From 8a263d7b25a4bb7dec9538076855565aea4a7f9b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 26 Jan 2017 22:54:47 -0500 Subject: [PATCH 01/19] fix required field in libraryoptionseditor --- .../libraryoptionseditor/libraryoptionseditor.template.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html b/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html index 6bcee417fa..9d287cf319 100644 --- a/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html +++ b/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html @@ -7,10 +7,10 @@
${LabelDownloadInternetMetadataHelp}
- +
- +
'; @@ -558,7 +555,7 @@ icon = i.icon || icon; var onclick = i.onclick ? ' function(){' + i.onclick + '}' : 'null'; - return '' + icon + '' + i.Name + ''; + return '' + i.Name + ''; }).join(''); @@ -851,6 +848,12 @@ if (!page.classList.contains('withTabs')) { LibraryMenu.setTabs(null); + + if (page.classList.contains('pageWithAbsoluteTabs')) { + document.body.classList.add('withTallToolbar'); + } else { + document.body.classList.remove('withTallToolbar'); + } } }); diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index a9f55e4c98..755f2a7fe4 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -383,14 +383,6 @@ var Dashboard = { pageIds = pageIds ? (' data-pageids="' + pageIds + '"') : ''; menuHtml += ''; - var icon = item.icon; - - if (icon) { - var style = item.color ? ' style="color:' + item.color + '"' : ''; - - menuHtml += '' + icon + ''; - } - menuHtml += ''; menuHtml += item.name; menuHtml += ''; From 8a6884abef271721ac2c792eafda4e4df269b10a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 27 Jan 2017 18:07:14 -0500 Subject: [PATCH 06/19] minify --- .../bower_components/Sortable/.bower.json | 43 - .../bower_components/Sortable/.editorconfig | 12 - .../bower_components/Sortable/.gitignore | 5 - .../bower_components/Sortable/.jshintrc | 24 - .../bower_components/Sortable/CONTRIBUTING.md | 23 - .../bower_components/Sortable/Gruntfile.js | 103 - .../bower_components/Sortable/bower.json | 32 - .../bower_components/Sortable/component.json | 32 - .../Sortable/jquery.binding.js | 62 +- .../Sortable/knockout-sortable.js | 183 +- .../bower_components/Sortable/ng-sortable.js | 192 +- .../bower_components/Sortable/package.json | 41 - .../Sortable/react-sortable-mixin.js | 166 +- .../bower_components/Swiper/.bower.json | 57 - .../bower_components/Swiper/CHANGELOG.md | 236 - .../bower_components/Swiper/bower.json | 35 - .../bower_components/Swiper/component.json | 17 - .../bower_components/Swiper/gulpfile.js | 309 +- .../bower_components/Swiper/package.js | 25 +- .../bower_components/cryptojslib/.bower.json | 21 - .../cryptojslib/.gitattributes | 22 - .../bower_components/cryptojslib/.gitignore | 215 - .../bower_components/cryptojslib/bower.json | 14 - .../cryptojslib/components/aes-min.js | 10 - .../cryptojslib/components/aes.js | 213 - .../cryptojslib/components/cipher-core-min.js | 14 - .../cryptojslib/components/cipher-core.js | 863 -- .../cryptojslib/components/core.js | 712 -- .../cryptojslib/components/enc-base64-min.js | 8 - .../cryptojslib/components/enc-base64.js | 109 - .../cryptojslib/components/enc-utf16-min.js | 8 - .../cryptojslib/components/enc-utf16.js | 135 - .../cryptojslib/components/evpkdf-min.js | 8 - .../cryptojslib/components/evpkdf.js | 118 - .../cryptojslib/components/format-hex-min.js | 7 - .../cryptojslib/components/format-hex.js | 52 - .../cryptojslib/components/hmac-min.js | 8 - .../cryptojslib/components/hmac.js | 131 - .../components/lib-typedarrays-min.js | 8 - .../cryptojslib/components/lib-typedarrays.js | 62 - .../cryptojslib/components/md5.js | 254 - .../cryptojslib/components/mode-cfb-min.js | 7 - .../cryptojslib/components/mode-cfb.js | 64 - .../components/mode-ctr-gladman-min.js | 14 - .../components/mode-ctr-gladman.js | 102 - .../cryptojslib/components/mode-ctr-min.js | 7 - .../cryptojslib/components/mode-ctr.js | 44 - .../cryptojslib/components/mode-ecb-min.js | 7 - .../cryptojslib/components/mode-ecb.js | 26 - .../cryptojslib/components/mode-ofb-min.js | 7 - .../cryptojslib/components/mode-ofb.js | 40 - .../components/pad-ansix923-min.js | 7 - .../cryptojslib/components/pad-ansix923.js | 35 - .../components/pad-iso10126-min.js | 7 - .../cryptojslib/components/pad-iso10126.js | 30 - .../components/pad-iso97971-min.js | 7 - .../cryptojslib/components/pad-iso97971.js | 26 - .../components/pad-nopadding-min.js | 7 - .../cryptojslib/components/pad-nopadding.js | 16 - .../components/pad-zeropadding-min.js | 7 - .../cryptojslib/components/pad-zeropadding.js | 31 - .../cryptojslib/components/pbkdf2-min.js | 8 - .../cryptojslib/components/pbkdf2.js | 131 - .../components/rabbit-legacy-min.js | 11 - .../cryptojslib/components/rabbit-legacy.js | 176 - .../cryptojslib/components/rabbit-min.js | 11 - .../cryptojslib/components/rabbit.js | 178 - .../cryptojslib/components/rc4-min.js | 8 - .../cryptojslib/components/rc4.js | 125 - .../cryptojslib/components/ripemd160-min.js | 22 - .../cryptojslib/components/ripemd160.js | 253 - .../cryptojslib/components/sha1.js | 136 - .../cryptojslib/components/sha224-min.js | 7 - .../cryptojslib/components/sha224.js | 66 - .../cryptojslib/components/sha256-min.js | 9 - .../cryptojslib/components/sha256.js | 185 - .../cryptojslib/components/sha3-min.js | 11 - .../cryptojslib/components/sha3.js | 309 - .../cryptojslib/components/sha384-min.js | 8 - .../cryptojslib/components/sha384.js | 69 - .../cryptojslib/components/sha512-min.js | 15 - .../cryptojslib/components/sha512.js | 309 - .../cryptojslib/components/tripledes-min.js | 26 - .../cryptojslib/components/tripledes.js | 756 -- .../cryptojslib/components/x64-core-min.js | 7 - .../cryptojslib/components/x64-core.js | 290 - .../cryptojslib/copyright.txt | 9 - .../bower_components/cryptojslib/push.bat | 5 - .../bower_components/cryptojslib/status.bat | 2 - .../document-register-element/.bower.json | 35 - .../document-register-element/LICENSE.txt | 19 - .../document-register-element/RESOURCES.md | 9 - .../document-register-element/bower.json | 23 - .../build/document-register-element.js | 3 +- .../document-register-element/testrunner.js | 53 +- .../emby-apiclient/.bower.json | 29 - .../emby-apiclient/LICENSE.md | 22 - .../emby-apiclient/apiclient.js | 3762 +----- .../emby-apiclient/apiclientex.js | 374 +- .../emby-apiclient/appstorage-cache.js | 49 +- .../emby-apiclient/appstorage-localstorage.js | 58 +- .../emby-apiclient/appstorage-memory.js | 23 +- .../emby-apiclient/bower.json | 21 - .../emby-apiclient/cameraroll.js | 16 +- .../emby-apiclient/connectionmanager.js | 1677 +-- .../emby-apiclient/credentials.js | 127 +- .../bower_components/emby-apiclient/events.js | 63 +- .../emby-apiclient/fileupload.js | 14 +- .../emby-apiclient/localassetmanager.js | 624 +- .../emby-apiclient/nullassetmanager.js | 133 +- .../emby-apiclient/serverdiscovery-chrome.js | 167 +- .../emby-apiclient/serverdiscovery-winjs.js | 127 +- .../emby-apiclient/serverdiscovery.js | 15 +- .../emby-apiclient/sync/contentuploader.js | 99 +- .../emby-apiclient/sync/filerepository.js | 51 +- .../emby-apiclient/sync/itemrepository.js | 115 +- .../emby-apiclient/sync/localsync.js | 47 +- .../emby-apiclient/sync/mediasync.js | 647 +- .../emby-apiclient/sync/multiserversync.js | 43 +- .../emby-apiclient/sync/offlineusersync.js | 50 +- .../emby-apiclient/sync/serversync.js | 111 +- .../emby-apiclient/sync/transfermanager.js | 24 +- .../sync/useractionrepository.js | 83 +- .../emby-apiclient/sync/userrepository.js | 72 +- .../emby-apiclient/wakeonlan.js | 14 +- .../emby-webcomponents/.bower.json | 27 - .../emby-webcomponents/LICENSE.md | 339 - .../actionsheet/actionsheet.css | 119 +- .../actionsheet/actionsheet.js | 328 +- .../emby-webcomponents/alert/alert.js | 35 +- .../emby-webcomponents/alert/nativealert.js | 24 +- .../alphapicker/alphapicker.js | 284 +- .../emby-webcomponents/alphapicker/style.css | 57 +- .../emby-webcomponents/appsettings.js | 117 +- .../emby-webcomponents/backdrop/backdrop.js | 354 +- .../emby-webcomponents/backdrop/style.css | 31 +- .../emby-webcomponents/bower.json | 19 - .../emby-webcomponents/browser.js | 299 +- .../browserdeviceprofile.js | 672 +- .../emby-webcomponents/cardbuilder/card.css | 657 +- .../cardbuilder/cardbuilder.js | 1655 +-- .../cardbuilder/chaptercardbuilder.js | 128 +- .../cardbuilder/peoplecardbuilder.js | 22 +- .../cardbuilder/roundcard.css | 30 +- .../emby-webcomponents/chromecastplayer.js | 1085 +- .../emby-webcomponents/clearbutton.css | 13 +- .../collectioneditor/collectioneditor.js | 292 +- .../emby-webcomponents/confirm/confirm.js | 41 +- .../confirm/nativeconfirm.js | 28 +- .../emby-webcomponents/datetime.js | 252 +- .../emby-webcomponents/deletehelper.js | 41 +- .../emby-webcomponents/dialog/dialog.css | 34 +- .../emby-webcomponents/dialog/dialog.js | 111 +- .../dialoghelper/dialoghelper.css | 168 +- .../dialoghelper/dialoghelper.js | 465 +- .../emby-webcomponents/dom.js | 159 +- .../emby-button/emby-button.css | 245 +- .../emby-button/emby-button.js | 107 +- .../emby-button/paper-icon-button-light.js | 83 +- .../emby-checkbox/emby-checkbox.css | 140 +- .../emby-checkbox/emby-checkbox.js | 90 +- .../emby-collapse/emby-collapse.css | 46 +- .../emby-collapse/emby-collapse.js | 101 +- .../emby-connect/connecthelper.js | 181 +- .../emby-input/emby-input.css | 61 +- .../emby-input/emby-input.js | 114 +- .../emby-itemscontainer.js | 314 +- .../emby-radio/emby-radio.css | 108 +- .../emby-radio/emby-radio.js | 49 +- .../emby-select/emby-select.css | 74 +- .../emby-select/emby-select.js | 175 +- .../emby-slider/emby-slider.css | 237 +- .../emby-slider/emby-slider.js | 180 +- .../emby-tabs/emby-tabs.css | 70 +- .../emby-webcomponents/emby-tabs/emby-tabs.js | 353 +- .../emby-textarea/emby-textarea.css | 55 +- .../emby-textarea/emby-textarea.js | 149 +- .../emby-toggle/emby-toggle.css | 138 +- .../emby-toggle/emby-toggle.js | 51 +- .../emby-webcomponents/fetchhelper.js | 133 +- .../emby-webcomponents/filedownloader.js | 13 +- .../emby-webcomponents/filesystem.js | 13 +- .../emby-webcomponents/focusmanager.js | 451 +- .../fonts/material-icons/style.css | 26 +- .../emby-webcomponents/fonts/roboto/style.css | 281 +- .../emby-webcomponents/formdialog.css | 107 +- .../fullscreen/fullscreen-doubleclick.js | 27 +- .../fullscreen/fullscreenmanager.js | 61 +- .../emby-webcomponents/globalize.js | 276 +- .../guide/guide-settings.js | 173 +- .../emby-webcomponents/guide/guide.css | 464 +- .../emby-webcomponents/guide/guide.js | 1013 +- .../emby-webcomponents/guide/programs.css | 16 +- .../htmlaudioplayer/plugin.js | 445 +- .../htmlvideoplayer/plugin.js | 1300 +- .../htmlvideoplayer/style.css | 45 +- .../emby-webcomponents/idb.js | 324 +- .../imageeditor/imageeditor.css | 17 +- .../imageeditor/imageeditor.js | 502 +- .../images/basicimagefetcher.js | 30 +- .../emby-webcomponents/images/imagehelper.js | 293 +- .../images/indexeddbimagefetcher.js | 178 +- .../images/persistentimagefetcher.js | 249 +- .../indicators/indicators.css | 78 +- .../indicators/indicators.js | 173 +- .../emby-webcomponents/input/api.js | 207 +- .../emby-webcomponents/input/gamepadtokey.js | 342 +- .../emby-webcomponents/input/mouse.js | 114 +- .../emby-webcomponents/inputmanager.js | 255 +- .../emby-webcomponents/itemcontextmenu.js | 628 +- .../emby-webcomponents/itemhelper.js | 210 +- .../itemhovermenu/itemhovermenu.css | 50 +- .../itemhovermenu/itemhovermenu.js | 283 +- .../itemidentifier/itemidentifier.js | 500 +- .../emby-webcomponents/layoutmanager.js | 69 +- .../lazyloader-intersectionobserver.js | 95 +- .../lazyloader/lazyloader-scroll.js | 186 +- .../emby-webcomponents/listview/listview.css | 192 +- .../emby-webcomponents/listview/listview.js | 451 +- .../loading/loading-legacy.css | 523 +- .../loading/loading-legacy.js | 38 +- .../loading/loading-lite.css | 480 +- .../loading/loading-lite.js | 35 +- .../mediainfo/mediainfo.css | 80 +- .../emby-webcomponents/mediainfo/mediainfo.js | 634 +- .../metadataeditor/metadataeditor.js | 1233 +- .../metadataeditor/personeditor.js | 100 +- .../emby-webcomponents/multidownload.js | 72 +- .../multiselect/multiselect.css | 40 +- .../multiselect/multiselect.js | 500 +- .../native-promise-only/lib/npo.src.js | 374 +- .../native-promise-only/test_adapter.js | 22 +- .../notifications/notifications.js | 273 +- .../emby-webcomponents/packagemanager.js | 149 +- .../emby-webcomponents/pagejs/page.js | 1059 +- .../playback/nowplayinghelper.js | 88 +- .../playback/playbackmanager.js | 2919 +---- .../playback/playbackvalidation.js | 61 +- .../playback/playerselection.js | 216 +- .../playback/playersettingsmenu.js | 96 +- .../playback/remotecontrolautoplay.js | 49 +- .../playlisteditor/playlisteditor.js | 295 +- .../emby-webcomponents/playmenu.js | 76 +- .../emby-webcomponents/pluginmanager.js | 153 +- .../emby-webcomponents/polyfills/array.js | 26 +- .../emby-webcomponents/polyfills/bind.js | 28 +- .../polyfills/objectassign.js | 24 +- .../emby-webcomponents/polyfills/raf.js | 32 +- .../emby-webcomponents/prompt/nativeprompt.js | 29 +- .../emby-webcomponents/prompt/prompt.js | 105 +- .../emby-webcomponents/qualityoptions.js | 90 +- .../recordingcreator/recordingcreator.css | 37 +- .../recordingcreator/recordingcreator.js | 207 +- .../recordingcreator/recordingeditor.js | 165 +- .../recordingcreator/recordingfields.css | 45 +- .../recordingcreator/recordingfields.js | 319 +- .../recordingcreator/recordinghelper.js | 163 +- .../recordingcreator/seriesrecordingeditor.js | 271 +- .../refreshdialog/refreshdialog.js | 160 +- .../registrationservices.js | 675 +- .../registrationservices/style.css | 27 +- .../emby-webcomponents/require/requirecss.js | 76 +- .../emby-webcomponents/require/requirehtml.js | 51 +- .../emby-webcomponents/require/requiretext.js | 31 +- .../resourcelocks/nullresourcelock.js | 21 +- .../resourcelocks/resourcelockmanager.js | 38 +- .../emby-webcomponents/router.js | 642 +- .../emby-webcomponents/sanitizefilename.js | 101 +- .../scroller/smoothscroller.js | 948 +- .../emby-webcomponents/scrollhelper.js | 127 +- .../emby-webcomponents/scrollstyles.css | 55 +- .../emby-webcomponents/servernotifications.js | 40 +- .../serviceworker/notifications.js | 53 +- .../emby-webcomponents/serviceworker/sync.js | 7 +- .../emby-webcomponents/sessionplayer.js | 549 +- .../sharing/sharingmanager.js | 60 +- .../emby-webcomponents/sharing/sharingmenu.js | 71 +- .../dist/css/social-share-kit.css | 2 +- .../dist/js/social-share-kit.js | 402 +- .../emby-webcomponents/shell.js | 16 +- .../emby-webcomponents/shortcuts.js | 482 +- .../emby-webcomponents/slideshow/slideshow.js | 626 +- .../emby-webcomponents/slideshow/style.css | 141 +- .../subtitleeditor/subtitleeditor.css | 7 +- .../subtitleeditor/subtitleeditor.js | 509 +- .../emby-webcomponents/sync/sync.js | 628 +- .../emby-webcomponents/sync/syncjobeditor.js | 507 +- .../emby-webcomponents/sync/syncjoblist.js | 421 +- .../emby-webcomponents/sync/synctoggle.js | 89 +- .../emby-webcomponents/thememediaplayer.js | 102 +- .../emby-webcomponents/toast/toast.css | 27 +- .../emby-webcomponents/toast/toast.js | 43 +- .../userdatabuttons/userdatabuttons.css | 4 +- .../userdatabuttons/userdatabuttons.js | 254 +- .../usersettings/usersettings.js | 6 +- .../usersettings/usersettingsbuilder.js | 172 +- .../viewmanager/viewcontainer-lite.css | 70 +- .../viewmanager/viewcontainer-lite.js | 279 +- .../viewmanager/viewmanager.js | 186 +- .../emby-webcomponents/visibleinviewport.js | 42 +- .../emby-webcomponents/voice/Readme.md | 177 - .../voice/commands/controlcommands.js | 18 +- .../voice/commands/disablecommands.js | 21 +- .../voice/commands/enablecommands.js | 21 +- .../voice/commands/playcommands.js | 103 +- .../voice/commands/searchcommands.js | 12 +- .../voice/commands/showcommands.js | 135 +- .../voice/commands/togglecommands.js | 21 +- .../voice/grammarprocessor.js | 260 +- .../emby-webcomponents/voice/voice.css | 21 +- .../emby-webcomponents/voice/voicecommands.js | 54 +- .../emby-webcomponents/voice/voicedialog.js | 285 +- .../voice/voiceprocessor.js | 61 +- .../emby-webcomponents/voice/voicereceiver.js | 100 +- .../youtubeplayer/plugin.js | 408 +- .../youtubeplayer/style.css | 22 +- .../bower_components/fetch/.bower.json | 24 - .../bower_components/fetch/bower.json | 13 - dashboard-ui/bower_components/fetch/fetch.js | 467 +- .../bower_components/font-roboto/.bower.json | 31 - .../bower_components/font-roboto/bower.json | 22 - .../bower_components/hammerjs/.bower.json | 27 - .../bower_components/hammerjs/CHANGELOG.md | 54 - .../bower_components/hammerjs/CONTRIBUTING.md | 41 - .../bower_components/hammerjs/LICENSE.md | 21 - .../bower_components/hammerjs/bower.json | 16 - .../bower_components/hammerjs/changelog.js | 72 +- .../bower_components/hammerjs/hammer.js | 2645 +--- .../hammerjs/hammer.min.js.map | 1 - .../bower_components/hammerjs/hammer.min.map | 1 - .../bower_components/headroomjs/.bower.json | 41 - .../bower_components/headroomjs/bower.json | 27 - .../headroomjs/dist/angular.headroom.js | 44 +- .../headroomjs/dist/headroom.js | 349 +- .../headroomjs/dist/jQuery.headroom.js | 46 +- .../bower_components/headroomjs/package.json | 40 - .../bower_components/hlsjs/.bower.json | 28 - dashboard-ui/bower_components/hlsjs/API.md | 1027 -- .../bower_components/hlsjs/CONTRIBUTING.md | 32 - .../bower_components/hlsjs/ISSUE_TEMPLATE.md | 31 - .../bower_components/hlsjs/bower.json | 19 - dashboard-ui/bower_components/hlsjs/design.md | 258 - .../bower_components/hlsjs/package.json | 64 - .../bower_components/howlerjs/.bower.json | 16 - .../bower_components/howlerjs/CHANGELOG.md | 210 - .../bower_components/howlerjs/LICENSE.md | 20 - .../bower_components/howlerjs/bower.json | 5 - .../bower_components/howlerjs/package.json | 29 - .../bower_components/jquery/.bower.json | 25 - .../bower_components/jquery/AUTHORS.txt | 295 - .../bower_components/jquery/LICENSE.txt | 36 - .../bower_components/jquery/bower.json | 14 - .../bower_components/jquery/dist/core.js | 483 +- .../bower_components/jquery/dist/jquery.js | 10225 +--------------- .../jquery/dist/jquery.min.map | 1 - .../jquery/dist/jquery.slim.js | 8111 +----------- .../jquery/dist/jquery.slim.min.map | 1 - .../jquery/external/sizzle/LICENSE.txt | 36 - .../jquery/external/sizzle/dist/sizzle.js | 2273 +--- .../external/sizzle/dist/sizzle.min.map | 1 - .../jquery/src/.eslintrc.json | 18 - .../bower_components/jquery/src/ajax.js | 855 -- .../bower_components/jquery/src/ajax/jsonp.js | 102 - .../bower_components/jquery/src/ajax/load.js | 76 - .../jquery/src/ajax/parseXML.js | 30 - .../jquery/src/ajax/script.js | 77 - .../bower_components/jquery/src/ajax/xhr.js | 169 - .../bower_components/jquery/src/attributes.js | 13 - .../jquery/src/attributes/attr.js | 140 - .../jquery/src/attributes/classes.js | 174 - .../jquery/src/attributes/prop.js | 143 - .../jquery/src/attributes/support.js | 33 - .../jquery/src/attributes/val.js | 188 - .../bower_components/jquery/src/callbacks.js | 234 - .../bower_components/jquery/src/core.js | 482 - .../jquery/src/core/DOMEval.js | 16 - .../jquery/src/core/access.js | 70 - .../bower_components/jquery/src/core/init.js | 127 - .../jquery/src/core/parseHTML.js | 65 - .../jquery/src/core/ready-no-deferred.js | 105 - .../bower_components/jquery/src/core/ready.js | 95 - .../jquery/src/core/readyException.js | 13 - .../jquery/src/core/stripAndCollapse.js | 14 - .../jquery/src/core/support.js | 20 - .../bower_components/jquery/src/css.js | 426 - .../jquery/src/css/addGetHookIf.js | 26 - .../jquery/src/css/adjustCSS.js | 71 - .../bower_components/jquery/src/css/curCSS.js | 59 - .../jquery/src/css/hiddenVisibleSelectors.js | 15 - .../jquery/src/css/showHide.js | 105 - .../jquery/src/css/support.js | 89 - .../bower_components/jquery/src/data.js | 179 - .../bower_components/jquery/src/data/Data.js | 161 - .../bower_components/jquery/src/deferred.js | 389 - .../jquery/src/deferred/exceptionHook.js | 21 - .../bower_components/jquery/src/deprecated.js | 30 - .../bower_components/jquery/src/dimensions.js | 56 - .../bower_components/jquery/src/effects.js | 693 -- .../jquery/src/effects/Tween.js | 123 - .../jquery/src/effects/animatedSelector.js | 15 - .../bower_components/jquery/src/event.js | 745 -- .../bower_components/jquery/src/event/ajax.js | 22 - .../jquery/src/event/alias.js | 29 - .../jquery/src/event/focusin.js | 55 - .../jquery/src/event/support.js | 11 - .../jquery/src/event/trigger.js | 185 - .../jquery/src/exports/amd.js | 26 - .../jquery/src/exports/global.js | 34 - .../bower_components/jquery/src/jquery.js | 41 - .../jquery/src/manipulation.js | 486 - .../jquery/src/manipulation/_evalUrl.js | 23 - .../jquery/src/manipulation/buildFragment.js | 104 - .../jquery/src/manipulation/getAll.js | 31 - .../jquery/src/manipulation/setGlobalEval.js | 22 - .../jquery/src/manipulation/support.js | 35 - .../jquery/src/manipulation/wrapMap.js | 29 - .../bower_components/jquery/src/offset.js | 232 - .../bower_components/jquery/src/queue.js | 145 - .../jquery/src/queue/delay.js | 24 - .../jquery/src/selector-native.js | 237 - .../jquery/src/selector-sizzle.js | 19 - .../bower_components/jquery/src/selector.js | 3 - .../bower_components/jquery/src/serialize.js | 130 - .../bower_components/jquery/src/traversing.js | 178 - .../jquery/src/traversing/findFilter.js | 106 - .../bower_components/jquery/src/wrap.js | 77 - .../bower_components/jstree/.bower.json | 43 - .../bower_components/jstree/bower.json | 32 - .../bower_components/jstree/composer.json | 44 - .../bower_components/jstree/dist/jstree.js | 7428 +---------- .../jstree/dist/themes/default-dark/style.css | 1076 +- .../jstree/dist/themes/default/style.css | 1032 +- .../bower_components/jstree/src/intro.js | 14 - .../jstree/src/jstree.checkbox.js | 764 -- .../jstree/src/jstree.contextmenu.js | 631 - .../bower_components/jstree/src/jstree.dnd.js | 545 - .../bower_components/jstree/src/jstree.js | 4430 ------- .../jstree/src/jstree.massload.js | 100 - .../jstree/src/jstree.search.js | 419 - .../jstree/src/jstree.sort.js | 74 - .../jstree/src/jstree.state.js | 125 - .../jstree/src/jstree.types.js | 236 - .../jstree/src/jstree.unique.js | 121 - .../jstree/src/jstree.wholerow.js | 115 - .../bower_components/jstree/src/misc.js | 394 - .../bower_components/jstree/src/outro.js | 1 - .../bower_components/jstree/src/sample.js | 93 - .../jstree/src/themes/base.less | 87 - .../jstree/src/themes/default-dark/32px.png | Bin 1525 -> 0 bytes .../jstree/src/themes/default-dark/40px.png | Bin 11488 -> 0 bytes .../jstree/src/themes/default-dark/style.css | 1075 -- .../jstree/src/themes/default-dark/style.less | 50 - .../src/themes/default-dark/throbber.gif | Bin 1849 -> 0 bytes .../jstree/src/themes/default/32px.png | Bin 8740 -> 0 bytes .../jstree/src/themes/default/40px.png | Bin 6055 -> 0 bytes .../jstree/src/themes/default/style.css | 1031 -- .../jstree/src/themes/default/style.less | 22 - .../jstree/src/themes/default/throbber.gif | Bin 1849 -> 0 bytes .../jstree/src/themes/main.less | 75 - .../jstree/src/themes/mixins.less | 98 - .../jstree/src/themes/responsive.less | 66 - .../jstree/src/vakata-jstree.js | 38 - .../bower_components/libjass/.bower.json | 14 - .../bower_components/libjass/CHANGELOG.md | 133 - .../bower_components/libjass/libjass.css | 101 +- .../bower_components/libjass/package.json | 24 - .../bower_components/query-string/.bower.json | 15 - .../query-string/.editorconfig | 15 - .../query-string/.gitattributes | 1 - .../bower_components/query-string/.gitignore | 1 - .../bower_components/query-string/.jshintrc | 12 - .../bower_components/query-string/.travis.yml | 6 - .../bower_components/query-string/index.js | 54 +- .../query-string/package.json | 39 - .../bower_components/query-string/readme.md | 76 - .../bower_components/query-string/test.js | 92 +- .../query-string/test/extract.js | 17 - .../query-string/test/parse.js | 51 - .../query-string/test/stringify.js | 33 - .../bower_components/requirejs/.bower.json | 26 - .../bower_components/requirejs/bower.json | 17 - .../bower_components/requirejs/require.js | 2143 +--- .../bower_components/vibrant/.bower.json | 45 - .../bower_components/vibrant/LICENSE.md | 19 - .../bower_components/vibrant/bower.json | 35 - .../bower_components/vibrant/dist/vibrant.js | 913 +- .../bower_components/vibrant/package.json | 44 - .../bower_components/vibrant/style.css | 32 +- .../web-animations-js/.bower.json | 41 - .../web-animations-js/History.md | 227 - .../web-animations-js/bower.json | 31 - .../webcomponentsjs/.bower.json | 30 - .../webcomponentsjs/bower.json | 21 - .../webcomponentsjs/package.json | 31 - 494 files changed, 256 insertions(+), 120180 deletions(-) delete mode 100644 dashboard-ui/bower_components/Sortable/.bower.json delete mode 100644 dashboard-ui/bower_components/Sortable/.editorconfig delete mode 100644 dashboard-ui/bower_components/Sortable/.gitignore delete mode 100644 dashboard-ui/bower_components/Sortable/.jshintrc delete mode 100644 dashboard-ui/bower_components/Sortable/CONTRIBUTING.md delete mode 100644 dashboard-ui/bower_components/Sortable/Gruntfile.js delete mode 100644 dashboard-ui/bower_components/Sortable/bower.json delete mode 100644 dashboard-ui/bower_components/Sortable/component.json delete mode 100644 dashboard-ui/bower_components/Sortable/package.json delete mode 100644 dashboard-ui/bower_components/Swiper/.bower.json delete mode 100644 dashboard-ui/bower_components/Swiper/CHANGELOG.md delete mode 100644 dashboard-ui/bower_components/Swiper/bower.json delete mode 100644 dashboard-ui/bower_components/Swiper/component.json delete mode 100644 dashboard-ui/bower_components/cryptojslib/.bower.json delete mode 100644 dashboard-ui/bower_components/cryptojslib/.gitattributes delete mode 100644 dashboard-ui/bower_components/cryptojslib/.gitignore delete mode 100644 dashboard-ui/bower_components/cryptojslib/bower.json delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/aes-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/aes.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/cipher-core-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/cipher-core.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/core.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/enc-base64-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/enc-base64.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/enc-utf16-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/enc-utf16.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/evpkdf-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/evpkdf.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/format-hex-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/format-hex.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/hmac-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/hmac.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/lib-typedarrays-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/lib-typedarrays.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/md5.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/mode-cfb-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/mode-cfb.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/mode-ctr-gladman-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/mode-ctr-gladman.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/mode-ctr-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/mode-ctr.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/mode-ecb-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/mode-ecb.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/mode-ofb-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/mode-ofb.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pad-ansix923-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pad-ansix923.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pad-iso10126-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pad-iso10126.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pad-iso97971-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pad-iso97971.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pad-nopadding-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pad-nopadding.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pad-zeropadding-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pad-zeropadding.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pbkdf2-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/pbkdf2.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/rabbit-legacy-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/rabbit-legacy.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/rabbit-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/rabbit.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/rc4-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/rc4.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/ripemd160-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/ripemd160.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/sha1.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/sha224-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/sha224.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/sha256-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/sha256.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/sha3-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/sha3.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/sha384-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/sha384.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/sha512-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/sha512.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/tripledes-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/tripledes.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/x64-core-min.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/components/x64-core.js delete mode 100644 dashboard-ui/bower_components/cryptojslib/copyright.txt delete mode 100644 dashboard-ui/bower_components/cryptojslib/push.bat delete mode 100644 dashboard-ui/bower_components/cryptojslib/status.bat delete mode 100644 dashboard-ui/bower_components/document-register-element/.bower.json delete mode 100644 dashboard-ui/bower_components/document-register-element/LICENSE.txt delete mode 100644 dashboard-ui/bower_components/document-register-element/RESOURCES.md delete mode 100644 dashboard-ui/bower_components/document-register-element/bower.json delete mode 100644 dashboard-ui/bower_components/emby-apiclient/.bower.json delete mode 100644 dashboard-ui/bower_components/emby-apiclient/LICENSE.md delete mode 100644 dashboard-ui/bower_components/emby-apiclient/bower.json delete mode 100644 dashboard-ui/bower_components/emby-webcomponents/.bower.json delete mode 100644 dashboard-ui/bower_components/emby-webcomponents/LICENSE.md delete mode 100644 dashboard-ui/bower_components/emby-webcomponents/bower.json delete mode 100644 dashboard-ui/bower_components/emby-webcomponents/voice/Readme.md delete mode 100644 dashboard-ui/bower_components/fetch/.bower.json delete mode 100644 dashboard-ui/bower_components/fetch/bower.json delete mode 100644 dashboard-ui/bower_components/font-roboto/.bower.json delete mode 100644 dashboard-ui/bower_components/font-roboto/bower.json delete mode 100644 dashboard-ui/bower_components/hammerjs/.bower.json delete mode 100644 dashboard-ui/bower_components/hammerjs/CHANGELOG.md delete mode 100644 dashboard-ui/bower_components/hammerjs/CONTRIBUTING.md delete mode 100644 dashboard-ui/bower_components/hammerjs/LICENSE.md delete mode 100644 dashboard-ui/bower_components/hammerjs/bower.json delete mode 100644 dashboard-ui/bower_components/hammerjs/hammer.min.js.map delete mode 100644 dashboard-ui/bower_components/hammerjs/hammer.min.map delete mode 100644 dashboard-ui/bower_components/headroomjs/.bower.json delete mode 100644 dashboard-ui/bower_components/headroomjs/bower.json delete mode 100644 dashboard-ui/bower_components/headroomjs/package.json delete mode 100644 dashboard-ui/bower_components/hlsjs/.bower.json delete mode 100644 dashboard-ui/bower_components/hlsjs/API.md delete mode 100644 dashboard-ui/bower_components/hlsjs/CONTRIBUTING.md delete mode 100644 dashboard-ui/bower_components/hlsjs/ISSUE_TEMPLATE.md delete mode 100644 dashboard-ui/bower_components/hlsjs/bower.json delete mode 100644 dashboard-ui/bower_components/hlsjs/design.md delete mode 100644 dashboard-ui/bower_components/hlsjs/package.json delete mode 100644 dashboard-ui/bower_components/howlerjs/.bower.json delete mode 100644 dashboard-ui/bower_components/howlerjs/CHANGELOG.md delete mode 100644 dashboard-ui/bower_components/howlerjs/LICENSE.md delete mode 100644 dashboard-ui/bower_components/howlerjs/bower.json delete mode 100644 dashboard-ui/bower_components/howlerjs/package.json delete mode 100644 dashboard-ui/bower_components/jquery/.bower.json delete mode 100644 dashboard-ui/bower_components/jquery/AUTHORS.txt delete mode 100644 dashboard-ui/bower_components/jquery/LICENSE.txt delete mode 100644 dashboard-ui/bower_components/jquery/bower.json delete mode 100644 dashboard-ui/bower_components/jquery/dist/jquery.min.map delete mode 100644 dashboard-ui/bower_components/jquery/dist/jquery.slim.min.map delete mode 100644 dashboard-ui/bower_components/jquery/external/sizzle/LICENSE.txt delete mode 100644 dashboard-ui/bower_components/jquery/external/sizzle/dist/sizzle.min.map delete mode 100644 dashboard-ui/bower_components/jquery/src/.eslintrc.json delete mode 100644 dashboard-ui/bower_components/jquery/src/ajax.js delete mode 100644 dashboard-ui/bower_components/jquery/src/ajax/jsonp.js delete mode 100644 dashboard-ui/bower_components/jquery/src/ajax/load.js delete mode 100644 dashboard-ui/bower_components/jquery/src/ajax/parseXML.js delete mode 100644 dashboard-ui/bower_components/jquery/src/ajax/script.js delete mode 100644 dashboard-ui/bower_components/jquery/src/ajax/xhr.js delete mode 100644 dashboard-ui/bower_components/jquery/src/attributes.js delete mode 100644 dashboard-ui/bower_components/jquery/src/attributes/attr.js delete mode 100644 dashboard-ui/bower_components/jquery/src/attributes/classes.js delete mode 100644 dashboard-ui/bower_components/jquery/src/attributes/prop.js delete mode 100644 dashboard-ui/bower_components/jquery/src/attributes/support.js delete mode 100644 dashboard-ui/bower_components/jquery/src/attributes/val.js delete mode 100644 dashboard-ui/bower_components/jquery/src/callbacks.js delete mode 100644 dashboard-ui/bower_components/jquery/src/core.js delete mode 100644 dashboard-ui/bower_components/jquery/src/core/DOMEval.js delete mode 100644 dashboard-ui/bower_components/jquery/src/core/access.js delete mode 100644 dashboard-ui/bower_components/jquery/src/core/init.js delete mode 100644 dashboard-ui/bower_components/jquery/src/core/parseHTML.js delete mode 100644 dashboard-ui/bower_components/jquery/src/core/ready-no-deferred.js delete mode 100644 dashboard-ui/bower_components/jquery/src/core/ready.js delete mode 100644 dashboard-ui/bower_components/jquery/src/core/readyException.js delete mode 100644 dashboard-ui/bower_components/jquery/src/core/stripAndCollapse.js delete mode 100644 dashboard-ui/bower_components/jquery/src/core/support.js delete mode 100644 dashboard-ui/bower_components/jquery/src/css.js delete mode 100644 dashboard-ui/bower_components/jquery/src/css/addGetHookIf.js delete mode 100644 dashboard-ui/bower_components/jquery/src/css/adjustCSS.js delete mode 100644 dashboard-ui/bower_components/jquery/src/css/curCSS.js delete mode 100644 dashboard-ui/bower_components/jquery/src/css/hiddenVisibleSelectors.js delete mode 100644 dashboard-ui/bower_components/jquery/src/css/showHide.js delete mode 100644 dashboard-ui/bower_components/jquery/src/css/support.js delete mode 100644 dashboard-ui/bower_components/jquery/src/data.js delete mode 100644 dashboard-ui/bower_components/jquery/src/data/Data.js delete mode 100644 dashboard-ui/bower_components/jquery/src/deferred.js delete mode 100644 dashboard-ui/bower_components/jquery/src/deferred/exceptionHook.js delete mode 100644 dashboard-ui/bower_components/jquery/src/deprecated.js delete mode 100644 dashboard-ui/bower_components/jquery/src/dimensions.js delete mode 100644 dashboard-ui/bower_components/jquery/src/effects.js delete mode 100644 dashboard-ui/bower_components/jquery/src/effects/Tween.js delete mode 100644 dashboard-ui/bower_components/jquery/src/effects/animatedSelector.js delete mode 100644 dashboard-ui/bower_components/jquery/src/event.js delete mode 100644 dashboard-ui/bower_components/jquery/src/event/ajax.js delete mode 100644 dashboard-ui/bower_components/jquery/src/event/alias.js delete mode 100644 dashboard-ui/bower_components/jquery/src/event/focusin.js delete mode 100644 dashboard-ui/bower_components/jquery/src/event/support.js delete mode 100644 dashboard-ui/bower_components/jquery/src/event/trigger.js delete mode 100644 dashboard-ui/bower_components/jquery/src/exports/amd.js delete mode 100644 dashboard-ui/bower_components/jquery/src/exports/global.js delete mode 100644 dashboard-ui/bower_components/jquery/src/jquery.js delete mode 100644 dashboard-ui/bower_components/jquery/src/manipulation.js delete mode 100644 dashboard-ui/bower_components/jquery/src/manipulation/_evalUrl.js delete mode 100644 dashboard-ui/bower_components/jquery/src/manipulation/buildFragment.js delete mode 100644 dashboard-ui/bower_components/jquery/src/manipulation/getAll.js delete mode 100644 dashboard-ui/bower_components/jquery/src/manipulation/setGlobalEval.js delete mode 100644 dashboard-ui/bower_components/jquery/src/manipulation/support.js delete mode 100644 dashboard-ui/bower_components/jquery/src/manipulation/wrapMap.js delete mode 100644 dashboard-ui/bower_components/jquery/src/offset.js delete mode 100644 dashboard-ui/bower_components/jquery/src/queue.js delete mode 100644 dashboard-ui/bower_components/jquery/src/queue/delay.js delete mode 100644 dashboard-ui/bower_components/jquery/src/selector-native.js delete mode 100644 dashboard-ui/bower_components/jquery/src/selector-sizzle.js delete mode 100644 dashboard-ui/bower_components/jquery/src/selector.js delete mode 100644 dashboard-ui/bower_components/jquery/src/serialize.js delete mode 100644 dashboard-ui/bower_components/jquery/src/traversing.js delete mode 100644 dashboard-ui/bower_components/jquery/src/traversing/findFilter.js delete mode 100644 dashboard-ui/bower_components/jquery/src/wrap.js delete mode 100644 dashboard-ui/bower_components/jstree/.bower.json delete mode 100644 dashboard-ui/bower_components/jstree/bower.json delete mode 100644 dashboard-ui/bower_components/jstree/composer.json delete mode 100644 dashboard-ui/bower_components/jstree/src/intro.js delete mode 100644 dashboard-ui/bower_components/jstree/src/jstree.checkbox.js delete mode 100644 dashboard-ui/bower_components/jstree/src/jstree.contextmenu.js delete mode 100644 dashboard-ui/bower_components/jstree/src/jstree.dnd.js delete mode 100644 dashboard-ui/bower_components/jstree/src/jstree.js delete mode 100644 dashboard-ui/bower_components/jstree/src/jstree.massload.js delete mode 100644 dashboard-ui/bower_components/jstree/src/jstree.search.js delete mode 100644 dashboard-ui/bower_components/jstree/src/jstree.sort.js delete mode 100644 dashboard-ui/bower_components/jstree/src/jstree.state.js delete mode 100644 dashboard-ui/bower_components/jstree/src/jstree.types.js delete mode 100644 dashboard-ui/bower_components/jstree/src/jstree.unique.js delete mode 100644 dashboard-ui/bower_components/jstree/src/jstree.wholerow.js delete mode 100644 dashboard-ui/bower_components/jstree/src/misc.js delete mode 100644 dashboard-ui/bower_components/jstree/src/outro.js delete mode 100644 dashboard-ui/bower_components/jstree/src/sample.js delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/base.less delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/default-dark/32px.png delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/default-dark/40px.png delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/default-dark/style.css delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/default-dark/style.less delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/default-dark/throbber.gif delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/default/32px.png delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/default/40px.png delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/default/style.css delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/default/style.less delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/default/throbber.gif delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/main.less delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/mixins.less delete mode 100644 dashboard-ui/bower_components/jstree/src/themes/responsive.less delete mode 100644 dashboard-ui/bower_components/jstree/src/vakata-jstree.js delete mode 100644 dashboard-ui/bower_components/libjass/.bower.json delete mode 100644 dashboard-ui/bower_components/libjass/CHANGELOG.md delete mode 100644 dashboard-ui/bower_components/libjass/package.json delete mode 100644 dashboard-ui/bower_components/query-string/.bower.json delete mode 100644 dashboard-ui/bower_components/query-string/.editorconfig delete mode 100644 dashboard-ui/bower_components/query-string/.gitattributes delete mode 100644 dashboard-ui/bower_components/query-string/.gitignore delete mode 100644 dashboard-ui/bower_components/query-string/.jshintrc delete mode 100644 dashboard-ui/bower_components/query-string/.travis.yml delete mode 100644 dashboard-ui/bower_components/query-string/package.json delete mode 100644 dashboard-ui/bower_components/query-string/readme.md delete mode 100644 dashboard-ui/bower_components/query-string/test/extract.js delete mode 100644 dashboard-ui/bower_components/query-string/test/parse.js delete mode 100644 dashboard-ui/bower_components/query-string/test/stringify.js delete mode 100644 dashboard-ui/bower_components/requirejs/.bower.json delete mode 100644 dashboard-ui/bower_components/requirejs/bower.json delete mode 100644 dashboard-ui/bower_components/vibrant/.bower.json delete mode 100644 dashboard-ui/bower_components/vibrant/LICENSE.md delete mode 100644 dashboard-ui/bower_components/vibrant/bower.json delete mode 100644 dashboard-ui/bower_components/vibrant/package.json delete mode 100644 dashboard-ui/bower_components/web-animations-js/.bower.json delete mode 100644 dashboard-ui/bower_components/web-animations-js/History.md delete mode 100644 dashboard-ui/bower_components/web-animations-js/bower.json delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/.bower.json delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/bower.json delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/package.json diff --git a/dashboard-ui/bower_components/Sortable/.bower.json b/dashboard-ui/bower_components/Sortable/.bower.json deleted file mode 100644 index 820d6f0c5d..0000000000 --- a/dashboard-ui/bower_components/Sortable/.bower.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Sortable", - "main": [ - "Sortable.js", - "ng-sortable.js", - "knockout-sortable.js", - "react-sortable-mixin.js" - ], - "homepage": "http://rubaxa.github.io/Sortable/", - "authors": [ - "RubaXa " - ], - "description": "Minimalist library for reorderable drag-and-drop lists on modern browsers and touch devices. No jQuery.", - "keywords": [ - "sortable", - "reorder", - "list", - "html5", - "drag", - "and", - "drop", - "dnd", - "web-components" - ], - "license": "MIT", - "ignore": [ - "node_modules", - "bower_components", - "test", - "tests" - ], - "version": "1.4.2", - "_release": "1.4.2", - "_resolution": { - "type": "version", - "tag": "1.4.2", - "commit": "d86937c8bca017f948aad04eb02dcaddfbb60ffa" - }, - "_source": "git://github.com/RubaXa/Sortable.git", - "_target": "~1.4.2", - "_originalSource": "Sortable", - "_direct": true -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/Sortable/.editorconfig b/dashboard-ui/bower_components/Sortable/.editorconfig deleted file mode 100644 index b0d7fd91b3..0000000000 --- a/dashboard-ui/bower_components/Sortable/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -# editorconfig.org -root = true - -[*] -indent_style = tab -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/dashboard-ui/bower_components/Sortable/.gitignore b/dashboard-ui/bower_components/Sortable/.gitignore deleted file mode 100644 index 434cfa9b1f..0000000000 --- a/dashboard-ui/bower_components/Sortable/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -mock.png -.*.sw* -.build* -jquery.fn.* diff --git a/dashboard-ui/bower_components/Sortable/.jshintrc b/dashboard-ui/bower_components/Sortable/.jshintrc deleted file mode 100644 index 3f67a098be..0000000000 --- a/dashboard-ui/bower_components/Sortable/.jshintrc +++ /dev/null @@ -1,24 +0,0 @@ -{ - "strict": true, - "newcap": false, - "node": true, - "expr": true, - "supernew": true, - "laxbreak": true, - "white": true, - "globals": { - "define": true, - "test": true, - "expect": true, - "module": true, - "asyncTest": true, - "start": true, - "ok": true, - "equal": true, - "notEqual": true, - "deepEqual": true, - "window": true, - "document": true, - "performance": true - } -} diff --git a/dashboard-ui/bower_components/Sortable/CONTRIBUTING.md b/dashboard-ui/bower_components/Sortable/CONTRIBUTING.md deleted file mode 100644 index 34ff6cdc53..0000000000 --- a/dashboard-ui/bower_components/Sortable/CONTRIBUTING.md +++ /dev/null @@ -1,23 +0,0 @@ -# Contribution Guidelines - -### Issue - - 1. Try [dev](https://github.com/RubaXa/Sortable/tree/dev/)-branch, perhaps the problem has been solved; - 2. [Use the search](https://github.com/RubaXa/Sortable/search?q=problem), maybe already have an answer; - 3. If not found, create example on [jsbin.com (draft)](http://jsbin.com/zunibaxada/1/edit?html,js,output) and describe the problem. - ---- - -### Pull Request - - 1. Before PR run `grunt`; - 2. Only into [dev](https://github.com/RubaXa/Sortable/tree/dev/)-branch. - -### Setup - - Pieced together from [gruntjs](http://gruntjs.com/getting-started) - - 1. Fork repo on [github](https://github.com) - 2. Clone locally - 3. from local repro ```npm install``` - 4. Install grunt-cli globally ```sudo -H npm install -g grunt-cli``` diff --git a/dashboard-ui/bower_components/Sortable/Gruntfile.js b/dashboard-ui/bower_components/Sortable/Gruntfile.js deleted file mode 100644 index 5d67184bb4..0000000000 --- a/dashboard-ui/bower_components/Sortable/Gruntfile.js +++ /dev/null @@ -1,103 +0,0 @@ -module.exports = function (grunt) { - 'use strict'; - - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - - version: { - js: { - src: ['<%= pkg.exportName %>.js', '*.json'] - }, - cdn: { - options: { - prefix: '(cdnjs\\.cloudflare\\.com\\/ajax\\/libs\\/Sortable|cdn\\.jsdelivr\\.net\\/sortable)\\/', - replace: '[0-9\\.]+' - }, - src: ['README.md'] - } - }, - - jshint: { - all: ['*.js', '!*.min.js'], - - options: { - jshintrc: true - } - }, - - uglify: { - options: { - banner: '/*! <%= pkg.exportName %> <%= pkg.version %> - <%= pkg.license %> | <%= pkg.repository.url %> */\n' - }, - dist: { - files: { - '<%= pkg.exportName %>.min.js': ['<%= pkg.exportName %>.js'] - } - }, - jquery: { - files: {} - } - }, - - exec: { - 'meteor-test': { - command: 'meteor/runtests.sh' - }, - 'meteor-publish': { - command: 'meteor/publish.sh' - } - }, - - jquery: {} - }); - - - grunt.registerTask('jquery', function (exportName, uglify) { - if (exportName == 'min') { - exportName = null; - uglify = 'min'; - } - - if (!exportName) { - exportName = 'sortable'; - } - - var fs = require('fs'), - filename = 'jquery.fn.' + exportName + '.js'; - - grunt.log.oklns(filename); - - fs.writeFileSync( - filename, - (fs.readFileSync('jquery.binding.js') + '') - .replace('$.fn.sortable', '$.fn.' + exportName) - .replace('/* CODE */', - (fs.readFileSync('Sortable.js') + '') - .replace(/^[\s\S]*?function[\s\S]*?(var[\s\S]+)\/\/\s+Export[\s\S]+/, '$1') - ) - ); - - if (uglify) { - var opts = {}; - - opts['jquery.fn.' + exportName + '.min.js'] = filename; - grunt.config.set('uglify.jquery.files', opts); - - grunt.task.run('uglify:jquery'); - } - }); - - - grunt.loadNpmTasks('grunt-version'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-exec'); - - // Meteor tasks - grunt.registerTask('meteor-test', 'exec:meteor-test'); - grunt.registerTask('meteor-publish', 'exec:meteor-publish'); - grunt.registerTask('meteor', ['meteor-test', 'meteor-publish']); - - grunt.registerTask('tests', ['jshint']); - grunt.registerTask('default', ['tests', 'version', 'uglify:dist']); -}; diff --git a/dashboard-ui/bower_components/Sortable/bower.json b/dashboard-ui/bower_components/Sortable/bower.json deleted file mode 100644 index 742b3ffb37..0000000000 --- a/dashboard-ui/bower_components/Sortable/bower.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "Sortable", - "main": [ - "Sortable.js", - "ng-sortable.js", - "knockout-sortable.js", - "react-sortable-mixin.js" - ], - "homepage": "http://rubaxa.github.io/Sortable/", - "authors": [ - "RubaXa " - ], - "description": "Minimalist library for reorderable drag-and-drop lists on modern browsers and touch devices. No jQuery.", - "keywords": [ - "sortable", - "reorder", - "list", - "html5", - "drag", - "and", - "drop", - "dnd", - "web-components" - ], - "license": "MIT", - "ignore": [ - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/dashboard-ui/bower_components/Sortable/component.json b/dashboard-ui/bower_components/Sortable/component.json deleted file mode 100644 index 3df9414d5c..0000000000 --- a/dashboard-ui/bower_components/Sortable/component.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "Sortable", - "main": "Sortable.js", - "version": "1.4.2", - "homepage": "http://rubaxa.github.io/Sortable/", - "repo": "RubaXa/Sortable", - "authors": [ - "RubaXa " - ], - "description": "Minimalist library for reorderable drag-and-drop lists on modern browsers and touch devices. No jQuery.", - "keywords": [ - "sortable", - "reorder", - "list", - "html5", - "drag", - "and", - "drop", - "dnd" - ], - "license": "MIT", - "ignore": [ - "node_modules", - "bower_components", - "test", - "tests" - ], - - "scripts": [ - "Sortable.js" - ] -} diff --git a/dashboard-ui/bower_components/Sortable/jquery.binding.js b/dashboard-ui/bower_components/Sortable/jquery.binding.js index 9e9f4b93c7..b85cd4b2f1 100644 --- a/dashboard-ui/bower_components/Sortable/jquery.binding.js +++ b/dashboard-ui/bower_components/Sortable/jquery.binding.js @@ -1,61 +1 @@ -/** - * jQuery plugin for Sortable - * @author RubaXa - * @license MIT - */ -(function (factory) { - "use strict"; - - if (typeof define === "function" && define.amd) { - define(["jquery"], factory); - } - else { - /* jshint sub:true */ - factory(jQuery); - } -})(function ($) { - "use strict"; - - - /* CODE */ - - - /** - * jQuery plugin for Sortable - * @param {Object|String} options - * @param {..*} [args] - * @returns {jQuery|*} - */ - $.fn.sortable = function (options) { - var retVal, - args = arguments; - - this.each(function () { - var $el = $(this), - sortable = $el.data('sortable'); - - if (!sortable && (options instanceof Object || !options)) { - sortable = new Sortable(this, options); - $el.data('sortable', sortable); - } - - if (sortable) { - if (options === 'widget') { - return sortable; - } - else if (options === 'destroy') { - sortable.destroy(); - $el.removeData('sortable'); - } - else if (typeof sortable[options] === 'function') { - retVal = sortable[options].apply(sortable, [].slice.call(args, 1)); - } - else if (options in sortable.options) { - retVal = sortable.option.apply(sortable, args); - } - } - }); - - return (retVal === void 0) ? this : retVal; - }; -}); +!function(factory){"use strict";"function"==typeof define&&define.amd?define(["jquery"],factory):factory(jQuery)}(function($){"use strict";$.fn.sortable=function(options){var retVal,args=arguments;return this.each(function(){var $el=$(this),sortable=$el.data("sortable");if(sortable||!(options instanceof Object)&&options||(sortable=new Sortable(this,options),$el.data("sortable",sortable)),sortable){if("widget"===options)return sortable;"destroy"===options?(sortable.destroy(),$el.removeData("sortable")):"function"==typeof sortable[options]?retVal=sortable[options].apply(sortable,[].slice.call(args,1)):options in sortable.options&&(retVal=sortable.option.apply(sortable,args))}}),void 0===retVal?this:retVal}}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/Sortable/knockout-sortable.js b/dashboard-ui/bower_components/Sortable/knockout-sortable.js index 02881970e3..ca4657f18e 100644 --- a/dashboard-ui/bower_components/Sortable/knockout-sortable.js +++ b/dashboard-ui/bower_components/Sortable/knockout-sortable.js @@ -1,182 +1 @@ -(function (factory) { - "use strict"; - if (typeof define === "function" && define.amd) { - // AMD anonymous module - define(["knockout"], factory); - } else if (typeof require === "function" && typeof exports === "object" && typeof module === "object") { - // CommonJS module - var ko = require("knockout"); - factory(ko); - } else { - // No module loader (plain -``` - -Invoke the following static method: `Hls.isSupported()` to check whether your browser is supporting [MediaSource Extensions](http://w3c.github.io/media-source/). - -```html - - -``` - -### Second step: instantiate Hls object and bind it to `" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( el ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( el ) { - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Simple selector that can be filtered directly, removing non-Elements - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - // Complex selector, compare the two sets, removing non-Elements - qualifier = jQuery.filter( qualifier, elements ); - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; - } ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - resolve.call( undefined, value ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.call( undefined, value ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( jQuery.isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ jQuery.camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ jQuery.camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( jQuery.camelCase ); - } else { - key = jQuery.camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - jQuery.contains( elem.ownerDocument, elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); - -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE <=9 only - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -// Support: IE <=9 only -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && jQuery.nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); -var documentElement = document.documentElement; - - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 only -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: jQuery.isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - - // Support: IE <=10 - 11, Edge 12 - 13 - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -function manipulationTarget( elem, content ) { - if ( jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return elem.getElementsByTagName( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rmargin = ( /^margin/ ); - -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - div.style.cssText = - "box-sizing:border-box;" + - "position:relative;display:block;" + - "margin:auto;border:1px;padding:1px;" + - "top:1%;width:50%"; - div.innerHTML = ""; - documentElement.appendChild( container ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = divStyle.marginLeft === "2px"; - boxSizingReliableVal = divStyle.width === "4px"; - - // Support: Android 4.0 - 4.3 only - // Some styles come back with percentage values, even though they shouldn't - div.style.marginRight = "50%"; - pixelMarginRightVal = divStyle.marginRight === "4px"; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + - "padding:0;margin-top:1px;position:absolute"; - container.appendChild( div ); - - jQuery.extend( support, { - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelMarginRight: function() { - computeStyleTests(); - return pixelMarginRightVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - style = elem.style; - - computed = computed || getStyles( elem ); - - // Support: IE <=9 only - // getPropertyValue is only needed for .css('filter') (#12537) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property -function vendorPropName( name ) { - - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i, - val = 0; - - // If we already have the right measurement, avoid augmentation - if ( extra === ( isBorderBox ? "border" : "content" ) ) { - i = 4; - - // Otherwise initialize for horizontal or vertical properties - } else { - i = name === "width" ? 1 : 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // At this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - - // At this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // At this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var val, - valueIsBorderBox = true, - styles = getStyles( elem ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - if ( elem.getClientRects().length ) { - val = elem.getBoundingClientRect()[ name ]; - } - - // Some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name, styles ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test( val ) ) { - return val; - } - - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && - ( support.boxSizingReliable() || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // Use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - "float": "cssFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || - ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - style[ name ] = value; - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || - ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); - } ) : - getWidthOrHeight( elem, name, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = extra && getStyles( elem ), - subtract = extra && augmentWidthOrHeight( - elem, - name, - extra, - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - styles - ); - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ name ] = value; - value = jQuery.css( elem, name ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( !rmargin.test( prefix ) ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( jQuery.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, timerId, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function raf() { - if ( timerId ) { - window.requestAnimationFrame( raf ); - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = jQuery.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 13 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = jQuery.camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( jQuery.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - if ( percent < 1 && length ) { - return remaining; - } else { - deferred.resolveWith( elem, [ animation ] ); - return false; - } - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( jQuery.isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - jQuery.proxy( result.stop, result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( jQuery.isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - // attach callbacks from options - return animation.progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing - }; - - // Go to the end state if fx are off or if document is hidden - if ( jQuery.fx.off || document.hidden ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = jQuery.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Checks the timer has not already been removed - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - if ( timer() ) { - jQuery.fx.start(); - } else { - jQuery.timers.pop(); - } -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( !timerId ) { - timerId = window.requestAnimationFrame ? - window.requestAnimationFrame( raf ) : - window.setInterval( jQuery.fx.tick, jQuery.fx.interval ); - } -}; - -jQuery.fx.stop = function() { - if ( window.cancelAnimationFrame ) { - window.cancelAnimationFrame( timerId ); - } else { - window.clearInterval( timerId ); - } - - timerId = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - jQuery.nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( type === "string" ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = value.match( rnothtmlwhite ) || []; - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, isFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup contextmenu" ).split( " " ), - function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; -} ); - -jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -} ); - - - - -support.focusin = "onfocusin" in window; - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = jQuery.now(); - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( jQuery.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && jQuery.type( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = jQuery.isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - // If an array was passed in, assume that it is an array of form elements. - if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( jQuery.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( jQuery.isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 13 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available, append data to url - if ( s.data ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - "throws": true - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( jQuery.isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( "-->', ''); - } - - var wrapper = document.createElement('div'); - wrapper.innerHTML = html; - return wrapper.querySelector('div[data-role="page"]'); - } - - function normalizeNewView(options) { - - if (options.view.indexOf('data-role="page"') == -1) { - return options.view; - } - - var hasScript = options.view.indexOf('=pageContainerCount&&(pageIndex=0);var newViewInfo=normalizeNewView(options),newView=newViewInfo.elem,dependencies="string"==typeof newView?null:newView.getAttribute("data-require");dependencies=dependencies?dependencies.split(","):[];var isPluginpage=options.url.toLowerCase().indexOf("/configurationpage?")!=-1;return isPluginpage&&(dependencies.push("jqmpopup"),dependencies.push("legacy/dashboard"),dependencies.push("legacy/selectmenu"),dependencies.push("jqmlistview"),dependencies.push("fnchecked")),(isPluginpage||newView.classList&&newView.classList.contains("type-interior"))&&(dependencies.push("scripts/notifications"),dependencies.push("css!css/notifications.css"),dependencies.push("dashboardcss")),new Promise(function(resolve,reject){require(dependencies,function(){var currentPage=allPages[pageIndex];currentPage&&triggerDestroy(currentPage);var view=newView;"string"==typeof view&&(view=document.createElement("div"),view.innerHTML=newView),view.classList.add("mainAnimatedPage"),currentPage?newViewInfo.hasScript&&window.$?(view=$(view).appendTo(mainAnimatedPages)[0],mainAnimatedPages.removeChild(currentPage)):mainAnimatedPages.replaceChild(view,currentPage):newViewInfo.hasScript&&window.$?view=$(view).appendTo(mainAnimatedPages)[0]:mainAnimatedPages.appendChild(view),"string"!=typeof newView&&enhanceNewView(dependencies,view),options.type&&view.setAttribute("data-type",options.type);var properties=[];options.fullscreen&&properties.push("fullscreen"),properties.length&&view.setAttribute("data-properties",properties.join(","));var animatable=view;allPages[pageIndex]=view,onBeforeChange&&onBeforeChange(view,!1,options),beforeAnimate(allPages,pageIndex,selected),animate(animatable,previousAnimatable,options.transition,options.isBack).then(function(){selectedPageIndex=pageIndex,currentUrls[pageIndex]=options.url,!options.cancel&&previousAnimatable&&afterAnimate(allPages,pageIndex),document.dispatchEvent(new CustomEvent("scroll",{})),window.$&&($.mobile=$.mobile||{},$.mobile.activePage=view),resolve(view)})})})}}function enhanceNewView(dependencies,newView){for(var hasJqm=!1,i=0,length=dependencies.length;i-->",""));var wrapper=document.createElement("div");return wrapper.innerHTML=html,wrapper.querySelector('div[data-role="page"]')}function normalizeNewView(options){if(options.view.indexOf('data-role="page"')==-1)return options.view;var hasScript=options.view.indexOf(" .table { - width: 100%; -} - -.autoorganizetable th { - padding: 0.4em; -} - -.autoorganizetable > .table > tbody > tr > td { - padding: 0.4em; -} - -.autoorganizetable .fileCell { - word-wrap: break-word; - word-break: break-all; -} - -.autoorganizetable > .table > thead > th { - text-align: left; -} - -.autoorganizetable tbody tr:nth-child(odd) td, -.autoorganizetable tbody tr:nth-child(odd) th { - background-color: #eeeeee; /* non-RGBA fallback */ - background-color: rgba(0,0,0,.04); -} - - -@media screen and (max-width: 800px) { - .autoorganizetable > .table { - margin-bottom: 0; - background-color: transparent; - } - - .autoorganizetable .spinnerCell { - display: none !important; - } - - .autoorganizetable > .table > thead, - .autoorganizetable > .table > tfoot { - display: none; - } - - .autoorganizetable > .table > tbody { - display: block; - } - - .autoorganizetable > .table > tbody > tr { - display: block; - border: 1px solid #e0e0e0; - border-radius: 2px; - margin-bottom: 1.6rem; - } - - .autoorganizetable > .table > tbody > tr > td { - background-color: #eeeeee; /* non-RGBA fallback */ - background-color: rgba(0,0,0,.04); - display: block; - vertical-align: middle; - text-align: left; - text-overflow: ellipsis; - padding: 0.4em; - } - - .autoorganizetable > .table > tbody > tr > td[data-title]:before { - content: attr(data-title); - float: left; - font-size: inherit; - font-weight: bold; - min-width: 20%; - } -} +.autoorganizetable>.table{width:100%}.autoorganizetable th,.autoorganizetable>.table>tbody>tr>td{padding:.4em}.autoorganizetable .fileCell{word-wrap:break-word;word-break:break-all}.autoorganizetable>.table>thead>th{text-align:left}.autoorganizetable tbody tr:nth-child(odd) td,.autoorganizetable tbody tr:nth-child(odd) th{background-color:#eee;background-color:rgba(0,0,0,.04)}@media screen and (max-width:800px){.autoorganizetable>.table{margin-bottom:0;background-color:transparent}.autoorganizetable .spinnerCell{display:none!important}.autoorganizetable>.table>tfoot,.autoorganizetable>.table>thead{display:none}.autoorganizetable>.table>tbody{display:block}.autoorganizetable>.table>tbody>tr{display:block;border:1px solid #e0e0e0;-webkit-border-radius:2px;border-radius:2px;margin-bottom:1.6rem}.autoorganizetable>.table>tbody>tr>td{background-color:#eee;background-color:rgba(0,0,0,.04);display:block;vertical-align:middle;text-align:left;-o-text-overflow:ellipsis;text-overflow:ellipsis;padding:.4em}.autoorganizetable>.table>tbody>tr>td[data-title]:before{content:attr(data-title);float:left;font-size:inherit;font-weight:700;min-width:20%}} \ No newline at end of file diff --git a/dashboard-ui/css/chromecast.css b/dashboard-ui/css/chromecast.css index 54a3f2f533..b2d8ba312d 100644 --- a/dashboard-ui/css/chromecast.css +++ b/dashboard-ui/css/chromecast.css @@ -1,17 +1 @@ -.btnActiveCast { - color: #52B54B !important; -} - -.headerSelectedPlayer { - font-weight: normal; - max-width: 160px; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} - -@media all and (max-width: 600px) { - .headerSelectedPlayer { - display: none; - } -} +.btnActiveCast{color:#52B54B!important}.headerSelectedPlayer{font-weight:400;max-width:160px;-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}@media all and (max-width:600px){.headerSelectedPlayer{display:none}} \ No newline at end of file diff --git a/dashboard-ui/css/dashboard.css b/dashboard-ui/css/dashboard.css index c7bfeb52b3..92ba21be09 100644 --- a/dashboard-ui/css/dashboard.css +++ b/dashboard-ui/css/dashboard.css @@ -1,578 +1 @@ -.dashboardFooter { - margin-top: 50px; - text-align: center; -} - - .dashboardFooter a { - text-decoration: none; - font-weight: normal; - margin: 0 .7em; - } - - .dashboardFooter .appLinks a { - margin: .25em; - } - - .dashboardFooter .appLinks img { - height: 16px; - } - -/* - * Gradient Shadow - */ - -/* All HTML5 progress enabled browsers */ -progress { - /* Turns off styling - not usually needed, but good to know. */ - appearance: none; - -moz-appearance: none; - -webkit-appearance: none; - /* gets rid of default border in Firefox and Opera. */ - border: solid #cccccc 2px; - border-radius: 4px; - margin: 0; -} - - /* Polyfill */ - progress[role]:after { - background-image: none; /* removes default background from polyfill */ - } - -/* - * Background of the progress bar background - */ - -/* Firefox and Polyfill */ -progress { - background: #cccccc !important; /* !important only needed in polyfill */ -} - - /* Chrome */ - progress::-webkit-progress-bar { - background: #cccccc; - } - - /* - * Background of the progress bar value - */ - - /* Firefox */ - progress::-moz-progress-bar { - border-radius: 5px; - background-image: -moz-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% ); - } - - /* Chrome */ - progress::-webkit-progress-value { - border-radius: 5px; - background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0, rgb(43,194,83)), color-stop(1, rgb(84,240,84)) ); - background-image: -webkit-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% ); - } - - /* Polyfill */ - progress[aria-valuenow]:before { - border-radius: 5px; - background-image: -moz-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% ); - background-image: -ms-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% ); - background-image: -o-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% ); - } - -/* Tabs (e.g. advanced metadata page) */ -.localnav { - margin-bottom: 30px !important; -} - -@media all and (min-width: 800px) { - - .type-interior > .ui-content, .type-interior > .ui-panel-content-wrap > .ui-content { - padding-right: 0; - padding-left: 0; - padding-top: 0; - overflow: hidden; - } -} - -.dashboardDocument .lnkMySync { - display: none !important; -} - -.dashboardDocument .dashboardEntryHeaderButton { - display: none !important; -} - -.dashboardDocument .lnkManageServer { - display: none !important; -} - -.dashboardDocument .headerVoiceButton { - display: none !important; -} - -.dashboardDocument .btnCast, .dashboardDocument .headerSelectedPlayer { - display: none !important; -} - -.adminDrawer { - background: #fff !important; -} - -.adminDrawer .sidebarLink { - color: #333 !important; -} - -.adminDrawer .sidebarHeader { - color: #666 !important; - font-weight: 500 !important; -} - -.adminDrawer .sidebarLink:hover { - color: #00897B !important; -} - -.adminDrawer .sidebarLink.selectedSidebarLink { - background: #52B54B !important; - color: #fff !important; -} - -.adminDrawerLogo { - padding: 1.5em 1em 1.2em; - border-bottom: 1px solid #e0e0e0; - margin-bottom: 1em; - display: block; -} - - .adminDrawerLogo img { - height: 30px; - } - -@media all and (max-width: 640px) { - - .dashboardDocument .headerAppsButton { - display: none; - } -} - -/* Links */ -.ui-body-a a { - color: #388E3C /*{a-link-color}*/; - font-weight: 500; -} - -div[data-role="controlgroup"] a[data-role='button'] { - display: inline-block !important; - margin: 0 !important; - -webkit-box-shadow: none !important; - -moz-box-shadow: none !important; - box-shadow: none !important; - border-radius: 0; -} - - div[data-role="controlgroup"] a[data-role='button']:first-child { - border-bottom-left-radius: .3125em; - border-top-left-radius: .3125em; - } - - div[data-role="controlgroup"] a[data-role='button']:last-child { - border-bottom-right-radius: .3125em; - border-top-right-radius: .3125em; - } - - div[data-role="controlgroup"] a[data-role='button'] + a[data-role='button'] { - border-left-width: 0 !important; - margin: 0 0 0 -3px !important; - } - -div[data-role="controlgroup"] a.ui-btn-active { - background: #38c !important; - color: #fff !important; -} - -.header .imageLink { - display: inline-block; -} - - .header .imageLink img { - height: 28px; - vertical-align: middle; - } - -.ulForm { - margin: -1em !important; - margin-bottom: 20px !important; -} - - .ulForm li:not(.ui-li-divider) { - background: none; - border: 0 !important; - } - -.popup .ulForm { - margin-bottom: 0 !important; -} - -.content-primary { - padding-top: 70px; -} - -.withTabs .content-primary { - padding-top: 115px; -} - -.mainDrawerPanel:not([narrow]) .content-primary { - padding-top: 90px; - padding-bottom: 3em; -} - -@media all and (min-width: 800px) { - - .mainDrawerPanel:not([narrow]) .content-primary { - padding-right: 1.5em; - padding-left: 1.5em; - } -} - -@media all and (min-width: 1200px) { - - .mainDrawerPanel:not([narrow]) .content-primary { - padding-left: 2em; - } -} - -.mainDrawerPanel:not([narrow]) .withTabs .content-primary { - padding-top: 125px !important; -} - -.mainDrawerPanel:not([narrow]) .content-primary ul:first-child { - margin-top: 0; -} - -@media all and (max-width: 1439px) { - - .dashboardHomeRightColumn { - margin-top: 1em; - } -} - -.dashboardContent { - margin-top: -10px; -} - -.dashboardHomeRightColumn { - vertical-align: top; -} - -@media all and (min-width: 1440px) { - - .dashboardHomeLeftColumn { - width: 600px; - display: inline-block; - vertical-align: top; - } - - .dashboardHomeRightColumn { - vertical-align: top; - } - - .firstDashboardHomeRightColumn { - display: inline-block; - width: 440px; - margin-left: 2em; - min-width: 300px; - } -} - -@media all and (min-width: 1580px) { - - .dashboardHomeRightColumn { - display: inline-block; - margin-left: 1em; - width: 300px; - min-width: 300px; - } -} - -@media all and (min-width: 1680px) { - - .dashboardHomeRightColumn { - width: 350px; - min-width: 350px; - } -} - - -@media all and (min-width: 1880px) { - - .dashboardHomeRightColumn { - max-width: 440px; - margin-left: 2em; - min-width: 440px; - } -} - -.premiumBanner img { - position: absolute; - text-align: right; - top: 0; - right: 0; - width: 60px; - height: 60px; -} - -.wizardContent { - max-width: 800px; - padding: .5em 2em 1em; - margin: 0 auto; - background: #fff; -} - -.wizardNavigation { - text-align: right; -} - -.wizardContent form { - max-width: 100%; -} - -.wizardContent h2 img { - height: 35px; - vertical-align: middle; - margin-right: .5em; - position: relative; - top: -3px; -} - -.scheduledTaskPaperIconItem { - outline: none !important; -} - -@media all and (min-width: 420px) { - - .activeSession { - width: 50% !important; - } -} - -.sessionNowPlayingContent { - background-size: cover; - background-repeat: no-repeat; - background-position: center center; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; -} - -.sessionNowPlayingInnerContent { - background-color: rgba(0, 0, 0, .6); - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - color: #fff; - font-weight: 400; -} - -.sessionAppInfo { - padding: .5em; - overflow: hidden; -} - -.sessionAppName { - vertical-align: top; - max-width: 200px; -} - -.sessionNowPlayingInfo { - position: absolute; - left: 0; - bottom: 11px; - padding: .5em; - max-width: 150px; - overflow: hidden; - text-overflow: ellipsis; -} - -.sessionAppInfo img { - max-width: 32px; - max-height: 32px; - margin-right: 5px; -} - -.activeSession .playbackProgress { - position: absolute; - right: 0; - bottom: 0; - left: 0; - height: 7px; - width: 100%; - opacity: .95; -} - -.activeSession:not(.playingSession) .sessionNowPlayingContent { - display: none; -} - -.activeSession:not(.playingSession) .sessionNowPlayingInnerContent { - background-color: #fff; - color: #000; -} - -.activeSession:not(.playingSession) .sessionNowPlayingInfo { - bottom: 0; -} - -.sessionNowPlayingTime { - color: #fff; - position: absolute; - right: 10px; - bottom: 19px; -} - -.sessionNowPlayingStreamInfo { - white-space: nowrap; - font-size: 90%; -} - -.activeSession .transcodingProgress { - right: 0; - bottom: 0; - left: 0; - height: 5px; - width: 100%; - opacity: .9; - z-index: 999; - position: absolute; -} - -/* All HTML5 progress enabled browsers */ -.transcodingProgress, .playbackProgress { - /* Turns off styling - not usually needed, but good to know. */ - appearance: none; - -moz-appearance: none; - -webkit-appearance: none; - /* gets rid of default border in Firefox and Opera. */ - border: 0; - margin: 0; - height: 14px; - border: 0 solid #222; - border-radius: 0; - width: 50px; - margin-right: 5px; - background: #000 !important; /* !important only needed in polyfill */ -} - - /* Chrome */ - .playbackProgress::-webkit-progress-bar, .transcodingProgress::-webkit-progress-bar { - background: #000; - } - - -.transcodingSession .playbackProgress { - bottom: 5px; -} - -/* Firefox */ -.transcodingProgress::-moz-progress-bar { - border-radius: 0; - background-image: -moz-linear-gradient( center bottom, rgb(221, 73, 25) 37%, rgb(221, 73, 25) 69% ) !important; -} - -/* Chrome */ -.transcodingProgress::-webkit-progress-value { - border-radius: 0; - background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0, rgb(221, 73, 25)), color-stop(1, rgb(221, 73, 25)) ) !important; - background-image: -webkit-linear-gradient( center bottom, rgb(221, 73, 25) 37%, rgb(221, 73, 25) 69% ) !important; -} - -/* Polyfill */ -.transcodingProgress[aria-valuenow]:before { - border-radius: 0; - background-image: -moz-linear-gradient( center bottom, rgb(221, 73, 25) 37%, rgb(221, 73, 25) 69% ) !important; - background-image: -ms-linear-gradient( center bottom, rgb(221, 73, 25) 37%, rgb(221, 73, 25) 69% ) !important; - background-image: -o-linear-gradient( center bottom, rgb(221, 73, 25) 37%, rgb(221, 73, 25) 69% ) !important; -} - -/* Firefox */ -.playbackProgress::-moz-progress-bar { - border-radius: 0; - background-image: none; - background-color: #52B54B; -} - -/* Chrome */ -.playbackProgress::-webkit-progress-value { - border-radius: 0; - background-image: none; - background-color: #52B54B; -} - -/* Polyfill */ -.playbackProgress[aria-valuenow]:before { - border-radius: 0; - background-image: none; - background-color: #52B54B; -} - -@media all and (max-width: 550px) { - - .sessionAppName { - max-width: 160px; - } -} - -@media all and (max-width: 500px) { - - .sessionAppName { - max-width: 150px; - } -} - -.disabledUser { - -webkit-filter: grayscale(100%); - filter: grayscale(100%); -} - -.disabledUserBanner { - margin: 0 0 2em; -} - -.appLinks a { - text-decoration: none !important; -} - - .appLinks a + a { - margin-left: 5px; - } - -.appLinks img { - height: 36px; -} - -.supporterMembershipDisabled .tabSupporterMembership { - display: none; -} - -a[data-role='button'] { - -webkit-font-smoothing: antialiased; - -webkit-user-select: none; - background-clip: padding-box; - border-radius: .3125em; - border: 1px solid #ddd !important; - color: rgb(51, 51, 51) !important; - cursor: pointer !important; - font-family: inherit !important; - font-size: inherit !important; - font-weight: 500 !important; - margin: 0 .25em !important; - display: inline-block; - padding: .8em 1em; - text-align: center; - text-decoration: none !important; - background: #f6f6f6 !important; - font-size: 16px; - -webkit-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ rgba(0,0,0,.15) /*{global-box-shadow-color}*/; - -moz-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ rgba(0,0,0,.15) /*{global-box-shadow-color}*/; - box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ rgba(0,0,0,.15) /*{global-box-shadow-color}*/; -} +.dashboardFooter{margin-top:50px;text-align:center}.dashboardFooter a{text-decoration:none;font-weight:400;margin:0 .7em}.dashboardFooter .appLinks a{margin:.25em}.dashboardFooter .appLinks img{height:16px}progress{appearance:none;-moz-appearance:none;-webkit-appearance:none;border:2px solid #ccc;-webkit-border-radius:4px;border-radius:4px;margin:0;background:#ccc!important}progress[role]:after{background-image:none}progress::-webkit-progress-bar{background:#ccc}progress::-moz-progress-bar{border-radius:5px;background-image:-moz-linear-gradient(center bottom,#2bc253 37%,#54f054 69%)}progress::-webkit-progress-value{-webkit-border-radius:5px;border-radius:5px;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#2bc253),color-stop(1,#54f054));background-image:-webkit-linear-gradient(center bottom,#2bc253 37%,#54f054 69%)}progress[aria-valuenow]:before{-webkit-border-radius:5px;border-radius:5px;background-image:-o-linear-gradient(center bottom,#2bc253 37%,#54f054 69%)}.localnav{margin-bottom:30px!important}@media all and (min-width:800px){.type-interior>.ui-content,.type-interior>.ui-panel-content-wrap>.ui-content{padding-right:0;padding-left:0;padding-top:0;overflow:hidden}}.dashboardDocument .btnCast,.dashboardDocument .dashboardEntryHeaderButton,.dashboardDocument .headerSelectedPlayer,.dashboardDocument .headerVoiceButton,.dashboardDocument .lnkManageServer,.dashboardDocument .lnkMySync{display:none!important}.adminDrawer{background:#fff!important}.adminDrawer .sidebarLink{color:#333!important}.adminDrawer .sidebarHeader{color:#666!important;font-weight:500!important}.adminDrawer .sidebarLink:hover{color:#00897B!important}.adminDrawer .sidebarLink.selectedSidebarLink{background:#52B54B!important;color:#fff!important}.adminDrawerLogo{padding:1.5em 1em 1.2em;border-bottom:1px solid #e0e0e0;margin-bottom:1em;display:block}.adminDrawerLogo img{height:30px}@media all and (max-width:640px){.dashboardDocument .headerAppsButton{display:none}}.ui-body-a a{color:#388E3C;font-weight:500}div[data-role=controlgroup] a[data-role=button]{display:inline-block!important;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-border-radius:0;border-radius:0}div[data-role=controlgroup] a[data-role=button]:first-child{-webkit-border-bottom-left-radius:.3125em;border-bottom-left-radius:.3125em;-webkit-border-top-left-radius:.3125em;border-top-left-radius:.3125em}div[data-role=controlgroup] a[data-role=button]:last-child{-webkit-border-bottom-right-radius:.3125em;border-bottom-right-radius:.3125em;-webkit-border-top-right-radius:.3125em;border-top-right-radius:.3125em}div[data-role=controlgroup] a[data-role=button]+a[data-role=button]{border-left-width:0!important;margin:0 0 0 -3px!important}div[data-role=controlgroup] a.ui-btn-active{background:#38c!important;color:#fff!important}.header .imageLink{display:inline-block}.header .imageLink img{height:28px;vertical-align:middle}.ulForm{margin:-1em -1em 20px!important}.ulForm li:not(.ui-li-divider){background:0 0;border:0!important}.popup .ulForm{margin-bottom:0!important}.content-primary{padding-top:70px}.withTabs .content-primary{padding-top:115px}.mainDrawerPanel:not([narrow]) .content-primary{padding-top:90px;padding-bottom:3em}@media all and (min-width:800px){.mainDrawerPanel:not([narrow]) .content-primary{padding-right:1.5em;padding-left:1.5em}}@media all and (min-width:1200px){.mainDrawerPanel:not([narrow]) .content-primary{padding-left:2em}}.mainDrawerPanel:not([narrow]) .withTabs .content-primary{padding-top:125px!important}.mainDrawerPanel:not([narrow]) .content-primary ul:first-child{margin-top:0}@media all and (max-width:1439px){.dashboardHomeRightColumn{margin-top:1em}}.dashboardContent{margin-top:-10px}.dashboardHomeRightColumn{vertical-align:top}@media all and (min-width:1440px){.dashboardHomeLeftColumn{width:600px;display:inline-block;vertical-align:top}.dashboardHomeRightColumn{vertical-align:top}.firstDashboardHomeRightColumn{display:inline-block;width:440px;margin-left:2em;min-width:300px}}@media all and (min-width:1580px){.dashboardHomeRightColumn{display:inline-block;margin-left:1em;width:300px;min-width:300px}}.activeSession:not(.playingSession) .sessionNowPlayingContent,.supporterMembershipDisabled .tabSupporterMembership{display:none}@media all and (min-width:1680px){.dashboardHomeRightColumn{width:350px;min-width:350px}}@media all and (min-width:1880px){.dashboardHomeRightColumn{max-width:440px;margin-left:2em;min-width:440px}}.premiumBanner img{position:absolute;text-align:right;top:0;right:0;width:60px;height:60px}.wizardContent{max-width:800px;padding:.5em 2em 1em;margin:0 auto;background:#fff}.sessionAppInfo,.sessionNowPlayingInfo{padding:.5em;overflow:hidden}.wizardNavigation{text-align:right}.wizardContent form{max-width:100%}.wizardContent h2 img{height:35px;vertical-align:middle;margin-right:.5em;position:relative;top:-3px}.scheduledTaskPaperIconItem{outline:0!important}@media all and (min-width:420px){.activeSession{width:50%!important}}.sessionNowPlayingContent{-webkit-background-size:cover;background-size:cover;background-repeat:no-repeat;background-position:center center;position:absolute;top:0;left:0;right:0;bottom:0}.sessionNowPlayingInnerContent{background-color:rgba(0,0,0,.6);position:absolute;top:0;left:0;right:0;bottom:0;color:#fff;font-weight:400}.sessionAppName{vertical-align:top;max-width:200px}.sessionNowPlayingInfo{position:absolute;left:0;bottom:11px;max-width:150px;-o-text-overflow:ellipsis;text-overflow:ellipsis}.sessionAppInfo img{max-width:32px;max-height:32px;margin-right:5px}.activeSession .playbackProgress{position:absolute;right:0;bottom:0;left:0;height:7px;width:100%;opacity:.95}.activeSession:not(.playingSession) .sessionNowPlayingInnerContent{background-color:#fff;color:#000}.activeSession:not(.playingSession) .sessionNowPlayingInfo{bottom:0}.sessionNowPlayingTime{color:#fff;position:absolute;right:10px;bottom:19px}.sessionNowPlayingStreamInfo{white-space:nowrap;font-size:90%}.activeSession .transcodingProgress{right:0;bottom:0;left:0;height:5px;width:100%;opacity:.9;z-index:999;position:absolute}.playbackProgress,.transcodingProgress{appearance:none;-moz-appearance:none;-webkit-appearance:none;margin:0 5px 0 0;height:14px;border:0 solid #222;-webkit-border-radius:0;border-radius:0;width:50px;background:#000!important}.playbackProgress::-webkit-progress-bar,.transcodingProgress::-webkit-progress-bar{background:#000}.transcodingSession .playbackProgress{bottom:5px}.transcodingProgress::-moz-progress-bar{border-radius:0;background-image:-moz-linear-gradient(center bottom,#dd4919 37%,#dd4919 69%)!important}.transcodingProgress::-webkit-progress-value{-webkit-border-radius:0;border-radius:0;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#dd4919),color-stop(1,#dd4919))!important;background-image:-webkit-linear-gradient(center bottom,#dd4919 37%,#dd4919 69%)!important}.transcodingProgress[aria-valuenow]:before{-webkit-border-radius:0;border-radius:0;background-image:-o-linear-gradient(center bottom,#dd4919 37%,#dd4919 69%)!important}.playbackProgress::-moz-progress-bar{border-radius:0;background-image:none;background-color:#52B54B}.playbackProgress::-webkit-progress-value{-webkit-border-radius:0;border-radius:0;background-image:none;background-color:#52B54B}.playbackProgress[aria-valuenow]:before{-webkit-border-radius:0;border-radius:0;background-image:none;background-color:#52B54B}@media all and (max-width:550px){.sessionAppName{max-width:160px}}@media all and (max-width:500px){.sessionAppName{max-width:150px}}.disabledUser{-webkit-filter:grayscale(100%);filter:grayscale(100%)}.disabledUserBanner{margin:0 0 2em}.appLinks a{text-decoration:none!important}.appLinks a+a{margin-left:5px}.appLinks img{height:36px}a[data-role=button]{-webkit-font-smoothing:antialiased;-webkit-user-select:none;-webkit-background-clip:padding-box;-webkit-border-radius:.3125em;border-radius:.3125em;border:1px solid #ddd!important;color:#333!important;cursor:pointer!important;font-family:inherit!important;font-size:inherit!important;font-weight:500!important;margin:0 .25em!important;display:inline-block;padding:.8em 1em;text-align:center;text-decoration:none!important;background:#f6f6f6!important;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.15);box-shadow:0 1px 3px rgba(0,0,0,.15)} \ No newline at end of file diff --git a/dashboard-ui/css/detailtable.css b/dashboard-ui/css/detailtable.css index 5b0adec10c..3d847ffadf 100644 --- a/dashboard-ui/css/detailtable.css +++ b/dashboard-ui/css/detailtable.css @@ -1,87 +1 @@ -.detailTableContainer { - width: 100%; - text-align: center; -} - -.detailTable { - border-collapse: collapse; - border-spacing: 0; - text-align: left; - width: 100%; - margin: 0 auto; -} - -.stretchedDetailTable { - width: 100%; -} - -.detailTable a { - text-decoration: none; -} - - .detailTable a:hover { - text-decoration: underline; - } - -.detailTable td { - border-spacing: 0; - padding: 5px 5px; -} - -.detailTable th { - border-spacing: 0; - padding: 5px; - font-weight: bold; - text-align: left; - vertical-align: top; -} - -.userDataCell { - width: 130px; - text-align: right; -} - -.tabletColumn, .desktopColumn { - display: none; -} - -.detailTable .btnPlay { - margin: 0; -} - -.detailTableButtonsCell { - white-space: nowrap; -} - - .detailTableButtonsCell button { - margin-top: 0; - margin-bottom: 0; - } - - .detailTableButtonsCell button + button { - margin-left: .5em; - } - -@media all and (min-width: 600px) { - .tabletColumn { - display: table-cell; - } -} - -@media all and (min-width: 1100px) { - .desktopColumn { - display: table-cell; - } -} - -.detailTable tbody tr:nth-child(odd) td, -.detailTable tbody tr:nth-child(odd) th { - background-color: #eeeeee; /* non-RGBA fallback */ - background-color: rgba(0,0,0,.1); -} - -.stripedTable tbody tr:nth-child(odd) td, -.stripedTable tbody tr:nth-child(odd) th { - background-color: #eeeeee; /* non-RGBA fallback */ - background-color: rgba(0,0,0,.04); -} +.detailTableContainer{width:100%;text-align:center}.detailTable,.detailTable th{border-spacing:0;text-align:left}.detailTable{border-collapse:collapse;width:100%;margin:0 auto}.stretchedDetailTable{width:100%}.detailTable a{text-decoration:none}.detailTable a:hover{text-decoration:underline}.detailTable td{border-spacing:0;padding:5px}.detailTable th{padding:5px;font-weight:700;vertical-align:top}.userDataCell{width:130px;text-align:right}.desktopColumn,.tabletColumn{display:none}.detailTable .btnPlay{margin:0}.detailTableButtonsCell{white-space:nowrap}.detailTableButtonsCell button{margin-top:0;margin-bottom:0}.detailTableButtonsCell button+button{margin-left:.5em}@media all and (min-width:600px){.tabletColumn{display:table-cell}}@media all and (min-width:1100px){.desktopColumn{display:table-cell}}.detailTable tbody tr:nth-child(odd) td,.detailTable tbody tr:nth-child(odd) th{background-color:#eee;background-color:rgba(0,0,0,.1)}.stripedTable tbody tr:nth-child(odd) td,.stripedTable tbody tr:nth-child(odd) th{background-color:#eee;background-color:rgba(0,0,0,.04)} \ No newline at end of file diff --git a/dashboard-ui/css/librarybrowser.css b/dashboard-ui/css/librarybrowser.css index 6a596a5ab2..1f6fb0a508 100644 --- a/dashboard-ui/css/librarybrowser.css +++ b/dashboard-ui/css/librarybrowser.css @@ -1,815 +1 @@ -.hidingAnimatedTab { - visibility: hidden; -} - -.headerArrowImage { - height: 20px; - margin-left: .5em; -} - -.background-theme-b .backgroundContainer, .dialog.background-theme-b { - background-color: #121314; -} - - .background-theme-b .backgroundContainer.withBackdrop { - background-color: rgba(6, 6, 6, .94) !important; - background: linear-gradient(to right, rgba(0, 0, 0, .99), rgba(0, 0, 0, .94), rgba(0, 0, 0, .5)) !important; - } - -.ui-body-b { - /* Need the important tag for paper dialogs with this class */ - color: #fff !important; -} - -.pageWithAbsoluteTabs { - background-color: transparent !important; -} - -.backdropContainer { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: -1; -} - -.backdropImage { - /*-webkit-filter: blur(20px); - -moz-filter: blur(20px); - -o-filter: blur(20px); - -ms-filter: blur(20px); - filter: blur(20px);*/ -} - -.libraryPage .header { - padding-bottom: 0; -} - -.pageTabContent { - contain: style; -} - -.libraryPage > .ui-content { - padding-top: 10px; -} - -.pageWithAbsoluteTabs .pageTabContent { - padding-top: 2.6em; -} - -/*.pageWithAbsoluteTabs .pageTabContent { - padding-left: .5em !important; - padding-right: .5em !important; -}*/ - -.flexPageTabContent.is-active { - display: flex !important; -} - -@media all and (max-width: 600px) { - - .libraryPage > .ui-content { - padding-left: .5em !important; - padding-right: .5em !important; - } -} - -.listHeader { - margin: .25em 0; - padding-left: 2px; - line-height: 1.25em; - line-height: initial; -} - -@media all and (max-width: 500px) { - - .listHeader { - padding-left: 5px; - } -} - -.listHeader + button { - margin-left: 2em; -} - -.ehsContent, .ehsContent .pageTabContent { - margin: 0 auto; -} - -.homePageSection { - margin-bottom: 3.6em; -} - -.sectionHeaderButton { - vertical-align: middle; - margin: 0 0 .25em 1.5em; - position: relative; - top: 8px; -} - -.viewPanelTabs { - margin-bottom: 2em; -} - -@media all and (min-width: 800px) { - - .hiddenSectionOnNonMobile { - display: none; - } -} - -@media all and (min-width: 1200px) { - - .paddedItemsContainer { - padding: 0 .8em; - } -} - -.ehsContent:not(.fullWidth), .ehsContent .pageTabContent { - width: 98%; -} - -@media all and (min-width: 1200px) { - - .ehsContent:not(.fullWidth), .ehsContent .pageTabContent { - width: 96%; - } -} - -.homePageSection h1 { - padding-left: .55em; -} - -.homePageSection .itemsContainer { - padding-left: .7em; - padding-right: .7em; -} - -@media all and (min-width: 1200px) { - - .homePageSection h1 { - padding-left: 2.2vw; - } - - .homePageSection .itemsContainer { - padding-left: 2vw; - padding-right: 2vw; - } -} - -.detailPageContent { - border-spacing: 0; - border-collapse: collapse; -} - -.viewSettings { - margin: 0 0 .25em; - text-align: center; -} - -.listPaging { - text-align: center; -} - -.viewControls + .listTopPaging { - margin-left: .5em !important; -} - -.criticReview { - margin: 1.5em 0; - background: #222; - padding: .8em .8em .8em 55px; - border-radius: 5px; - position: relative; -} - - .criticReview:first-child { - margin-top: .5em; - } - - .criticReview img { - width: 30px; - } - -.criticRatingScore { - margin-bottom: .5em; -} - -.itemTag { - display: inline-block; - background-color: #333; - border-radius: 4px; - padding: 5px 7px; - margin: 0 5px 5px 0; - color: #fff !important; - text-decoration: none; - font-weight: normal !important; -} - -.itemOverview { - white-space: pre-wrap; -} - -a.itemTag:hover { - background-color: #2489ce; -} - -.itemLinks { - text-align: center; - padding: 0; -} - - .itemLinks p { - margin: .5em 0; - } - -.reviewerName { - color: #ccc; - margin-top: .5em; -} - -.reviewLink { - margin-top: .5em; -} - -.reviewDate { - margin-left: 1em; -} - -.reviewScore { - position: absolute; - left: .8em; -} - -span.itemCommunityRating:not(:empty) + .userDataIcons { - margin-left: 1.25em; -} - -.itemBackdrop { - background-size: cover; - background-position: center 15%; - background-repeat: no-repeat; - height: 45vh; - position: relative; -} - -.noSecondaryNavPage .itemBackdrop { - margin-top: -50px; -} - -.noBackdrop { - background: #181818; - height: 170px !important; -} - -.withBackdrop + .mainDrawerPanel .noBackdrop { - background-color: transparent; -} - -.itemBackdropContent { - position: absolute; - bottom: 0; - left: 0; - right: 0; - background-color: rgba(0,0,0,0.7); - min-height: 120px; -} - -.noBackdrop .itemBackdropContent { - background-color: transparent; -} - -.desktopMiscInfoContainer { - position: absolute; - bottom: 10px; -} - -.detailUserDataIcons { - display: flex; - align-items: center; -} - -.detailImageContainer { - margin-right: 2em; - width: 280px; - flex-shrink: 0; -} - -.detailPagePrimaryContent { - position: relative; - flex-grow: 1; -} - -.detailLogo { - width: 300px; - height: 70px; - position: absolute; - top: 13.5%; - right: 19.5%; - background-repeat: no-repeat; - background-position: center center; - background-size: contain; -} - -@media all and (max-width: 1400px) { - - .detailLogo { - right: 5%; - } -} - -@media all and (max-width: 1200px) { - - .detailLogo { - right: 2%; - } -} - -@media all and (max-width: 1100px) { - - .detailLogo { - display: none; - } -} - -.itemDetailImage { - border: solid 1px transparent; - width: 100%; -} - -.thumbDetailImageContainer { - width: 400px; -} - -.itemDetailImage.loaded { - -moz-box-shadow: 0px 0 20px #000; - -webkit-box-shadow: 0px 0 20px #000; - box-shadow: 0px 0 20px #000; - border: solid 1px #222; -} - -.itemDetailGalleryLink img:hover { - -moz-box-shadow: 0 0 20px 3px #52B54B; - -webkit-box-shadow: 0 0 20px 3px #52B54B; - box-shadow: 0 0 20px 3px #52B54B; -} - -@media all and (max-width: 800px) { - - .detailPageContent { - position: relative; - } - - .detailImageContainer { - position: absolute; - top: -90px; - left: 5%; - width: auto; - } - - .itemDetailImage { - height: 120px; - width: auto !important; - } - - .btnPlaySimple { - display: none !important; - } -} - -@media all and (min-width: 800px) { - - .itemBackdrop { - display: none; - } - - .detailPagePrimaryContainer { - display: flex; - margin-bottom: 3.6em; - } -} - -@media all and (max-width: 1200px) { - - .lnkSibling { - display: none !important; - } -} - -.parentName { - display: block; - margin-bottom: .5em; -} - -.emby-button.detailFloatingButton { - width: 56px !important; - height: 56px !important; - bottom: -28px; - position: absolute; - right: 5%; - background-color: #52B54B !important; - z-index: 1; -} - -.emby-button.btnFloatingRecord { - background-color: #cc3333 !important; -} - -@media all and (max-width: 800px) { - - .parentName { - margin-bottom: 1em; - } - - .itemBackdropContent { - min-height: 0; - } -} - -@media all and (min-width: 500px) { - - .mobileDetails { - display: none; - } -} - -@media all and (max-width: 500px) { - - .desktopDetails { - display: none !important; - } -} - -.itemName { - font-weight: normal !important; - margin: .5em 0; -} - -.empty { - margin: 0; -} - -.detailSection { - vertical-align: top; - margin-bottom: 3em; -} - -.detailCollapsibleSection:not(.hide) + .detailCollapsibleSection { - margin-top: -2em; -} - -.detailPageCollabsible { - margin-top: 0; -} - -.detailSection h1 { - margin-bottom: .25em; - position: relative; -} - -.detailSectionHeader { - background-clip: border-box; - padding: 0 0 .25em .25em; - background-color: transparent; - border-radius: 0; - margin-bottom: .5em; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - position: relative; - margin: 1.5em 0 1em; - display: flex; - align-items: center; -} - - .detailSectionHeader > h1 { - margin: 0; - } - -.detailSectionHeaderButton { - margin-left: 1em; -} - -.mainDetailButtons { - padding: .5em 0; - display: flex; - align-items: center; - flex-wrap: wrap; -} - - .mainDetailButtons button, .recordingFields button { - margin-left: 0; - margin-right: .5em; - flex-shrink: 0; - } - - .mainDetailButtons.hide + .recordingFields { - margin-top: 1.5em !important; - } - - .mainDetailButtons > .raised { - justify-content: center; - } - -@media all and (min-width: 400px) { - - .mainDetailButtons > .raised { - padding-left: 1.5em; - padding-right: 1.5em; - } -} - -.detailImageProgressContainer { - position: absolute; - bottom: 4px; - right: 1px; - left: 1px; - text-align: center; -} - -.viewControls, .listTopPaging { - display: inline-block; -} - -@media all and (max-width: 800px) { - - .editorMenuLink { - display: none; - } -} - -.itemMiscInfo { - text-overflow: ellipsis; - overflow: hidden; - display: flex; - flex-wrap: wrap; - align-items: center; -} - -@media all and (max-width: 500px) { - - .mobileDetails .itemMiscInfo { - text-align: center; - justify-content: center; - } - - .itemMiscInfo .endsAt { - display: none; - } -} - -.detailPageContent { - padding: 3em 3% 0; -} - -@media all and (min-width: 750px) { - .detailPageContent { - padding: 3em 3% 0; - } -} - -@media all and (min-width: 1200px) { - .detailPageContent { - padding: 3em 5% 0; - } -} - -.detailPageParentLink { - font-weight: inherit !important; -} - -.mediaInfoContent { - line-height: 1.5em; -} - -.mediaInfoStream { - margin: 1em 3em 1em 0; - display: inline-block; - color: #bbb; - vertical-align: top; -} - -.mediaInfoStreamType { - display: block; - color: #fff; - margin-bottom: 1em; -} - -.mediaInfoAttribute { - color: #fff; - display: inline-block; -} - -.mediaInfoLabel { - color: #aaa; - margin-right: 1em; - display: inline-block; -} - -.posterRibbon { - display: block; - position: absolute; - top: 5px; - right: 5px; - text-align: center; - padding: 5px 6px; - border-radius: 10px; - color: #fff; - background: rgb(0, 143, 187); - background: rgba(0, 143, 187, .8); - line-height: initial; -} - -.offlinePosterRibbon { - background: rgba(248, 58, 34, .8); -} - -.unairedPosterRibbon { - background: rgba(255, 106, 0, .8); -} - -.missingPosterRibbon { - background: rgba(248, 58, 34, .8); -} - -.recordingProgressBar::-moz-progress-bar { - background-color: #cc3333; -} - -.recordingProgressBar::-webkit-progress-value { - background-color: #cc3333; -} - -.recordingProgressBar[aria-valuenow]:before { - background-color: #cc3333; -} - -.timelineHeader { - margin-bottom: .25em; - line-height: 1.25em; - line-height: initial; -} - -.itemsContainer { - margin: 0 auto; -} - -.alphabetPicker { - position: fixed; - right: 0; - bottom: 0; - text-align: center; - font-size: 90%; - display: none; - line-height: 1; -} - -.layout-desktop .absolutePageTabContent .alphabetPicker { - right: 20px; -} - -@media all and (max-height: 500px) { - - .alphabetPicker { - display: none !important; - } -} - -@media all and (min-height: 500px) { - - .itemsContainerWithAlphaPicker { - margin-right: 20px; - } - - .absolutePageTabContent .itemsContainerWithAlphaPicker { - margin-right: 30px; - } -} - -@media all and (min-height: 500px) { - - .alphabetPicker { - bottom: 5px; - } -} - -@media all and (min-width: 1200px) { - - .itemsContainerWithAlphaPicker, .absolutePageTabContent .itemsContainerWithAlphaPicker { - margin-right: 0; - } -} - -@media all and (max-height: 700px) { - - .alphaPicker-vertical .alphaPickerButton { - padding-top: 1px !important; - padding-bottom: 1px !important; - } -} - -@media all and (max-height: 600px) { - - .alphaPicker-vertical .alphaPickerButton { - padding-top: 0 !important; - padding-bottom: 0 !important; - } -} - -@media all and (max-height: 530px) { - - .alphabetPicker { - font-size: 80%; - } -} - -@media all and (max-height: 480px) { - - .alphabetPicker { - font-size: 76%; - } -} - -@media all and (min-height: 900px) { - - .alphabetPicker { - bottom: 120px; - } -} - -@media all and (min-height: 1000px) { - - .alphabetPicker { - bottom: 200px; - } -} - -@media all and (max-width: 1200px) { - - .listViewUserDataButtons { - display: none !important; - } -} - -.userProfileSettingsForm { - max-width: 700px; -} - -@media all and (max-width: 700px) { - - .userProfileSettingsForm .detailSection { - margin-left: .5em; - margin-right: .5em; - } -} - -@media all and (max-width: 800px) { - - .detailsHiddenOnMobile { - display: none; - } -} - -#criticReviewsContent.hiddenScrollX { - white-space: nowrap; -} - - #criticReviewsContent.hiddenScrollX .paperList { - min-width: 240px; - width: 90%; - max-width: 500px; - display: inline-block; - vertical-align: top; - margin: 0 4px 0 0; - } - -.btnSyncComplete { - background: #673AB7 !important; -} - - .btnSyncComplete i { - border-radius: 1000px; - } - -.bulletSeparator { - margin: 0 .35em; -} - -.mediaInfoIcons { - display: flex; - align-items: center; - margin: 1.5em 0 1em; - flex-wrap: wrap; -} - -.mediaInfoText { - padding: .3em .5em !important; - margin-right: .5em; - margin-bottom: .5em; - font-size: 94% !important; -} - -.mediaInfoText-upper { - text-transform: uppercase; -} +.itemTag,.ui-body-b{color:#fff!important}.itemName,.itemTag{font-weight:400!important}.detailSectionHeader,.itemMiscInfo{-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden}.alphabetPicker,.itemLinks,.listPaging,.posterRibbon,.viewSettings{text-align:center}.hidingAnimatedTab{visibility:hidden}.headerArrowImage{height:20px;margin-left:.5em}.background-theme-b .backgroundContainer,.dialog.background-theme-b{background-color:#121314}.background-theme-b .backgroundContainer.withBackdrop{background-color:rgba(6,6,6,.94)!important;background:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.99)),color-stop(rgba(0,0,0,.94)),to(rgba(0,0,0,.5)))!important;background:-webkit-linear-gradient(left,rgba(0,0,0,.99),rgba(0,0,0,.94),rgba(0,0,0,.5))!important;background:-o-linear-gradient(left,rgba(0,0,0,.99),rgba(0,0,0,.94),rgba(0,0,0,.5))!important;background:linear-gradient(to right,rgba(0,0,0,.99),rgba(0,0,0,.94),rgba(0,0,0,.5))!important}.pageWithAbsoluteTabs{background-color:transparent!important}.backdropContainer{position:fixed;top:0;left:0;right:0;bottom:0;z-index:-1}.libraryPage .header{padding-bottom:0}.pageTabContent{contain:style}.libraryPage>.ui-content{padding-top:10px}.pageWithAbsoluteTabs .pageTabContent{padding-top:2.6em}.flexPageTabContent.is-active{display:-webkit-box!important;display:-webkit-flex!important;display:flex!important}@media all and (max-width:600px){.libraryPage>.ui-content{padding-left:.5em!important;padding-right:.5em!important}}.listHeader{margin:.25em 0;padding-left:2px;line-height:1.25em;line-height:initial}@media all and (max-width:500px){.listHeader{padding-left:5px}}.listHeader+button{margin-left:2em}.ehsContent,.ehsContent .pageTabContent{margin:0 auto}.homePageSection{margin-bottom:3.6em}.sectionHeaderButton{vertical-align:middle;margin:0 0 .25em 1.5em;position:relative;top:8px}.viewPanelTabs{margin-bottom:2em}@media all and (min-width:800px){.hiddenSectionOnNonMobile{display:none}}.ehsContent .pageTabContent,.ehsContent:not(.fullWidth){width:98%}@media all and (min-width:1200px){.paddedItemsContainer{padding:0 .8em}.ehsContent .pageTabContent,.ehsContent:not(.fullWidth){width:96%}}.homePageSection h1{padding-left:.55em}.homePageSection .itemsContainer{padding-left:.7em;padding-right:.7em}@media all and (min-width:1200px){.homePageSection h1{padding-left:2.2vw}.homePageSection .itemsContainer{padding-left:2vw;padding-right:2vw}}.viewSettings{margin:0 0 .25em}.viewControls+.listTopPaging{margin-left:.5em!important}.criticReview{margin:1.5em 0;background:#222;padding:.8em .8em .8em 55px;-webkit-border-radius:5px;border-radius:5px;position:relative}.criticReview:first-child{margin-top:.5em}.criticReview img{width:30px}.criticRatingScore{margin-bottom:.5em}.itemTag{display:inline-block;background-color:#333;-webkit-border-radius:4px;border-radius:4px;padding:5px 7px;margin:0 5px 5px 0;text-decoration:none}.detailSectionHeader,.detailUserDataIcons{display:-webkit-box;display:-webkit-flex;-webkit-box-align:center}.itemOverview{white-space:pre-wrap}a.itemTag:hover{background-color:#2489ce}.itemLinks{padding:0}.itemLinks p{margin:.5em 0}.reviewLink,.reviewerName{margin-top:.5em}.reviewerName{color:#ccc}.reviewDate{margin-left:1em}.reviewScore{position:absolute;left:.8em}span.itemCommunityRating:not(:empty)+.userDataIcons{margin-left:1.25em}.itemBackdrop{-webkit-background-size:cover;background-size:cover;background-position:center 15%;background-repeat:no-repeat;height:45vh;position:relative}.noSecondaryNavPage .itemBackdrop{margin-top:-50px}.noBackdrop{background:#181818;height:170px!important}.withBackdrop+.mainDrawerPanel .noBackdrop{background-color:transparent}.itemBackdropContent{position:absolute;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.7);min-height:120px}.noBackdrop .itemBackdropContent{background-color:transparent}.desktopMiscInfoContainer{position:absolute;bottom:10px}.detailUserDataIcons{display:flex;-webkit-align-items:center;align-items:center}.detailImageContainer{margin-right:2em;width:280px;-webkit-flex-shrink:0;flex-shrink:0}.detailPagePrimaryContent{position:relative;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}.detailLogo{width:300px;height:70px;position:absolute;top:13.5%;right:19.5%;background-repeat:no-repeat;background-position:center center;-webkit-background-size:contain;background-size:contain}@media all and (max-width:1400px){.detailLogo{right:5%}}@media all and (max-width:1100px){.detailLogo{display:none}}.itemDetailImage{border:1px solid transparent;width:100%}.thumbDetailImageContainer{width:400px}.itemDetailImage.loaded{-webkit-box-shadow:0 0 20px #000;box-shadow:0 0 20px #000;border:1px solid #222}.itemDetailGalleryLink img:hover{-webkit-box-shadow:0 0 20px 3px #52B54B;box-shadow:0 0 20px 3px #52B54B}@media all and (max-width:800px){.detailPageContent{position:relative}.detailImageContainer{position:absolute;top:-90px;left:5%;width:auto}.itemDetailImage{height:120px;width:auto!important}.btnPlaySimple{display:none!important}}@media all and (min-width:800px){.itemBackdrop{display:none}.detailPagePrimaryContainer{display:-webkit-box;display:-webkit-flex;display:flex;margin-bottom:3.6em}}@media all and (max-width:1200px){.detailLogo{right:2%}.lnkSibling{display:none!important}}.parentName{display:block;margin-bottom:.5em}.emby-button.detailFloatingButton{width:56px!important;height:56px!important;bottom:-28px;position:absolute;right:5%;background-color:#52B54B!important;z-index:1}.emby-button.btnFloatingRecord{background-color:#c33!important}@media all and (max-width:800px){.parentName{margin-bottom:1em}.itemBackdropContent{min-height:0}}@media all and (min-width:500px){.mobileDetails{display:none}}@media all and (max-width:500px){.desktopDetails{display:none!important}}.itemName{margin:.5em 0}.empty{margin:0}.detailSection{vertical-align:top;margin-bottom:3em}.detailCollapsibleSection:not(.hide)+.detailCollapsibleSection{margin-top:-2em}.detailPageCollabsible{margin-top:0}.detailSection h1{margin-bottom:.25em;position:relative}.detailSectionHeader{-webkit-background-clip:border-box;background-clip:border-box;padding:0 0 .25em .25em;background-color:transparent;-webkit-border-radius:0;border-radius:0;white-space:nowrap;position:relative;margin:1.5em 0 1em;display:flex;-webkit-align-items:center;align-items:center}.detailSectionHeader>h1{margin:0}.detailSectionHeaderButton{margin-left:1em}.mainDetailButtons{padding:.5em 0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-flex-wrap:wrap;flex-wrap:wrap}.mainDetailButtons button,.recordingFields button{margin-left:0;margin-right:.5em;-webkit-flex-shrink:0;flex-shrink:0}.mainDetailButtons.hide+.recordingFields{margin-top:1.5em!important}.mainDetailButtons>.raised{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}@media all and (min-width:400px){.mainDetailButtons>.raised{padding-left:1.5em;padding-right:1.5em}}.detailImageProgressContainer{position:absolute;bottom:4px;right:1px;left:1px;text-align:center}.listTopPaging,.viewControls{display:inline-block}@media all and (max-width:800px){.editorMenuLink{display:none}}.itemMiscInfo{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-webkit-align-items:center;align-items:center}@media all and (max-width:500px){.mobileDetails .itemMiscInfo{text-align:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.itemMiscInfo .endsAt{display:none}}.detailPageContent{border-spacing:0;border-collapse:collapse;padding:3em 3% 0}@media all and (min-width:750px){.detailPageContent{padding:3em 3% 0}}@media all and (min-width:1200px){.detailPageContent{padding:3em 5% 0}}.detailPageParentLink{font-weight:inherit!important}.mediaInfoContent{line-height:1.5em}.mediaInfoStream{margin:1em 3em 1em 0;display:inline-block;color:#bbb;vertical-align:top}.mediaInfoStreamType{display:block;color:#fff;margin-bottom:1em}.mediaInfoAttribute{color:#fff;display:inline-block}.mediaInfoLabel{color:#aaa;margin-right:1em;display:inline-block}.posterRibbon{display:block;position:absolute;top:5px;right:5px;padding:5px 6px;-webkit-border-radius:10px;border-radius:10px;color:#fff;background:#008fbb;background:rgba(0,143,187,.8);line-height:initial}.offlinePosterRibbon{background:rgba(248,58,34,.8)}.unairedPosterRibbon{background:rgba(255,106,0,.8)}.missingPosterRibbon{background:rgba(248,58,34,.8)}.recordingProgressBar::-moz-progress-bar{background-color:#c33}.recordingProgressBar::-webkit-progress-value{background-color:#c33}.recordingProgressBar[aria-valuenow]:before{background-color:#c33}.timelineHeader{margin-bottom:.25em;line-height:1.25em;line-height:initial}.itemsContainer{margin:0 auto}.alphabetPicker{position:fixed;right:0;bottom:0;font-size:90%;display:none;line-height:1}.layout-desktop .absolutePageTabContent .alphabetPicker{right:20px}@media all and (max-height:500px){.alphabetPicker{display:none!important}}@media all and (min-height:500px){.itemsContainerWithAlphaPicker{margin-right:20px}.absolutePageTabContent .itemsContainerWithAlphaPicker{margin-right:30px}.alphabetPicker{bottom:5px}}@media all and (min-width:1200px){.absolutePageTabContent .itemsContainerWithAlphaPicker,.itemsContainerWithAlphaPicker{margin-right:0}}@media all and (max-height:700px){.alphaPicker-vertical .alphaPickerButton{padding-top:1px!important;padding-bottom:1px!important}}@media all and (max-height:600px){.alphaPicker-vertical .alphaPickerButton{padding-top:0!important;padding-bottom:0!important}}@media all and (max-height:530px){.alphabetPicker{font-size:80%}}@media all and (max-height:480px){.alphabetPicker{font-size:76%}}@media all and (min-height:900px){.alphabetPicker{bottom:120px}}@media all and (min-height:1000px){.alphabetPicker{bottom:200px}}@media all and (max-width:1200px){.listViewUserDataButtons{display:none!important}}.userProfileSettingsForm{max-width:700px}@media all and (max-width:700px){.userProfileSettingsForm .detailSection{margin-left:.5em;margin-right:.5em}}@media all and (max-width:800px){.detailsHiddenOnMobile{display:none}}#criticReviewsContent.hiddenScrollX{white-space:nowrap}#criticReviewsContent.hiddenScrollX .paperList{min-width:240px;width:90%;max-width:500px;display:inline-block;vertical-align:top;margin:0 4px 0 0}.btnSyncComplete{background:#673AB7!important}.btnSyncComplete i{-webkit-border-radius:1000px;border-radius:1000px}.bulletSeparator{margin:0 .35em}.mediaInfoIcons{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;margin:1.5em 0 1em;-webkit-flex-wrap:wrap;flex-wrap:wrap}.mediaInfoText{padding:.3em .5em!important;margin-right:.5em;margin-bottom:.5em;font-size:94%!important}.mediaInfoText-upper{text-transform:uppercase} \ No newline at end of file diff --git a/dashboard-ui/css/librarymenu.css b/dashboard-ui/css/librarymenu.css index 05e5bfeb92..5f4dfc3cd6 100644 --- a/dashboard-ui/css/librarymenu.css +++ b/dashboard-ui/css/librarymenu.css @@ -1,341 +1 @@ -.libraryPage { - padding-top: 50px !important; -} - - .libraryPage:not(.noSecondaryNavPage) { - padding-top: 95px !important; - } - -.pageWithAbsoluteTabs:not(.noSecondaryNavPage) { - padding-top: 98px !important; -} - -.absolutePageTabContent { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - /* If this is raised, make sure it does not overlap bottom footer */ - z-index: 1; - margin: 0 !important; - /* Page needs to supply padding */ - top: 102px !important; - transition: transform 200ms ease-out; -} - - .absolutePageTabContent.headroomUnpinned { - transform: translateY(-92px); - bottom: -92px !important; - } - -.pageTabContent:not(.is-active) { - display: none !important; -} - -.sidebarDivider { - height: 1px; - background: #eaeaea; - margin: .5em 0; -} - -.headerUserImage { - background-size: contain; - background-repeat: no-repeat; - background-position: center center; - border-radius: 1000px; - vertical-align: middle; - display: inline-block; -} - -.headerUserButtonRound img { - border-radius: 1000px; -} - -.viewMenuBar paper-icon-button { - vertical-align: middle; -} - -.headerButton { - flex-shrink: 0; -} - -.menuArrow { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAbklEQ…yGDxkLaBtENI9kPMk0gaoW0Dyj0aWowFLYNYzWB6MWMAAAq1H3+Mhu2hQAAAAASUVORK5CYII=); - height: 24px; - width: 24px; - display: inline-block; -} - -.hideMainDrawer .mainDrawerButton { - display: none; -} - -.libraryMenuButtonText { - text-decoration: none; - display: inline-flex; - vertical-align: middle; - padding-left: 0 !important; - cursor: default; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - align-items: center; - margin: 0 0 0 .5em; - /* Avoid pushing right header off the screen */ - flex-shrink: 1; -} - -.viewMenuBar { - position: fixed; - right: 0; - left: 0; - z-index: 999; - top: 0; - border: 0; - height: 50px; - display: flex; - flex-direction: column; -} - -.hiddenViewMenuBar .viewMenuBar { - display: none; -} - -.libraryViewNav { - overflow: hidden; - z-index: 999; - text-align: center; - text-transform: uppercase; - white-space: nowrap; - padding: 0 0 0; - display: flex; - display: block; - text-align: center; - margin: 0 auto; - align-items: center; - font-size: 13px; -} - -.ui-body-b .libraryViewNav { - position: fixed; - right: 0; - left: 0; - top: 50px; -} - -.libraryViewNav.bottom { - top: auto !important; - bottom: 0; -} - -.viewMenuBar, .ui-body-b .libraryViewNav { - background-color: #222326; - color: #fff; -} - - .viewMenuBar .primaryIcons { - display: flex; - flex-grow: 1; - width: 100%; - align-items: center; - } - -.dashboardDocument { - font-size: 13px; -} - - .dashboardDocument .viewMenuBar { - height: auto; - } - - .dashboardDocument .viewMenuBar .primaryIcons { - padding: .7em 0; - } - - .dashboardDocument.withTallToolbar .primaryIcons { - padding-bottom: 0; - } - -.viewMenuBarTabs { - width: 100%; -} - - .viewMenuBarTabs .paperTabLink { - padding-left: 1.5em; - padding-right: 1.5em; - } - -.viewMenuBar.semiTransparent { - background-color: rgba(15, 15, 15, .3); -} - -.viewMenuLink { - text-decoration: none; - color: #eee !important; - padding: 7px .5em 6px; - display: inline-block; - vertical-align: middle; -} - - .viewMenuLink:hover { - color: #fff; - } - - .viewMenuLink:hover img { - opacity: .5; - } - - .viewMenuLink img { - height: 24px; - vertical-align: top; - } - -.viewMenuSecondary { - margin-left: auto; - display: flex; - align-items: center; -} - -.selectedMediaFolder { - background-color: #f2f2f2 !important; -} - -.ui-panel.ui-body-b { - background-color: #1D1D20; -} - -@media all and (max-width: 800px) { - - /* The sidebar isn't visible at this size, so there's no way to navigate within the editor */ - .editorViewMenu { - display: none; - } -} - -.sidebarLink { - display: block; - text-decoration: none; - color: #111 !important; - font-weight: normal !important; - vertical-align: middle; - padding: 1em 0 1em 2.4em; -} - - .sidebarLink:hover { - background: #f2f2f2; - } - - .sidebarLink.selectedSidebarLink { - background: #f2f2f2 !important; - } - -.sidebarHeader { - padding-left: 1.4em; - margin: 1.2em 0 .7em; - color: #666; -} - -body:not(.dashboardDocument) .btnNotifications { - display: none !important; -} - -.darkDrawer { - background-color: #1C1C1F !important; - /*background-color: rgba(40,40,40,.8) !important; - -webkit-backdrop-filter: blur(5px); - backdrop-filter: blur(5px);*/ -} - - .darkDrawer .sidebarLinkText, .darkDrawer .sidebarLink { - color: #fff !important; - } - - .darkDrawer .sidebarHeader { - color: #bbb !important; - } - - .darkDrawer .sidebarDivider { - background: #262626 !important; - } - - .darkDrawer .sidebarLink:hover { - background: #252528; - } - - .darkDrawer .sidebarLink.selectedSidebarLink, .darkDrawer .selectedMediaFolder { - background: #252528 !important; - color: #52B54B !important; - } - -body:not(.dashboardDocument) .headerAppsButton { - display: none; -} - -.mainDrawer-scrollContainer { - padding-bottom: 10vh; -} - -.dashboardDocument .mainDrawerPanelContent { - transition: left ease-in-out 0.3s, padding ease-in-out 0.3s; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -@media all and (min-width: 640px) { - - .mainDrawerPanel .viewMenuBarTabs { - width: auto; - padding-left: 272px; - } - - .viewMenuBarTabs .libraryViewNav { - text-align: left !important; - } - - .dashboardDocument .sidebarLink { - padding: .7em 0 .7em 2.4em; - } - - .dashboardDocument .mainDrawer { - z-index: inherit !important; - left: 0 !important; - top: 0 !important; - transform: none !important; - } - - .dashboardDocument .mainDrawer-scrollContainer { - margin-top: 50px !important; - } - - .dashboardDocument.withTallToolbar .mainDrawer-scrollContainer { - margin-top: 98px !important; - } - - .dashboardDocument .tmla-mask { - display: none !important; - } - - .dashboardDocument .mainDrawerButton { - display: none !important; - } - - .dashboardDocument .mainDrawerPanelContent { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 260px; - } - - .dashboardDocument .adminDrawerLogo { - display: none !important; - } - - .dashboardDocument .darkDrawer { - background-color: rgba(28,28,31,.3) !important; - } -} +.headerUserImage,.viewMenuBar paper-icon-button,.viewMenuLink{vertical-align:middle}.libraryPage{padding-top:50px!important}.libraryPage:not(.noSecondaryNavPage){padding-top:95px!important}.pageWithAbsoluteTabs:not(.noSecondaryNavPage){padding-top:98px!important}.absolutePageTabContent{position:absolute;left:0;right:0;bottom:0;z-index:1;margin:0!important;top:102px!important;-webkit-transition:-webkit-transform .2s ease-out;-o-transition:transform .2s ease-out;transition:transform .2s ease-out}.absolutePageTabContent.headroomUnpinned{-webkit-transform:translateY(-92px);transform:translateY(-92px);bottom:-92px!important}.pageTabContent:not(.is-active){display:none!important}.sidebarDivider{height:1px;background:#eaeaea;margin:.5em 0}.headerUserImage{-webkit-background-size:contain;background-size:contain;background-repeat:no-repeat;background-position:center center;-webkit-border-radius:1000px;border-radius:1000px;display:inline-block}.headerUserButtonRound img{-webkit-border-radius:1000px;border-radius:1000px}.headerButton{-webkit-flex-shrink:0;flex-shrink:0}.menuArrow{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAbklEQ…yGDxkLaBtENI9kPMk0gaoW0Dyj0aWowFLYNYzWB6MWMAAAq1H3+Mhu2hQAAAAASUVORK5CYII=);height:24px;width:24px;display:inline-block}.hideMainDrawer .mainDrawerButton{display:none}.libraryMenuButtonText{text-decoration:none;display:-webkit-inline-box;display:-webkit-inline-flex;display:inline-flex;vertical-align:middle;padding-left:0!important;cursor:default;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;-webkit-box-align:center;-webkit-align-items:center;align-items:center;margin:0 0 0 .5em;-webkit-flex-shrink:1;flex-shrink:1}.libraryViewNav,.viewMenuBar{z-index:999;display:-webkit-box;display:-webkit-flex}.viewMenuBar{position:fixed;right:0;left:0;top:0;border:0;height:50px;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}.hiddenViewMenuBar .viewMenuBar{display:none}.libraryViewNav{overflow:hidden;text-transform:uppercase;white-space:nowrap;padding:0;display:flex;display:block;text-align:center;margin:0 auto;-webkit-box-align:center;-webkit-align-items:center;align-items:center;font-size:13px}.ui-body-b .libraryViewNav{position:fixed;right:0;left:0;top:50px}.libraryViewNav.bottom{top:auto!important;bottom:0}.ui-body-b .libraryViewNav,.viewMenuBar{background-color:#222326;color:#fff}.viewMenuBar .primaryIcons{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;width:100%;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.dashboardDocument{font-size:13px}.dashboardDocument .viewMenuBar{height:auto}.dashboardDocument .viewMenuBar .primaryIcons{padding:.7em 0}.dashboardDocument.withTallToolbar .primaryIcons{padding-bottom:0}.viewMenuBarTabs{width:100%}.viewMenuBarTabs .paperTabLink{padding-left:1.5em;padding-right:1.5em}.viewMenuBar.semiTransparent{background-color:rgba(15,15,15,.3)}.viewMenuLink{text-decoration:none;color:#eee!important;padding:7px .5em 6px;display:inline-block}.viewMenuLink:hover{color:#fff}.viewMenuLink:hover img{opacity:.5}.viewMenuLink img{height:24px;vertical-align:top}.viewMenuSecondary{margin-left:auto;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.selectedMediaFolder{background-color:#f2f2f2!important}.ui-panel.ui-body-b{background-color:#1D1D20}@media all and (max-width:800px){.editorViewMenu{display:none}}.sidebarLink{display:block;text-decoration:none;color:#111!important;font-weight:400!important;vertical-align:middle;padding:1em 0 1em 2.4em}.sidebarLink:hover{background:#f2f2f2}.sidebarLink.selectedSidebarLink{background:#f2f2f2!important}.sidebarHeader{padding-left:1.4em;margin:1.2em 0 .7em;color:#666}body:not(.dashboardDocument) .btnNotifications{display:none!important}.darkDrawer{background-color:#1C1C1F!important}.darkDrawer .sidebarLink,.darkDrawer .sidebarLinkText{color:#fff!important}.darkDrawer .sidebarHeader{color:#bbb!important}.darkDrawer .sidebarDivider{background:#262626!important}.darkDrawer .sidebarLink:hover{background:#252528}.darkDrawer .selectedMediaFolder,.darkDrawer .sidebarLink.selectedSidebarLink{background:#252528!important;color:#52B54B!important}body:not(.dashboardDocument) .headerAppsButton{display:none}.mainDrawer-scrollContainer{padding-bottom:10vh}.dashboardDocument .mainDrawerPanelContent{-webkit-transition:left ease-in-out .3s,padding ease-in-out .3s;-o-transition:left ease-in-out .3s,padding ease-in-out .3s;transition:left ease-in-out .3s,padding ease-in-out .3s;position:absolute;top:0;right:0;bottom:0;left:0}@media all and (min-width:640px){.dashboardDocument .adminDrawerLogo,.dashboardDocument .mainDrawerButton,.dashboardDocument .tmla-mask{display:none!important}.mainDrawerPanel .viewMenuBarTabs{width:auto;padding-left:272px}.viewMenuBarTabs .libraryViewNav{text-align:left!important}.dashboardDocument .sidebarLink{padding:.7em 0 .7em 2.4em}.dashboardDocument .mainDrawer{z-index:inherit!important;left:0!important;top:0!important;-webkit-transform:none!important;transform:none!important}.dashboardDocument .mainDrawer-scrollContainer{margin-top:50px!important}.dashboardDocument.withTallToolbar .mainDrawer-scrollContainer{margin-top:98px!important}.dashboardDocument .mainDrawerPanelContent{position:absolute;top:0;right:0;bottom:0;left:260px}.dashboardDocument .darkDrawer{background-color:rgba(28,28,31,.3)!important}} \ No newline at end of file diff --git a/dashboard-ui/css/livetv.css b/dashboard-ui/css/livetv.css index 56f8d61187..d35cb6d4bd 100644 --- a/dashboard-ui/css/livetv.css +++ b/dashboard-ui/css/livetv.css @@ -1,9 +1 @@ -/* Allow vertical space for anything that slides up at the bottom */ -.guideVerticalScroller { - padding-bottom: 160px; -} - -.tvGuideHeader.headroom--unpinned { - -webkit-transform: none; - transform: none; -} +.guideVerticalScroller{padding-bottom:160px}.tvGuideHeader.headroom--unpinned{-webkit-transform:none;transform:none} \ No newline at end of file diff --git a/dashboard-ui/css/metadataeditor.css b/dashboard-ui/css/metadataeditor.css index e03353eddb..699342c4bb 100644 --- a/dashboard-ui/css/metadataeditor.css +++ b/dashboard-ui/css/metadataeditor.css @@ -1,221 +1 @@ -.editorTab { - padding-bottom: 200px; -} - -.editPageContent { - padding: 0; -} - -.editPageInnerContent { - padding: 0 15px 100px; -} - -.editPageName { - margin: .5em 0 0; -} - -.editPageSidebar { - display: none; -} - -.libraryTree { - margin-left: .25em; -} - -.offlineEditorNode { - color: #cc3333; -} - -.editorNode img { - height: 18px; - margin: 0 .35em; - vertical-align: middle; - position: relative; - top: -2px; -} - -.remoteImageContainer { - display: inline-block; - margin: 5px; - vertical-align: top; -} - -.remoteImageDetails { - text-align: left; - background: #282828; - position: relative; - padding: 5px 5px 2px; -} - - .remoteImageDetails paper-icon-button { - position: absolute; - bottom: 0; - right: 0; - } - -.remoteImageDetailText { - padding: 5px 5px; -} - - .remoteImageDetailText + .remoteImageDetailText { - color: #ccc; - } - -.remoteImage { - background-position: center bottom; - background-repeat: no-repeat; - background-size: contain; - display: block; - /* For the box shadow so that the bottom border isnt underneath the text */ - z-index: 100000; - position: relative; -} - -.remotePosterImage { - width: 140px; - height: 210px; -} - -.remoteBackdropImage { - width: 272px; - height: 153px; -} - -.remoteBannerImage { - width: 272px; - height: 50px; -} - -.remoteDiscImage { - width: 180px; - height: 180px; -} - -@media all and (min-width: 600px) { - - .remotePosterImage { - width: 160px; - height: 240px; - } -} - -@media all and (min-width: 1200px) { - - .remotePosterImage { - width: 200px; - height: 300px; - } - - .remoteBackdropImage { - width: 320px; - height: 180px; - } - - .remoteDiscImage { - width: 240px; - height: 240px; - } - - .remoteBannerImage { - width: 544px; - height: 100px; - } -} - -.editorfieldDescription { - color: #ccc; -} - -.searchImage { - background-position: center bottom; - background-repeat: no-repeat; - background-size: contain; - display: block; -} - -.searchBackdropImageContainer { - width: 160px; -} - -.searchDiscImageContainer { - width: 150px; -} - -.searchPosterImageContainer { - width: 140px; -} - -.searchBackdropImageContainer .searchImage { - height: 90px; -} - -.searchDiscImageContainer .searchImage { - height: 150px; -} - -.searchPosterImageContainer .searchImage { - height: 210px; -} - -.searchImageContainer .remoteImageDetails { - overflow-x: hidden; - text-overflow: ellipsis; -} - -.jstree-anchor { - font-weight: normal !important; -} - -.jstree-wholerow-hovered { - background: #38c !important; - border-radius: 0 !important; - box-shadow: none !important; -} - -.jstree-default .jstree-hovered { - background: none !important; - border-radius: 0 !important; - box-shadow: none !important; - color: #fff !important; -} - -.jstree-default .jstree-wholerow-clicked { - background: #52B54B !important; -} - -@media all and (min-width: 600px) { - - .remoteBannerImage { - width: 450px; - height: 83px; - } -} - -@media all and (min-width: 800px) { - - .editPageSidebar { - position: fixed; - top: 54px; - bottom: 0; - left: 0; - width: 30%; - display: block; - border-right: 1px solid #555; - } - - .editPageInnerContent { - float: right; - width: 67.5%; - } -} - -@media all and (min-width: 1800px) { - - .editPageSidebar { - width: 25%; - } - - .editPageInnerContent { - width: 72.5%; - } -} \ No newline at end of file +.editorTab{padding-bottom:200px}.editPageContent{padding:0}.editPageInnerContent{padding:0 15px 100px}.editPageName{margin:.5em 0 0}.editPageSidebar{display:none}.libraryTree{margin-left:.25em}.offlineEditorNode{color:#c33}.editorfieldDescription,.remoteImageDetailText+.remoteImageDetailText{color:#ccc}.editorNode img{height:18px;margin:0 .35em;vertical-align:middle;position:relative;top:-2px}.remoteImageContainer{display:inline-block;margin:5px;vertical-align:top}.remoteImageDetails{text-align:left;background:#282828;position:relative;padding:5px 5px 2px}.remoteImage,.searchImage{background-position:center bottom;background-repeat:no-repeat;display:block}.remoteImageDetails paper-icon-button{position:absolute;bottom:0;right:0}.remoteImageDetailText{padding:5px}.remoteImage{-webkit-background-size:contain;background-size:contain;z-index:100000;position:relative}.remotePosterImage{width:140px;height:210px}.remoteBackdropImage{width:272px;height:153px}.remoteBannerImage{width:272px;height:50px}.remoteDiscImage{width:180px;height:180px}@media all and (min-width:600px){.remotePosterImage{width:160px;height:240px}}@media all and (min-width:1200px){.remotePosterImage{width:200px;height:300px}.remoteBackdropImage{width:320px;height:180px}.remoteDiscImage{width:240px;height:240px}.remoteBannerImage{width:544px;height:100px}}.searchImage{-webkit-background-size:contain;background-size:contain}.searchBackdropImageContainer{width:160px}.searchDiscImageContainer{width:150px}.searchPosterImageContainer{width:140px}.searchBackdropImageContainer .searchImage{height:90px}.searchDiscImageContainer .searchImage{height:150px}.searchPosterImageContainer .searchImage{height:210px}.searchImageContainer .remoteImageDetails{overflow-x:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.jstree-anchor{font-weight:400!important}.jstree-wholerow-hovered{background:#38c!important;-webkit-border-radius:0!important;border-radius:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.jstree-default .jstree-hovered{background:0 0!important;-webkit-border-radius:0!important;border-radius:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff!important}.jstree-default .jstree-wholerow-clicked{background:#52B54B!important}@media all and (min-width:600px){.remoteBannerImage{width:450px;height:83px}}@media all and (min-width:800px){.editPageSidebar{position:fixed;top:54px;bottom:0;left:0;width:30%;display:block;border-right:1px solid #555}.editPageInnerContent{float:right;width:67.5%}}@media all and (min-width:1800px){.editPageSidebar{width:25%}.editPageInnerContent{width:72.5%}} \ No newline at end of file diff --git a/dashboard-ui/css/notifications.css b/dashboard-ui/css/notifications.css index 0ac0205781..0763705f50 100644 --- a/dashboard-ui/css/notifications.css +++ b/dashboard-ui/css/notifications.css @@ -1,35 +1 @@ -.btnNotifications { - text-decoration: none !important; - outline: 0 !important; - vertical-align: middle; - width: auto; - margin: 0; - padding-top: 0; - padding-bottom: 0; -} - -.btnNotificationsInner { - color: #fff; - font-weight: 500; - position: relative; - border-radius: 1000px; - background: #444; - line-height: 28px; - min-width: 30px; - display: inline-flex; - align-items: center; - justify-content: center; - text-align: center; -} - -.levelNormal { - background-color: #43A047; -} - -.levelWarning { - background-color: #FF7537; -} - -.levelError { - background-color: #d14836; -} \ No newline at end of file +.btnNotifications{text-decoration:none!important;outline:0!important;vertical-align:middle;width:auto;margin:0;padding-top:0;padding-bottom:0}.btnNotificationsInner{color:#fff;font-weight:500;position:relative;-webkit-border-radius:1000px;border-radius:1000px;background:#444;line-height:28px;min-width:30px;display:-webkit-inline-box;display:-webkit-inline-flex;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;text-align:center}.levelNormal{background-color:#43A047}.levelWarning{background-color:#FF7537}.levelError{background-color:#d14836} \ No newline at end of file diff --git a/dashboard-ui/css/nowplaying.css b/dashboard-ui/css/nowplaying.css index 86982cf2a7..f472dc768c 100644 --- a/dashboard-ui/css/nowplaying.css +++ b/dashboard-ui/css/nowplaying.css @@ -1,172 +1 @@ -/*.nowPlayingPage { - padding-top: 1em !important; -}*/ - -.remoteControlContent { - padding: 1em 0 0; - max-width: 96%; -} - -.nowPlayingInfoContainer { - display: flex; - flex-direction: row; -} - -.nowPlayingPageTitle { - margin: 0 0 .5em .5em; -} - -.nowPlayingPositionSliderContainer { - margin: .7em 0 .7em 1em; -} - -.nowPlayingInfoButtons { - display: flex; - align-items: center; - flex-wrap: wrap; - font-size: 130%; -} - -.nowPlayingPageImageContainer { - width: 20%; - margin-right: .25em; - position: relative; - flex-shrink: 0; -} - -@media all and (min-width: 800px) { - - .nowPlayingPageImageContainer { - width: 16%; - } -} - -.nowPlayingInfoControls { - flex-grow: 1; - display: flex; - flex-direction: column; - justify-content: center; -} - -.nowPlayingPageImage { - /*position: absolute;*/ - bottom: 0; - left: 0; - right: 0; - width: 100%; - -moz-box-shadow: 0 0 1.9vh #000; - -webkit-box-shadow: 0 0 1.9vh #000; - box-shadow: 0 0 1.9vh #000; - border: solid 1px #222; - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; -} - -@media all and (orientation: portrait) and (max-width: 800px) { - - .remoteControlContent { - padding-top: 0; - } - - .nowPlayingInfoContainer { - flex-direction: column !important; - align-items: center; - } - - .nowPlayingPageTitle { - text-align: center; - margin: .5em 0 .75em 0; - } - - .nowPlayingPositionSliderContainer { - margin: .7em 1em; - } - - .nowPlayingInfoButtons { - justify-content: center; - } - - .nowPlayingPageImageContainer { - width: auto; - margin-right: 0; - } - - .nowPlayingInfoControls { - margin-top: 1em; - } - - .nowPlayingPageImage { - width: auto; - height: 36vh; - } -} - -.nowPlayingTime { - display: flex; - align-items: center; - margin: 0 1em; -} - -.nowPlayingSecondaryButtons { - display: flex; - align-items: center; -} - -@media all and (min-width: 800px) { - - .nowPlayingSecondaryButtons { - flex-grow: 1; - justify-content: flex-end; - } -} - -@media all and (min-width: 1280px) { - - .nowPlayingPageImageContainer { - margin-right: .75em; - } -} - -.nowPlayingNavButtonContainer { - width: 400px; -} - -.nowPlayingPageRepeatActive { - color: #2ad !important; -} - -.smallBackdropPosterItem .cardOverlayInner > div { - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} - -.playlistIndexIndicatorImage { - background-size: initial !important; - background-image: url(images/ani_equalizer_white.gif) !important; -} - -.hideVideoButtons .videoButton { - display: none; -} - -.nowPlayingCastIcon { - font-size: 86%; -} - -.nowPlayingVolumeSliderContainer { - width: 6em; -} - - - -@media all and (max-width: 400px) { - - .playlist .listItemMediaInfo { - display: none !important; - } -} +.remoteControlContent{padding:1em 0 0;max-width:96%}.nowPlayingInfoContainer{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row}.nowPlayingPageTitle{margin:0 0 .5em .5em}.nowPlayingPositionSliderContainer{margin:.7em 0 .7em 1em}.nowPlayingInfoButtons{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-flex-wrap:wrap;flex-wrap:wrap;font-size:130%}.nowPlayingInfoControls,.nowPlayingTime{display:-webkit-box;display:-webkit-flex}.nowPlayingPageImageContainer{width:20%;margin-right:.25em;position:relative;-webkit-flex-shrink:0;flex-shrink:0}@media all and (min-width:800px){.nowPlayingPageImageContainer{width:16%}}.nowPlayingInfoControls{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.nowPlayingPageImage{bottom:0;left:0;right:0;width:100%;-webkit-box-shadow:0 0 1.9vh #000;box-shadow:0 0 1.9vh #000;border:1px solid #222;user-drag:none;user-select:none;-moz-user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none}@media all and (orientation:portrait) and (max-width:800px){.remoteControlContent{padding-top:0}.nowPlayingInfoContainer{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;flex-direction:column!important;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.nowPlayingPageTitle{text-align:center;margin:.5em 0 .75em}.nowPlayingPositionSliderContainer{margin:.7em 1em}.nowPlayingInfoButtons{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.nowPlayingPageImageContainer{width:auto;margin-right:0}.nowPlayingInfoControls{margin-top:1em}.nowPlayingPageImage{width:auto;height:36vh}}.nowPlayingTime{display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;margin:0 1em}.nowPlayingSecondaryButtons{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}@media all and (min-width:800px){.nowPlayingSecondaryButtons{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-box-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}}@media all and (min-width:1280px){.nowPlayingPageImageContainer{margin-right:.75em}}.nowPlayingNavButtonContainer{width:400px}.nowPlayingPageRepeatActive{color:#2ad!important}.smallBackdropPosterItem .cardOverlayInner>div{white-space:nowrap;-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden}.playlistIndexIndicatorImage{-webkit-background-size:initial initial!important;background-size:initial!important;background-image:url(images/ani_equalizer_white.gif)!important}.hideVideoButtons .videoButton{display:none}.nowPlayingCastIcon{font-size:86%}.nowPlayingVolumeSliderContainer{width:6em}@media all and (max-width:400px){.playlist .listItemMediaInfo{display:none!important}} \ No newline at end of file diff --git a/dashboard-ui/css/nowplayingbar.css b/dashboard-ui/css/nowplayingbar.css index f8da4f4727..79a980ae04 100644 --- a/dashboard-ui/css/nowplayingbar.css +++ b/dashboard-ui/css/nowplayingbar.css @@ -1,264 +1 @@ -.nowPlayingText { - display: inline-block; - position: relative; - top: -7px; - margin: 0 0 0 3px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - vertical-align: middle; - text-align: left; - max-width: 130px; -} - -.mediaButton.active { - color: #52B54B; -} - -@media (min-width: 500px) { - .nowPlayingText { - max-width: 180px; - } -} - -@media (min-width: 600px) { - .nowPlayingText { - max-width: 200px; - } -} - -@media (min-width: 800px) { - .nowPlayingText { - margin-right: 30px; - } -} - -.nowPlayingBarInfoContainer { - display: flex; - align-items: center; -} - -.currentTime { - display: inline-block; - vertical-align: middle; - max-width: 110px; - margin-right: 2em; - font-weight: normal; -} - -/* Now playing bar */ -.nowPlayingBar { - /* Above everything, except for the video player and popup overlays */ - color: #fff; - text-align: center; - /*box-shadow: 0 -2px 2px 0 rgba(0,0,0,.14),-1px 5px 1px rgba(0,0,0,.12);*/ - will-change: transform; - contain: layout style; - font-size: 90%; - transition: transform 200ms ease-out; -} - -.nowPlayingBar-hidden { - transform: translate3d(0,100%,0); -} - -.hiddenNowPlayingBar .nowPlayingBar { - display: none !important; -} - -.nowPlayingBarTop { - display: flex; - flex-direction: row; - align-items: center; -} - -.mediaButton, .nowPlayingBarUserDataButtons .btnUserItemRating { - vertical-align: middle; - color: #e8e8e8; - margin: 0; - text-align: center; -} - - .mediaButton i { - height: 1em; - width: 1em; - font-size: 36px; - } - - .mediaButton.muteButton i, .mediaButton.unmuteButton i, .mediaButton.castButton i, .mediaButton.infoButton i { - font-size: 24px; - } - -.nowPlayingImage { - display: inline-block; - vertical-align: middle; - margin-right: 1em; -} - - .nowPlayingImage img { - vertical-align: bottom; - } - - .nowPlayingImage img { - height: 64px; - } - -.nowPlayingBar .nowPlayingImage { - width: 64px; - height: 64px; - background-position: center center; - background-repeat: no-repeat; - background-size: contain; -} - -.nowPlayingBarText { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - vertical-align: middle; - text-align: left; - max-width: 130px; - flex-grow: 1; -} - -.repeatActive { - color: #52B54B; -} - -@media (min-width: 500px) { - .nowPlayingBarText { - max-width: 180px; - } -} - -@media (min-width: 600px) { - .nowPlayingBarText { - max-width: 200px; - } -} - -@media (min-width: 700px) { - .nowPlayingBarText { - max-width: 240px; - } -} - -@media (min-width: 800px) { - .nowPlayingBarText { - max-width: 300px; - margin-right: 30px; - } -} - -@media (min-width: 900px) { - .nowPlayingBarText { - max-width: 400px; - } -} - -.nowPlayingBarCenter { - vertical-align: middle; - text-align: center; - margin-top: 6px; - /* Need this to make sure it's on top of nowPlayingBarPositionContainer so that buttons are fully clickable */ - z-index: 2; - position: absolute; - left: 200px; - right: 200px; - top: 0; -} - -.nowPlayingBarPositionContainer { - position: absolute !important; - left: 64px; - top: -8px; - right: 0; - z-index: 1; -} - - .nowPlayingBarPositionContainer .mdl-slider__background-upper { - background: #333; - } - -.headroom--unpinned .nowPlayingBarPositionContainer { - display: none; -} - -.noMediaProgress .nowPlayingBarPositionContainer { - display: none; -} - -.nowPlayingBarRight { - position: relative; - margin: 0 1em 0 auto; - /* Need this to make sure it's on top of nowPlayingBarPositionContainer so that buttons are fully clickable */ - z-index: 2; - display: flex; - align-items: center; -} - -.nowPlayingBarCurrentTime { - vertical-align: middle; - font-weight: normal; - text-align: center; - display: inline-block; - margin: 0 auto; - padding-left: 50px; -} - -.nowPlayingBarVolumeSliderContainer { - margin-right: 2em; -} - -.nowPlayingBarUserDataButtons { - display: inline-block; - margin-left: 2em; - margin-right: 2em; -} - - -@media all and (max-width: 1400px) { - - .nowPlayingBarUserDataButtons { - display: none; - } -} - -@media all and (max-width: 1100px) { - - .nowPlayingBarVolumeSliderContainer, .nowPlayingBar .muteButton, .nowPlayingBar .unmuteButton { - display: none !important; - } -} - -@media all and (max-width: 800px) { - - .nowPlayingBarCurrentTime { - padding-left: 0; - top: 22px; - right: 140px; - position: absolute; - } - - .nowPlayingBarCenter > *:not(.nowPlayingBarCurrentTime) { - display: none !important; - } - - .toggleRepeatButton { - display: none; - } -} - -@media all and (min-width: 800px) { - - .nowPlayingBarRight .playPauseButton { - display: none; - } -} - -@media all and (max-width: 600px) { - - .nowPlayingBarCurrentTime { - display: none; - } -} +.nowPlayingBarText,.nowPlayingText{overflow:hidden;white-space:nowrap;-o-text-overflow:ellipsis;text-overflow:ellipsis}.nowPlayingText{display:inline-block;position:relative;top:-7px;margin:0 0 0 3px;vertical-align:middle;text-align:left;max-width:130px}.mediaButton.active{color:#52B54B}@media (min-width:500px){.nowPlayingText{max-width:180px}}@media (min-width:600px){.nowPlayingText{max-width:200px}}@media (min-width:800px){.nowPlayingText{margin-right:30px}}.nowPlayingBarInfoContainer{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.currentTime{display:inline-block;vertical-align:middle;max-width:110px;margin-right:2em;font-weight:400}.nowPlayingBar{color:#fff;text-align:center;will-change:transform;contain:layout style;font-size:90%;-webkit-transition:-webkit-transform .2s ease-out;-o-transition:transform .2s ease-out;transition:transform .2s ease-out}.nowPlayingBar-hidden{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.hiddenNowPlayingBar .nowPlayingBar{display:none!important}.nowPlayingBarTop{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.mediaButton,.nowPlayingBarUserDataButtons .btnUserItemRating{vertical-align:middle;color:#e8e8e8;margin:0;text-align:center}.mediaButton i{height:1em;width:1em;font-size:36px}.mediaButton.castButton i,.mediaButton.infoButton i,.mediaButton.muteButton i,.mediaButton.unmuteButton i{font-size:24px}.nowPlayingImage{display:inline-block;vertical-align:middle;margin-right:1em}.nowPlayingImage img{vertical-align:bottom;height:64px}.nowPlayingBar .nowPlayingImage{width:64px;height:64px;background-position:center center;background-repeat:no-repeat;-webkit-background-size:contain;background-size:contain}.nowPlayingBarText{vertical-align:middle;text-align:left;max-width:130px;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}.repeatActive{color:#52B54B}@media (min-width:500px){.nowPlayingBarText{max-width:180px}}@media (min-width:600px){.nowPlayingBarText{max-width:200px}}@media (min-width:700px){.nowPlayingBarText{max-width:240px}}@media (min-width:800px){.nowPlayingBarText{max-width:300px;margin-right:30px}}@media (min-width:900px){.nowPlayingBarText{max-width:400px}}.nowPlayingBarCenter{vertical-align:middle;text-align:center;margin-top:6px;z-index:2;position:absolute;left:200px;right:200px;top:0}.nowPlayingBarPositionContainer{position:absolute!important;left:64px;top:-8px;right:0;z-index:1}.nowPlayingBarPositionContainer .mdl-slider__background-upper{background:#333}.headroom--unpinned .nowPlayingBarPositionContainer,.noMediaProgress .nowPlayingBarPositionContainer{display:none}.nowPlayingBarRight{position:relative;margin:0 1em 0 auto;z-index:2;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.nowPlayingBarCurrentTime{vertical-align:middle;font-weight:400;text-align:center;display:inline-block;margin:0 auto;padding-left:50px}.nowPlayingBarVolumeSliderContainer{margin-right:2em}.nowPlayingBarUserDataButtons{display:inline-block;margin-left:2em;margin-right:2em}@media all and (max-width:1400px){.nowPlayingBarUserDataButtons{display:none}}@media all and (max-width:1100px){.nowPlayingBar .muteButton,.nowPlayingBar .unmuteButton,.nowPlayingBarVolumeSliderContainer{display:none!important}}@media all and (max-width:800px){.nowPlayingBarCurrentTime{padding-left:0;top:22px;right:140px;position:absolute}.nowPlayingBarCenter>:not(.nowPlayingBarCurrentTime){display:none!important}.toggleRepeatButton{display:none}}@media all and (min-width:800px){.nowPlayingBarRight .playPauseButton{display:none}}@media all and (max-width:600px){.nowPlayingBarCurrentTime{display:none}} \ No newline at end of file diff --git a/dashboard-ui/css/site.css b/dashboard-ui/css/site.css index 704d9e4de1..6bf9ffdbbb 100644 --- a/dashboard-ui/css/site.css +++ b/dashboard-ui/css/site.css @@ -1,344 +1 @@ -.backgroundContainer { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - contain: layout style; -} - -/* Links */ -.ui-body-b a { - color: #52B54B /*{b-link-color}*/; - font-weight: 500; -} - - .ui-body-b a:visited { - color: #52B54B /*{b-link-visited}*/; - } - - .ui-body-b a:hover { - color: #2E7D32 /*{b-link-hover}*/; - } - - .ui-body-b a:active { - color: #2E7D32 /*{b-link-active}*/; - } - -/* Remove IE mobile 300ms tap delay */ -html { - -ms-touch-action: manipulation; - touch-action: manipulation; - /* Prevent white flickering */ - background-color: #242424; - /* Normalize for different browsers */ - margin: 0; - padding: 0; - height: 100%; - font-family: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Oxygen-Sans", "Ubuntu", "Cantarell", "Helvetica Neue", 'Open Sans', sans-serif; - font-size: 88%; -} - -h1 { - font-family: -apple-system-headline, BlinkMacSystemFont, "Roboto", "Segoe UI", "Oxygen-Sans", "Ubuntu", "Cantarell", "Helvetica Neue", 'Open Sans', sans-serif; -} - -h2 { - font-family: -apple-system-subheadline, BlinkMacSystemFont, "Roboto", "Segoe UI", "Oxygen-Sans", "Ubuntu", "Cantarell", "Helvetica Neue", 'Open Sans', sans-serif; -} - -body { - overflow-y: scroll !important; - /* This is needed to prevent a horizontal scrollbar while neon-animated-pages are animating. */ - overflow-x: hidden; - /*Can't use this with safari or it causes some content to disappear*/ - /*-webkit-overflow-scrolling: touch;*/ - /* Remove the white default from jqm */ - background-color: transparent !important; - /* Normalize for different browsers */ - margin: 0; - padding: 0; - height: 100%; - -webkit-font-smoothing: antialiased; -} - - body.autoScrollY { - overflow-y: auto !important; - } - -.mainAnimatedPage { - /* Have to override because it breaks scrolling when dependant on window scroll */ - contain: style !important; -} - -/* Without this, no content will be displayed in mobile safari */ -.pageContainer { - overflow-x: visible !important; - /* jqm often wants to assign a background color to this */ - background-color: transparent !important; -} - -.bodyWithPopupOpen { - overflow-y: hidden !important; -} - -h1, h2, h3 { - margin-top: 1em; -} - -h1 { - font-weight: normal !important; - opacity: .7; - font-size: 1.72em; -} - -h2 { - font-weight: normal; -} - -h3 { - font-weight: normal; -} - -a, a:active, a:hover { - text-decoration: none; -} - -.libraryPage h1 a { - color: #fff !important; -} - -h1 a:hover { - text-decoration: underline; -} - -.ui-body-b a.accent { - color: #52B54B !important; -} - -.ui-body-a .paperList { - background-color: #fff; -} - -.ui-body-a [is="emby-select"] { - border-color: #ccc !important; -} - -.ui-body-a [is="emby-input"], .ui-body-a [is="emby-textarea"] { - background: none; - border-color: #ccc !important; -} - -.ui-body-a .secondaryText { - color: #ccc; -} - -.ui-body-b .secondaryText { - color: #aaa; -} - -div[data-role='page'] { - outline: none; -} - -/** - * Note: I have omitted any vendor-prefixes for clarity. - * Adding them is left as an exercise for the reader. - */ -.headroom { - transition: transform 180ms linear; -} - -.headroom--pinned { - transform: none; -} - -.headroom--unpinned:not(.headroomDisabled) { - transform: translateY(-100%); -} - -.libraryViewNav.headroom--unpinned:not(.headroomDisabled) { - transform: translateY(-210%); -} - -.hide { - display: none !important; -} - -/* - Header - */ -.header { - padding: 20px 0 0 20px; -} - -.imgLogoIcon { - height: 40px; - vertical-align: middle; -} - - .imgLogoIcon + span { - margin-left: 10px; - } - -@media all and (max-height: 800px) { - - .header { - display: none !important; - } -} - -.pageTitle { - margin-top: 0; - font-family: inherit; -} - -.fieldDescription { - padding-left: 2px; - font-weight: normal; - white-space: normal !important; -} - -.fieldDescription + .fieldDescription { - margin-top: 5px; -} - -.background-theme-a .backgroundContainer { - background-color: #f6f6f6; -} - -.dialog.background-theme-a { - background-color: #f0f0f0; -} - -.ui-content { - border-width: 0; - overflow: visible; - overflow-x: hidden; - padding: 1em; -} - -.page > .ui-content, .pageWithAbsoluteTabs .pageTabContent, .absolutePageTabContent .itemsContainer { - /* Need this so that the audio player doesn't cover content, but also for unveil lazy loading. */ - padding-bottom: 160px; -} - -@media all and (min-width: 800px) { - - /* - Forms - */ - form, .readOnlyContent { - max-width: 700px; - } - - .header { - padding-bottom: 15px; - } -} - -@media all and (min-width: 900px) { - - .page:not(.standalonePage) .header { - padding-top: 0; - } -} - -.supporterPromotionContainer { - margin: 0 0 2em; -} - -@media all and (min-width: 1280px) { - - .supporterPromotionContainer { - position: fixed; - top: 120px; - right: 0; - } -} - -.fullWidthContent .supporterPromotionContainer { - position: static !important; -} - -@media all and (min-width: 800px) { - - .supporterPromotionContainer { - display: flex; - flex-direction: row-reverse; - } - - .supporterPromotion { - text-align: center; - padding: 0 2em; - } - - .supporterPromotion button { - padding-left: 2em; - padding-right: 2em; - } -} - -.syncActivityForTarget { - margin: 0 0 3em 0; -} - -@media all and (min-width: 800px) { - - .syncActivityForTarget { - max-width: 600px; - margin: 0 3em 3em 0; - display: inline-block; - vertical-align: top; - min-width: 400px; - } -} - -.imageDropZone { - border: 2px dashed #bbb; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - padding: 25px; - text-align: center; - color: #bbb; -} - -.ui-body-a .emby-collapsible-button { - border-color: #ddd; -} - -.ui-body-a .collapseContent { - background-color: #fff; -} - -.ui-body-a .inputLabelUnfocused, .ui-body-a .textareaLabel { - color: #555; -} - -.ui-body-a .inputLabelFocused, .ui-body-a .textareaLabelFocused, .ui-body-a .selectLabelFocused { - color: green; -} - -.ui-body-a .selectLabelUnfocused, .ui-body-a .paperListLabel, .ui-body-a .fieldDescription { - color: #555; -} - - -.ui-body-a .visualCardBox-cardScalable, .ui-body-a .visualCardBox-cardFooter { - background-color: #fff; -} - -.ui-body-a .visualCardBox { - border: 0; - margin: 6px; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); -} - -.ui-body-a .cardFooter .cardText + .cardText { - opacity: .8; -} - -.ui-body-a .listItem .secondary { - color: #737373; -} +.ui-body-b a,.ui-body-b a:visited{color:#52B54B}body,html{margin:0;padding:0;height:100%}.backgroundContainer{position:fixed;top:0;left:0;right:0;bottom:0;contain:layout style}.ui-body-b a{font-weight:500}.ui-body-b a:active,.ui-body-b a:hover{color:#2E7D32}html{touch-action:manipulation;background-color:#242424;font-family:-apple-system,BlinkMacSystemFont,Roboto,"Segoe UI",Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",'Open Sans',sans-serif;font-size:88%}.pageContainer,body{background-color:transparent!important}h1{font-family:-apple-system-headline,BlinkMacSystemFont,Roboto,"Segoe UI",Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",'Open Sans',sans-serif;font-weight:400!important;opacity:.7;font-size:1.72em}h2{font-family:-apple-system-subheadline,BlinkMacSystemFont,Roboto,"Segoe UI",Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",'Open Sans',sans-serif}body{overflow-y:scroll!important;overflow-x:hidden;-webkit-font-smoothing:antialiased}body.autoScrollY{overflow-y:auto!important}.mainAnimatedPage{contain:style!important}.pageContainer{overflow-x:visible!important}.bodyWithPopupOpen{overflow-y:hidden!important}h1,h2,h3{margin-top:1em}h2,h3{font-weight:400}a,a:active,a:hover{text-decoration:none}.libraryPage h1 a{color:#fff!important}h1 a:hover{text-decoration:underline}.ui-body-b a.accent{color:#52B54B!important}.ui-body-a .paperList{background-color:#fff}.ui-body-a [is=emby-select]{border-color:#ccc!important}.ui-body-a [is=emby-input],.ui-body-a [is=emby-textarea]{background:0 0;border-color:#ccc!important}.ui-body-a .secondaryText{color:#ccc}.ui-body-b .secondaryText{color:#aaa}div[data-role=page]{outline:0}.headroom{-webkit-transition:-webkit-transform 180ms linear;-o-transition:transform 180ms linear;transition:transform 180ms linear}.headroom--pinned{-webkit-transform:none;transform:none}.headroom--unpinned:not(.headroomDisabled){-webkit-transform:translateY(-100%);transform:translateY(-100%)}.libraryViewNav.headroom--unpinned:not(.headroomDisabled){-webkit-transform:translateY(-210%);transform:translateY(-210%)}.hide{display:none!important}.header{padding:20px 0 0 20px}.imgLogoIcon{height:40px;vertical-align:middle}.imgLogoIcon+span{margin-left:10px}@media all and (max-height:800px){.header{display:none!important}}.pageTitle{margin-top:0;font-family:inherit}.fieldDescription{padding-left:2px;font-weight:400;white-space:normal!important}.fieldDescription+.fieldDescription{margin-top:5px}.background-theme-a .backgroundContainer{background-color:#f6f6f6}.dialog.background-theme-a{background-color:#f0f0f0}.ui-body-a .collapseContent,.ui-body-a .visualCardBox-cardFooter,.ui-body-a .visualCardBox-cardScalable{background-color:#fff}.ui-content{border-width:0;overflow:visible;overflow-x:hidden;padding:1em}.absolutePageTabContent .itemsContainer,.page>.ui-content,.pageWithAbsoluteTabs .pageTabContent{padding-bottom:160px}@media all and (min-width:900px){.page:not(.standalonePage) .header{padding-top:0}}.supporterPromotionContainer{margin:0 0 2em}@media all and (min-width:1280px){.supporterPromotionContainer{position:fixed;top:120px;right:0}}.fullWidthContent .supporterPromotionContainer{position:static!important}.syncActivityForTarget{margin:0 0 3em}@media all and (min-width:800px){.readOnlyContent,form{max-width:700px}.header{padding-bottom:15px}.supporterPromotionContainer{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.supporterPromotion{text-align:center;padding:0 2em}.supporterPromotion button{padding-left:2em;padding-right:2em}.syncActivityForTarget{max-width:600px;margin:0 3em 3em 0;display:inline-block;vertical-align:top;min-width:400px}}.imageDropZone{border:2px dashed #bbb;-webkit-border-radius:5px;border-radius:5px;padding:25px;text-align:center;color:#bbb}.ui-body-a .emby-collapsible-button{border-color:#ddd}.ui-body-a .inputLabelUnfocused,.ui-body-a .textareaLabel{color:#555}.ui-body-a .inputLabelFocused,.ui-body-a .selectLabelFocused,.ui-body-a .textareaLabelFocused{color:green}.ui-body-a .fieldDescription,.ui-body-a .paperListLabel,.ui-body-a .selectLabelUnfocused{color:#555}.ui-body-a .visualCardBox{border:0;margin:6px;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.1);box-shadow:0 2px 4px rgba(0,0,0,.1)}.ui-body-a .cardFooter .cardText+.cardText{opacity:.8}.ui-body-a .listItem .secondary{color:#737373} \ No newline at end of file diff --git a/dashboard-ui/dashboard/aboutpage.js b/dashboard-ui/dashboard/aboutpage.js index 5f97d9149b..bdd05aa7ac 100644 --- a/dashboard-ui/dashboard/aboutpage.js +++ b/dashboard-ui/dashboard/aboutpage.js @@ -1,15 +1 @@ -define([], function () { - 'use strict'; - - return function (view, params) { - - var self = this; - - view.addEventListener('viewbeforeshow', function (e) { - - var elem = view.querySelector('#appVersionNumber'); - - elem.innerHTML = elem.innerHTML.replace('{0}', ConnectionManager.appVersion()); - }); - } -}); \ No newline at end of file +define([],function(){"use strict";return function(view,params){view.addEventListener("viewbeforeshow",function(e){var elem=view.querySelector("#appVersionNumber");elem.innerHTML=elem.innerHTML.replace("{0}",ConnectionManager.appVersion())})}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/autoorganizelog.js b/dashboard-ui/dashboard/autoorganizelog.js index d375c9e9b8..4deb839b9d 100644 --- a/dashboard-ui/dashboard/autoorganizelog.js +++ b/dashboard-ui/dashboard/autoorganizelog.js @@ -1,423 +1 @@ -define(['serverNotifications', 'events', 'scripts/taskbutton', 'datetime', 'paper-icon-button-light'], function (serverNotifications, events, taskButton, datetime) { - 'use strict'; - - var query = { - - StartIndex: 0, - Limit: 50 - }; - - var currentResult; - var page; - - function parentWithClass(elem, className) { - - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - - if (!elem) { - return null; - } - } - - return elem; - } - - function showStatusMessage(id) { - - var item = currentResult.Items.filter(function (i) { - - return i.Id == id; - })[0]; - - Dashboard.alert({ - - title: getStatusText(item, false), - message: item.StatusMessage - }); - } - - function deleteOriginalFile(page, id) { - - var item = currentResult.Items.filter(function (i) { - - return i.Id == id; - })[0]; - - var message = Globalize.translate('MessageFileWillBeDeleted') + '

' + item.OriginalPath + '

' + Globalize.translate('MessageSureYouWishToProceed'); - - require(['confirm'], function (confirm) { - - confirm(message, Globalize.translate('HeaderDeleteFile')).then(function () { - - Dashboard.showLoadingMsg(); - - ApiClient.deleteOriginalFileFromOrganizationResult(id).then(function () { - - Dashboard.hideLoadingMsg(); - - reloadItems(page, true); - - }, Dashboard.processErrorResponse); - }); - }); - } - - function organizeFileWithCorrections(page, item) { - - showCorrectionPopup(page, item); - } - - function showCorrectionPopup(page, item) { - - require(['components/fileorganizer/fileorganizer'], function (fileorganizer) { - - fileorganizer.show(item).then(function () { - reloadItems(page, false); - }); - }); - } - - function organizeFile(page, id) { - - var item = currentResult.Items.filter(function (i) { - - return i.Id == id; - })[0]; - - if (!item.TargetPath) { - - if (item.Type == "Episode") { - organizeFileWithCorrections(page, item); - } - - return; - } - - var message = Globalize.translate('MessageFollowingFileWillBeMovedFrom') + '

' + item.OriginalPath + '

' + Globalize.translate('MessageDestinationTo') + '

' + item.TargetPath; - - if (item.DuplicatePaths.length) { - message += '

' + Globalize.translate('MessageDuplicatesWillBeDeleted'); - - message += '

' + item.DuplicatePaths.join('
'); - } - - message += '

' + Globalize.translate('MessageSureYouWishToProceed'); - - require(['confirm'], function (confirm) { - - confirm(message, Globalize.translate('HeaderOrganizeFile')).then(function () { - - Dashboard.showLoadingMsg(); - - ApiClient.performOrganization(id).then(function () { - - Dashboard.hideLoadingMsg(); - - reloadItems(page, true); - - }, Dashboard.processErrorResponse); - }); - }); - } - - function reloadItems(page, showSpinner) { - - if (showSpinner) { - Dashboard.showLoadingMsg(); - } - - ApiClient.getFileOrganizationResults(query).then(function (result) { - - currentResult = result; - renderResults(page, result); - - Dashboard.hideLoadingMsg(); - }, Dashboard.processErrorResponse); - } - - function getStatusText(item, enhance) { - - var status = item.Status; - - var color = null; - - if (status == 'SkippedExisting') { - status = Globalize.translate('StatusSkipped'); - } - else if (status == 'Failure') { - color = '#cc0000'; - status = Globalize.translate('StatusFailed'); - } - if (status == 'Success') { - color = 'green'; - status = Globalize.translate('StatusSuccess'); - } - - if (enhance) { - - if (item.StatusMessage) { - - return '' + status + ''; - } else { - return '' + status + ''; - } - } - - return status; - } - - function renderResults(page, result) { - - var rows = result.Items.map(function (item) { - - var html = ''; - - html += ''; - - html += renderItemRow(item); - - html += ''; - - return html; - }).join(''); - - var resultBody = page.querySelector('.resultBody'); - resultBody.innerHTML = rows; - - resultBody.addEventListener('click', handleItemClick); - - var pagingHtml = LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false - }); - - var topPaging = page.querySelector('.listTopPaging'); - topPaging.innerHTML = pagingHtml; - - var bottomPaging = page.querySelector('.listBottomPaging'); - bottomPaging.innerHTML = pagingHtml; - - var btnNextTop = topPaging.querySelector(".btnNextPage"); - var btnNextBottom = bottomPaging.querySelector(".btnNextPage"); - var btnPrevTop = topPaging.querySelector(".btnPreviousPage"); - var btnPrevBottom = bottomPaging.querySelector(".btnPreviousPage"); - - if (btnNextTop) { - btnNextTop.addEventListener('click', function () { - query.StartIndex += query.Limit; - reloadItems(page, true); - }); - } - - if (btnNextBottom) { - btnNextBottom.addEventListener('click', function () { - query.StartIndex += query.Limit; - reloadItems(page, true); - }); - } - - if (btnPrevTop) { - btnPrevTop.addEventListener('click', function () { - query.StartIndex -= query.Limit; - reloadItems(page, true); - }); - } - - if (btnPrevBottom) { - btnPrevBottom.addEventListener('click', function () { - query.StartIndex -= query.Limit; - reloadItems(page, true); - }); - } - - var btnClearLog = page.querySelector('.btnClearLog'); - - if (result.TotalRecordCount) { - btnClearLog.classList.remove('hide'); - } else { - btnClearLog.classList.add('hide'); - } - } - - function renderItemRow(item) { - - var html = ''; - - html += ''; - var hide = item.IsInProgress ? '' : ' hide'; - html += ''; - html += ''; - - html += ''; - var date = datetime.parseISO8601Date(item.Date, true); - html += datetime.toLocaleDateString(date); - html += ''; - - html += ''; - var status = item.Status; - - if (item.IsInProgress) { - html += ''; - html += item.OriginalFileName; - html += ''; - } - else if (status == 'SkippedExisting') { - html += ''; - html += item.OriginalFileName; - html += ''; - } - else if (status == 'Failure') { - html += ''; - html += item.OriginalFileName; - html += ''; - } else { - html += ''; - html += item.OriginalFileName; - html += ''; - } - html += ''; - - html += ''; - html += item.TargetPath || ''; - html += ''; - - html += ''; - - if (item.Status != 'Success') { - - html += ''; - html += ''; - } - - html += ''; - - return html; - } - - function handleItemClick(e) { - - var id; - - var buttonStatus = parentWithClass(e.target, 'btnShowStatusMessage'); - if (buttonStatus) { - - id = buttonStatus.getAttribute('data-resultid'); - showStatusMessage(id); - } - - var buttonOrganize = parentWithClass(e.target, 'btnProcessResult'); - if (buttonOrganize) { - - id = buttonOrganize.getAttribute('data-resultid'); - organizeFile(e.view, id); - } - - var buttonDelete = parentWithClass(e.target, 'btnDeleteResult'); - if (buttonDelete) { - - id = buttonDelete.getAttribute('data-resultid'); - deleteOriginalFile(e.view, id); - } - } - - function onServerEvent(e, apiClient, data) { - - if (e.type == 'ScheduledTaskEnded') { - - if (data && data.Key == 'AutoOrganize') { - reloadItems(page, false); - } - } else if (e.type == 'AutoOrganize_ItemUpdated' && data) { - - updateItemStatus(page, data); - } else { - - reloadItems(page, false); - } - } - - function updateItemStatus(page, item) { - - var rowId = '#row' + item.Id; - var row = page.querySelector(rowId); - - if (row) { - - row.innerHTML = renderItemRow(item); - } - } - - function getTabs() { - return [ - { - href: 'autoorganizelog.html', - name: Globalize.translate('TabActivityLog') - }, - { - href: 'autoorganizetv.html', - name: Globalize.translate('TabTV') - }, - { - href: 'autoorganizesmart.html', - name: Globalize.translate('TabSmartMatches') - }]; - } - - - return function (view, params) { - - page = view; - - var clearButton = view.querySelector('.btnClearLog'); - clearButton.addEventListener('click', function () { - - ApiClient.clearOrganizationLog().then(function () { - query.StartIndex = 0; - reloadItems(view, true); - }, Dashboard.processErrorResponse); - }); - - view.addEventListener('viewshow', function (e) { - - LibraryMenu.setTabs('autoorganize', 0, getTabs); - - reloadItems(view, true); - - events.on(serverNotifications, 'AutoOrganize_LogReset', onServerEvent); - events.on(serverNotifications, 'AutoOrganize_ItemUpdated', onServerEvent); - events.on(serverNotifications, 'AutoOrganize_ItemRemoved', onServerEvent); - events.on(serverNotifications, 'AutoOrganize_ItemAdded', onServerEvent); - events.on(serverNotifications, 'ScheduledTaskEnded', onServerEvent); - - // on here - taskButton({ - mode: 'on', - progressElem: view.querySelector('.organizeProgress'), - panel: view.querySelector('.organizeTaskPanel'), - taskKey: 'AutoOrganize', - button: view.querySelector('.btnOrganize') - }); - }); - - view.addEventListener('viewhide', function (e) { - - currentResult = null; - - events.off(serverNotifications, 'AutoOrganize_LogReset', onServerEvent); - events.off(serverNotifications, 'AutoOrganize_ItemUpdated', onServerEvent); - events.off(serverNotifications, 'AutoOrganize_ItemRemoved', onServerEvent); - events.off(serverNotifications, 'AutoOrganize_ItemAdded', onServerEvent); - events.off(serverNotifications, 'ScheduledTaskEnded', onServerEvent); - - // off here - taskButton({ - mode: 'off', - button: view.querySelector('.btnOrganize') - }); - }); - }; -}); \ No newline at end of file +define(["serverNotifications","events","scripts/taskbutton","datetime","paper-icon-button-light"],function(serverNotifications,events,taskButton,datetime){"use strict";function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}function showStatusMessage(id){var item=currentResult.Items.filter(function(i){return i.Id==id})[0];Dashboard.alert({title:getStatusText(item,!1),message:item.StatusMessage})}function deleteOriginalFile(page,id){var item=currentResult.Items.filter(function(i){return i.Id==id})[0],message=Globalize.translate("MessageFileWillBeDeleted")+"

"+item.OriginalPath+"

"+Globalize.translate("MessageSureYouWishToProceed");require(["confirm"],function(confirm){confirm(message,Globalize.translate("HeaderDeleteFile")).then(function(){Dashboard.showLoadingMsg(),ApiClient.deleteOriginalFileFromOrganizationResult(id).then(function(){Dashboard.hideLoadingMsg(),reloadItems(page,!0)},Dashboard.processErrorResponse)})})}function organizeFileWithCorrections(page,item){showCorrectionPopup(page,item)}function showCorrectionPopup(page,item){require(["components/fileorganizer/fileorganizer"],function(fileorganizer){fileorganizer.show(item).then(function(){reloadItems(page,!1)})})}function organizeFile(page,id){var item=currentResult.Items.filter(function(i){return i.Id==id})[0];if(!item.TargetPath)return void("Episode"==item.Type&&organizeFileWithCorrections(page,item));var message=Globalize.translate("MessageFollowingFileWillBeMovedFrom")+"

"+item.OriginalPath+"

"+Globalize.translate("MessageDestinationTo")+"

"+item.TargetPath;item.DuplicatePaths.length&&(message+="

"+Globalize.translate("MessageDuplicatesWillBeDeleted"),message+="

"+item.DuplicatePaths.join("
")),message+="

"+Globalize.translate("MessageSureYouWishToProceed"),require(["confirm"],function(confirm){confirm(message,Globalize.translate("HeaderOrganizeFile")).then(function(){Dashboard.showLoadingMsg(),ApiClient.performOrganization(id).then(function(){Dashboard.hideLoadingMsg(),reloadItems(page,!0)},Dashboard.processErrorResponse)})})}function reloadItems(page,showSpinner){showSpinner&&Dashboard.showLoadingMsg(),ApiClient.getFileOrganizationResults(query).then(function(result){currentResult=result,renderResults(page,result),Dashboard.hideLoadingMsg()},Dashboard.processErrorResponse)}function getStatusText(item,enhance){var status=item.Status,color=null;return"SkippedExisting"==status?status=Globalize.translate("StatusSkipped"):"Failure"==status&&(color="#cc0000",status=Globalize.translate("StatusFailed")),"Success"==status&&(color="green",status=Globalize.translate("StatusSuccess")),enhance?item.StatusMessage?''+status+"":''+status+"":status}function renderResults(page,result){var rows=result.Items.map(function(item){var html="";return html+='',html+=renderItemRow(item),html+=""}).join(""),resultBody=page.querySelector(".resultBody");resultBody.innerHTML=rows,resultBody.addEventListener("click",handleItemClick);var pagingHtml=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1}),topPaging=page.querySelector(".listTopPaging");topPaging.innerHTML=pagingHtml;var bottomPaging=page.querySelector(".listBottomPaging");bottomPaging.innerHTML=pagingHtml;var btnNextTop=topPaging.querySelector(".btnNextPage"),btnNextBottom=bottomPaging.querySelector(".btnNextPage"),btnPrevTop=topPaging.querySelector(".btnPreviousPage"),btnPrevBottom=bottomPaging.querySelector(".btnPreviousPage");btnNextTop&&btnNextTop.addEventListener("click",function(){query.StartIndex+=query.Limit,reloadItems(page,!0)}),btnNextBottom&&btnNextBottom.addEventListener("click",function(){query.StartIndex+=query.Limit,reloadItems(page,!0)}),btnPrevTop&&btnPrevTop.addEventListener("click",function(){query.StartIndex-=query.Limit,reloadItems(page,!0)}),btnPrevBottom&&btnPrevBottom.addEventListener("click",function(){query.StartIndex-=query.Limit,reloadItems(page,!0)});var btnClearLog=page.querySelector(".btnClearLog");result.TotalRecordCount?btnClearLog.classList.remove("hide"):btnClearLog.classList.add("hide")}function renderItemRow(item){var html="";html+="";var hide=item.IsInProgress?"":" hide";html+='',html+="",html+='';var date=datetime.parseISO8601Date(item.Date,!0);html+=datetime.toLocaleDateString(date),html+="",html+='';var status=item.Status;return item.IsInProgress?(html+='',html+=item.OriginalFileName,html+=""):"SkippedExisting"==status?(html+='',html+=item.OriginalFileName,html+=""):"Failure"==status?(html+='',html+=item.OriginalFileName,html+=""):(html+='',html+=item.OriginalFileName,html+=""),html+="",html+='',html+=item.TargetPath||"",html+="",html+='',"Success"!=item.Status&&(html+='',html+=''),html+=""}function handleItemClick(e){var id,buttonStatus=parentWithClass(e.target,"btnShowStatusMessage");buttonStatus&&(id=buttonStatus.getAttribute("data-resultid"),showStatusMessage(id));var buttonOrganize=parentWithClass(e.target,"btnProcessResult");buttonOrganize&&(id=buttonOrganize.getAttribute("data-resultid"),organizeFile(e.view,id));var buttonDelete=parentWithClass(e.target,"btnDeleteResult");buttonDelete&&(id=buttonDelete.getAttribute("data-resultid"),deleteOriginalFile(e.view,id))}function onServerEvent(e,apiClient,data){"ScheduledTaskEnded"==e.type?data&&"AutoOrganize"==data.Key&&reloadItems(page,!1):"AutoOrganize_ItemUpdated"==e.type&&data?updateItemStatus(page,data):reloadItems(page,!1)}function updateItemStatus(page,item){var rowId="#row"+item.Id,row=page.querySelector(rowId);row&&(row.innerHTML=renderItemRow(item))}function getTabs(){return[{href:"autoorganizelog.html",name:Globalize.translate("TabActivityLog")},{href:"autoorganizetv.html",name:Globalize.translate("TabTV")},{href:"autoorganizesmart.html",name:Globalize.translate("TabSmartMatches")}]}var currentResult,page,query={StartIndex:0,Limit:50};return function(view,params){page=view;var clearButton=view.querySelector(".btnClearLog");clearButton.addEventListener("click",function(){ApiClient.clearOrganizationLog().then(function(){query.StartIndex=0,reloadItems(view,!0)},Dashboard.processErrorResponse)}),view.addEventListener("viewshow",function(e){LibraryMenu.setTabs("autoorganize",0,getTabs),reloadItems(view,!0),events.on(serverNotifications,"AutoOrganize_LogReset",onServerEvent),events.on(serverNotifications,"AutoOrganize_ItemUpdated",onServerEvent),events.on(serverNotifications,"AutoOrganize_ItemRemoved",onServerEvent),events.on(serverNotifications,"AutoOrganize_ItemAdded",onServerEvent),events.on(serverNotifications,"ScheduledTaskEnded",onServerEvent),taskButton({mode:"on",progressElem:view.querySelector(".organizeProgress"),panel:view.querySelector(".organizeTaskPanel"),taskKey:"AutoOrganize",button:view.querySelector(".btnOrganize")})}),view.addEventListener("viewhide",function(e){currentResult=null,events.off(serverNotifications,"AutoOrganize_LogReset",onServerEvent),events.off(serverNotifications,"AutoOrganize_ItemUpdated",onServerEvent),events.off(serverNotifications,"AutoOrganize_ItemRemoved",onServerEvent),events.off(serverNotifications,"AutoOrganize_ItemAdded",onServerEvent),events.off(serverNotifications,"ScheduledTaskEnded",onServerEvent),taskButton({mode:"off",button:view.querySelector(".btnOrganize")})})}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/autoorganizesmart.js b/dashboard-ui/dashboard/autoorganizesmart.js index 5c0d760e92..bd21108a63 100644 --- a/dashboard-ui/dashboard/autoorganizesmart.js +++ b/dashboard-ui/dashboard/autoorganizesmart.js @@ -1,178 +1 @@ -define(['listViewStyle'], function () { - 'use strict'; - - var query = { - - StartIndex: 0, - Limit: 100000 - }; - - var currentResult; - - function parentWithClass(elem, className) { - - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - - if (!elem) { - return null; - } - } - - return elem; - } - - function reloadList(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getSmartMatchInfos(query).then(function (infos) { - - currentResult = infos; - - populateList(page, infos); - - Dashboard.hideLoadingMsg(); - - }, function () { - - Dashboard.hideLoadingMsg(); - }); - } - - function populateList(page, result) { - - var infos = result.Items; - - if (infos.length > 0) { - infos = infos.sort(function (a, b) { - - a = a.OrganizerType + " " + (a.DisplayName || a.ItemName); - b = b.OrganizerType + " " + (b.DisplayName || b.ItemName); - - if (a == b) { - return 0; - } - - if (a < b) { - return -1; - } - - return 1; - }); - } - - var html = ""; - - if (infos.length) { - html += '
'; - } - - for (var i = 0, length = infos.length; i < length; i++) { - - var info = infos[i]; - - html += '
'; - - html += '
'; - html += 'folder'; - html += '
'; - - html += '
'; - html += "

" + (info.DisplayName || info.ItemName) + "

"; - html += '
'; - - html += '
'; - - var matchStringIndex = 0; - - html += info.MatchStrings.map(function (m) { - - var matchStringHtml = ''; - - matchStringHtml += '
'; - - matchStringHtml += '
'; - - matchStringHtml += "
" + m + "
"; - - matchStringHtml += '
'; - - matchStringHtml += ''; - - matchStringHtml += '
'; - matchStringIndex++; - - return matchStringHtml; - - }).join(''); - } - - if (infos.length) { - html += "
"; - } - - var matchInfos = page.querySelector('.divMatchInfos'); - matchInfos.innerHTML = html; - } - - function getTabs() { - return [ - { - href: 'autoorganizelog.html', - name: Globalize.translate('TabActivityLog') - }, - { - href: 'autoorganizetv.html', - name: Globalize.translate('TabTV') - }, - { - href: 'autoorganizesmart.html', - name: Globalize.translate('TabSmartMatches') - }]; - } - - return function (view, params) { - - var self = this; - - var divInfos = view.querySelector('.divMatchInfos'); - - divInfos.addEventListener('click', function (e) { - - var button = parentWithClass(e.target, 'btnDeleteMatchEntry'); - - if (button) { - - var index = parseInt(button.getAttribute('data-index')); - var matchIndex = parseInt(button.getAttribute('data-matchindex')); - - var info = currentResult.Items[index]; - var entries = [ - { - Name: info.ItemName, - Value: info.MatchStrings[matchIndex] - }]; - - ApiClient.deleteSmartMatchEntries(entries).then(function () { - - reloadList(view); - - }, Dashboard.processErrorResponse); - } - }); - - view.addEventListener('viewshow', function (e) { - - LibraryMenu.setTabs('autoorganize', 2, getTabs); - Dashboard.showLoadingMsg(); - - reloadList(view); - }); - - view.addEventListener('viewhide', function (e) { - - currentResult = null; - }); - }; -}); \ No newline at end of file +define(["listViewStyle"],function(){"use strict";function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}function reloadList(page){Dashboard.showLoadingMsg(),ApiClient.getSmartMatchInfos(query).then(function(infos){currentResult=infos,populateList(page,infos),Dashboard.hideLoadingMsg()},function(){Dashboard.hideLoadingMsg()})}function populateList(page,result){var infos=result.Items;infos.length>0&&(infos=infos.sort(function(a,b){return a=a.OrganizerType+" "+(a.DisplayName||a.ItemName),b=b.OrganizerType+" "+(b.DisplayName||b.ItemName),a==b?0:a',html+='
',html+='folder',html+="
",html+='
',html+="

"+(info.DisplayName||info.ItemName)+"

",html+="
",html+="";var matchStringIndex=0;html+=info.MatchStrings.map(function(m){var matchStringHtml="";return matchStringHtml+='
',matchStringHtml+='
',matchStringHtml+="
"+m+"
",matchStringHtml+="
",matchStringHtml+='',matchStringHtml+="
",matchStringIndex++,matchStringHtml}).join("")}infos.length&&(html+="");var matchInfos=page.querySelector(".divMatchInfos");matchInfos.innerHTML=html}function getTabs(){return[{href:"autoorganizelog.html",name:Globalize.translate("TabActivityLog")},{href:"autoorganizetv.html",name:Globalize.translate("TabTV")},{href:"autoorganizesmart.html",name:Globalize.translate("TabSmartMatches")}]}var currentResult,query={StartIndex:0,Limit:1e5};return function(view,params){var divInfos=view.querySelector(".divMatchInfos");divInfos.addEventListener("click",function(e){var button=parentWithClass(e.target,"btnDeleteMatchEntry");if(button){var index=parseInt(button.getAttribute("data-index")),matchIndex=parseInt(button.getAttribute("data-matchindex")),info=currentResult.Items[index],entries=[{Name:info.ItemName,Value:info.MatchStrings[matchIndex]}];ApiClient.deleteSmartMatchEntries(entries).then(function(){reloadList(view)},Dashboard.processErrorResponse)}}),view.addEventListener("viewshow",function(e){LibraryMenu.setTabs("autoorganize",2,getTabs),Dashboard.showLoadingMsg(),reloadList(view)}),view.addEventListener("viewhide",function(e){currentResult=null})}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/autoorganizetv.js b/dashboard-ui/dashboard/autoorganizetv.js index 54d24c2b52..d93ab1b5eb 100644 --- a/dashboard-ui/dashboard/autoorganizetv.js +++ b/dashboard-ui/dashboard/autoorganizetv.js @@ -1,182 +1 @@ -define([], function () { - 'use strict'; - - function getEpisodeFileName(value, enableMultiEpisode) { - - var seriesName = "Series Name"; - var episodeTitle = "Episode Four"; - - var result = value.replace('%sn', seriesName) - .replace('%s.n', seriesName.replace(' ', '.')) - .replace('%s_n', seriesName.replace(' ', '_')) - .replace('%s', '1') - .replace('%0s', '01') - .replace('%00s', '001') - .replace('%ext', 'mkv') - .replace('%en', episodeTitle) - .replace('%e.n', episodeTitle.replace(' ', '.')) - .replace('%e_n', episodeTitle.replace(' ', '_')); - - if (enableMultiEpisode) { - result = result - .replace('%ed', '5') - .replace('%0ed', '05') - .replace('%00ed', '005'); - } - - return result - .replace('%e', '4') - .replace('%0e', '04') - .replace('%00e', '004'); - } - - function loadPage(view, config) { - - var tvOptions = config.TvOptions; - - view.querySelector('#chkEnableTvSorting').checked = tvOptions.IsEnabled; - view.querySelector('#chkOverwriteExistingEpisodes').checked = tvOptions.OverwriteExistingEpisodes; - view.querySelector('#chkDeleteEmptyFolders').checked = tvOptions.DeleteEmptyFolders; - - view.querySelector('#txtMinFileSize').value = tvOptions.MinFileSizeMb; - view.querySelector('#txtSeasonFolderPattern').value = tvOptions.SeasonFolderPattern; - view.querySelector('#txtSeasonZeroName').value = tvOptions.SeasonZeroFolderName; - view.querySelector('#txtWatchFolder').value = tvOptions.WatchLocations[0] || ''; - - view.querySelector('#txtEpisodePattern').value = tvOptions.EpisodeNamePattern; - view.querySelector('#txtMultiEpisodePattern').value = tvOptions.MultiEpisodeNamePattern; - - view.querySelector('#txtDeleteLeftOverFiles').value = tvOptions.LeftOverFileExtensionsToDelete.join(';'); - - view.querySelector('#copyOrMoveFile').value = tvOptions.CopyOriginalFile.toString(); - } - - function onSubmit(view) { - - ApiClient.getNamedConfiguration('autoorganize').then(function (config) { - - var tvOptions = config.TvOptions; - - tvOptions.IsEnabled = view.querySelector('#chkEnableTvSorting').checked; - tvOptions.OverwriteExistingEpisodes = view.querySelector('#chkOverwriteExistingEpisodes').checked; - tvOptions.DeleteEmptyFolders = view.querySelector('#chkDeleteEmptyFolders').checked; - - tvOptions.MinFileSizeMb = view.querySelector('#txtMinFileSize').value; - tvOptions.SeasonFolderPattern = view.querySelector('#txtSeasonFolderPattern').value; - tvOptions.SeasonZeroFolderName = view.querySelector('#txtSeasonZeroName').value; - - tvOptions.EpisodeNamePattern = view.querySelector('#txtEpisodePattern').value; - tvOptions.MultiEpisodeNamePattern = view.querySelector('#txtMultiEpisodePattern').value; - - tvOptions.LeftOverFileExtensionsToDelete = view.querySelector('#txtDeleteLeftOverFiles').value.split(';'); - - var watchLocation = view.querySelector('#txtWatchFolder').value; - tvOptions.WatchLocations = watchLocation ? [watchLocation] : []; - - tvOptions.CopyOriginalFile = view.querySelector('#copyOrMoveFile').value; - - ApiClient.updateNamedConfiguration('autoorganize', config).then(Dashboard.processServerConfigurationUpdateResult, Dashboard.processErrorResponse); - }); - - return false; - } - - function getTabs() { - return [ - { - href: 'autoorganizelog.html', - name: Globalize.translate('TabActivityLog') - }, - { - href: 'autoorganizetv.html', - name: Globalize.translate('TabTV') - }, - { - href: 'autoorganizesmart.html', - name: Globalize.translate('TabSmartMatches') - }]; - } - - return function (view, params) { - - - function updateSeasonPatternHelp() { - - var value = view.querySelector('#txtSeasonFolderPattern').value; - value = value.replace('%s', '1').replace('%0s', '01').replace('%00s', '001'); - - var replacementHtmlResult = Globalize.translate('OrganizePatternResult').replace('{0}', value); - - view.querySelector('.seasonFolderFieldDescription').innerHTML = replacementHtmlResult; - } - - function updateEpisodePatternHelp() { - - var value = view.querySelector('#txtEpisodePattern').value; - var fileName = getEpisodeFileName(value, false); - - var replacementHtmlResult = Globalize.translate('OrganizePatternResult').replace('{0}', fileName); - - view.querySelector('.episodePatternDescription').innerHTML = replacementHtmlResult; - } - - function updateMultiEpisodePatternHelp() { - - var value = view.querySelector('#txtMultiEpisodePattern').value; - var fileName = getEpisodeFileName(value, true); - - var replacementHtmlResult = Globalize.translate('OrganizePatternResult').replace('{0}', fileName); - - view.querySelector('.multiEpisodePatternDescription').innerHTML = replacementHtmlResult; - } - - function selectWatchFolder(e) { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - callback: function (path) { - - if (path) { - - view.querySelector('#txtWatchFolder').value = path; - } - picker.close(); - }, - header: Globalize.translate('HeaderSelectWatchFolder'), - instruction: Globalize.translate('HeaderSelectWatchFolderHelp') - }); - }); - } - - view.querySelector('#txtSeasonFolderPattern').addEventListener('change', updateSeasonPatternHelp); - view.querySelector('#txtSeasonFolderPattern').addEventListener('keyup', updateSeasonPatternHelp); - view.querySelector('#txtEpisodePattern').addEventListener('change', updateEpisodePatternHelp); - view.querySelector('#txtEpisodePattern').addEventListener('keyup', updateEpisodePatternHelp); - view.querySelector('#txtMultiEpisodePattern').addEventListener('change', updateMultiEpisodePatternHelp); - view.querySelector('#txtMultiEpisodePattern').addEventListener('keyup', updateMultiEpisodePatternHelp); - view.querySelector('#btnSelectWatchFolder').addEventListener('click', selectWatchFolder); - - view.querySelector('.libraryFileOrganizerForm').addEventListener('submit', function (e) { - - e.preventDefault(); - onSubmit(view); - return false; - }); - - view.addEventListener('viewshow', function (e) { - - LibraryMenu.setTabs('autoorganize', 1, getTabs); - - ApiClient.getNamedConfiguration('autoorganize').then(function (config) { - loadPage(view, config); - updateSeasonPatternHelp(); - updateEpisodePatternHelp(); - updateMultiEpisodePatternHelp(); - }); - }); - }; -}); \ No newline at end of file +define([],function(){"use strict";function getEpisodeFileName(value,enableMultiEpisode){var seriesName="Series Name",episodeTitle="Episode Four",result=value.replace("%sn",seriesName).replace("%s.n",seriesName.replace(" ",".")).replace("%s_n",seriesName.replace(" ","_")).replace("%s","1").replace("%0s","01").replace("%00s","001").replace("%ext","mkv").replace("%en",episodeTitle).replace("%e.n",episodeTitle.replace(" ",".")).replace("%e_n",episodeTitle.replace(" ","_"));return enableMultiEpisode&&(result=result.replace("%ed","5").replace("%0ed","05").replace("%00ed","005")),result.replace("%e","4").replace("%0e","04").replace("%00e","004")}function loadPage(view,config){var tvOptions=config.TvOptions;view.querySelector("#chkEnableTvSorting").checked=tvOptions.IsEnabled,view.querySelector("#chkOverwriteExistingEpisodes").checked=tvOptions.OverwriteExistingEpisodes,view.querySelector("#chkDeleteEmptyFolders").checked=tvOptions.DeleteEmptyFolders,view.querySelector("#txtMinFileSize").value=tvOptions.MinFileSizeMb,view.querySelector("#txtSeasonFolderPattern").value=tvOptions.SeasonFolderPattern,view.querySelector("#txtSeasonZeroName").value=tvOptions.SeasonZeroFolderName,view.querySelector("#txtWatchFolder").value=tvOptions.WatchLocations[0]||"",view.querySelector("#txtEpisodePattern").value=tvOptions.EpisodeNamePattern,view.querySelector("#txtMultiEpisodePattern").value=tvOptions.MultiEpisodeNamePattern,view.querySelector("#txtDeleteLeftOverFiles").value=tvOptions.LeftOverFileExtensionsToDelete.join(";"),view.querySelector("#copyOrMoveFile").value=tvOptions.CopyOriginalFile.toString()}function onSubmit(view){return ApiClient.getNamedConfiguration("autoorganize").then(function(config){var tvOptions=config.TvOptions;tvOptions.IsEnabled=view.querySelector("#chkEnableTvSorting").checked,tvOptions.OverwriteExistingEpisodes=view.querySelector("#chkOverwriteExistingEpisodes").checked,tvOptions.DeleteEmptyFolders=view.querySelector("#chkDeleteEmptyFolders").checked,tvOptions.MinFileSizeMb=view.querySelector("#txtMinFileSize").value,tvOptions.SeasonFolderPattern=view.querySelector("#txtSeasonFolderPattern").value,tvOptions.SeasonZeroFolderName=view.querySelector("#txtSeasonZeroName").value,tvOptions.EpisodeNamePattern=view.querySelector("#txtEpisodePattern").value,tvOptions.MultiEpisodeNamePattern=view.querySelector("#txtMultiEpisodePattern").value,tvOptions.LeftOverFileExtensionsToDelete=view.querySelector("#txtDeleteLeftOverFiles").value.split(";");var watchLocation=view.querySelector("#txtWatchFolder").value;tvOptions.WatchLocations=watchLocation?[watchLocation]:[],tvOptions.CopyOriginalFile=view.querySelector("#copyOrMoveFile").value,ApiClient.updateNamedConfiguration("autoorganize",config).then(Dashboard.processServerConfigurationUpdateResult,Dashboard.processErrorResponse)}),!1}function getTabs(){return[{href:"autoorganizelog.html",name:Globalize.translate("TabActivityLog")},{href:"autoorganizetv.html",name:Globalize.translate("TabTV")},{href:"autoorganizesmart.html",name:Globalize.translate("TabSmartMatches")}]}return function(view,params){function updateSeasonPatternHelp(){var value=view.querySelector("#txtSeasonFolderPattern").value;value=value.replace("%s","1").replace("%0s","01").replace("%00s","001");var replacementHtmlResult=Globalize.translate("OrganizePatternResult").replace("{0}",value);view.querySelector(".seasonFolderFieldDescription").innerHTML=replacementHtmlResult}function updateEpisodePatternHelp(){var value=view.querySelector("#txtEpisodePattern").value,fileName=getEpisodeFileName(value,!1),replacementHtmlResult=Globalize.translate("OrganizePatternResult").replace("{0}",fileName);view.querySelector(".episodePatternDescription").innerHTML=replacementHtmlResult}function updateMultiEpisodePatternHelp(){var value=view.querySelector("#txtMultiEpisodePattern").value,fileName=getEpisodeFileName(value,!0),replacementHtmlResult=Globalize.translate("OrganizePatternResult").replace("{0}",fileName);view.querySelector(".multiEpisodePatternDescription").innerHTML=replacementHtmlResult}function selectWatchFolder(e){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&(view.querySelector("#txtWatchFolder").value=path),picker.close()},header:Globalize.translate("HeaderSelectWatchFolder"),instruction:Globalize.translate("HeaderSelectWatchFolderHelp")})})}view.querySelector("#txtSeasonFolderPattern").addEventListener("change",updateSeasonPatternHelp),view.querySelector("#txtSeasonFolderPattern").addEventListener("keyup",updateSeasonPatternHelp),view.querySelector("#txtEpisodePattern").addEventListener("change",updateEpisodePatternHelp),view.querySelector("#txtEpisodePattern").addEventListener("keyup",updateEpisodePatternHelp),view.querySelector("#txtMultiEpisodePattern").addEventListener("change",updateMultiEpisodePatternHelp),view.querySelector("#txtMultiEpisodePattern").addEventListener("keyup",updateMultiEpisodePatternHelp),view.querySelector("#btnSelectWatchFolder").addEventListener("click",selectWatchFolder),view.querySelector(".libraryFileOrganizerForm").addEventListener("submit",function(e){return e.preventDefault(),onSubmit(view),!1}),view.addEventListener("viewshow",function(e){LibraryMenu.setTabs("autoorganize",1,getTabs),ApiClient.getNamedConfiguration("autoorganize").then(function(config){loadPage(view,config),updateSeasonPatternHelp(),updateEpisodePatternHelp(),updateMultiEpisodePatternHelp()})})}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/cinemamodeconfiguration.js b/dashboard-ui/dashboard/cinemamodeconfiguration.js index af7db3f802..ccdf9ac533 100644 --- a/dashboard-ui/dashboard/cinemamodeconfiguration.js +++ b/dashboard-ui/dashboard/cinemamodeconfiguration.js @@ -1,144 +1 @@ -define(['jQuery', 'fnchecked'], function ($) { - 'use strict'; - - function loadPage(page, config) { - - $('.chkMovies', page).checked(config.EnableIntrosForMovies); - $('.chkEpisodes', page).checked(config.EnableIntrosForEpisodes); - - $('.chkMyMovieTrailers', page).checked(config.EnableIntrosFromMoviesInLibrary); - - $('.chkUpcomingTheaterTrailers', page).checked(config.EnableIntrosFromUpcomingTrailers); - $('.chkUpcomingDvdTrailers', page).checked(config.EnableIntrosFromUpcomingDvdMovies); - $('.chkUpcomingStreamingTrailers', page).checked(config.EnableIntrosFromUpcomingStreamingMovies); - $('.chkOtherTrailers', page).checked(config.EnableIntrosFromSimilarMovies); - - $('.chkUnwatchedOnly', page).checked(!config.EnableIntrosForWatchedContent); - $('.chkEnableParentalControl', page).checked(config.EnableIntrosParentalControl); - - $('#txtCustomIntrosPath', page).val(config.CustomIntroPath || ''); - $('#txtCodecIntrosPath', page).val(config.MediaInfoIntroPath || ''); - $('#txtNumTrailers', page).val(config.TrailerLimit); - - Dashboard.hideLoadingMsg(); - } - - function onSubmit() { - Dashboard.showLoadingMsg(); - - var form = this; - - var page = $(form).parents('.page'); - - ApiClient.getNamedConfiguration("cinemamode").then(function (config) { - - config.CustomIntroPath = $('#txtCustomIntrosPath', page).val(); - config.MediaInfoIntroPath = $('#txtCodecIntrosPath', page).val(); - config.TrailerLimit = $('#txtNumTrailers', page).val(); - - config.EnableIntrosForMovies = $('.chkMovies', page).checked(); - config.EnableIntrosForEpisodes = $('.chkEpisodes', page).checked(); - config.EnableIntrosFromMoviesInLibrary = $('.chkMyMovieTrailers', page).checked(); - config.EnableIntrosForWatchedContent = !$('.chkUnwatchedOnly', page).checked(); - config.EnableIntrosParentalControl = $('.chkEnableParentalControl', page).checked(); - - config.EnableIntrosFromUpcomingTrailers = $('.chkUpcomingTheaterTrailers', page).checked(); - config.EnableIntrosFromUpcomingDvdMovies = $('.chkUpcomingDvdTrailers', page).checked(); - config.EnableIntrosFromUpcomingStreamingMovies = $('.chkUpcomingStreamingTrailers', page).checked(); - config.EnableIntrosFromSimilarMovies = $('.chkOtherTrailers', page).checked(); - - ApiClient.updateNamedConfiguration("cinemamode", config).then(Dashboard.processServerConfigurationUpdateResult); - }); - - // Disable default form submission - return false; - } - - function getTabs() { - return [ - { - href: 'cinemamodeconfiguration.html', - name: Globalize.translate('TabCinemaMode') - }, - { - href: 'playbackconfiguration.html', - name: Globalize.translate('TabResumeSettings') - }, - { - href: 'streamingsettings.html', - name: Globalize.translate('TabStreaming') - }]; - } - - $(document).on('pageinit', "#cinemaModeConfigurationPage", function () { - - var page = this; - - $('#btnSelectCustomIntrosPath', page).on("click.selectDirectory", function () { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - callback: function (path) { - - if (path) { - $('#txtCustomIntrosPath', page).val(path); - } - picker.close(); - }, - - header: Globalize.translate('HeaderSelectCustomIntrosPath') - }); - }); - }); - - $('#btnSelectCodecIntrosPath', page).on("click.selectDirectory", function () { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - callback: function (path) { - - if (path) { - $('#txtCodecIntrosPath', page).val(path); - } - picker.close(); - }, - - header: Globalize.translate('HeaderSelectCodecIntrosPath') - }); - }); - }); - - $('.cinemaModeConfigurationForm').off('submit', onSubmit).on('submit', onSubmit); - - if (!AppInfo.enableSupporterMembership) { - page.querySelector('.lnkSupporterLearnMore').href = '#'; - page.querySelector('.lnkSupporterLearnMore').addEventListener('click', function (e) { - e.preventDefault(); - return false; - }); - } - - }).on('pageshow', "#cinemaModeConfigurationPage", function () { - - LibraryMenu.setTabs('playback', 0, getTabs); - - Dashboard.showLoadingMsg(); - - var page = this; - - ApiClient.getNamedConfiguration("cinemamode").then(function (config) { - - loadPage(page, config); - - }); - }); - -}); +define(["jQuery","fnchecked"],function($){"use strict";function loadPage(page,config){$(".chkMovies",page).checked(config.EnableIntrosForMovies),$(".chkEpisodes",page).checked(config.EnableIntrosForEpisodes),$(".chkMyMovieTrailers",page).checked(config.EnableIntrosFromMoviesInLibrary),$(".chkUpcomingTheaterTrailers",page).checked(config.EnableIntrosFromUpcomingTrailers),$(".chkUpcomingDvdTrailers",page).checked(config.EnableIntrosFromUpcomingDvdMovies),$(".chkUpcomingStreamingTrailers",page).checked(config.EnableIntrosFromUpcomingStreamingMovies),$(".chkOtherTrailers",page).checked(config.EnableIntrosFromSimilarMovies),$(".chkUnwatchedOnly",page).checked(!config.EnableIntrosForWatchedContent),$(".chkEnableParentalControl",page).checked(config.EnableIntrosParentalControl),$("#txtCustomIntrosPath",page).val(config.CustomIntroPath||""),$("#txtCodecIntrosPath",page).val(config.MediaInfoIntroPath||""),$("#txtNumTrailers",page).val(config.TrailerLimit),Dashboard.hideLoadingMsg()}function onSubmit(){Dashboard.showLoadingMsg();var form=this,page=$(form).parents(".page");return ApiClient.getNamedConfiguration("cinemamode").then(function(config){config.CustomIntroPath=$("#txtCustomIntrosPath",page).val(),config.MediaInfoIntroPath=$("#txtCodecIntrosPath",page).val(),config.TrailerLimit=$("#txtNumTrailers",page).val(),config.EnableIntrosForMovies=$(".chkMovies",page).checked(),config.EnableIntrosForEpisodes=$(".chkEpisodes",page).checked(),config.EnableIntrosFromMoviesInLibrary=$(".chkMyMovieTrailers",page).checked(),config.EnableIntrosForWatchedContent=!$(".chkUnwatchedOnly",page).checked(),config.EnableIntrosParentalControl=$(".chkEnableParentalControl",page).checked(),config.EnableIntrosFromUpcomingTrailers=$(".chkUpcomingTheaterTrailers",page).checked(),config.EnableIntrosFromUpcomingDvdMovies=$(".chkUpcomingDvdTrailers",page).checked(),config.EnableIntrosFromUpcomingStreamingMovies=$(".chkUpcomingStreamingTrailers",page).checked(),config.EnableIntrosFromSimilarMovies=$(".chkOtherTrailers",page).checked(),ApiClient.updateNamedConfiguration("cinemamode",config).then(Dashboard.processServerConfigurationUpdateResult)}),!1}function getTabs(){return[{href:"cinemamodeconfiguration.html",name:Globalize.translate("TabCinemaMode")},{href:"playbackconfiguration.html",name:Globalize.translate("TabResumeSettings")},{href:"streamingsettings.html",name:Globalize.translate("TabStreaming")}]}$(document).on("pageinit","#cinemaModeConfigurationPage",function(){var page=this;$("#btnSelectCustomIntrosPath",page).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&$("#txtCustomIntrosPath",page).val(path),picker.close()},header:Globalize.translate("HeaderSelectCustomIntrosPath")})})}),$("#btnSelectCodecIntrosPath",page).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&$("#txtCodecIntrosPath",page).val(path),picker.close()},header:Globalize.translate("HeaderSelectCodecIntrosPath")})})}),$(".cinemaModeConfigurationForm").off("submit",onSubmit).on("submit",onSubmit),AppInfo.enableSupporterMembership||(page.querySelector(".lnkSupporterLearnMore").href="#",page.querySelector(".lnkSupporterLearnMore").addEventListener("click",function(e){return e.preventDefault(),!1}))}).on("pageshow","#cinemaModeConfigurationPage",function(){LibraryMenu.setTabs("playback",0,getTabs),Dashboard.showLoadingMsg();var page=this;ApiClient.getNamedConfiguration("cinemamode").then(function(config){loadPage(page,config)})})}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/dashboardgeneral.js b/dashboard-ui/dashboard/dashboardgeneral.js index c3e6c26407..cbfede87bd 100644 --- a/dashboard-ui/dashboard/dashboardgeneral.js +++ b/dashboard-ui/dashboard/dashboardgeneral.js @@ -1,158 +1 @@ -define(['jQuery', 'fnchecked', 'emby-checkbox', 'emby-collapse', 'emby-textarea', 'emby-input', 'emby-select'], function ($) { - 'use strict'; - - var brandingConfigKey = "branding"; - var currentBrandingOptions; - - var currentLanguage; - - function loadPage(page, config, languageOptions, systemInfo) { - - var os = systemInfo.OperatingSystem.toLowerCase(); - - if (os.indexOf('windows') != -1) { - $('#windowsStartupDescription', page).show(); - } else { - $('#windowsStartupDescription', page).hide(); - } - - if (systemInfo.SupportsAutoRunAtStartup) { - $('#fldRunAtStartup', page).show(); - } else { - $('#fldRunAtStartup', page).hide(); - } - - page.querySelector('#txtCachePath').value = config.CachePath || ''; - - $('#selectLocalizationLanguage', page).html(languageOptions.map(function (l) { - - return ''; - - })).val(config.UICulture); - - currentLanguage = config.UICulture; - $('#chkUsageData', page).checked(config.EnableAnonymousUsageReporting); - $('#chkRunAtStartup', page).checked(config.RunAtStartup); - - if (systemInfo.CanSelfUpdate) { - $('.fldAutomaticUpdates', page).show(); - } else { - $('.fldAutomaticUpdates', page).hide(); - } - - $('#chkEnableAutomaticServerUpdates', page).checked(config.EnableAutoUpdate); - $('#chkEnableAutomaticRestart', page).checked(config.EnableAutomaticRestart); - - if (systemInfo.CanSelfRestart) { - $('#fldEnableAutomaticRestart', page).show(); - } else { - $('#fldEnableAutomaticRestart', page).hide(); - } - - if (systemInfo.CanSelfRestart || systemInfo.CanSelfUpdate) { - $('.autoUpdatesContainer', page).removeClass('hide'); - } else { - $('.autoUpdatesContainer', page).addClass('hide'); - } - - Dashboard.hideLoadingMsg(); - } - - function onSubmit() { - Dashboard.showLoadingMsg(); - - var form = this; - var page = $(form).parents('.page'); - - ApiClient.getServerConfiguration().then(function (config) { - - config.UICulture = $('#selectLocalizationLanguage', form).val(); - - config.CachePath = form.querySelector('#txtCachePath').value; - - var requiresReload = false; - - if (config.UICulture != currentLanguage) { - requiresReload = true; - } - - config.EnableAnonymousUsageReporting = $('#chkUsageData', form).checked(); - config.RunAtStartup = $('#chkRunAtStartup', form).checked(); - - config.EnableAutomaticRestart = $('#chkEnableAutomaticRestart', form).checked(); - config.EnableAutoUpdate = $('#chkEnableAutomaticServerUpdates', form).checked(); - - ApiClient.updateServerConfiguration(config).then(function () { - - ApiClient.getNamedConfiguration(brandingConfigKey).then(function (brandingConfig) { - - brandingConfig.LoginDisclaimer = form.querySelector('#txtLoginDisclaimer').value; - brandingConfig.CustomCss = form.querySelector('#txtCustomCss').value; - - if (currentBrandingOptions && brandingConfig.CustomCss != currentBrandingOptions.CustomCss) { - requiresReload = true; - } - - ApiClient.updateNamedConfiguration(brandingConfigKey, brandingConfig).then(Dashboard.processServerConfigurationUpdateResult); - - if (requiresReload && !AppInfo.isNativeApp) { - window.location.reload(true); - } - }); - - }); - }); - - // Disable default form submission - return false; - } - - return function (view, params) { - - $('#btnSelectCachePath', view).on("click.selectDirectory", function () { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - callback: function (path) { - - if (path) { - view.querySelector('#txtCachePath').value = path; - } - picker.close(); - }, - - header: Globalize.translate('HeaderSelectServerCachePath'), - - instruction: Globalize.translate('HeaderSelectServerCachePathHelp') - }); - }); - }); - - $('.dashboardGeneralForm', view).off('submit', onSubmit).on('submit', onSubmit); - - view.addEventListener('viewshow', function () { - - var promise1 = ApiClient.getServerConfiguration(); - var promise2 = ApiClient.getJSON(ApiClient.getUrl("Localization/Options")); - var promise3 = ApiClient.getSystemInfo(); - - Promise.all([promise1, promise2, promise3]).then(function (responses) { - - loadPage(view, responses[0], responses[1], responses[2]); - - }); - - ApiClient.getNamedConfiguration(brandingConfigKey).then(function (config) { - - currentBrandingOptions = config; - - view.querySelector('#txtLoginDisclaimer').value = config.LoginDisclaimer || ''; - view.querySelector('#txtCustomCss').value = config.CustomCss || ''; - }); - }); - }; -}); +define(["jQuery","fnchecked","emby-checkbox","emby-collapse","emby-textarea","emby-input","emby-select"],function($){"use strict";function loadPage(page,config,languageOptions,systemInfo){var os=systemInfo.OperatingSystem.toLowerCase();os.indexOf("windows")!=-1?$("#windowsStartupDescription",page).show():$("#windowsStartupDescription",page).hide(),systemInfo.SupportsAutoRunAtStartup?$("#fldRunAtStartup",page).show():$("#fldRunAtStartup",page).hide(),page.querySelector("#txtCachePath").value=config.CachePath||"",$("#selectLocalizationLanguage",page).html(languageOptions.map(function(l){return'"})).val(config.UICulture),currentLanguage=config.UICulture,$("#chkUsageData",page).checked(config.EnableAnonymousUsageReporting),$("#chkRunAtStartup",page).checked(config.RunAtStartup),systemInfo.CanSelfUpdate?$(".fldAutomaticUpdates",page).show():$(".fldAutomaticUpdates",page).hide(),$("#chkEnableAutomaticServerUpdates",page).checked(config.EnableAutoUpdate),$("#chkEnableAutomaticRestart",page).checked(config.EnableAutomaticRestart),systemInfo.CanSelfRestart?$("#fldEnableAutomaticRestart",page).show():$("#fldEnableAutomaticRestart",page).hide(),systemInfo.CanSelfRestart||systemInfo.CanSelfUpdate?$(".autoUpdatesContainer",page).removeClass("hide"):$(".autoUpdatesContainer",page).addClass("hide"),Dashboard.hideLoadingMsg()}function onSubmit(){Dashboard.showLoadingMsg();var form=this;$(form).parents(".page");return ApiClient.getServerConfiguration().then(function(config){config.UICulture=$("#selectLocalizationLanguage",form).val(),config.CachePath=form.querySelector("#txtCachePath").value;var requiresReload=!1;config.UICulture!=currentLanguage&&(requiresReload=!0),config.EnableAnonymousUsageReporting=$("#chkUsageData",form).checked(),config.RunAtStartup=$("#chkRunAtStartup",form).checked(),config.EnableAutomaticRestart=$("#chkEnableAutomaticRestart",form).checked(),config.EnableAutoUpdate=$("#chkEnableAutomaticServerUpdates",form).checked(),ApiClient.updateServerConfiguration(config).then(function(){ApiClient.getNamedConfiguration(brandingConfigKey).then(function(brandingConfig){brandingConfig.LoginDisclaimer=form.querySelector("#txtLoginDisclaimer").value,brandingConfig.CustomCss=form.querySelector("#txtCustomCss").value,currentBrandingOptions&&brandingConfig.CustomCss!=currentBrandingOptions.CustomCss&&(requiresReload=!0),ApiClient.updateNamedConfiguration(brandingConfigKey,brandingConfig).then(Dashboard.processServerConfigurationUpdateResult),requiresReload&&!AppInfo.isNativeApp&&window.location.reload(!0)})})}),!1}var currentBrandingOptions,currentLanguage,brandingConfigKey="branding";return function(view,params){$("#btnSelectCachePath",view).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&(view.querySelector("#txtCachePath").value=path),picker.close()},header:Globalize.translate("HeaderSelectServerCachePath"),instruction:Globalize.translate("HeaderSelectServerCachePathHelp")})})}),$(".dashboardGeneralForm",view).off("submit",onSubmit).on("submit",onSubmit),view.addEventListener("viewshow",function(){var promise1=ApiClient.getServerConfiguration(),promise2=ApiClient.getJSON(ApiClient.getUrl("Localization/Options")),promise3=ApiClient.getSystemInfo();Promise.all([promise1,promise2,promise3]).then(function(responses){loadPage(view,responses[0],responses[1],responses[2])}),ApiClient.getNamedConfiguration(brandingConfigKey).then(function(config){currentBrandingOptions=config,view.querySelector("#txtLoginDisclaimer").value=config.LoginDisclaimer||"",view.querySelector("#txtCustomCss").value=config.CustomCss||""})})}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/dashboardhosting.js b/dashboard-ui/dashboard/dashboardhosting.js index cebbc67eae..dbce604b08 100644 --- a/dashboard-ui/dashboard/dashboardhosting.js +++ b/dashboard-ui/dashboard/dashboardhosting.js @@ -1,139 +1 @@ -define(['jQuery', 'fnchecked', 'emby-checkbox'], function ($) { - 'use strict'; - - function onSubmit() { - var form = this; - var localAddress = form.querySelector('#txtLocalAddress').value; - var enableUpnp = $('#chkEnableUpnp', form).checked(); - - confirmSelections(localAddress, enableUpnp, function () { - - Dashboard.showLoadingMsg(); - - ApiClient.getServerConfiguration().then(function (config) { - - config.HttpServerPortNumber = $('#txtPortNumber', form).val(); - config.PublicPort = $('#txtPublicPort', form).val(); - config.PublicHttpsPort = $('#txtPublicHttpsPort', form).val(); - config.EnableHttps = $('#chkEnableHttps', form).checked(); - config.HttpsPortNumber = $('#txtHttpsPort', form).val(); - config.EnableUPnP = enableUpnp; - config.WanDdns = $('#txtDdns', form).val(); - config.CertificatePath = $('#txtCertificatePath', form).val(); - - config.LocalNetworkAddresses = localAddress ? [localAddress] : []; - - ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult, Dashboard.processErrorResponse); - }); - }); - - // Disable default form submission - return false; - } - - function confirmSelections(localAddress, enableUpnp, callback) { - - if (localAddress || !enableUpnp) { - - require(['alert'], function (alert) { - alert({ - title: Globalize.translate('TitleHostingSettings'), - text: Globalize.translate('SettingsWarning') - }).then(callback); - }); - - } else { - callback(); - } - } - - function getTabs() { - return [ - { - href: 'dashboardhosting.html', - name: Globalize.translate('TabHosting') - }, - { - href: 'serversecurity.html', - name: Globalize.translate('TabSecurity') - }]; - } - - return function (view, params) { - - var self = this; - - function loadPage(page, config) { - - $('#txtPortNumber', page).val(config.HttpServerPortNumber); - $('#txtPublicPort', page).val(config.PublicPort); - $('#txtPublicHttpsPort', page).val(config.PublicHttpsPort); - - page.querySelector('#txtLocalAddress').value = config.LocalNetworkAddresses[0] || ''; - - var chkEnableHttps = page.querySelector('#chkEnableHttps'); - chkEnableHttps.checked = config.EnableHttps; - - $('#txtHttpsPort', page).val(config.HttpsPortNumber); - - $('#txtDdns', page).val(config.WanDdns || ''); - - var txtCertificatePath = page.querySelector('#txtCertificatePath'); - txtCertificatePath.value = config.CertificatePath || ''; - - $('#chkEnableUpnp', page).checked(config.EnableUPnP); - - onCertPathChange.call(txtCertificatePath); - - Dashboard.hideLoadingMsg(); - } - - function onCertPathChange() { - - if (this.value) { - view.querySelector('#txtDdns').setAttribute('required', 'required'); - } else { - view.querySelector('#txtDdns').removeAttribute('required'); - } - } - - $('#btnSelectCertPath', view).on("click.selectDirectory", function () { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - includeFiles: true, - includeDirectories: true, - - callback: function (path) { - - if (path) { - $('#txtCertificatePath', view).val(path); - } - picker.close(); - }, - - header: Globalize.translate('HeaderSelectCertificatePath') - }); - }); - }); - - $('.dashboardHostingForm').off('submit', onSubmit).on('submit', onSubmit); - - view.querySelector('#txtCertificatePath').addEventListener('change', onCertPathChange); - - view.addEventListener('viewshow', function (e) { - LibraryMenu.setTabs('adminadvanced', 0, getTabs); - Dashboard.showLoadingMsg(); - - ApiClient.getServerConfiguration().then(function (config) { - - loadPage(view, config); - - }); - }); - }; -}); +define(["jQuery","fnchecked","emby-checkbox"],function($){"use strict";function onSubmit(){var form=this,localAddress=form.querySelector("#txtLocalAddress").value,enableUpnp=$("#chkEnableUpnp",form).checked();return confirmSelections(localAddress,enableUpnp,function(){Dashboard.showLoadingMsg(),ApiClient.getServerConfiguration().then(function(config){config.HttpServerPortNumber=$("#txtPortNumber",form).val(),config.PublicPort=$("#txtPublicPort",form).val(),config.PublicHttpsPort=$("#txtPublicHttpsPort",form).val(),config.EnableHttps=$("#chkEnableHttps",form).checked(),config.HttpsPortNumber=$("#txtHttpsPort",form).val(),config.EnableUPnP=enableUpnp,config.WanDdns=$("#txtDdns",form).val(),config.CertificatePath=$("#txtCertificatePath",form).val(),config.LocalNetworkAddresses=localAddress?[localAddress]:[],ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult,Dashboard.processErrorResponse)})}),!1}function confirmSelections(localAddress,enableUpnp,callback){localAddress||!enableUpnp?require(["alert"],function(alert){alert({title:Globalize.translate("TitleHostingSettings"),text:Globalize.translate("SettingsWarning")}).then(callback)}):callback()}function getTabs(){return[{href:"dashboardhosting.html",name:Globalize.translate("TabHosting")},{href:"serversecurity.html",name:Globalize.translate("TabSecurity")}]}return function(view,params){function loadPage(page,config){$("#txtPortNumber",page).val(config.HttpServerPortNumber),$("#txtPublicPort",page).val(config.PublicPort),$("#txtPublicHttpsPort",page).val(config.PublicHttpsPort),page.querySelector("#txtLocalAddress").value=config.LocalNetworkAddresses[0]||"";var chkEnableHttps=page.querySelector("#chkEnableHttps");chkEnableHttps.checked=config.EnableHttps,$("#txtHttpsPort",page).val(config.HttpsPortNumber),$("#txtDdns",page).val(config.WanDdns||"");var txtCertificatePath=page.querySelector("#txtCertificatePath");txtCertificatePath.value=config.CertificatePath||"",$("#chkEnableUpnp",page).checked(config.EnableUPnP),onCertPathChange.call(txtCertificatePath),Dashboard.hideLoadingMsg()}function onCertPathChange(){this.value?view.querySelector("#txtDdns").setAttribute("required","required"):view.querySelector("#txtDdns").removeAttribute("required")}$("#btnSelectCertPath",view).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({includeFiles:!0,includeDirectories:!0,callback:function(path){path&&$("#txtCertificatePath",view).val(path),picker.close()},header:Globalize.translate("HeaderSelectCertificatePath")})})}),$(".dashboardHostingForm").off("submit",onSubmit).on("submit",onSubmit),view.querySelector("#txtCertificatePath").addEventListener("change",onCertPathChange),view.addEventListener("viewshow",function(e){LibraryMenu.setTabs("adminadvanced",0,getTabs),Dashboard.showLoadingMsg(),ApiClient.getServerConfiguration().then(function(config){loadPage(view,config)})})}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/devicesupload.js b/dashboard-ui/dashboard/devicesupload.js index 281582dd05..4980fc3b50 100644 --- a/dashboard-ui/dashboard/devicesupload.js +++ b/dashboard-ui/dashboard/devicesupload.js @@ -1,101 +1 @@ -define(['jQuery', 'fnchecked'], function ($) { - 'use strict'; - - function load(page, config) { - - $('#txtUploadPath', page).val(config.CameraUploadPath || ''); - - $('#chkSubfolder', page).checked(config.EnableCameraUploadSubfolders); - } - - function loadData(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getNamedConfiguration("devices").then(function (config) { - load(page, config); - - Dashboard.hideLoadingMsg(); - }); - } - - function save(page) { - - ApiClient.getNamedConfiguration("devices").then(function (config) { - - config.CameraUploadPath = $('#txtUploadPath', page).val(); - - config.EnableCameraUploadSubfolders = $('#chkSubfolder', page).checked(); - - ApiClient.updateNamedConfiguration("devices", config).then(Dashboard.processServerConfigurationUpdateResult); - }); - - } - - function onSubmit() { - var form = this; - var page = $(form).parents('.page'); - - save(page); - - return false; - } - - function getTabs() { - return [ - { - href: 'syncactivity.html', - name: Globalize.translate('TabSyncJobs') - }, - { - href: 'devicesupload.html', - name: Globalize.translate('TabCameraUpload') - }, - { - href: 'appservices.html?context=sync', - name: Globalize.translate('TabServices') - }, - { - href: 'syncsettings.html', - name: Globalize.translate('TabSettings') - }]; - } - - $(document).on('pageinit', "#devicesUploadPage", function () { - - var page = this; - - $('#btnSelectUploadPath', page).on("click.selectDirectory", function () { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - callback: function (path) { - - if (path) { - $('#txtUploadPath', page).val(path); - } - picker.close(); - }, - - header: Globalize.translate('HeaderSelectUploadPath') - }); - }); - }); - - $('.devicesUploadForm').off('submit', onSubmit).on('submit', onSubmit); - - - }).on('pageshow', "#devicesUploadPage", function () { - - LibraryMenu.setTabs('syncadmin', 1, getTabs); - var page = this; - - loadData(page); - - }); - -}); \ No newline at end of file +define(["jQuery","fnchecked"],function($){"use strict";function load(page,config){$("#txtUploadPath",page).val(config.CameraUploadPath||""),$("#chkSubfolder",page).checked(config.EnableCameraUploadSubfolders)}function loadData(page){Dashboard.showLoadingMsg(),ApiClient.getNamedConfiguration("devices").then(function(config){load(page,config),Dashboard.hideLoadingMsg()})}function save(page){ApiClient.getNamedConfiguration("devices").then(function(config){config.CameraUploadPath=$("#txtUploadPath",page).val(),config.EnableCameraUploadSubfolders=$("#chkSubfolder",page).checked(),ApiClient.updateNamedConfiguration("devices",config).then(Dashboard.processServerConfigurationUpdateResult)})}function onSubmit(){var form=this,page=$(form).parents(".page");return save(page),!1}function getTabs(){return[{href:"syncactivity.html",name:Globalize.translate("TabSyncJobs")},{href:"devicesupload.html",name:Globalize.translate("TabCameraUpload")},{href:"appservices.html?context=sync",name:Globalize.translate("TabServices")},{href:"syncsettings.html",name:Globalize.translate("TabSettings")}]}$(document).on("pageinit","#devicesUploadPage",function(){var page=this;$("#btnSelectUploadPath",page).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&$("#txtUploadPath",page).val(path),picker.close()},header:Globalize.translate("HeaderSelectUploadPath")})})}),$(".devicesUploadForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#devicesUploadPage",function(){LibraryMenu.setTabs("syncadmin",1,getTabs);var page=this;loadData(page)})}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/librarydisplay.js b/dashboard-ui/dashboard/librarydisplay.js index f1672d2c8f..8a5482b966 100644 --- a/dashboard-ui/dashboard/librarydisplay.js +++ b/dashboard-ui/dashboard/librarydisplay.js @@ -1,70 +1 @@ -define(['globalize', 'emby-checkbox', 'emby-button'], function (globalize) { - 'use strict'; - - function getTabs() { - return [ - { - href: 'library.html', - name: Globalize.translate('HeaderLibraries') - }, - { - href: 'librarydisplay.html', - name: Globalize.translate('TabDisplay') - }, - { - href: 'metadataimages.html', - name: Globalize.translate('TabMetadata') - }, - { - href: 'metadatanfo.html', - name: Globalize.translate('TabNfoSettings') - }, - { - href: 'librarysettings.html', - name: Globalize.translate('TabAdvanced') - }]; - } - - return function (view, params) { - - var self = this; - - view.querySelector('form').addEventListener('submit', function (e) { - - Dashboard.showLoadingMsg(); - - var form = this; - - ApiClient.getServerConfiguration().then(function (config) { - - config.EnableFolderView = form.querySelector('.chkFolderView').checked; - config.EnableGroupingIntoCollections = form.querySelector('.chkGroupMoviesIntoCollections').checked; - config.DisplaySpecialsWithinSeasons = form.querySelector('.chkDisplaySpecialsWithinSeasons').checked; - config.DisplayCollectionsView = form.querySelector('.chkDisplayCollectionView').checked; - config.EnableChannelView = !form.querySelector('.chkDisplayChannelsInline').checked; - config.EnableExternalContentInSuggestions = form.querySelector('.chkExternalContentInSuggestions').checked; - - ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); - }); - - e.preventDefault(); - return false; - }); - - function loadData() { - ApiClient.getServerConfiguration().then(function (config) { - view.querySelector('.chkFolderView').checked = config.EnableFolderView; - view.querySelector('.chkGroupMoviesIntoCollections').checked = config.EnableGroupingIntoCollections; - view.querySelector('.chkDisplaySpecialsWithinSeasons').checked = config.DisplaySpecialsWithinSeasons; - view.querySelector('.chkDisplayCollectionView').checked = config.DisplayCollectionsView; - view.querySelector('.chkDisplayChannelsInline').checked = !(config.EnableChannelView || false); - view.querySelector('.chkExternalContentInSuggestions').checked = config.EnableExternalContentInSuggestions; - }); - } - - view.addEventListener('viewshow', function () { - LibraryMenu.setTabs('librarysetup', 1, getTabs); - loadData(); - }); - }; -}); \ No newline at end of file +define(["globalize","emby-checkbox","emby-button"],function(globalize){"use strict";function getTabs(){return[{href:"library.html",name:Globalize.translate("HeaderLibraries")},{href:"librarydisplay.html",name:Globalize.translate("TabDisplay")},{href:"metadataimages.html",name:Globalize.translate("TabMetadata")},{href:"metadatanfo.html",name:Globalize.translate("TabNfoSettings")},{href:"librarysettings.html",name:Globalize.translate("TabAdvanced")}]}return function(view,params){function loadData(){ApiClient.getServerConfiguration().then(function(config){view.querySelector(".chkFolderView").checked=config.EnableFolderView,view.querySelector(".chkGroupMoviesIntoCollections").checked=config.EnableGroupingIntoCollections,view.querySelector(".chkDisplaySpecialsWithinSeasons").checked=config.DisplaySpecialsWithinSeasons,view.querySelector(".chkDisplayCollectionView").checked=config.DisplayCollectionsView,view.querySelector(".chkDisplayChannelsInline").checked=!config.EnableChannelView,view.querySelector(".chkExternalContentInSuggestions").checked=config.EnableExternalContentInSuggestions})}view.querySelector("form").addEventListener("submit",function(e){Dashboard.showLoadingMsg();var form=this;return ApiClient.getServerConfiguration().then(function(config){config.EnableFolderView=form.querySelector(".chkFolderView").checked,config.EnableGroupingIntoCollections=form.querySelector(".chkGroupMoviesIntoCollections").checked,config.DisplaySpecialsWithinSeasons=form.querySelector(".chkDisplaySpecialsWithinSeasons").checked,config.DisplayCollectionsView=form.querySelector(".chkDisplayCollectionView").checked,config.EnableChannelView=!form.querySelector(".chkDisplayChannelsInline").checked,config.EnableExternalContentInSuggestions=form.querySelector(".chkExternalContentInSuggestions").checked,ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult)}),e.preventDefault(),!1}),view.addEventListener("viewshow",function(){LibraryMenu.setTabs("librarysetup",1,getTabs),loadData()})}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/librarysettings.js b/dashboard-ui/dashboard/librarysettings.js index 39719fb834..434ec8bd4f 100644 --- a/dashboard-ui/dashboard/librarysettings.js +++ b/dashboard-ui/dashboard/librarysettings.js @@ -1,161 +1 @@ -define(['jQuery', 'fnchecked', 'emby-checkbox'], function ($) { - 'use strict'; - - function loadPage(page, config) { - - if (config.MergeMetadataAndImagesByName) { - $('.fldImagesByName', page).hide(); - } else { - $('.fldImagesByName', page).show(); - } - - $('#txtSeasonZeroName', page).val(config.SeasonZeroDisplayName); - - $('#chkSaveMetadataHidden', page).checked(config.SaveMetadataHidden); - - $('#txtMetadataPath', page).val(config.MetadataPath || ''); - $('#txtMetadataNetworkPath', page).val(config.MetadataNetworkPath || ''); - - Dashboard.hideLoadingMsg(); - } - - function loadMetadataConfig(page, config) { - - $('#selectDateAdded', page).val((config.UseFileCreationTimeForDateAdded ? '1' : '0')); - } - - function loadFanartConfig(page, config) { - - $('#txtFanartApiKey', page).val(config.UserApiKey || ''); - } - - function saveFanart(form) { - - ApiClient.getNamedConfiguration("fanart").then(function (config) { - - config.UserApiKey = $('#txtFanartApiKey', form).val(); - - ApiClient.updateNamedConfiguration("fanart", config); - }); - } - - function saveMetadata(form) { - - ApiClient.getNamedConfiguration("metadata").then(function (config) { - - config.UseFileCreationTimeForDateAdded = $('#selectDateAdded', form).val() == '1'; - - ApiClient.updateNamedConfiguration("metadata", config); - }); - } - - function onSubmit() { - Dashboard.showLoadingMsg(); - - var form = this; - - ApiClient.getServerConfiguration().then(function (config) { - - config.SeasonZeroDisplayName = $('#txtSeasonZeroName', form).val(); - - config.SaveMetadataHidden = $('#chkSaveMetadataHidden', form).checked(); - - config.EnableTvDbUpdates = $('#chkEnableTvdbUpdates', form).checked(); - config.EnableTmdbUpdates = $('#chkEnableTmdbUpdates', form).checked(); - config.EnableFanArtUpdates = $('#chkEnableFanartUpdates', form).checked(); - config.MetadataPath = $('#txtMetadataPath', form).val(); - config.MetadataNetworkPath = $('#txtMetadataNetworkPath', form).val(); - config.FanartApiKey = $('#txtFanartApiKey', form).val(); - - ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); - }); - - saveMetadata(form); - saveFanart(form); - - // Disable default form submission - return false; - } - - function getTabs() { - return [ - { - href: 'library.html', - name: Globalize.translate('HeaderLibraries') - }, - { - href: 'librarydisplay.html', - name: Globalize.translate('TabDisplay') - }, - { - href: 'metadataimages.html', - name: Globalize.translate('TabMetadata') - }, - { - href: 'metadatanfo.html', - name: Globalize.translate('TabNfoSettings') - }, - { - href: 'librarysettings.html', - name: Globalize.translate('TabAdvanced') - }]; - } - - return function (view, params) { - - var self = this; - - $('#btnSelectMetadataPath', view).on("click.selectDirectory", function () { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - path: $('#txtMetadataPath', view).val(), - networkSharePath: $('#txtMetadataNetworkPath', view).val(), - callback: function (path, networkPath) { - if (path) { - $('#txtMetadataPath', view).val(path); - $('#txtMetadataNetworkPath', view).val(networkPath); - } - picker.close(); - }, - - header: Globalize.translate('HeaderSelectMetadataPath'), - - instruction: Globalize.translate('HeaderSelectMetadataPathHelp'), - - enableNetworkSharePath: true - }); - }); - - }); - - $('.librarySettingsForm').off('submit', onSubmit).on('submit', onSubmit); - - view.addEventListener('viewshow', function () { - LibraryMenu.setTabs('librarysetup', 4, getTabs); - Dashboard.showLoadingMsg(); - - var page = this; - - ApiClient.getServerConfiguration().then(function (config) { - - loadPage(page, config); - }); - - ApiClient.getNamedConfiguration("metadata").then(function (metadata) { - - loadMetadataConfig(page, metadata); - }); - - ApiClient.getNamedConfiguration("fanart").then(function (metadata) { - - loadFanartConfig(page, metadata); - }); - }); - }; - -}); +define(["jQuery","fnchecked","emby-checkbox"],function($){"use strict";function loadPage(page,config){config.MergeMetadataAndImagesByName?$(".fldImagesByName",page).hide():$(".fldImagesByName",page).show(),$("#txtSeasonZeroName",page).val(config.SeasonZeroDisplayName),$("#chkSaveMetadataHidden",page).checked(config.SaveMetadataHidden),$("#txtMetadataPath",page).val(config.MetadataPath||""),$("#txtMetadataNetworkPath",page).val(config.MetadataNetworkPath||""),Dashboard.hideLoadingMsg()}function loadMetadataConfig(page,config){$("#selectDateAdded",page).val(config.UseFileCreationTimeForDateAdded?"1":"0")}function loadFanartConfig(page,config){$("#txtFanartApiKey",page).val(config.UserApiKey||"")}function saveFanart(form){ApiClient.getNamedConfiguration("fanart").then(function(config){config.UserApiKey=$("#txtFanartApiKey",form).val(),ApiClient.updateNamedConfiguration("fanart",config)})}function saveMetadata(form){ApiClient.getNamedConfiguration("metadata").then(function(config){config.UseFileCreationTimeForDateAdded="1"==$("#selectDateAdded",form).val(),ApiClient.updateNamedConfiguration("metadata",config)})}function onSubmit(){Dashboard.showLoadingMsg();var form=this;return ApiClient.getServerConfiguration().then(function(config){config.SeasonZeroDisplayName=$("#txtSeasonZeroName",form).val(),config.SaveMetadataHidden=$("#chkSaveMetadataHidden",form).checked(),config.EnableTvDbUpdates=$("#chkEnableTvdbUpdates",form).checked(),config.EnableTmdbUpdates=$("#chkEnableTmdbUpdates",form).checked(),config.EnableFanArtUpdates=$("#chkEnableFanartUpdates",form).checked(),config.MetadataPath=$("#txtMetadataPath",form).val(),config.MetadataNetworkPath=$("#txtMetadataNetworkPath",form).val(),config.FanartApiKey=$("#txtFanartApiKey",form).val(),ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult)}),saveMetadata(form),saveFanart(form),!1}function getTabs(){return[{href:"library.html",name:Globalize.translate("HeaderLibraries")},{href:"librarydisplay.html",name:Globalize.translate("TabDisplay")},{href:"metadataimages.html",name:Globalize.translate("TabMetadata")},{href:"metadatanfo.html",name:Globalize.translate("TabNfoSettings")},{href:"librarysettings.html",name:Globalize.translate("TabAdvanced")}]}return function(view,params){$("#btnSelectMetadataPath",view).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({path:$("#txtMetadataPath",view).val(),networkSharePath:$("#txtMetadataNetworkPath",view).val(),callback:function(path,networkPath){path&&($("#txtMetadataPath",view).val(path),$("#txtMetadataNetworkPath",view).val(networkPath)),picker.close()},header:Globalize.translate("HeaderSelectMetadataPath"),instruction:Globalize.translate("HeaderSelectMetadataPathHelp"),enableNetworkSharePath:!0})})}),$(".librarySettingsForm").off("submit",onSubmit).on("submit",onSubmit),view.addEventListener("viewshow",function(){LibraryMenu.setTabs("librarysetup",4,getTabs),Dashboard.showLoadingMsg();var page=this;ApiClient.getServerConfiguration().then(function(config){loadPage(page,config)}),ApiClient.getNamedConfiguration("metadata").then(function(metadata){loadMetadataConfig(page,metadata)}),ApiClient.getNamedConfiguration("fanart").then(function(metadata){loadFanartConfig(page,metadata)})})}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/livetvtunerprovider-satip.js b/dashboard-ui/dashboard/livetvtunerprovider-satip.js index 3897eeb024..5550b6c181 100644 --- a/dashboard-ui/dashboard/livetvtunerprovider-satip.js +++ b/dashboard-ui/dashboard/livetvtunerprovider-satip.js @@ -1,136 +1 @@ -define(['emby-checkbox'], function () { - 'use strict'; - - function reload(page, providerId) { - - page.querySelector('.txtDevicePath').value = ''; - - if (providerId) { - ApiClient.getNamedConfiguration("livetv").then(function (config) { - - var info = config.TunerHosts.filter(function (i) { - return i.Id == providerId; - })[0]; - - page.querySelector('.txtDevicePath').value = info.Url || ''; - page.querySelector('.txtM3uUrl').value = info.M3UUrl || ''; - page.querySelector('.chkEnabled').checked = info.IsEnabled; - }); - } - } - - function fillInfoFromPage(page, info) { - info.Url = page.querySelector('.txtDevicePath').value; - info.M3UUrl = page.querySelector('.txtM3uUrl').value; - info.IsEnabled = page.querySelector('.chkEnabled').checked; - info.DiseqC = page.querySelector('.selectDiseqC').value; - info.SourceA = page.querySelector('.selectSourceA').value; - info.SourceB = page.querySelector('.selectSourceB').value; - info.SourceC = page.querySelector('.selectSourceC').value; - info.SourceD = page.querySelector('.selectSourceD').value; - } - - function submitTunerInfo(page, info) { - ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl('LiveTv/TunerHosts'), - data: JSON.stringify(info), - contentType: "application/json" - - }).then(function () { - - Dashboard.processServerConfigurationUpdateResult(); - Dashboard.navigate('livetvstatus.html'); - - }, function () { - Dashboard.hideLoadingMsg(); - Dashboard.alert({ - message: Globalize.translate('ErrorSavingTvProvider') - }); - }); - } - - function populateMappings(view) { - - ApiClient.getJSON(ApiClient.getUrl('LiveTv/TunerHosts/Satip/IniMappings')).then(function (mappings) { - - var optionsHtml = mappings.map(function (m) { - return ''; - }).join(''); - - optionsHtml = '' + optionsHtml; - - view.querySelector('.selectSourceA').innerHTML = optionsHtml; - view.querySelector('.selectSourceB').innerHTML = optionsHtml; - view.querySelector('.selectSourceC').innerHTML = optionsHtml; - view.querySelector('.selectSourceD').innerHTML = optionsHtml; - }); - } - - return function (view, params) { - - function submitForm() { - - Dashboard.showLoadingMsg(); - - var id = params.id; - - if (id) { - - ApiClient.getNamedConfiguration("livetv").then(function (config) { - - var info = config.TunerHosts.filter(function (i) { - return i.Id == id; - })[0]; - - fillInfoFromPage(view, info); - submitTunerInfo(view, info); - }); - - } else { - var info = { - Type: 'satip' - }; - - fillInfoFromPage(view, info); - submitTunerInfo(view, info); - } - } - - function onSelectDiseqCChange(e) { - - var select = e.target; - var value = select.value; - - if (value) { - view.querySelector('.fldSourceB').classList.remove('hide'); - } else { - view.querySelector('.fldSourceB').classList.add('hide'); - } - - if (value == 'diseqc1') { - - view.querySelector('.fldSourceC').classList.remove('hide'); - view.querySelector('.fldSourceD').classList.remove('hide'); - } else { - view.querySelector('.fldSourceC').classList.add('hide'); - view.querySelector('.fldSourceD').classList.add('hide'); - } - } - - view.querySelector('form').addEventListener('submit', function (e) { - submitForm(); - e.preventDefault(); - return false; - }); - - view.querySelector('.selectDiseqC').addEventListener('change', onSelectDiseqCChange); - - populateMappings(view); - - view.addEventListener('viewshow', function (e) { - var providerId = params.id; - reload(view, providerId); - }); - } -}); \ No newline at end of file +define(["emby-checkbox"],function(){"use strict";function reload(page,providerId){page.querySelector(".txtDevicePath").value="",providerId&&ApiClient.getNamedConfiguration("livetv").then(function(config){var info=config.TunerHosts.filter(function(i){return i.Id==providerId})[0];page.querySelector(".txtDevicePath").value=info.Url||"",page.querySelector(".txtM3uUrl").value=info.M3UUrl||"",page.querySelector(".chkEnabled").checked=info.IsEnabled})}function fillInfoFromPage(page,info){info.Url=page.querySelector(".txtDevicePath").value,info.M3UUrl=page.querySelector(".txtM3uUrl").value,info.IsEnabled=page.querySelector(".chkEnabled").checked,info.DiseqC=page.querySelector(".selectDiseqC").value,info.SourceA=page.querySelector(".selectSourceA").value,info.SourceB=page.querySelector(".selectSourceB").value,info.SourceC=page.querySelector(".selectSourceC").value,info.SourceD=page.querySelector(".selectSourceD").value}function submitTunerInfo(page,info){ApiClient.ajax({type:"POST",url:ApiClient.getUrl("LiveTv/TunerHosts"),data:JSON.stringify(info),contentType:"application/json"}).then(function(){Dashboard.processServerConfigurationUpdateResult(),Dashboard.navigate("livetvstatus.html")},function(){Dashboard.hideLoadingMsg(),Dashboard.alert({message:Globalize.translate("ErrorSavingTvProvider")})})}function populateMappings(view){ApiClient.getJSON(ApiClient.getUrl("LiveTv/TunerHosts/Satip/IniMappings")).then(function(mappings){var optionsHtml=mappings.map(function(m){return'"}).join("");optionsHtml='"+optionsHtml,view.querySelector(".selectSourceA").innerHTML=optionsHtml,view.querySelector(".selectSourceB").innerHTML=optionsHtml,view.querySelector(".selectSourceC").innerHTML=optionsHtml,view.querySelector(".selectSourceD").innerHTML=optionsHtml})}return function(view,params){function submitForm(){Dashboard.showLoadingMsg();var id=params.id;if(id)ApiClient.getNamedConfiguration("livetv").then(function(config){var info=config.TunerHosts.filter(function(i){return i.Id==id})[0];fillInfoFromPage(view,info),submitTunerInfo(view,info)});else{var info={Type:"satip"};fillInfoFromPage(view,info),submitTunerInfo(view,info)}}function onSelectDiseqCChange(e){var select=e.target,value=select.value;value?view.querySelector(".fldSourceB").classList.remove("hide"):view.querySelector(".fldSourceB").classList.add("hide"),"diseqc1"==value?(view.querySelector(".fldSourceC").classList.remove("hide"),view.querySelector(".fldSourceD").classList.remove("hide")):(view.querySelector(".fldSourceC").classList.add("hide"),view.querySelector(".fldSourceD").classList.add("hide"))}view.querySelector("form").addEventListener("submit",function(e){return submitForm(),e.preventDefault(),!1}),view.querySelector(".selectDiseqC").addEventListener("change",onSelectDiseqCChange),populateMappings(view),view.addEventListener("viewshow",function(e){var providerId=params.id;reload(view,providerId)})}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/logpage.js b/dashboard-ui/dashboard/logpage.js index f6c454547c..048bd1e31f 100644 --- a/dashboard-ui/dashboard/logpage.js +++ b/dashboard-ui/dashboard/logpage.js @@ -1,79 +1 @@ -define(['datetime', 'listViewStyle'], function (datetime) { - 'use strict'; - - return function (view, params) { - - view.querySelector('#chkDebugLog').addEventListener('change', function () { - - ApiClient.getServerConfiguration().then(function (config) { - - config.EnableDebugLevelLogging = view.querySelector('#chkDebugLog').checked; - - ApiClient.updateServerConfiguration(config); - }); - }); - - view.addEventListener('viewbeforeshow', function () { - - Dashboard.showLoadingMsg(); - - var apiClient = ApiClient; - - apiClient.getJSON(apiClient.getUrl('System/Logs')).then(function (logs) { - - var html = ''; - - html += '
'; - - html += logs.map(function (log) { - - var logUrl = apiClient.getUrl('System/Logs/Log', { - name: log.Name - }); - - logUrl += "&api_key=" + apiClient.accessToken(); - - var logHtml = ''; - logHtml += ''; - - return logHtml; - - }) - .join(''); - - html += '
'; - - view.querySelector('.serverLogs').innerHTML = html; - Dashboard.hideLoadingMsg(); - }); - - apiClient.getServerConfiguration().then(function (config) { - - view.querySelector('#chkDebugLog').checked = config.EnableDebugLevelLogging; - }); - }); - - }; -}); \ No newline at end of file +define(["datetime","listViewStyle"],function(datetime){"use strict";return function(view,params){view.querySelector("#chkDebugLog").addEventListener("change",function(){ApiClient.getServerConfiguration().then(function(config){config.EnableDebugLevelLogging=view.querySelector("#chkDebugLog").checked,ApiClient.updateServerConfiguration(config)})}),view.addEventListener("viewbeforeshow",function(){Dashboard.showLoadingMsg();var apiClient=ApiClient;apiClient.getJSON(apiClient.getUrl("System/Logs")).then(function(logs){var html="";html+='
',html+=logs.map(function(log){var logUrl=apiClient.getUrl("System/Logs/Log",{name:log.Name});logUrl+="&api_key="+apiClient.accessToken();var logHtml="";logHtml+='"}).join(""),html+="
",view.querySelector(".serverLogs").innerHTML=html,Dashboard.hideLoadingMsg()}),apiClient.getServerConfiguration().then(function(config){view.querySelector("#chkDebugLog").checked=config.EnableDebugLevelLogging})})}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/wizardcomponents.js b/dashboard-ui/dashboard/wizardcomponents.js index fe69bdae58..8707aec0d5 100644 --- a/dashboard-ui/dashboard/wizardcomponents.js +++ b/dashboard-ui/dashboard/wizardcomponents.js @@ -1,145 +1 @@ -define([], function () { - 'use strict'; - - function goNext() { - Dashboard.navigate('wizardagreement.html'); - } - - function loadDownloadInfo(view) { - - var instructions = ''; - - ApiClient.getSystemInfo().then(function (systemInfo) { - - var operatingSystem = systemInfo.OperatingSystem.toLowerCase(); - - if (operatingSystem == 'windows') { - view.querySelector('.fldSelectEncoderPathType').classList.add('hide'); - view.querySelector('.markExec').classList.add('hide'); - } else { - view.querySelector('.fldSelectEncoderPathType').classList.remove('hide'); - view.querySelector('.markExec').classList.remove('hide'); - } - - if (operatingSystem == 'windows' && systemInfo.SystemArchitecture != 'Arm') { - - view.querySelector('.suggestedLocation').innerHTML = Globalize.translate('FFmpegSuggestedDownload', 'https://ffmpeg.zeranoe.com'); - - if (systemInfo.SystemArchitecture == 'X86') { - instructions = 'Download FFmpeg 32-Bit Static'; - } - else if (systemInfo.SystemArchitecture == 'X64') { - instructions = 'Download FFmpeg 64-Bit Static'; - } - - } else if (operatingSystem == 'linux') { - - view.querySelector('.suggestedLocation').innerHTML = Globalize.translate('FFmpegSuggestedDownload', 'http://johnvansickle.com/ffmpeg'); - - if (systemInfo.SystemArchitecture == 'X86') { - instructions = 'Download x86 build'; - } - else if (systemInfo.SystemArchitecture == 'X64') { - instructions = 'Download x86_64 build'; - } - - } else if (operatingSystem == 'osx' && systemInfo.SystemArchitecture == 'X64') { - - view.querySelector('.suggestedLocation').innerHTML = Globalize.translate('FFmpegSuggestedDownload', 'http://evermeet.cx/ffmpeg'); - instructions = 'Download both ffmpeg and ffprobe, and extract them to the same folder.'; - - } else { - view.querySelector('.suggestedLocation').innerHTML = Globalize.translate('FFmpegSuggestedDownload', 'https://ffmpeg.org/download.html'); - } - - view.querySelector('.downloadInstructions').innerHTML = instructions; - - var selectEncoderPath = view.querySelector('#selectEncoderPath'); - selectEncoderPath.value = 'Custom'; - onSelectEncoderPathChange.call(selectEncoderPath); - }); - } - - function onSaveEncodingPathFailure(response) { - - var msg = ''; - - // This is a fallback that handles both 404 and 400 (no path entered) - msg = Globalize.translate('FFmpegSavePathNotFound'); - - require(['alert'], function (alert) { - alert(msg); - }); - } - - function parentWithClass(elem, className) { - - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - - if (!elem) { - return null; - } - } - - return elem; - } - - function onSelectEncoderPathChange(e) { - - var page = parentWithClass(this, 'page'); - - if (this.value == 'Custom') { - page.querySelector('.fldEncoderPath').classList.remove('hide'); - } else { - page.querySelector('.fldEncoderPath').classList.add('hide'); - } - } - - return function (view, params) { - - view.querySelector('#btnSelectEncoderPath').addEventListener("click", function () { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - includeFiles: true, - callback: function (path) { - - if (path) { - view.querySelector('.txtEncoderPath').value = path; - } - picker.close(); - } - }); - }); - }); - - view.querySelector('form').addEventListener('submit', function (e) { - - var form = this; - - ApiClient.ajax({ - url: ApiClient.getUrl('System/MediaEncoder/Path'), - type: 'POST', - data: { - Path: form.querySelector('.txtEncoderPath').value, - PathType: 'Custom' - } - }).then(goNext, onSaveEncodingPathFailure); - - e.preventDefault(); - return false; - }); - - view.querySelector('#selectEncoderPath').addEventListener('change', onSelectEncoderPathChange); - - view.addEventListener('viewbeforeshow', function (e) { - - loadDownloadInfo(view); - }); - }; -}); \ No newline at end of file +define([],function(){"use strict";function goNext(){Dashboard.navigate("wizardagreement.html")}function loadDownloadInfo(view){var instructions="";ApiClient.getSystemInfo().then(function(systemInfo){var operatingSystem=systemInfo.OperatingSystem.toLowerCase();"windows"==operatingSystem?(view.querySelector(".fldSelectEncoderPathType").classList.add("hide"),view.querySelector(".markExec").classList.add("hide")):(view.querySelector(".fldSelectEncoderPathType").classList.remove("hide"),view.querySelector(".markExec").classList.remove("hide")),"windows"==operatingSystem&&"Arm"!=systemInfo.SystemArchitecture?(view.querySelector(".suggestedLocation").innerHTML=Globalize.translate("FFmpegSuggestedDownload",'https://ffmpeg.zeranoe.com'),"X86"==systemInfo.SystemArchitecture?instructions="Download FFmpeg 32-Bit Static":"X64"==systemInfo.SystemArchitecture&&(instructions="Download FFmpeg 64-Bit Static")):"linux"==operatingSystem?(view.querySelector(".suggestedLocation").innerHTML=Globalize.translate("FFmpegSuggestedDownload",'http://johnvansickle.com/ffmpeg'),"X86"==systemInfo.SystemArchitecture?instructions="Download x86 build":"X64"==systemInfo.SystemArchitecture&&(instructions="Download x86_64 build")):"osx"==operatingSystem&&"X64"==systemInfo.SystemArchitecture?(view.querySelector(".suggestedLocation").innerHTML=Globalize.translate("FFmpegSuggestedDownload",'http://evermeet.cx/ffmpeg'),instructions="Download both ffmpeg and ffprobe, and extract them to the same folder."):view.querySelector(".suggestedLocation").innerHTML=Globalize.translate("FFmpegSuggestedDownload",'https://ffmpeg.org/download.html'),view.querySelector(".downloadInstructions").innerHTML=instructions;var selectEncoderPath=view.querySelector("#selectEncoderPath");selectEncoderPath.value="Custom",onSelectEncoderPathChange.call(selectEncoderPath)})}function onSaveEncodingPathFailure(response){var msg="";msg=Globalize.translate("FFmpegSavePathNotFound"),require(["alert"],function(alert){alert(msg)})}function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}function onSelectEncoderPathChange(e){var page=parentWithClass(this,"page");"Custom"==this.value?page.querySelector(".fldEncoderPath").classList.remove("hide"):page.querySelector(".fldEncoderPath").classList.add("hide")}return function(view,params){view.querySelector("#btnSelectEncoderPath").addEventListener("click",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({includeFiles:!0,callback:function(path){path&&(view.querySelector(".txtEncoderPath").value=path),picker.close()}})})}),view.querySelector("form").addEventListener("submit",function(e){var form=this;return ApiClient.ajax({url:ApiClient.getUrl("System/MediaEncoder/Path"),type:"POST",data:{Path:form.querySelector(".txtEncoderPath").value,PathType:"Custom"}}).then(goNext,onSaveEncodingPathFailure),e.preventDefault(),!1}),view.querySelector("#selectEncoderPath").addEventListener("change",onSelectEncoderPathChange),view.addEventListener("viewbeforeshow",function(e){loadDownloadInfo(view)})}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/wizardfinishpage.js b/dashboard-ui/dashboard/wizardfinishpage.js index a147255c0c..3b5de30ee9 100644 --- a/dashboard-ui/dashboard/wizardfinishpage.js +++ b/dashboard-ui/dashboard/wizardfinishpage.js @@ -1,27 +1 @@ -define(['loading'], function (loading) { - 'use strict'; - - function onFinish() { - - loading.show(); - - ApiClient.ajax({ - - url: ApiClient.getUrl('Startup/Complete'), - type: 'POST' - - }).then(function () { - - Dashboard.navigate('dashboard.html'); - loading.hide(); - }); - } - - return function (view, params) { - - var self = this; - - view.querySelector('.btnWizardNext').addEventListener('click', onFinish); - }; - -}); \ No newline at end of file +define(["loading"],function(loading){"use strict";function onFinish(){loading.show(),ApiClient.ajax({url:ApiClient.getUrl("Startup/Complete"),type:"POST"}).then(function(){Dashboard.navigate("dashboard.html"),loading.hide()})}return function(view,params){view.querySelector(".btnWizardNext").addEventListener("click",onFinish)}}); \ No newline at end of file diff --git a/dashboard-ui/devices/android/android.css b/dashboard-ui/devices/android/android.css index 0e84f3622b..c2a38617c6 100644 --- a/dashboard-ui/devices/android/android.css +++ b/dashboard-ui/devices/android/android.css @@ -1,15 +1 @@ -.libraryMenuButtonText { - font-weight: 500 !important; -} - -@media all and (min-width: 300px) { - - .libraryViewNav, .emby-tabs-slider { - display: flex; - flex-grow: 1; - } - - .emby-tab-button { - flex-grow: 1; - } -} +.libraryMenuButtonText{font-weight:500!important}@media all and (min-width:300px){.emby-tabs-slider,.libraryViewNav{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}.emby-tab-button{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}} \ No newline at end of file diff --git a/dashboard-ui/devices/ios/ios.css b/dashboard-ui/devices/ios/ios.css index cebe066a73..35c59fdcca 100644 --- a/dashboard-ui/devices/ios/ios.css +++ b/dashboard-ui/devices/ios/ios.css @@ -1,95 +1 @@ -body:not(.dashboardDocument) .mainDrawerButton { - display: none !important; -} - -.pageWithAbsoluteTabs:not(.noSecondaryNavPage) { - padding-top: 88px !important; -} - -.libraryPage:not(.noSecondaryNavPage) { - padding-top: 85px !important; -} - -.backdropContainer { - /* This isn't implemented right and ends up looking terrible */ - background-attachment: initial; -} - -.viewMenuBar { - /* It needs this in order to retain height since we're positioning the contents absolutely */ - height: 50px; -} - -.ui-body-b .libraryViewNav { - box-shadow: none; -} - -/*.viewMenuBar, .ui-body-b .libraryViewNav { - background: rgba(34,35,38,.90); - -webkit-backdrop-filter: blur(5px); - backdrop-filter: blur(5px); -} - - .viewMenuBar.semiTransparent { - background-color: rgba(15, 15, 15, .3); - }*/ - -.emby-tab-button { - font-weight: 400; - text-transform: none !important; - border-color: transparent !important; - border-width: 0 !important; -} - -.criticReviewPaperList { - background-color: #262626; -} - -.settingsMenuHeader { - display: none; -} - -.libraryMenuButtonText { - font-weight: 500 !important; -} - -.btnNotificationsInner { - font-weight: 400; -} - -.cardImageContainer { - border-radius: 4px; -} - -.sidebarLinkText { - font-weight: 400 !important; -} - -.videoSubtitles { - font-size: 200% !important; -} - -.txtSearch { - padding-bottom: .5em !important; - text-indent: 0 !important; -} - -.searchInputContainer { - margin-left: 5%; - margin-right: 5%; -} - -.categorySyncButton, .btnSync { - display: none !important; -} - -.dialog.background-theme-b { - background: rgba(28,28,28,.84); - -webkit-backdrop-filter: blur(5px); - backdrop-filter: blur(5px); -} - -.cardOverlayButton { - -webkit-backdrop-filter: blur(5px); - backdrop-filter: blur(5px); -} +body:not(.dashboardDocument) .mainDrawerButton{display:none!important}.pageWithAbsoluteTabs:not(.noSecondaryNavPage){padding-top:88px!important}.libraryPage:not(.noSecondaryNavPage){padding-top:85px!important}.backdropContainer{background-attachment:initial}.viewMenuBar{height:50px}.ui-body-b .libraryViewNav{-webkit-box-shadow:none;box-shadow:none}.emby-tab-button{font-weight:400;text-transform:none!important;border-color:transparent!important;border-width:0!important}.criticReviewPaperList{background-color:#262626}.settingsMenuHeader{display:none}.libraryMenuButtonText{font-weight:500!important}.btnNotificationsInner{font-weight:400}.cardImageContainer{-webkit-border-radius:4px;border-radius:4px}.sidebarLinkText{font-weight:400!important}.videoSubtitles{font-size:200%!important}.txtSearch{padding-bottom:.5em!important;text-indent:0!important}.searchInputContainer{margin-left:5%;margin-right:5%}.btnSync,.categorySyncButton{display:none!important}.dialog.background-theme-b{background:rgba(28,28,28,.84);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.cardOverlayButton{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)} \ No newline at end of file diff --git a/dashboard-ui/legacy/buttonenabled.js b/dashboard-ui/legacy/buttonenabled.js index bd18e22b43..aea7ab8ff8 100644 --- a/dashboard-ui/legacy/buttonenabled.js +++ b/dashboard-ui/legacy/buttonenabled.js @@ -1,8 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - $.fn.buttonEnabled = function (enabled) { - - return enabled ? this.attr('disabled', '').removeAttr('disabled') : this.attr('disabled', 'disabled'); - }; -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";$.fn.buttonEnabled=function(enabled){return enabled?this.attr("disabled","").removeAttr("disabled"):this.attr("disabled","disabled")}}); \ No newline at end of file diff --git a/dashboard-ui/legacy/dashboard.js b/dashboard-ui/legacy/dashboard.js index 399d2f15e1..390f1ae7df 100644 --- a/dashboard-ui/legacy/dashboard.js +++ b/dashboard-ui/legacy/dashboard.js @@ -1,12 +1 @@ -Dashboard.confirm = function (message, title, callback) { - 'use strict'; - - require(['confirm'], function (confirm) { - - confirm(message, title).then(function () { - callback(true); - }, function () { - callback(false); - }); - }); -}; \ No newline at end of file +Dashboard.confirm=function(message,title,callback){"use strict";require(["confirm"],function(confirm){confirm(message,title).then(function(){callback(!0)},function(){callback(!1)})})}; \ No newline at end of file diff --git a/dashboard-ui/legacy/fnchecked.js b/dashboard-ui/legacy/fnchecked.js index db7eb810ee..4417f523e5 100644 --- a/dashboard-ui/legacy/fnchecked.js +++ b/dashboard-ui/legacy/fnchecked.js @@ -1,20 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - // TODO: This needs to be deprecated, but it's used heavily - $.fn.checked = function (value) { - if (value === true || value === false) { - // Set the value of the checkbox - return $(this).each(function () { - this.checked = value; - }); - } else { - // Return check state - return this.length && this[0].checked; - } - }; - - $.fn.checkboxradio = function () { - return this; - }; -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";$.fn.checked=function(value){return value===!0||value===!1?$(this).each(function(){this.checked=value}):this.length&&this[0].checked},$.fn.checkboxradio=function(){return this}}); \ No newline at end of file diff --git a/dashboard-ui/legacy/selectmenu.js b/dashboard-ui/legacy/selectmenu.js index a867fb3793..952941d9c7 100644 --- a/dashboard-ui/legacy/selectmenu.js +++ b/dashboard-ui/legacy/selectmenu.js @@ -1,9 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - // TODO: This needs to be deprecated, but it's used heavily by plugins - $.fn.selectmenu = function () { - // No-op. This implementation only exists to prevent script errors - return this; - }; -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";$.fn.selectmenu=function(){return this}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/addpluginpage.js b/dashboard-ui/scripts/addpluginpage.js index bdd591ee20..536d8cf2bc 100644 --- a/dashboard-ui/scripts/addpluginpage.js +++ b/dashboard-ui/scripts/addpluginpage.js @@ -1,357 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - function populateHistory(packageInfo, page) { - - var html = ''; - - for (var i = 0, length = Math.min(packageInfo.versions.length, 10) ; i < length; i++) { - - var version = packageInfo.versions[i]; - - html += '

' + version.versionStr + ' (' + version.classification + ')

'; - - html += '
' + version.description + '
'; - } - - $('#revisionHistory', page).html(html); - } - - function populateVersions(packageInfo, page, installedPlugin) { - - var html = ''; - - for (var i = 0, length = packageInfo.versions.length; i < length; i++) { - - var version = packageInfo.versions[i]; - - html += ''; - - } - - var selectmenu = $('#selectVersion', page).html(html); - - if (!installedPlugin) { - - $('#pCurrentVersion', page).hide().html(""); - } - - var packageVersion = packageInfo.versions.filter(function (current) { - - return current.classification == "Release"; - })[0]; - - // If we still don't have a package version to select, pick the first Beta build - if (!packageVersion) { - - packageVersion = packageInfo.versions.filter(function (current) { - - return current.classification == "Beta"; - })[0]; - } - - if (packageVersion) { - var val = packageVersion.versionStr + '|' + packageVersion.classification; - - selectmenu.val(val); - } - } - - function renderPluginInfo(page, pkg, pluginSecurityInfo) { - - if (AppInfo.isNativeApp) { - return; - } - - if (pkg.isPremium) { - $('.premiumPackage', page).show(); - - // Fill in registration info - var regStatus = ""; - if (pkg.isRegistered) { - - regStatus += "

"; - - regStatus += Globalize.translate('MessageFeatureIncludedWithSupporter'); - - } else { - - var expDateTime = new Date(pkg.expDate).getTime(); - var nowTime = new Date().getTime(); - - if (expDateTime <= nowTime) { - regStatus += "

"; - regStatus += Globalize.translate('MessageTrialExpired'); - } else if (expDateTime > new Date(1970, 1, 1).getTime()) { - - regStatus += "

"; - regStatus += Globalize.translate('MessageTrialWillExpireIn').replace('{0}', Math.round(expDateTime - nowTime) / (86400000)); - } - } - - regStatus += "

"; - $('#regStatus', page).html(regStatus); - - if (pluginSecurityInfo.IsMBSupporter) { - $('#regInfo', page).html(pkg.regInfo || ""); - - $('.premiumDescription', page).hide(); - $('.supporterDescription', page).hide(); - - if (pkg.price > 0) { - - $('.premiumHasPrice', page).show(); - $('#featureId', page).val(pkg.featureId); - $('#featureName', page).val(pkg.name); - $('#amount', page).val(pkg.price); - - $('#regPrice', page).html("

" + Globalize.translate('ValuePriceUSD').replace('{0}', "$" + pkg.price.toFixed(2)) + "

"); - $('#ppButton', page).hide(); - - var url = "https://mb3admin.com/admin/service/user/getPayPalEmail?id=" + pkg.owner; - - fetch(url).then(function (response) { - - return response.json(); - - }).then(function (dev) { - - if (dev.payPalEmail) { - $('#payPalEmail', page).val(dev.payPalEmail); - $('#ppButton', page).show(); - - } - }); - - } else { - // Supporter-only feature - $('.premiumHasPrice', page).hide(); - } - } else { - - if (pkg.price) { - $('.premiumDescription', page).show(); - $('.supporterDescription', page).hide(); - $('#regInfo', page).html(""); - - } else { - $('.premiumDescription', page).hide(); - $('.supporterDescription', page).show(); - $('#regInfo', page).html(""); - } - - $('#ppButton', page).hide(); - } - - } else { - $('.premiumPackage', page).hide(); - } - } - - function renderPackage(pkg, installedPlugins, pluginSecurityInfo, page) { - - var installedPlugin = installedPlugins.filter(function (ip) { - return ip.Name == pkg.name; - })[0]; - - populateVersions(pkg, page, installedPlugin); - populateHistory(pkg, page); - - $('.pluginName', page).html(pkg.name); - - if (pkg.targetSystem == 'Server') { - $("#btnInstallDiv", page).removeClass('hide'); - $("#nonServerMsg", page).hide(); - $("#pSelectVersion", page).removeClass('hide'); - } else { - $("#btnInstallDiv", page).addClass('hide'); - $("#pSelectVersion", page).addClass('hide'); - - var msg = Globalize.translate('MessageInstallPluginFromApp'); - $("#nonServerMsg", page).html(msg).show(); - } - - if (pkg.shortDescription) { - $('#tagline', page).show().html(pkg.shortDescription); - } else { - $('#tagline', page).hide(); - } - - $('#overview', page).html(pkg.overview || ""); - - - $('#developer', page).html(pkg.owner); - - renderPluginInfo(page, pkg, pluginSecurityInfo); - - if (pkg.richDescUrl) { - $('#pViewWebsite', page).show(); - $('#pViewWebsite a', page).attr('href', pkg.richDescUrl); - } else { - $('#pViewWebsite', page).hide(); - } - - if (pkg.previewImage || pkg.thumbImage) { - - var color = pkg.tileColor || "#38c"; - var img = pkg.previewImage ? pkg.previewImage : pkg.thumbImage; - $('#pPreviewImage', page).show().html(""); - } else { - $('#pPreviewImage', page).hide().html(""); - } - - if (installedPlugin) { - - var currentVersionText = Globalize.translate('MessageYouHaveVersionInstalled').replace('{0}', '' + installedPlugin.Version + ''); - $('#pCurrentVersion', page).show().html(currentVersionText); - - } else { - $('#pCurrentVersion', page).hide().html(""); - } - - Dashboard.hideLoadingMsg(); - } - - function performInstallation(page, packageName, guid, updateClass, version) { - - var developer = $('#developer', page).html().toLowerCase(); - - var alertCallback = function (confirmed) { - - if (confirmed) { - - Dashboard.showLoadingMsg(); - - page.querySelector('#btnInstall').disabled = true; - - ApiClient.installPlugin(packageName, guid, updateClass, version).then(function () { - - Dashboard.hideLoadingMsg(); - }); - } - }; - - if (developer != 'luke' && developer != 'ebr') { - - Dashboard.hideLoadingMsg(); - - var msg = Globalize.translate('MessagePluginInstallDisclaimer'); - msg += '
'; - msg += '
'; - msg += Globalize.translate('PleaseConfirmPluginInstallation'); - - require(['confirm'], function (confirm) { - - confirm(msg, Globalize.translate('HeaderConfirmPluginInstallation')).then(function () { - - alertCallback(true); - }, function () { - - alertCallback(false); - }); - - }); - - } else { - alertCallback(true); - } - } - - function updateHelpUrl(page, params) { - - var context = params.context; - - $('.notificationsTabs', page).hide(); - - if (context == 'sync') { - page.setAttribute('data-helpurl', 'https://github.com/MediaBrowser/Wiki/wiki/Sync'); - LibraryMenu.setTitle(Globalize.translate('TitleSync')); - } - else if (context == 'livetv') { - - LibraryMenu.setTitle(Globalize.translate('TitleLiveTV')); - page.setAttribute('data-helpurl', 'https://github.com/MediaBrowser/Wiki/wiki/Live%20TV'); - } - else if (context == 'notifications') { - - $('.notificationsTabs', page).show(); - - LibraryMenu.setTitle(Globalize.translate('TitleNotifications')); - page.setAttribute('data-helpurl', 'https://github.com/MediaBrowser/Wiki/wiki/Notifications'); - } - else { - page.setAttribute('data-helpurl', 'https://github.com/MediaBrowser/Wiki/wiki/Plugins'); - LibraryMenu.setTitle(Globalize.translate('TitlePlugins')); - } - } - - return function (view, params) { - - var onSubmit = function () { - - Dashboard.showLoadingMsg(); - - var page = $(this).parents('#addPluginPage')[0]; - - var name = params.name; - var guid = params.guid; - - ApiClient.getInstalledPlugins().then(function (plugins) { - - var installedPlugin = plugins.filter(function (ip) { - return ip.Name == name; - })[0]; - - var vals = $('#selectVersion', page).val().split('|'); - - var version = vals[0]; - - if (installedPlugin && installedPlugin.Version == version) { - - Dashboard.hideLoadingMsg(); - - Dashboard.alert({ - message: Globalize.translate('MessageAlreadyInstalled'), - title: Globalize.translate('HeaderPluginInstallation') - }); - } else { - performInstallation(page, name, guid, vals[1], version); - } - }); - - return false; - }; - - $('.addPluginForm', view).on('submit', onSubmit); - - updateHelpUrl(view, params); - - view.addEventListener('viewbeforeshow', function () { - - var page = this; - - updateHelpUrl(page, params); - }); - - view.addEventListener('viewshow', function () { - - var page = this; - - Dashboard.showLoadingMsg(); - - var name = params.name; - var guid = params.guid; - - var promise1 = ApiClient.getPackageInfo(name, guid); - var promise2 = ApiClient.getInstalledPlugins(); - var promise3 = ApiClient.getPluginSecurityInfo(); - - Promise.all([promise1, promise2, promise3]).then(function (responses) { - - renderPackage(responses[0], responses[1], responses[2], page); - }); - - updateHelpUrl(page, params); - }); - }; -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";function populateHistory(packageInfo,page){for(var html="",i=0,length=Math.min(packageInfo.versions.length,10);i'+version.versionStr+" ("+version.classification+")",html+='
'+version.description+"
"}$("#revisionHistory",page).html(html)}function populateVersions(packageInfo,page,installedPlugin){for(var html="",i=0,length=packageInfo.versions.length;i'+version.versionStr+" ("+version.classification+")"}var selectmenu=$("#selectVersion",page).html(html);installedPlugin||$("#pCurrentVersion",page).hide().html("");var packageVersion=packageInfo.versions.filter(function(current){return"Release"==current.classification})[0];if(packageVersion||(packageVersion=packageInfo.versions.filter(function(current){return"Beta"==current.classification})[0]),packageVersion){var val=packageVersion.versionStr+"|"+packageVersion.classification;selectmenu.val(val)}}function renderPluginInfo(page,pkg,pluginSecurityInfo){if(!AppInfo.isNativeApp)if(pkg.isPremium){$(".premiumPackage",page).show();var regStatus="";if(pkg.isRegistered)regStatus+="

",regStatus+=Globalize.translate("MessageFeatureIncludedWithSupporter");else{var expDateTime=new Date(pkg.expDate).getTime(),nowTime=(new Date).getTime();expDateTime<=nowTime?(regStatus+="

",regStatus+=Globalize.translate("MessageTrialExpired")):expDateTime>new Date(1970,1,1).getTime()&&(regStatus+="

",regStatus+=Globalize.translate("MessageTrialWillExpireIn").replace("{0}",Math.round(expDateTime-nowTime)/864e5))}if(regStatus+="

",$("#regStatus",page).html(regStatus),pluginSecurityInfo.IsMBSupporter)if($("#regInfo",page).html(pkg.regInfo||""),$(".premiumDescription",page).hide(),$(".supporterDescription",page).hide(),pkg.price>0){$(".premiumHasPrice",page).show(),$("#featureId",page).val(pkg.featureId),$("#featureName",page).val(pkg.name),$("#amount",page).val(pkg.price),$("#regPrice",page).html("

"+Globalize.translate("ValuePriceUSD").replace("{0}","$"+pkg.price.toFixed(2))+"

"),$("#ppButton",page).hide();var url="https://mb3admin.com/admin/service/user/getPayPalEmail?id="+pkg.owner;fetch(url).then(function(response){return response.json()}).then(function(dev){dev.payPalEmail&&($("#payPalEmail",page).val(dev.payPalEmail),$("#ppButton",page).show())})}else $(".premiumHasPrice",page).hide();else pkg.price?($(".premiumDescription",page).show(),$(".supporterDescription",page).hide(),$("#regInfo",page).html("")):($(".premiumDescription",page).hide(),$(".supporterDescription",page).show(),$("#regInfo",page).html("")),$("#ppButton",page).hide()}else $(".premiumPackage",page).hide()}function renderPackage(pkg,installedPlugins,pluginSecurityInfo,page){var installedPlugin=installedPlugins.filter(function(ip){return ip.Name==pkg.name})[0];if(populateVersions(pkg,page,installedPlugin),populateHistory(pkg,page),$(".pluginName",page).html(pkg.name),"Server"==pkg.targetSystem)$("#btnInstallDiv",page).removeClass("hide"),$("#nonServerMsg",page).hide(),$("#pSelectVersion",page).removeClass("hide");else{$("#btnInstallDiv",page).addClass("hide"),$("#pSelectVersion",page).addClass("hide");var msg=Globalize.translate("MessageInstallPluginFromApp");$("#nonServerMsg",page).html(msg).show()}if(pkg.shortDescription?$("#tagline",page).show().html(pkg.shortDescription):$("#tagline",page).hide(),$("#overview",page).html(pkg.overview||""),$("#developer",page).html(pkg.owner),renderPluginInfo(page,pkg,pluginSecurityInfo),pkg.richDescUrl?($("#pViewWebsite",page).show(),$("#pViewWebsite a",page).attr("href",pkg.richDescUrl)):$("#pViewWebsite",page).hide(),pkg.previewImage||pkg.thumbImage){var color=pkg.tileColor||"#38c",img=pkg.previewImage?pkg.previewImage:pkg.thumbImage;$("#pPreviewImage",page).show().html("")}else $("#pPreviewImage",page).hide().html("");if(installedPlugin){var currentVersionText=Globalize.translate("MessageYouHaveVersionInstalled").replace("{0}",""+installedPlugin.Version+"");$("#pCurrentVersion",page).show().html(currentVersionText)}else $("#pCurrentVersion",page).hide().html("");Dashboard.hideLoadingMsg()}function performInstallation(page,packageName,guid,updateClass,version){var developer=$("#developer",page).html().toLowerCase(),alertCallback=function(confirmed){confirmed&&(Dashboard.showLoadingMsg(),page.querySelector("#btnInstall").disabled=!0,ApiClient.installPlugin(packageName,guid,updateClass,version).then(function(){Dashboard.hideLoadingMsg()}))};if("luke"!=developer&&"ebr"!=developer){Dashboard.hideLoadingMsg();var msg=Globalize.translate("MessagePluginInstallDisclaimer");msg+="
",msg+="
",msg+=Globalize.translate("PleaseConfirmPluginInstallation"),require(["confirm"],function(confirm){confirm(msg,Globalize.translate("HeaderConfirmPluginInstallation")).then(function(){alertCallback(!0)},function(){alertCallback(!1)})})}else alertCallback(!0)}function updateHelpUrl(page,params){var context=params.context;$(".notificationsTabs",page).hide(),"sync"==context?(page.setAttribute("data-helpurl","https://github.com/MediaBrowser/Wiki/wiki/Sync"),LibraryMenu.setTitle(Globalize.translate("TitleSync"))):"livetv"==context?(LibraryMenu.setTitle(Globalize.translate("TitleLiveTV")),page.setAttribute("data-helpurl","https://github.com/MediaBrowser/Wiki/wiki/Live%20TV")):"notifications"==context?($(".notificationsTabs",page).show(),LibraryMenu.setTitle(Globalize.translate("TitleNotifications")),page.setAttribute("data-helpurl","https://github.com/MediaBrowser/Wiki/wiki/Notifications")):(page.setAttribute("data-helpurl","https://github.com/MediaBrowser/Wiki/wiki/Plugins"),LibraryMenu.setTitle(Globalize.translate("TitlePlugins")))}return function(view,params){var onSubmit=function(){Dashboard.showLoadingMsg();var page=$(this).parents("#addPluginPage")[0],name=params.name,guid=params.guid;return ApiClient.getInstalledPlugins().then(function(plugins){var installedPlugin=plugins.filter(function(ip){return ip.Name==name})[0],vals=$("#selectVersion",page).val().split("|"),version=vals[0];installedPlugin&&installedPlugin.Version==version?(Dashboard.hideLoadingMsg(),Dashboard.alert({message:Globalize.translate("MessageAlreadyInstalled"),title:Globalize.translate("HeaderPluginInstallation")})):performInstallation(page,name,guid,vals[1],version)}),!1};$(".addPluginForm",view).on("submit",onSubmit),updateHelpUrl(view,params),view.addEventListener("viewbeforeshow",function(){var page=this;updateHelpUrl(page,params)}),view.addEventListener("viewshow",function(){var page=this;Dashboard.showLoadingMsg();var name=params.name,guid=params.guid,promise1=ApiClient.getPackageInfo(name,guid),promise2=ApiClient.getInstalledPlugins(),promise3=ApiClient.getPluginSecurityInfo();Promise.all([promise1,promise2,promise3]).then(function(responses){renderPackage(responses[0],responses[1],responses[2],page)}),updateHelpUrl(page,params)})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/appservices.js b/dashboard-ui/scripts/appservices.js index 137a17e039..dd751b7449 100644 --- a/dashboard-ui/scripts/appservices.js +++ b/dashboard-ui/scripts/appservices.js @@ -1,106 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - function reloadList(page) { - - Dashboard.showLoadingMsg(); - - var promise1 = ApiClient.getAvailablePlugins({ - TargetSystems: 'Server' - }); - - var promise2 = ApiClient.getInstalledPlugins(); - - Promise.all([promise1, promise2]).then(function (responses) { - renderInstalled(page, responses[0], responses[1]); - renderCatalog(page, responses[0], responses[1]); - }); - } - - function getCategories() { - - var context = getParameterByName('context'); - - var categories = []; - - if (context == 'sync') { - categories.push('Sync'); - } - else if (context == 'livetv') { - categories.push('Live TV'); - } - else if (context == 'notifications') { - categories.push('Notifications'); - } - - return categories; - } - - function renderInstalled(page, availablePlugins, installedPlugins) { - - requirejs(['scripts/pluginspage'], function() { - var category = getCategories()[0]; - - installedPlugins = installedPlugins.filter(function (i) { - - var catalogEntry = availablePlugins.filter(function (a) { - return (a.guid || '').toLowerCase() == (i.Id || '').toLowerCase(); - })[0]; - - if (catalogEntry) { - return catalogEntry.category == category; - } - return false; - }); - - PluginsPage.renderPlugins(page, installedPlugins); - }); - } - - function renderCatalog(page, availablePlugins, installedPlugins) { - - requirejs(['scripts/plugincatalogpage'], function () { - var categories = getCategories(); - - PluginCatalog.renderCatalog({ - - catalogElement: $('.catalog', page), - availablePlugins: availablePlugins, - installedPlugins: installedPlugins, - categories: categories, - showCategory: false, - context: getParameterByName('context'), - targetSystem: 'Server' - }); - }); - } - - $(document).on('pagebeforeshow pageshow', "#appServicesPage", function () { - - // This needs both events for the helpurl to get done at the right time - - var page = this; - - var context = getParameterByName('context'); - - if (context == 'sync') { - LibraryMenu.setTitle(Globalize.translate('TitleSync')); - page.setAttribute('data-helpurl', 'https://github.com/MediaBrowser/Wiki/wiki/Sync'); - } - else if (context == 'livetv') { - LibraryMenu.setTitle(Globalize.translate('TitleLiveTV')); - page.setAttribute('data-helpurl', 'https://github.com/MediaBrowser/Wiki/wiki/Live%20TV'); - } - else if (context == 'notifications') { - LibraryMenu.setTitle(Globalize.translate('TitleNotifications')); - page.setAttribute('data-helpurl', 'https://github.com/MediaBrowser/Wiki/wiki/Notifications'); - } - - }).on('pageshow', "#appServicesPage", function () { - - var page = this; - - reloadList(page); - }); - -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";function reloadList(page){Dashboard.showLoadingMsg();var promise1=ApiClient.getAvailablePlugins({TargetSystems:"Server"}),promise2=ApiClient.getInstalledPlugins();Promise.all([promise1,promise2]).then(function(responses){renderInstalled(page,responses[0],responses[1]),renderCatalog(page,responses[0],responses[1])})}function getCategories(){var context=getParameterByName("context"),categories=[];return"sync"==context?categories.push("Sync"):"livetv"==context?categories.push("Live TV"):"notifications"==context&&categories.push("Notifications"),categories}function renderInstalled(page,availablePlugins,installedPlugins){requirejs(["scripts/pluginspage"],function(){var category=getCategories()[0];installedPlugins=installedPlugins.filter(function(i){var catalogEntry=availablePlugins.filter(function(a){return(a.guid||"").toLowerCase()==(i.Id||"").toLowerCase()})[0];return!!catalogEntry&&catalogEntry.category==category}),PluginsPage.renderPlugins(page,installedPlugins)})}function renderCatalog(page,availablePlugins,installedPlugins){requirejs(["scripts/plugincatalogpage"],function(){var categories=getCategories();PluginCatalog.renderCatalog({catalogElement:$(".catalog",page),availablePlugins:availablePlugins,installedPlugins:installedPlugins,categories:categories,showCategory:!1,context:getParameterByName("context"),targetSystem:"Server"})})}$(document).on("pagebeforeshow pageshow","#appServicesPage",function(){var page=this,context=getParameterByName("context");"sync"==context?(LibraryMenu.setTitle(Globalize.translate("TitleSync")),page.setAttribute("data-helpurl","https://github.com/MediaBrowser/Wiki/wiki/Sync")):"livetv"==context?(LibraryMenu.setTitle(Globalize.translate("TitleLiveTV")),page.setAttribute("data-helpurl","https://github.com/MediaBrowser/Wiki/wiki/Live%20TV")):"notifications"==context&&(LibraryMenu.setTitle(Globalize.translate("TitleNotifications")),page.setAttribute("data-helpurl","https://github.com/MediaBrowser/Wiki/wiki/Notifications"))}).on("pageshow","#appServicesPage",function(){var page=this;reloadList(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/autobackdrops.js b/dashboard-ui/scripts/autobackdrops.js index bd43edd650..04a608fd55 100644 --- a/dashboard-ui/scripts/autobackdrops.js +++ b/dashboard-ui/scripts/autobackdrops.js @@ -1,112 +1 @@ -define(['backdrop', 'appStorage'], function (backdrop, appStorage) { - 'use strict'; - - function enabled() { - - var apiClient = window.ApiClient; - - if (!apiClient) { - return false; - } - - var userId = apiClient.getCurrentUserId(); - - var val = appStorage.getItem('enableBackdrops-' + userId); - - // For bandwidth - return val == '1'; - } - - var cache = {}; - - function getBackdropItemIds(apiClient, userId, types, parentId) { - - var key = 'backdrops2_' + userId + (types || '') + (parentId || ''); - - var data = cache[key]; - - if (data) { - - console.log('Found backdrop id list in cache. Key: ' + key); - data = JSON.parse(data); - return Promise.resolve(data); - } else { - - var options = { - - SortBy: "IsFavoriteOrLiked,Random", - Limit: 20, - Recursive: true, - IncludeItemTypes: types, - ImageTypes: "Backdrop", - //Ids: "8114409aa00a2722456c08e298f90bed", - ParentId: parentId - }; - - return apiClient.getItems(apiClient.getCurrentUserId(), options).then(function (result) { - - var images = result.Items.map(function (i) { - return { - Id: i.Id, - tag: i.BackdropImageTags[0], - ServerId: i.ServerId - }; - }); - - cache[key] = JSON.stringify(images); - return images; - }); - } - } - - function showBackdrop(type, parentId) { - - var apiClient = window.ApiClient; - - if (!apiClient) { - return; - } - - getBackdropItemIds(apiClient, apiClient.getCurrentUserId(), type, parentId).then(function (images) { - - if (images.length) { - - backdrop.setBackdrops(images.map(function (i) { - i.BackdropImageTags = [i.tag]; - return i; - })); - - } else { - - backdrop.clear(); - } - }); - } - - pageClassOn('pagebeforeshow', "page", function () { - - var page = this; - - // These pages self-manage their backdrops - if (page.classList.contains('selfBackdropPage')) { - return; - } - - if (page.classList.contains('backdropPage')) { - - if (enabled()) { - var type = page.getAttribute('data-backdroptype'); - - var parentId = page.classList.contains('globalBackdropPage') ? '' : LibraryMenu.getTopParentId(); - showBackdrop(type, parentId); - - } else { - page.classList.remove('backdropPage'); - backdrop.clear(); - } - } else { - backdrop.clear(); - } - - }); -}); \ No newline at end of file +define(["backdrop","appStorage"],function(backdrop,appStorage){"use strict";function enabled(){var apiClient=window.ApiClient;if(!apiClient)return!1;var userId=apiClient.getCurrentUserId(),val=appStorage.getItem("enableBackdrops-"+userId);return"1"==val}function getBackdropItemIds(apiClient,userId,types,parentId){var key="backdrops2_"+userId+(types||"")+(parentId||""),data=cache[key];if(data)return console.log("Found backdrop id list in cache. Key: "+key),data=JSON.parse(data),Promise.resolve(data);var options={SortBy:"IsFavoriteOrLiked,Random",Limit:20,Recursive:!0,IncludeItemTypes:types,ImageTypes:"Backdrop",ParentId:parentId};return apiClient.getItems(apiClient.getCurrentUserId(),options).then(function(result){var images=result.Items.map(function(i){return{Id:i.Id,tag:i.BackdropImageTags[0],ServerId:i.ServerId}});return cache[key]=JSON.stringify(images),images})}function showBackdrop(type,parentId){var apiClient=window.ApiClient;apiClient&&getBackdropItemIds(apiClient,apiClient.getCurrentUserId(),type,parentId).then(function(images){images.length?backdrop.setBackdrops(images.map(function(i){return i.BackdropImageTags=[i.tag],i})):backdrop.clear()})}var cache={};pageClassOn("pagebeforeshow","page",function(){var page=this;if(!page.classList.contains("selfBackdropPage"))if(page.classList.contains("backdropPage"))if(enabled()){var type=page.getAttribute("data-backdroptype"),parentId=page.classList.contains("globalBackdropPage")?"":LibraryMenu.getTopParentId();showBackdrop(type,parentId)}else page.classList.remove("backdropPage"),backdrop.clear();else backdrop.clear()})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/camerauploadsettings.js b/dashboard-ui/scripts/camerauploadsettings.js index b877a5bfce..faf110a50e 100644 --- a/dashboard-ui/scripts/camerauploadsettings.js +++ b/dashboard-ui/scripts/camerauploadsettings.js @@ -1,73 +1 @@ -define(['appSettings', 'emby-checkbox'], function (appSettings) { - 'use strict'; - - function loadForm(page, user) { - - var uploadServers = appSettings.cameraUploadServers(); - - page.querySelector('.uploadServerList').innerHTML = ConnectionManager.getSavedServers().map(function (s) { - - var checkedHtml = uploadServers.indexOf(s.Id) == -1 ? '' : ' checked'; - var html = ''; - - return html; - - }).join(''); - - Dashboard.hideLoadingMsg(); - } - - function saveUser(page) { - - var chkUploadServer = page.querySelectorAll('.chkUploadServer'); - var cameraUploadServers = []; - - for (var i = 0, length = chkUploadServer.length; i < length; i++) { - if (chkUploadServer[i].checked) { - cameraUploadServers.push(chkUploadServer[i].getAttribute('data-id')); - } - } - - appSettings.cameraUploadServers(cameraUploadServers); - - if (window.MainActivity) { - // TODO: isolate into android app - MainActivity.authorizeStorage(); - } - - Dashboard.hideLoadingMsg(); - } - - return function (view, params) { - - view.querySelector('form').addEventListener('submit', function (e) { - - Dashboard.showLoadingMsg(); - - saveUser(view); - - // Disable default form submission - e.preventDefault(); - return false; - }); - - view.addEventListener('viewshow', function () { - var page = this; - - Dashboard.showLoadingMsg(); - - var userId = params.userId || Dashboard.getCurrentUserId(); - - ApiClient.getUser(userId).then(function (user) { - - loadForm(page, user); - }); - }); - - view.addEventListener('viewbeforehide', function () { - - saveUser(this); - }); - }; - -}); \ No newline at end of file +define(["appSettings","emby-checkbox"],function(appSettings){"use strict";function loadForm(page,user){var uploadServers=appSettings.cameraUploadServers();page.querySelector(".uploadServerList").innerHTML=ConnectionManager.getSavedServers().map(function(s){var checkedHtml=uploadServers.indexOf(s.Id)==-1?"":" checked",html='";return html}).join(""),Dashboard.hideLoadingMsg()}function saveUser(page){for(var chkUploadServer=page.querySelectorAll(".chkUploadServer"),cameraUploadServers=[],i=0,length=chkUploadServer.length;ihttps://emby.media') - }); - } - break; - case MediaBrowser.ConnectionState.Unavailable: - { - Dashboard.alert({ - message: Globalize.translate("MessageUnableToConnectToServer"), - title: Globalize.translate("HeaderConnectionFailure") - }); - } - break; - default: - break; - } - } - - function loadAppConnection(page) { - - Dashboard.showLoadingMsg(); - - ConnectionManager.connect({ - - enableAutoLogin: appSettings.enableAutoLogin() - - }).then(function (result) { - - handleConnectionResult(page, result); - - }); - } - - function loadPage(page, params) { - - var mode = params.mode || 'auto'; - - if (mode == 'auto') { - - if (AppInfo.isNativeApp) { - loadAppConnection(page); - return; - } - mode = 'connect'; - } - - loadMode(page, mode); - } - function loadMode(page, mode) { - - if (mode == 'welcome') { - - page.querySelector('.connectLoginForm').classList.add('hide'); - page.querySelector('.welcomeContainer').classList.remove('hide'); - page.querySelector('.manualServerForm').classList.add('hide'); - page.querySelector('.signupForm').classList.add('hide'); - } - else if (mode == 'connect') { - page.querySelector('.connectLoginForm').classList.remove('hide'); - page.querySelector('.welcomeContainer').classList.add('hide'); - page.querySelector('.manualServerForm').classList.add('hide'); - page.querySelector('.signupForm').classList.add('hide'); - } - else if (mode == 'manualserver') { - page.querySelector('.manualServerForm').classList.remove('hide'); - page.querySelector('.connectLoginForm').classList.add('hide'); - page.querySelector('.welcomeContainer').classList.add('hide'); - page.querySelector('.signupForm').classList.add('hide'); - } - else if (mode == 'signup') { - page.querySelector('.manualServerForm').classList.add('hide'); - page.querySelector('.connectLoginForm').classList.add('hide'); - page.querySelector('.welcomeContainer').classList.add('hide'); - page.querySelector('.signupForm').classList.remove('hide'); - initSignup(page); - } - } - - function skip() { - - Dashboard.navigate('selectserver.html'); - } - - function requireCaptcha() { - return !AppInfo.isNativeApp && window.location.href.toLowerCase().indexOf('https') == 0; - } - - function supportInAppSignup() { - return AppInfo.isNativeApp || window.location.href.toLowerCase().indexOf('https') == 0; - } - - var greWidgetId; - function initSignup(page) { - - if (!supportInAppSignup()) { - return; - } - - if (!requireCaptcha()) { - return; - } - - require(['https://www.google.com/recaptcha/api.js?render=explicit'], function () { - - setTimeout(function () { - var recaptchaContainer = page.querySelector('.recaptchaContainer'); - - greWidgetId = grecaptcha.render(recaptchaContainer, { - 'sitekey': '6Le2LAgTAAAAAK06Wvttt_yUnbISTy6q3Azqp9po', - 'theme': 'dark' - }); - }, 100); - }); - } - - function submitManualServer(page) { - - var host = page.querySelector('#txtServerHost').value; - var port = page.querySelector('#txtServerPort').value; - - if (port) { - host += ':' + port; - } - - Dashboard.showLoadingMsg(); - - ConnectionManager.connectToAddress(host, { - - enableAutoLogin: appSettings.enableAutoLogin() - - }).then(function (result) { - - handleConnectionResult(page, result); - - }, function () { - handleConnectionResult(page, { - State: MediaBrowser.ConnectionState.Unavailable - }); - - }); - } - - function submit(page) { - - var user = page.querySelector('#txtManualName').value; - var password = page.querySelector('#txtManualPassword').value; - - login(page, user, password); - } - - return function (view, params) { - - function onSubmit(e) { - submit(view); - - e.preventDefault(); - return false; - } - - function onManualServerSubmit(e) { - submitManualServer(view); - - e.preventDefault(); - return false; - } - - function onSignupFormSubmit(e) { - - if (!supportInAppSignup()) { - e.preventDefault(); - return false; - } - - var page = view; - - var greResponse = greWidgetId ? grecaptcha.getResponse(greWidgetId) : null; - - ConnectionManager.signupForConnect({ - - email: page.querySelector('#txtSignupEmail', page).value, - username: page.querySelector('#txtSignupUsername', page).value, - password: page.querySelector('#txtSignupPassword', page).value, - passwordConfirm: page.querySelector('#txtSignupPasswordConfirm', page).value, - grecaptcha: greResponse - - }).then(function (result) { - - var msg = result.Validated ? - Globalize.translate('MessageThankYouForConnectSignUpNoValidation') : - Globalize.translate('MessageThankYouForConnectSignUp'); - - Dashboard.alert({ - message: msg, - callback: function () { - Dashboard.navigate('connectlogin.html?mode=welcome'); - } - }); - - }, function (result) { - - if (result.errorCode == 'passwordmatch') { - Dashboard.alert({ - message: Globalize.translate('ErrorMessagePasswordNotMatchConfirm') - }); - } - else if (result.errorCode == 'USERNAME_IN_USE') { - Dashboard.alert({ - message: Globalize.translate('ErrorMessageUsernameInUse') - }); - } - else if (result.errorCode == 'EMAIL_IN_USE') { - Dashboard.alert({ - message: Globalize.translate('ErrorMessageEmailInUse') - }); - } else { - Dashboard.alert({ - message: Globalize.translate('DefaultErrorMessage') - }); - } - - }); - - e.preventDefault(); - return false; - } - - view.querySelector('.btnSkipConnect').addEventListener('click', skip); - - view.querySelector('.connectLoginForm').addEventListener('submit', onSubmit); - view.querySelector('.manualServerForm').addEventListener('submit', onManualServerSubmit); - view.querySelector('.signupForm').addEventListener('submit', onSignupFormSubmit); - - view.querySelector('.btnSignupForConnect').addEventListener('click', function (e) { - if (supportInAppSignup()) { - e.preventDefault(); - e.stopPropagation(); - Dashboard.navigate('connectlogin.html?mode=signup'); - return false; - } - }); - - function goBack() { - require(['embyRouter'], function (embyRouter) { - embyRouter.back(); - }); - } - - view.querySelector('.btnCancelSignup').addEventListener('click', goBack); - view.querySelector('.btnCancelManualServer').addEventListener('click', goBack); - - view.querySelector('.btnWelcomeNext').addEventListener('click', function () { - Dashboard.navigate('connectlogin.html?mode=connect'); - }); - - var terms = view.querySelector('.terms'); - terms.innerHTML = Globalize.translate('LoginDisclaimer') + ""; - - if (AppInfo.isNativeApp) { - terms.classList.add('hide'); - view.querySelector('.tvAppInfo').classList.add('hide'); - } else { - terms.classList.remove('hide'); - view.querySelector('.tvAppInfo').classList.remove('hide'); - } - - view.addEventListener('viewbeforeshow', function () { - - var page = this; - - page.querySelector('#txtSignupEmail').value = ''; - page.querySelector('#txtSignupUsername').value = ''; - page.querySelector('#txtSignupPassword').value = ''; - page.querySelector('#txtSignupPasswordConfirm').value = ''; - - if (browserInfo.safari && AppInfo.isNativeApp) { - // With apple we can't even have a link to the site - page.querySelector('.embyIntroDownloadMessage').innerHTML = Globalize.translate('EmbyIntroDownloadMessageWithoutLink'); - } else { - var link = 'http://emby.media'; - page.querySelector('.embyIntroDownloadMessage').innerHTML = Globalize.translate('EmbyIntroDownloadMessage', link); - } - }); - - view.addEventListener('viewshow', function () { - loadPage(view, params); - }); - }; -}); \ No newline at end of file +define(["appSettings"],function(appSettings){"use strict";function login(page,username,password){Dashboard.showLoadingMsg(),appSettings.enableAutoLogin(!0),ConnectionManager.loginToConnect(username,password).then(function(){Dashboard.hideLoadingMsg(),Dashboard.navigate("selectserver.html")},function(){Dashboard.hideLoadingMsg(),Dashboard.alert({message:Globalize.translate("MessageInvalidUser"),title:Globalize.translate("HeaderLoginFailure")}),page.querySelector("#txtManualPassword").value=""})}function handleConnectionResult(page,result){switch(Dashboard.hideLoadingMsg(),result.State){case MediaBrowser.ConnectionState.SignedIn:var apiClient=result.ApiClient;Dashboard.onServerChanged(apiClient.getCurrentUserId(),apiClient.accessToken(),apiClient),Dashboard.navigate("home.html");break;case MediaBrowser.ConnectionState.ServerSignIn:Dashboard.navigate("login.html?serverid="+result.Servers[0].Id,!1,"none");break;case MediaBrowser.ConnectionState.ServerSelection:Dashboard.navigate("selectserver.html",!1,"none");break;case MediaBrowser.ConnectionState.ConnectSignIn:loadMode(page,"welcome");break;case MediaBrowser.ConnectionState.ServerUpdateNeeded:Dashboard.alert({message:Globalize.translate("ServerUpdateNeeded",'https://emby.media')});break;case MediaBrowser.ConnectionState.Unavailable:Dashboard.alert({message:Globalize.translate("MessageUnableToConnectToServer"),title:Globalize.translate("HeaderConnectionFailure")})}}function loadAppConnection(page){Dashboard.showLoadingMsg(),ConnectionManager.connect({enableAutoLogin:appSettings.enableAutoLogin()}).then(function(result){handleConnectionResult(page,result)})}function loadPage(page,params){var mode=params.mode||"auto";if("auto"==mode){if(AppInfo.isNativeApp)return void loadAppConnection(page);mode="connect"}loadMode(page,mode)}function loadMode(page,mode){"welcome"==mode?(page.querySelector(".connectLoginForm").classList.add("hide"),page.querySelector(".welcomeContainer").classList.remove("hide"),page.querySelector(".manualServerForm").classList.add("hide"),page.querySelector(".signupForm").classList.add("hide")):"connect"==mode?(page.querySelector(".connectLoginForm").classList.remove("hide"),page.querySelector(".welcomeContainer").classList.add("hide"),page.querySelector(".manualServerForm").classList.add("hide"),page.querySelector(".signupForm").classList.add("hide")):"manualserver"==mode?(page.querySelector(".manualServerForm").classList.remove("hide"),page.querySelector(".connectLoginForm").classList.add("hide"),page.querySelector(".welcomeContainer").classList.add("hide"),page.querySelector(".signupForm").classList.add("hide")):"signup"==mode&&(page.querySelector(".manualServerForm").classList.add("hide"),page.querySelector(".connectLoginForm").classList.add("hide"),page.querySelector(".welcomeContainer").classList.add("hide"),page.querySelector(".signupForm").classList.remove("hide"),initSignup(page))}function skip(){Dashboard.navigate("selectserver.html")}function requireCaptcha(){return!AppInfo.isNativeApp&&0==window.location.href.toLowerCase().indexOf("https")}function supportInAppSignup(){return AppInfo.isNativeApp||0==window.location.href.toLowerCase().indexOf("https")}function initSignup(page){supportInAppSignup()&&requireCaptcha()&&require(["https://www.google.com/recaptcha/api.js?render=explicit"],function(){setTimeout(function(){var recaptchaContainer=page.querySelector(".recaptchaContainer");greWidgetId=grecaptcha.render(recaptchaContainer,{sitekey:"6Le2LAgTAAAAAK06Wvttt_yUnbISTy6q3Azqp9po",theme:"dark"})},100)})}function submitManualServer(page){var host=page.querySelector("#txtServerHost").value,port=page.querySelector("#txtServerPort").value;port&&(host+=":"+port),Dashboard.showLoadingMsg(),ConnectionManager.connectToAddress(host,{enableAutoLogin:appSettings.enableAutoLogin()}).then(function(result){handleConnectionResult(page,result)},function(){handleConnectionResult(page,{State:MediaBrowser.ConnectionState.Unavailable})})}function submit(page){var user=page.querySelector("#txtManualName").value,password=page.querySelector("#txtManualPassword").value;login(page,user,password)}var greWidgetId;return function(view,params){function onSubmit(e){return submit(view),e.preventDefault(),!1}function onManualServerSubmit(e){return submitManualServer(view),e.preventDefault(),!1}function onSignupFormSubmit(e){if(!supportInAppSignup())return e.preventDefault(),!1;var page=view,greResponse=greWidgetId?grecaptcha.getResponse(greWidgetId):null;return ConnectionManager.signupForConnect({email:page.querySelector("#txtSignupEmail",page).value,username:page.querySelector("#txtSignupUsername",page).value,password:page.querySelector("#txtSignupPassword",page).value,passwordConfirm:page.querySelector("#txtSignupPasswordConfirm",page).value,grecaptcha:greResponse}).then(function(result){var msg=result.Validated?Globalize.translate("MessageThankYouForConnectSignUpNoValidation"):Globalize.translate("MessageThankYouForConnectSignUp");Dashboard.alert({message:msg,callback:function(){Dashboard.navigate("connectlogin.html?mode=welcome")}})},function(result){"passwordmatch"==result.errorCode?Dashboard.alert({message:Globalize.translate("ErrorMessagePasswordNotMatchConfirm")}):"USERNAME_IN_USE"==result.errorCode?Dashboard.alert({message:Globalize.translate("ErrorMessageUsernameInUse")}):"EMAIL_IN_USE"==result.errorCode?Dashboard.alert({message:Globalize.translate("ErrorMessageEmailInUse")}):Dashboard.alert({message:Globalize.translate("DefaultErrorMessage")})}),e.preventDefault(),!1}function goBack(){require(["embyRouter"],function(embyRouter){embyRouter.back()})}view.querySelector(".btnSkipConnect").addEventListener("click",skip),view.querySelector(".connectLoginForm").addEventListener("submit",onSubmit),view.querySelector(".manualServerForm").addEventListener("submit",onManualServerSubmit),view.querySelector(".signupForm").addEventListener("submit",onSignupFormSubmit),view.querySelector(".btnSignupForConnect").addEventListener("click",function(e){if(supportInAppSignup())return e.preventDefault(),e.stopPropagation(),Dashboard.navigate("connectlogin.html?mode=signup"),!1}),view.querySelector(".btnCancelSignup").addEventListener("click",goBack),view.querySelector(".btnCancelManualServer").addEventListener("click",goBack),view.querySelector(".btnWelcomeNext").addEventListener("click",function(){Dashboard.navigate("connectlogin.html?mode=connect")});var terms=view.querySelector(".terms");terms.innerHTML=Globalize.translate("LoginDisclaimer")+"",AppInfo.isNativeApp?(terms.classList.add("hide"),view.querySelector(".tvAppInfo").classList.add("hide")):(terms.classList.remove("hide"),view.querySelector(".tvAppInfo").classList.remove("hide")),view.addEventListener("viewbeforeshow",function(){var page=this;if(page.querySelector("#txtSignupEmail").value="",page.querySelector("#txtSignupUsername").value="",page.querySelector("#txtSignupPassword").value="",page.querySelector("#txtSignupPasswordConfirm").value="",browserInfo.safari&&AppInfo.isNativeApp)page.querySelector(".embyIntroDownloadMessage").innerHTML=Globalize.translate("EmbyIntroDownloadMessageWithoutLink");else{var link='http://emby.media';page.querySelector(".embyIntroDownloadMessage").innerHTML=Globalize.translate("EmbyIntroDownloadMessage",link)}}),view.addEventListener("viewshow",function(){loadPage(view,params)})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/dashboardpage.js b/dashboard-ui/scripts/dashboardpage.js index b1c2190b5c..7a956feee0 100644 --- a/dashboard-ui/scripts/dashboardpage.js +++ b/dashboard-ui/scripts/dashboardpage.js @@ -1,1414 +1 @@ -define(['datetime', 'jQuery', 'dom', 'humanedate', 'cardStyle', 'listViewStyle'], function (datetime, $, dom) { - 'use strict'; - - function renderNoHealthAlertsMessage(page) { - - var html = '

'; - - html += ''; - - html += Globalize.translate('HealthMonitorNoAlerts') + '

'; - - page.querySelector('.healthMonitor').innerHTML = html; - } - - function refreshHealthMonitor(page) { - - renderNoHealthAlertsMessage(page); - } - - function onConnectionHelpClick(e) { - - e.preventDefault(); - return false; - } - - function onEditServerNameClick(e) { - - var page = dom.parentWithClass(this, 'page'); - - require(['prompt'], function (prompt) { - - prompt({ - label: Globalize.translate('LabelFriendlyServerName'), - description: Globalize.translate('LabelFriendlyServerNameHelp'), - value: page.querySelector('.serverNameHeader').innerHTML, - confirmText: Globalize.translate('ButtonSave') - - }).then(function (value) { - - Dashboard.showLoadingMsg(); - - ApiClient.getServerConfiguration().then(function (config) { - - config.ServerName = value; - - ApiClient.updateServerConfiguration(config).then(function () { - page.querySelector('.serverNameHeader').innerHTML = value; - Dashboard.hideLoadingMsg(); - }); - }); - }); - }); - - e.preventDefault(); - return false; - } - - window.DashboardPage = { - - newsStartIndex: 0, - - onPageInit: function () { - - var page = this; - - page.querySelector('.btnConnectionHelp').addEventListener('click', onConnectionHelpClick); - page.querySelector('.btnEditServerName').addEventListener('click', onEditServerNameClick); - }, - - onPageShow: function () { - - var page = this; - - var apiClient = ApiClient; - - if (!apiClient) { - return; - } - - DashboardPage.newsStartIndex = 0; - - Dashboard.showLoadingMsg(); - DashboardPage.pollForInfo(page); - DashboardPage.startInterval(apiClient); - - Events.on(apiClient, 'websocketmessage', DashboardPage.onWebSocketMessage); - Events.on(apiClient, 'websocketopen', DashboardPage.onWebSocketOpen); - - DashboardPage.lastAppUpdateCheck = null; - DashboardPage.lastPluginUpdateCheck = null; - - Dashboard.getPluginSecurityInfo().then(function (pluginSecurityInfo) { - - DashboardPage.renderSupporterIcon(page, pluginSecurityInfo); - }); - - DashboardPage.reloadSystemInfo(page); - DashboardPage.reloadNews(page); - DashboardPage.sessionUpdateTimer = setInterval(DashboardPage.refreshSessionsLocally, 60000); - - $('.activityItems', page).activityLogList(); - - $('.swaggerLink', page).attr('href', apiClient.getUrl('swagger-ui/index.html', { - api_key: ApiClient.accessToken() - })); - - refreshHealthMonitor(page); - }, - - onPageHide: function () { - - var page = this; - - $('.activityItems', page).activityLogList('destroy'); - - var apiClient = ApiClient; - - if (apiClient) { - Events.off(apiClient, 'websocketmessage', DashboardPage.onWebSocketMessage); - Events.off(apiClient, 'websocketopen', DashboardPage.onWebSocketOpen); - DashboardPage.stopInterval(apiClient); - } - - if (DashboardPage.sessionUpdateTimer) { - clearInterval(DashboardPage.sessionUpdateTimer); - } - }, - - renderPaths: function (page, systemInfo) { - - $('#cachePath', page).html(systemInfo.CachePath); - $('#logPath', page).html(systemInfo.LogPath); - $('#transcodingTemporaryPath', page).html(systemInfo.TranscodingTempPath); - $('#metadataPath', page).html(systemInfo.InternalMetadataPath); - }, - - refreshSessionsLocally: function () { - - var list = DashboardPage.sessionsList; - - if (list) { - DashboardPage.renderActiveConnections($.mobile.activePage, list); - } - }, - - reloadSystemInfo: function (page) { - - ApiClient.getSystemInfo().then(function (systemInfo) { - - page.querySelector('.serverNameHeader').innerHTML = systemInfo.ServerName; - - var localizedVersion = Globalize.translate('LabelVersionNumber', systemInfo.Version); - if (systemInfo.SystemUpdateLevel && systemInfo.SystemUpdateLevel != 'Release') { - localizedVersion += " " + Globalize.translate('Option' + systemInfo.SystemUpdateLevel).toLowerCase(); - } - - $('#appVersionNumber', page).html(localizedVersion); - - if (systemInfo.SupportsHttps) { - $('#ports', page).html(Globalize.translate('LabelRunningOnPorts', systemInfo.HttpServerPortNumber, systemInfo.HttpsPortNumber)); - } else { - $('#ports', page).html(Globalize.translate('LabelRunningOnPort', systemInfo.HttpServerPortNumber)); - } - - if (systemInfo.CanSelfRestart) { - $('.btnRestartContainer', page).removeClass('hide'); - } else { - $('.btnRestartContainer', page).addClass('hide'); - } - - DashboardPage.renderUrls(page, systemInfo); - DashboardPage.renderPendingInstallations(page, systemInfo); - - if (systemInfo.CanSelfUpdate) { - $('#btnUpdateApplicationContainer', page).show(); - $('#btnManualUpdateContainer', page).hide(); - } else { - $('#btnUpdateApplicationContainer', page).hide(); - $('#btnManualUpdateContainer', page).show(); - } - - if (systemInfo.PackageName == 'synology') { - $('#btnManualUpdateContainer').html(Globalize.translate('SynologyUpdateInstructions')); - } else { - $('#btnManualUpdateContainer').html('' + Globalize.translate('PleaseUpdateManually') + ''); - } - - DashboardPage.renderPaths(page, systemInfo); - DashboardPage.renderHasPendingRestart(page, systemInfo.HasPendingRestart); - }); - }, - - reloadNews: function (page) { - - var query = { - StartIndex: DashboardPage.newsStartIndex, - Limit: 7 - }; - - ApiClient.getProductNews(query).then(function (result) { - - var html = result.Items.map(function (item) { - - var itemHtml = ''; - - itemHtml += ''; - itemHtml += '
'; - - itemHtml += 'dvr'; - - itemHtml += '
'; - - itemHtml += '
'; - itemHtml += item.Title; - itemHtml += '
'; - - itemHtml += '
'; - var date = datetime.parseISO8601Date(item.Date, true); - itemHtml += datetime.toLocaleDateString(date); - itemHtml += '
'; - - //itemHtml += '
'; - //itemHtml += item.Description; - //itemHtml += '
'; - - itemHtml += '
'; - - itemHtml += '
'; - itemHtml += '
'; - - return itemHtml; - }); - - var pagingHtml = ''; - pagingHtml += '
'; - pagingHtml += LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false - }); - pagingHtml += '
'; - - html = html.join('') + pagingHtml; - - var elem = $('.latestNewsItems', page).html(html); - - $('.btnNextPage', elem).on('click', function () { - DashboardPage.newsStartIndex += query.Limit; - DashboardPage.reloadNews(page); - }); - - $('.btnPreviousPage', elem).on('click', function () { - DashboardPage.newsStartIndex -= query.Limit; - DashboardPage.reloadNews(page); - }); - }); - - }, - - startInterval: function (apiClient) { - - if (apiClient.isWebSocketOpen()) { - apiClient.sendWebSocketMessage("SessionsStart", "0,1500"); - apiClient.sendWebSocketMessage("ScheduledTasksInfoStart", "0,1000"); - } - }, - - stopInterval: function (apiClient) { - - if (apiClient.isWebSocketOpen()) { - apiClient.sendWebSocketMessage("SessionsStop"); - apiClient.sendWebSocketMessage("ScheduledTasksInfoStop"); - } - }, - - onWebSocketMessage: function (e, msg) { - - var page = $.mobile.activePage; - - if (msg.MessageType == "Sessions") { - DashboardPage.renderInfo(page, msg.Data); - } - else if (msg.MessageType == "RestartRequired") { - DashboardPage.renderHasPendingRestart(page, true); - } - else if (msg.MessageType == "ServerShuttingDown") { - DashboardPage.renderHasPendingRestart(page, true); - } - else if (msg.MessageType == "ServerRestarting") { - DashboardPage.renderHasPendingRestart(page, true); - } - else if (msg.MessageType == "ScheduledTasksInfo") { - - var tasks = msg.Data; - - DashboardPage.renderRunningTasks(page, tasks); - } - else if (msg.MessageType == "PackageInstalling" || msg.MessageType == "PackageInstallationCompleted") { - - DashboardPage.pollForInfo(page, true); - DashboardPage.reloadSystemInfo(page); - } - }, - - onWebSocketOpen: function () { - - var apiClient = this; - - DashboardPage.startInterval(apiClient); - }, - - pollForInfo: function (page, forceUpdate) { - - var apiClient = window.ApiClient; - - if (!apiClient) { - return; - } - - apiClient.getSessions().then(function (sessions) { - - DashboardPage.renderInfo(page, sessions, forceUpdate); - }); - apiClient.getScheduledTasks().then(function (tasks) { - - DashboardPage.renderRunningTasks(page, tasks); - }); - }, - - renderInfo: function (page, sessions, forceUpdate) { - - DashboardPage.renderActiveConnections(page, sessions); - DashboardPage.renderPluginUpdateInfo(page, forceUpdate); - - Dashboard.hideLoadingMsg(); - }, - - renderActiveConnections: function (page, sessions) { - - var html = ''; - - DashboardPage.sessionsList = sessions; - - var parentElement = $('.activeDevices', page); - - $('.card', parentElement).addClass('deadSession'); - - for (var i = 0, length = sessions.length; i < length; i++) { - - var session = sessions[i]; - - var rowId = 'session' + session.Id; - - var elem = $('#' + rowId, page); - - if (elem.length) { - DashboardPage.updateSession(elem, session); - continue; - } - - var nowPlayingItem = session.NowPlayingItem; - - var className = nowPlayingItem ? 'scalableCard card activeSession backdropCard backdropCard-scalable' : 'scalableCard card activeSession backdropCard backdropCard-scalable'; - - if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { - className += ' transcodingSession'; - } - - html += '
'; - - html += '
'; - html += '
'; - - html += '
'; - html += '
'; - - html += '
'; - html += '
' + DashboardPage.getAppSecondaryText(session) + '
'; - html += '
'; - - html += '
'; - - html += '
' + DashboardPage.getSessionNowPlayingTime(session) + '
'; - - //if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { - - // html += '
' + session.TranscodingInfo.Framerate + ' fps
'; - //} else { - // html += '
'; - //} - - var nowPlayingName = DashboardPage.getNowPlayingName(session); - - html += '
'; - html += nowPlayingName.html; - html += '
'; - - if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { - - var position = session.PlayState.PositionTicks || 0; - var value = (100 * position) / nowPlayingItem.RunTimeTicks; - - html += ''; - } else { - html += ''; - } - - if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { - - html += ''; - } else { - html += ''; - } - - html += '
'; - - html += '
'; - - // cardScalable - html += '
'; - - html += '
'; - - html += '
'; - html += DashboardPage.getSessionNowPlayingStreamInfo(session); - html += '
'; - - html += '
'; - var userImage = DashboardPage.getUserImage(session); - if (userImage) { - html += ''; - } else { - html += '
'; - } - - html += '
'; - html += DashboardPage.getUsersHtml(session) || ' '; - html += '
'; - html += '
'; - html += '
'; - - // cardBox - html += ''; - - // card - html += ''; - } - - parentElement.append(html); - - $('.deadSession', parentElement).remove(); - }, - - getSessionNowPlayingStreamInfo: function (session) { - - var html = ''; - - //html += '
'; - var showTranscodingInfo = false; - - if (session.TranscodingInfo && session.TranscodingInfo.IsAudioDirect && session.TranscodingInfo.IsVideoDirect) { - html += Globalize.translate('LabelPlayMethodDirectStream'); - } - else if (session.TranscodingInfo && session.TranscodingInfo.IsVideoDirect) { - html += Globalize.translate('LabelPlayMethodDirectStream'); - } - else if (session.PlayState.PlayMethod == 'Transcode') { - html += Globalize.translate('LabelPlayMethodTranscoding'); - - if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { - - html += ' (' + session.TranscodingInfo.Framerate + ' fps' + ')'; - } - showTranscodingInfo = true; - } - else if (session.PlayState.PlayMethod == 'DirectStream') { - html += Globalize.translate('LabelPlayMethodDirectPlay'); - } - else if (session.PlayState.PlayMethod == 'DirectPlay') { - html += Globalize.translate('LabelPlayMethodDirectPlay'); - } - - //html += '
'; - - if (showTranscodingInfo) { - - var line = []; - - if (session.TranscodingInfo) { - if (session.TranscodingInfo.Bitrate) { - - if (session.TranscodingInfo.Bitrate > 1000000) { - line.push((session.TranscodingInfo.Bitrate / 1000000).toFixed(1) + ' Mbps'); - } else { - line.push(Math.floor(session.TranscodingInfo.Bitrate / 1000) + ' kbps'); - } - } - if (session.TranscodingInfo.Container) { - - line.push(session.TranscodingInfo.Container); - } - - if (session.TranscodingInfo.VideoCodec) { - - //line.push(Globalize.translate('LabelVideoCodec').replace('{0}', session.TranscodingInfo.VideoCodec)); - line.push(session.TranscodingInfo.VideoCodec); - } - if (session.TranscodingInfo.AudioCodec && session.TranscodingInfo.AudioCodec != session.TranscodingInfo.Container) { - - //line.push(Globalize.translate('LabelAudioCodec').replace('{0}', session.TranscodingInfo.AudioCodec)); - line.push(session.TranscodingInfo.AudioCodec); - } - } - - if (line.length) { - - html += ' - ' + line.join(' '); - } - - } - - return html || ' '; - }, - - getSessionNowPlayingTime: function (session) { - - var html = ''; - - if (session.PlayState.PositionTicks) { - html += datetime.getDisplayRunningTime(session.PlayState.PositionTicks); - } else { - html += '--:--:--'; - } - - html += ' / '; - - var nowPlayingItem = session.NowPlayingItem; - - if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { - html += datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks); - } else { - html += '--:--:--'; - } - - return html; - }, - - getAppSecondaryText: function (session) { - - return session.ApplicationVersion; - }, - - getNowPlayingName: function (session) { - - var imgUrl = ''; - - var nowPlayingItem = session.NowPlayingItem; - - if (!nowPlayingItem) { - - return { - html: 'Last seen ' + humane_date(session.LastActivityDate), - image: imgUrl - }; - } - - var topText = nowPlayingItem.Name; - - var bottomText = ''; - - if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) { - bottomText = topText; - topText = nowPlayingItem.Artists[0]; - } - else if (nowPlayingItem.SeriesName || nowPlayingItem.Album) { - bottomText = topText; - topText = nowPlayingItem.SeriesName || nowPlayingItem.Album; - } - else if (nowPlayingItem.ProductionYear) { - bottomText = nowPlayingItem.ProductionYear; - } - - if (nowPlayingItem.LogoItemId) { - - imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.LogoItemId, { - - tag: session.LogoImageTag, - maxHeight: 24, - maxWidth: 130, - type: 'Logo' - - }); - - topText = ''; - } - - var text = bottomText ? topText + '
' + bottomText : topText; - - return { - html: text, - image: imgUrl - }; - }, - - getUsersHtml: function (session) { - - var html = []; - - if (session.UserId) { - html.push(session.UserName); - } - - for (var i = 0, length = session.AdditionalUsers.length; i < length; i++) { - - html.push(session.AdditionalUsers[i].UserName); - } - - return html.join(', '); - }, - - getUserImage: function (session) { - - if (session.UserId && session.UserPrimaryImageTag) { - return ApiClient.getUserImageUrl(session.UserId, { - - tag: session.UserPrimaryImageTag, - height: 24, - type: 'Primary' - - }); - } - - return null; - }, - - updateSession: function (row, session) { - - row.removeClass('deadSession'); - - var nowPlayingItem = session.NowPlayingItem; - - if (nowPlayingItem) { - row.addClass('playingSession'); - } else { - row.removeClass('playingSession'); - } - - $('.sessionNowPlayingStreamInfo', row).html(DashboardPage.getSessionNowPlayingStreamInfo(session)); - $('.sessionNowPlayingTime', row).html(DashboardPage.getSessionNowPlayingTime(session)); - - $('.sessionUserName', row).html(DashboardPage.getUsersHtml(session) || ' '); - - $('.sessionAppSecondaryText', row).html(DashboardPage.getAppSecondaryText(session)); - - $('.sessionTranscodingFramerate', row).html((session.TranscodingInfo && session.TranscodingInfo.Framerate) ? session.TranscodingInfo.Framerate + ' fps' : ''); - - var nowPlayingName = DashboardPage.getNowPlayingName(session); - var nowPlayingInfoElem = $('.sessionNowPlayingInfo', row); - - if (!nowPlayingName.image || nowPlayingName.image != nowPlayingInfoElem.attr('data-imgsrc')) { - nowPlayingInfoElem.html(nowPlayingName.html); - nowPlayingInfoElem.attr('data-imgsrc', nowPlayingName.image || ''); - } - - if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { - - var position = session.PlayState.PositionTicks || 0; - var value = (100 * position) / nowPlayingItem.RunTimeTicks; - - $('.playbackProgress', row).show().val(value); - } else { - $('.playbackProgress', row).hide(); - } - - if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { - - row.addClass('transcodingSession'); - $('.transcodingProgress', row).show().val(session.TranscodingInfo.CompletionPercentage); - } else { - $('.transcodingProgress', row).hide(); - row.removeClass('transcodingSession'); - } - - var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || ''; - var imgElem = $('.sessionNowPlayingContent', row)[0]; - - if (imgUrl != imgElem.getAttribute('data-src')) { - imgElem.style.backgroundImage = imgUrl ? 'url(\'' + imgUrl + '\')' : ''; - imgElem.setAttribute('data-src', imgUrl); - } - }, - - getClientImage: function (connection) { - - var clientLowered = connection.Client.toLowerCase(); - var device = connection.DeviceName.toLowerCase(); - - if (connection.AppIconUrl) { - return ""; - } - - if (clientLowered == "dashboard" || clientLowered == "emby web client") { - - var imgUrl; - - if (device.indexOf('chrome') != -1) { - imgUrl = 'css/images/clients/chrome.png'; - } - else { - imgUrl = 'css/images/clients/html5.png'; - } - - return "Emby Web Client"; - } - if (clientLowered.indexOf('android') != -1) { - return ""; - } - if (clientLowered.indexOf('ios') != -1) { - return ""; - } - if (clientLowered == "mb-classic") { - - return ""; - } - if (clientLowered == "roku") { - - return ""; - } - if (clientLowered == "dlna") { - - return ""; - } - if (clientLowered == "kodi" || clientLowered == "xbmc") { - return ""; - } - if (clientLowered == "chromecast") { - - return ""; - } - - return null; - }, - - getNowPlayingImageUrl: function (item) { - - if (item && item.BackdropImageTag) { - - return ApiClient.getScaledImageUrl(item.BackdropItemId, { - type: "Backdrop", - width: 275, - tag: item.BackdropImageTag - }); - } - - if (item && item.ThumbImageTag) { - - return ApiClient.getScaledImageUrl(item.ThumbItemId, { - type: "Thumb", - width: 275, - tag: item.ThumbImageTag - }); - } - - if (item && item.PrimaryImageTag) { - - return ApiClient.getScaledImageUrl(item.PrimaryImageItemId, { - type: "Primary", - width: 275, - tag: item.PrimaryImageTag - }); - } - - return null; - }, - - systemUpdateTaskKey: "SystemUpdateTask", - - renderRunningTasks: function (page, tasks) { - - var html = ''; - - tasks = tasks.filter(function (t) { - return t.State != 'Idle' && !t.IsHidden; - }); - - if (tasks.filter(function (t) { - - return t.Key == DashboardPage.systemUpdateTaskKey; - - }).length) { - - $('#btnUpdateApplication', page).buttonEnabled(false); - } else { - $('#btnUpdateApplication', page).buttonEnabled(true); - } - - if (!tasks.length) { - $('#runningTasksCollapsible', page).hide(); - } else { - $('#runningTasksCollapsible', page).show(); - } - - for (var i = 0, length = tasks.length; i < length; i++) { - - var task = tasks[i]; - - html += '

'; - - html += task.Name + "
"; - - if (task.State == "Running") { - var progress = (task.CurrentProgressPercentage || 0).toFixed(1); - - html += ''; - html += '' + progress + '%'; - html += ''; - - html += "" + progress + "%"; - - html += ''; - } - else if (task.State == "Cancelling") { - html += '' + Globalize.translate('LabelStopping') + ''; - } - - html += '

'; - } - - - $('#divRunningTasks', page).html(html); - }, - - renderUrls: function (page, systemInfo) { - - var helpButton = '' + Globalize.translate('ButtonHelp') + ''; - - if (systemInfo.LocalAddress) { - - var localAccessHtml = Globalize.translate('LabelLocalAccessUrl', '' + systemInfo.LocalAddress + ''); - - $('.localUrl', page).html(localAccessHtml + helpButton).show().trigger('create'); - } else { - $('.externalUrl', page).hide(); - } - - if (systemInfo.WanAddress) { - - var externalUrl = systemInfo.WanAddress; - - var remoteAccessHtml = Globalize.translate('LabelRemoteAccessUrl', '' + externalUrl + ''); - - $('.externalUrl', page).html(remoteAccessHtml + helpButton).show().trigger('create'); - } else { - $('.externalUrl', page).hide(); - } - }, - - renderSupporterIcon: function (page, pluginSecurityInfo) { - - var imgUrl, text; - - var supporterIconContainer = page.querySelector('.supporterIconContainer'); - - if (!AppInfo.enableSupporterMembership) { - supporterIconContainer.classList.add('hide'); - } - else if (pluginSecurityInfo.IsMBSupporter) { - - supporterIconContainer.classList.remove('hide'); - - imgUrl = "css/images/supporter/supporterbadge.png"; - text = Globalize.translate('MessageThankYouForSupporting'); - - supporterIconContainer.innerHTML = '' + text + ''; - } else { - - supporterIconContainer.classList.add('hide'); - } - }, - - renderHasPendingRestart: function (page, hasPendingRestart) { - - if (!hasPendingRestart) { - - // Only check once every 30 mins - if (DashboardPage.lastAppUpdateCheck && (new Date().getTime() - DashboardPage.lastAppUpdateCheck) < 1800000) { - return; - } - - DashboardPage.lastAppUpdateCheck = new Date().getTime(); - - ApiClient.getAvailableApplicationUpdate().then(function (packageInfo) { - - var version = packageInfo[0]; - - if (!version) { - page.querySelector('#pUpToDate').classList.remove('hide'); - $('#pUpdateNow', page).hide(); - } else { - page.querySelector('#pUpToDate').classList.add('hide'); - - $('#pUpdateNow', page).show(); - - $('#newVersionNumber', page).html(Globalize.translate('VersionXIsAvailableForDownload').replace('{0}', version.versionStr)); - } - - }); - - } else { - - page.querySelector('#pUpToDate').classList.add('hide'); - - $('#pUpdateNow', page).hide(); - } - }, - - renderPendingInstallations: function (page, systemInfo) { - - if (systemInfo.CompletedInstallations.length) { - - $('#collapsiblePendingInstallations', page).show(); - - } else { - $('#collapsiblePendingInstallations', page).hide(); - - return; - } - - var html = ''; - - for (var i = 0, length = systemInfo.CompletedInstallations.length; i < length; i++) { - - var update = systemInfo.CompletedInstallations[i]; - - html += '
' + update.Name + ' (' + update.Version + ')
'; - } - - $('#pendingInstallations', page).html(html); - }, - - renderPluginUpdateInfo: function (page, forceUpdate) { - - // Only check once every 30 mins - if (!forceUpdate && DashboardPage.lastPluginUpdateCheck && (new Date().getTime() - DashboardPage.lastPluginUpdateCheck) < 1800000) { - return; - } - - DashboardPage.lastPluginUpdateCheck = new Date().getTime(); - - ApiClient.getAvailablePluginUpdates().then(function (updates) { - - var elem = $('#pPluginUpdates', page); - - if (updates.length) { - - elem.show(); - - } else { - elem.hide(); - - return; - } - var html = ''; - - for (var i = 0, length = updates.length; i < length; i++) { - - var update = updates[i]; - - html += '

' + Globalize.translate('NewVersionOfSomethingAvailable').replace('{0}', update.name) + '

'; - - html += ''; - } - - elem.html(html); - - }); - }, - - installPluginUpdate: function (button) { - - $(button).buttonEnabled(false); - - var name = button.getAttribute('data-name'); - var guid = button.getAttribute('data-guid'); - var version = button.getAttribute('data-version'); - var classification = button.getAttribute('data-classification'); - - Dashboard.showLoadingMsg(); - - ApiClient.installPlugin(name, guid, classification, version).then(function () { - - Dashboard.hideLoadingMsg(); - }); - }, - - updateApplication: function () { - - var page = $.mobile.activePage; - $('#btnUpdateApplication', page).buttonEnabled(false); - - Dashboard.showLoadingMsg(); - - ApiClient.getScheduledTasks().then(function (tasks) { - - var task = tasks.filter(function (t) { - - return t.Key == DashboardPage.systemUpdateTaskKey; - })[0]; - - ApiClient.startScheduledTask(task.Id).then(function () { - - DashboardPage.pollForInfo(page); - - Dashboard.hideLoadingMsg(); - }); - }); - }, - - stopTask: function (id) { - - var page = $.mobile.activePage; - - ApiClient.stopScheduledTask(id).then(function () { - - DashboardPage.pollForInfo(page); - }); - - }, - - restart: function () { - - require(['confirm'], function (confirm) { - - confirm({ - - title: Globalize.translate('HeaderRestart'), - text: Globalize.translate('MessageConfirmRestart'), - confirmText: Globalize.translate('ButtonRestart'), - primary: 'cancel' - - }).then(function () { - - $('#btnRestartServer').buttonEnabled(false); - $('#btnShutdown').buttonEnabled(false); - Dashboard.restartServer(); - }); - }); - }, - - shutdown: function () { - - require(['confirm'], function (confirm) { - - confirm({ - - title: Globalize.translate('HeaderShutdown'), - text: Globalize.translate('MessageConfirmShutdown'), - confirmText: Globalize.translate('ButtonShutdown'), - primary: 'cancel' - - }).then(function () { - - $('#btnRestartServer').buttonEnabled(false); - $('#btnShutdown').buttonEnabled(false); - ApiClient.shutdownServer(); - }); - }); - } - }; - - $(document).on('pageinit', "#dashboardPage", DashboardPage.onPageInit).on('pageshow', "#dashboardPage", DashboardPage.onPageShow).on('pagebeforehide', "#dashboardPage", DashboardPage.onPageHide); - - (function ($, document, window) { - - function getEntryHtml(entry) { - - var html = ''; - - html += '
'; - - var color = entry.Severity == 'Error' || entry.Severity == 'Fatal' || entry.Severity == 'Warn' ? '#cc0000' : '#52B54B'; - - if (entry.UserId && entry.UserPrimaryImageTag) { - - var userImgUrl = ApiClient.getUserImageUrl(entry.UserId, { - type: 'Primary', - tag: entry.UserPrimaryImageTag, - height: 40 - }); - - html += 'dvr'; - } - else { - html += 'dvr'; - } - - html += '
'; - - html += '
'; - html += entry.Name; - html += '
'; - - html += '
'; - var date = datetime.parseISO8601Date(entry.Date, true); - html += datetime.toLocaleString(date).toLowerCase(); - html += '
'; - - html += '
'; - html += entry.ShortOverview || ''; - html += '
'; - - html += '
'; - - html += '
'; - - return html; - } - - function renderList(elem, result, startIndex, limit) { - - var html = result.Items.map(getEntryHtml).join(''); - - if (result.TotalRecordCount > limit) { - - var query = { StartIndex: startIndex, Limit: limit }; - - html += LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false - }); - } - - $(elem).html(html); - - $('.btnNextPage', elem).on('click', function () { - reloadData(elem, startIndex + limit, limit); - }); - - $('.btnPreviousPage', elem).on('click', function () { - reloadData(elem, startIndex - limit, limit); - }); - - $('.btnShowOverview', elem).on('click', function () { - - var item = $(this).parents('.newsItem'); - var overview = $('.newsItemLongDescription', item).html(); - var name = $('.notificationName', item).html(); - - Dashboard.alert({ - message: '
' + overview + '
', - title: name - }); - }); - } - - function reloadData(elem, startIndex, limit) { - - if (startIndex == null) { - startIndex = parseInt(elem.getAttribute('data-activitystartindex') || '0'); - } - - limit = limit || parseInt(elem.getAttribute('data-activitylimit') || '7'); - - // Show last 24 hours - var minDate = new Date(); - minDate.setTime(minDate.getTime() - 86400000); - - ApiClient.getJSON(ApiClient.getUrl('System/ActivityLog/Entries', { - - startIndex: startIndex, - limit: limit, - minDate: minDate.toISOString() - - })).then(function (result) { - - elem.setAttribute('data-activitystartindex', startIndex); - elem.setAttribute('data-activitylimit', limit); - - renderList(elem, result, startIndex, limit); - }); - } - - function createList(elem) { - - elem.each(function () { - - reloadData(this); - - }).addClass('activityLogListWidget'); - - var apiClient = ApiClient; - - if (!apiClient) { - return; - } - - Events.on(apiClient, 'websocketopen', onSocketOpen); - Events.on(apiClient, 'websocketmessage', onSocketMessage); - } - - function startListening(apiClient) { - - if (apiClient.isWebSocketOpen()) { - apiClient.sendWebSocketMessage("ActivityLogEntryStart", "0,1500"); - } - - } - - function stopListening(apiClient) { - - if (apiClient.isWebSocketOpen()) { - apiClient.sendWebSocketMessage("ActivityLogEntryStop", "0,1500"); - } - - } - - function onSocketOpen() { - - var apiClient = ApiClient; - if (apiClient) { - startListening(apiClient); - } - } - - function onSocketMessage(e, data) { - - var msg = data; - - if (msg.MessageType === "ActivityLogEntry") { - $('.activityLogListWidget').each(function () { - - reloadData(this); - }); - } - } - - function destroyList(elem) { - - var apiClient = ApiClient; - - if (apiClient) { - Events.off(apiClient, 'websocketopen', onSocketOpen); - Events.off(apiClient, 'websocketmessage', onSocketMessage); - - stopListening(apiClient); - } - } - - $.fn.activityLogList = function (action) { - - if (action == 'destroy') { - this.removeClass('activityLogListWidget'); - destroyList(this); - } else { - createList(this); - } - - var apiClient = ApiClient; - - if (apiClient) { - startListening(apiClient); - } - - return this; - }; - - })(jQuery, document, window); - - (function ($, document, window) { - - var welcomeDismissValue = '12'; - var welcomeTourKey = 'welcomeTour'; - - function dismissWelcome(page, userId) { - - ApiClient.getDisplayPreferences('dashboard', userId, 'dashboard').then(function (result) { - - result.CustomPrefs[welcomeTourKey] = welcomeDismissValue; - ApiClient.updateDisplayPreferences('dashboard', result, userId, 'dashboard'); - - $(page).off('pageshow', onPageShowCheckTour); - }); - } - - function showWelcomeIfNeeded(page, apiClient) { - - var userId = Dashboard.getCurrentUserId(); - - apiClient.getDisplayPreferences('dashboard', userId, 'dashboard').then(function (result) { - - if (result.CustomPrefs[welcomeTourKey] == welcomeDismissValue) { - $('.welcomeMessage', page).hide(); - } else { - - var elem = $('.welcomeMessage', page).show(); - - if (result.CustomPrefs[welcomeTourKey]) { - - $('.tourHeader', elem).html(Globalize.translate('HeaderWelcomeBack')); - $('.tourButtonText', elem).html(Globalize.translate('ButtonTakeTheTourToSeeWhatsNew')); - - } else { - - $('.tourHeader', elem).html(Globalize.translate('HeaderWelcomeToProjectServerDashboard')); - $('.tourButtonText', elem).html(Globalize.translate('ButtonTakeTheTour')); - } - } - }); - } - - function takeTour(page, userId) { - - require(['slideshow'], function () { - - var slides = [ - { imageUrl: 'css/images/tour/admin/dashboard.png', title: Globalize.translate('DashboardTourDashboard') }, - { imageUrl: 'css/images/tour/admin/help.png', title: Globalize.translate('DashboardTourHelp') }, - { imageUrl: 'css/images/tour/admin/users.png', title: Globalize.translate('DashboardTourUsers') }, - { imageUrl: 'css/images/tour/admin/sync.png', title: Globalize.translate('DashboardTourSync') }, - { imageUrl: 'css/images/tour/admin/cinemamode.png', title: Globalize.translate('DashboardTourCinemaMode') }, - { imageUrl: 'css/images/tour/admin/chapters.png', title: Globalize.translate('DashboardTourChapters') }, - { imageUrl: 'css/images/tour/admin/subtitles.png', title: Globalize.translate('DashboardTourSubtitles') }, - { imageUrl: 'css/images/tour/admin/plugins.png', title: Globalize.translate('DashboardTourPlugins') }, - { imageUrl: 'css/images/tour/admin/notifications.png', title: Globalize.translate('DashboardTourNotifications') }, - { imageUrl: 'css/images/tour/admin/scheduledtasks.png', title: Globalize.translate('DashboardTourScheduledTasks') }, - { imageUrl: 'css/images/tour/admin/mobile.png', title: Globalize.translate('DashboardTourMobile') }, - { imageUrl: 'css/images/tour/enjoy.jpg', title: Globalize.translate('MessageEnjoyYourStay') } - ]; - - require(['slideshow'], function (slideshow) { - - var newSlideShow = new slideshow({ - slides: slides, - interactive: true, - loop: false - }); - - newSlideShow.show(); - - dismissWelcome(page, userId); - $('.welcomeMessage', page).hide(); - }); - }); - } - - function onPageShowCheckTour() { - var page = this; - - var apiClient = ApiClient; - - if (apiClient && !AppInfo.isNativeApp) { - showWelcomeIfNeeded(page, apiClient); - } - } - - $(document).on('pageinit', "#dashboardPage", function () { - - var page = this; - - $('.btnTakeTour', page).on('click', function () { - takeTour(page, Dashboard.getCurrentUserId()); - }); - - }).on('pageshow', "#dashboardPage", onPageShowCheckTour); - - })(jQuery, document, window); - - pageClassOn('pageshow', "type-interior", function () { - - var page = this; - - Dashboard.getPluginSecurityInfo().then(function (pluginSecurityInfo) { - - if (!page.querySelector('.customSupporterPromotion')) { - - $('.supporterPromotion', page).remove(); - - if (!pluginSecurityInfo.IsMBSupporter && AppInfo.enableSupporterMembership) { - - var html = ''; - - page.querySelector('.content-primary').insertAdjacentHTML('afterbegin', html); - } - } - }); - - }); -}); \ No newline at end of file +define(["datetime","jQuery","dom","humanedate","cardStyle","listViewStyle"],function(datetime,$,dom){"use strict";function renderNoHealthAlertsMessage(page){var html='

';html+='',html+=Globalize.translate("HealthMonitorNoAlerts")+"

",page.querySelector(".healthMonitor").innerHTML=html}function refreshHealthMonitor(page){renderNoHealthAlertsMessage(page)}function onConnectionHelpClick(e){return e.preventDefault(),!1}function onEditServerNameClick(e){var page=dom.parentWithClass(this,"page");return require(["prompt"],function(prompt){prompt({label:Globalize.translate("LabelFriendlyServerName"),description:Globalize.translate("LabelFriendlyServerNameHelp"),value:page.querySelector(".serverNameHeader").innerHTML,confirmText:Globalize.translate("ButtonSave")}).then(function(value){Dashboard.showLoadingMsg(),ApiClient.getServerConfiguration().then(function(config){config.ServerName=value,ApiClient.updateServerConfiguration(config).then(function(){page.querySelector(".serverNameHeader").innerHTML=value,Dashboard.hideLoadingMsg()})})})}),e.preventDefault(),!1}window.DashboardPage={newsStartIndex:0,onPageInit:function(){var page=this;page.querySelector(".btnConnectionHelp").addEventListener("click",onConnectionHelpClick),page.querySelector(".btnEditServerName").addEventListener("click",onEditServerNameClick)},onPageShow:function(){var page=this,apiClient=ApiClient;apiClient&&(DashboardPage.newsStartIndex=0,Dashboard.showLoadingMsg(),DashboardPage.pollForInfo(page),DashboardPage.startInterval(apiClient),Events.on(apiClient,"websocketmessage",DashboardPage.onWebSocketMessage),Events.on(apiClient,"websocketopen",DashboardPage.onWebSocketOpen),DashboardPage.lastAppUpdateCheck=null,DashboardPage.lastPluginUpdateCheck=null,Dashboard.getPluginSecurityInfo().then(function(pluginSecurityInfo){DashboardPage.renderSupporterIcon(page,pluginSecurityInfo)}),DashboardPage.reloadSystemInfo(page),DashboardPage.reloadNews(page),DashboardPage.sessionUpdateTimer=setInterval(DashboardPage.refreshSessionsLocally,6e4),$(".activityItems",page).activityLogList(),$(".swaggerLink",page).attr("href",apiClient.getUrl("swagger-ui/index.html",{api_key:ApiClient.accessToken()})),refreshHealthMonitor(page))},onPageHide:function(){var page=this;$(".activityItems",page).activityLogList("destroy");var apiClient=ApiClient;apiClient&&(Events.off(apiClient,"websocketmessage",DashboardPage.onWebSocketMessage),Events.off(apiClient,"websocketopen",DashboardPage.onWebSocketOpen),DashboardPage.stopInterval(apiClient)),DashboardPage.sessionUpdateTimer&&clearInterval(DashboardPage.sessionUpdateTimer)},renderPaths:function(page,systemInfo){$("#cachePath",page).html(systemInfo.CachePath),$("#logPath",page).html(systemInfo.LogPath),$("#transcodingTemporaryPath",page).html(systemInfo.TranscodingTempPath),$("#metadataPath",page).html(systemInfo.InternalMetadataPath)},refreshSessionsLocally:function(){var list=DashboardPage.sessionsList;list&&DashboardPage.renderActiveConnections($.mobile.activePage,list)},reloadSystemInfo:function(page){ApiClient.getSystemInfo().then(function(systemInfo){page.querySelector(".serverNameHeader").innerHTML=systemInfo.ServerName;var localizedVersion=Globalize.translate("LabelVersionNumber",systemInfo.Version);systemInfo.SystemUpdateLevel&&"Release"!=systemInfo.SystemUpdateLevel&&(localizedVersion+=" "+Globalize.translate("Option"+systemInfo.SystemUpdateLevel).toLowerCase()),$("#appVersionNumber",page).html(localizedVersion),systemInfo.SupportsHttps?$("#ports",page).html(Globalize.translate("LabelRunningOnPorts",systemInfo.HttpServerPortNumber,systemInfo.HttpsPortNumber)):$("#ports",page).html(Globalize.translate("LabelRunningOnPort",systemInfo.HttpServerPortNumber)),systemInfo.CanSelfRestart?$(".btnRestartContainer",page).removeClass("hide"):$(".btnRestartContainer",page).addClass("hide"),DashboardPage.renderUrls(page,systemInfo),DashboardPage.renderPendingInstallations(page,systemInfo),systemInfo.CanSelfUpdate?($("#btnUpdateApplicationContainer",page).show(),$("#btnManualUpdateContainer",page).hide()):($("#btnUpdateApplicationContainer",page).hide(),$("#btnManualUpdateContainer",page).show()),"synology"==systemInfo.PackageName?$("#btnManualUpdateContainer").html(Globalize.translate("SynologyUpdateInstructions")):$("#btnManualUpdateContainer").html(''+Globalize.translate("PleaseUpdateManually")+""),DashboardPage.renderPaths(page,systemInfo),DashboardPage.renderHasPendingRestart(page,systemInfo.HasPendingRestart)})},reloadNews:function(page){var query={StartIndex:DashboardPage.newsStartIndex,Limit:7};ApiClient.getProductNews(query).then(function(result){var html=result.Items.map(function(item){var itemHtml="";itemHtml+='',itemHtml+='
',itemHtml+='dvr',itemHtml+='
',itemHtml+='
',itemHtml+=item.Title,itemHtml+="
",itemHtml+='
';var date=datetime.parseISO8601Date(item.Date,!0);return itemHtml+=datetime.toLocaleDateString(date),itemHtml+="
",itemHtml+="
",itemHtml+="
",itemHtml+="
"}),pagingHtml="";pagingHtml+="
",pagingHtml+=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1}),pagingHtml+="
",html=html.join("")+pagingHtml;var elem=$(".latestNewsItems",page).html(html);$(".btnNextPage",elem).on("click",function(){DashboardPage.newsStartIndex+=query.Limit,DashboardPage.reloadNews(page)}),$(".btnPreviousPage",elem).on("click",function(){DashboardPage.newsStartIndex-=query.Limit,DashboardPage.reloadNews(page)})})},startInterval:function(apiClient){apiClient.isWebSocketOpen()&&(apiClient.sendWebSocketMessage("SessionsStart","0,1500"),apiClient.sendWebSocketMessage("ScheduledTasksInfoStart","0,1000"))},stopInterval:function(apiClient){apiClient.isWebSocketOpen()&&(apiClient.sendWebSocketMessage("SessionsStop"),apiClient.sendWebSocketMessage("ScheduledTasksInfoStop"))},onWebSocketMessage:function(e,msg){var page=$.mobile.activePage;if("Sessions"==msg.MessageType)DashboardPage.renderInfo(page,msg.Data);else if("RestartRequired"==msg.MessageType)DashboardPage.renderHasPendingRestart(page,!0);else if("ServerShuttingDown"==msg.MessageType)DashboardPage.renderHasPendingRestart(page,!0);else if("ServerRestarting"==msg.MessageType)DashboardPage.renderHasPendingRestart(page,!0);else if("ScheduledTasksInfo"==msg.MessageType){var tasks=msg.Data;DashboardPage.renderRunningTasks(page,tasks)}else"PackageInstalling"!=msg.MessageType&&"PackageInstallationCompleted"!=msg.MessageType||(DashboardPage.pollForInfo(page,!0),DashboardPage.reloadSystemInfo(page))},onWebSocketOpen:function(){var apiClient=this;DashboardPage.startInterval(apiClient)},pollForInfo:function(page,forceUpdate){var apiClient=window.ApiClient;apiClient&&(apiClient.getSessions().then(function(sessions){DashboardPage.renderInfo(page,sessions,forceUpdate)}),apiClient.getScheduledTasks().then(function(tasks){DashboardPage.renderRunningTasks(page,tasks)}))},renderInfo:function(page,sessions,forceUpdate){DashboardPage.renderActiveConnections(page,sessions),DashboardPage.renderPluginUpdateInfo(page,forceUpdate),Dashboard.hideLoadingMsg()},renderActiveConnections:function(page,sessions){var html="";DashboardPage.sessionsList=sessions;var parentElement=$(".activeDevices",page);$(".card",parentElement).addClass("deadSession");for(var i=0,length=sessions.length;i',html+='
',html+='
',html+='
',html+='
',html+='
',html+='
'+session.DeviceName+"
",html+='
'+DashboardPage.getAppSecondaryText(session)+"
",html+="
",html+="
",html+='
'+DashboardPage.getSessionNowPlayingTime(session)+"
";var nowPlayingName=DashboardPage.getNowPlayingName(session);if(html+='
',html+=nowPlayingName.html,html+="
",nowPlayingItem&&nowPlayingItem.RunTimeTicks){var position=session.PlayState.PositionTicks||0,value=100*position/nowPlayingItem.RunTimeTicks;html+=''}else html+='';html+=session.TranscodingInfo&&session.TranscodingInfo.CompletionPercentage?'':'',html+="
",html+="
",html+="",html+='
',html+='
',html+=DashboardPage.getSessionNowPlayingStreamInfo(session),html+="
",html+='
';var userImage=DashboardPage.getUserImage(session);html+=userImage?'':'
',html+='
',html+=DashboardPage.getUsersHtml(session)||" ",html+="
",html+="
",html+="
",html+="",html+=""}}parentElement.append(html),$(".deadSession",parentElement).remove()},getSessionNowPlayingStreamInfo:function(session){var html="",showTranscodingInfo=!1;if(session.TranscodingInfo&&session.TranscodingInfo.IsAudioDirect&&session.TranscodingInfo.IsVideoDirect?html+=Globalize.translate("LabelPlayMethodDirectStream"):session.TranscodingInfo&&session.TranscodingInfo.IsVideoDirect?html+=Globalize.translate("LabelPlayMethodDirectStream"):"Transcode"==session.PlayState.PlayMethod?(html+=Globalize.translate("LabelPlayMethodTranscoding"),session.TranscodingInfo&&session.TranscodingInfo.Framerate&&(html+=" ("+session.TranscodingInfo.Framerate+" fps)"),showTranscodingInfo=!0):"DirectStream"==session.PlayState.PlayMethod?html+=Globalize.translate("LabelPlayMethodDirectPlay"):"DirectPlay"==session.PlayState.PlayMethod&&(html+=Globalize.translate("LabelPlayMethodDirectPlay")),showTranscodingInfo){var line=[];session.TranscodingInfo&&(session.TranscodingInfo.Bitrate&&(session.TranscodingInfo.Bitrate>1e6?line.push((session.TranscodingInfo.Bitrate/1e6).toFixed(1)+" Mbps"):line.push(Math.floor(session.TranscodingInfo.Bitrate/1e3)+" kbps")),session.TranscodingInfo.Container&&line.push(session.TranscodingInfo.Container),session.TranscodingInfo.VideoCodec&&line.push(session.TranscodingInfo.VideoCodec),session.TranscodingInfo.AudioCodec&&session.TranscodingInfo.AudioCodec!=session.TranscodingInfo.Container&&line.push(session.TranscodingInfo.AudioCodec)),line.length&&(html+=" - "+line.join(" "))}return html||" "},getSessionNowPlayingTime:function(session){var html="";html+=session.PlayState.PositionTicks?datetime.getDisplayRunningTime(session.PlayState.PositionTicks):"--:--:--",html+=" / ";var nowPlayingItem=session.NowPlayingItem;return html+=nowPlayingItem&&nowPlayingItem.RunTimeTicks?datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks):"--:--:--"},getAppSecondaryText:function(session){return session.ApplicationVersion},getNowPlayingName:function(session){var imgUrl="",nowPlayingItem=session.NowPlayingItem;if(!nowPlayingItem)return{html:"Last seen "+humane_date(session.LastActivityDate),image:imgUrl};var topText=nowPlayingItem.Name,bottomText="";nowPlayingItem.Artists&&nowPlayingItem.Artists.length?(bottomText=topText,topText=nowPlayingItem.Artists[0]):nowPlayingItem.SeriesName||nowPlayingItem.Album?(bottomText=topText,topText=nowPlayingItem.SeriesName||nowPlayingItem.Album):nowPlayingItem.ProductionYear&&(bottomText=nowPlayingItem.ProductionYear),nowPlayingItem.LogoItemId&&(imgUrl=ApiClient.getScaledImageUrl(nowPlayingItem.LogoItemId,{tag:session.LogoImageTag,maxHeight:24,maxWidth:130,type:"Logo"}),topText='');var text=bottomText?topText+"
"+bottomText:topText;return{html:text,image:imgUrl}},getUsersHtml:function(session){var html=[];session.UserId&&html.push(session.UserName);for(var i=0,length=session.AdditionalUsers.length;i";if("dashboard"==clientLowered||"emby web client"==clientLowered){var imgUrl;return imgUrl=device.indexOf("chrome")!=-1?"css/images/clients/chrome.png":"css/images/clients/html5.png","Emby Web Client"}return clientLowered.indexOf("android")!=-1?"":clientLowered.indexOf("ios")!=-1?"":"mb-classic"==clientLowered?"":"roku"==clientLowered?"":"dlna"==clientLowered?"":"kodi"==clientLowered||"xbmc"==clientLowered?"":"chromecast"==clientLowered?"":null},getNowPlayingImageUrl:function(item){return item&&item.BackdropImageTag?ApiClient.getScaledImageUrl(item.BackdropItemId,{type:"Backdrop",width:275,tag:item.BackdropImageTag}):item&&item.ThumbImageTag?ApiClient.getScaledImageUrl(item.ThumbItemId,{type:"Thumb",width:275,tag:item.ThumbImageTag}):item&&item.PrimaryImageTag?ApiClient.getScaledImageUrl(item.PrimaryImageItemId,{type:"Primary",width:275,tag:item.PrimaryImageTag}):null},systemUpdateTaskKey:"SystemUpdateTask",renderRunningTasks:function(page,tasks){var html="";tasks=tasks.filter(function(t){return"Idle"!=t.State&&!t.IsHidden}),tasks.filter(function(t){return t.Key==DashboardPage.systemUpdateTaskKey}).length?$("#btnUpdateApplication",page).buttonEnabled(!1):$("#btnUpdateApplication",page).buttonEnabled(!0),tasks.length?$("#runningTasksCollapsible",page).show():$("#runningTasksCollapsible",page).hide();for(var i=0,length=tasks.length;i",html+=task.Name+"
","Running"==task.State){var progress=(task.CurrentProgressPercentage||0).toFixed(1);html+='',html+=""+progress+"%",html+="",html+=""+progress+"%",html+=''}else"Cancelling"==task.State&&(html+=''+Globalize.translate("LabelStopping")+"");html+="

"}$("#divRunningTasks",page).html(html)},renderUrls:function(page,systemInfo){var helpButton=''+Globalize.translate("ButtonHelp")+"";if(systemInfo.LocalAddress){var localAccessHtml=Globalize.translate("LabelLocalAccessUrl",''+systemInfo.LocalAddress+"");$(".localUrl",page).html(localAccessHtml+helpButton).show().trigger("create")}else $(".externalUrl",page).hide();if(systemInfo.WanAddress){var externalUrl=systemInfo.WanAddress,remoteAccessHtml=Globalize.translate("LabelRemoteAccessUrl",''+externalUrl+"");$(".externalUrl",page).html(remoteAccessHtml+helpButton).show().trigger("create")}else $(".externalUrl",page).hide()},renderSupporterIcon:function(page,pluginSecurityInfo){var imgUrl,text,supporterIconContainer=page.querySelector(".supporterIconContainer");AppInfo.enableSupporterMembership&&pluginSecurityInfo.IsMBSupporter?(supporterIconContainer.classList.remove("hide"),imgUrl="css/images/supporter/supporterbadge.png",text=Globalize.translate("MessageThankYouForSupporting"),supporterIconContainer.innerHTML=''+text+""):supporterIconContainer.classList.add("hide")},renderHasPendingRestart:function(page,hasPendingRestart){if(hasPendingRestart)page.querySelector("#pUpToDate").classList.add("hide"),$("#pUpdateNow",page).hide();else{if(DashboardPage.lastAppUpdateCheck&&(new Date).getTime()-DashboardPage.lastAppUpdateCheck<18e5)return;DashboardPage.lastAppUpdateCheck=(new Date).getTime(),ApiClient.getAvailableApplicationUpdate().then(function(packageInfo){var version=packageInfo[0];version?(page.querySelector("#pUpToDate").classList.add("hide"),$("#pUpdateNow",page).show(),$("#newVersionNumber",page).html(Globalize.translate("VersionXIsAvailableForDownload").replace("{0}",version.versionStr))):(page.querySelector("#pUpToDate").classList.remove("hide"),$("#pUpdateNow",page).hide())})}},renderPendingInstallations:function(page,systemInfo){if(!systemInfo.CompletedInstallations.length)return void $("#collapsiblePendingInstallations",page).hide();$("#collapsiblePendingInstallations",page).show();for(var html="",i=0,length=systemInfo.CompletedInstallations.length;i"+update.Name+" ("+update.Version+")"}$("#pendingInstallations",page).html(html)},renderPluginUpdateInfo:function(page,forceUpdate){!forceUpdate&&DashboardPage.lastPluginUpdateCheck&&(new Date).getTime()-DashboardPage.lastPluginUpdateCheck<18e5||(DashboardPage.lastPluginUpdateCheck=(new Date).getTime(),ApiClient.getAvailablePluginUpdates().then(function(updates){var elem=$("#pPluginUpdates",page);if(!updates.length)return void elem.hide();elem.show();for(var html="",i=0,length=updates.length;i"+Globalize.translate("NewVersionOfSomethingAvailable").replace("{0}",update.name)+"

",html+='"}elem.html(html)}))},installPluginUpdate:function(button){$(button).buttonEnabled(!1);var name=button.getAttribute("data-name"),guid=button.getAttribute("data-guid"),version=button.getAttribute("data-version"),classification=button.getAttribute("data-classification");Dashboard.showLoadingMsg(),ApiClient.installPlugin(name,guid,classification,version).then(function(){Dashboard.hideLoadingMsg()})},updateApplication:function(){var page=$.mobile.activePage;$("#btnUpdateApplication",page).buttonEnabled(!1),Dashboard.showLoadingMsg(),ApiClient.getScheduledTasks().then(function(tasks){var task=tasks.filter(function(t){return t.Key==DashboardPage.systemUpdateTaskKey})[0];ApiClient.startScheduledTask(task.Id).then(function(){DashboardPage.pollForInfo(page),Dashboard.hideLoadingMsg()})})},stopTask:function(id){var page=$.mobile.activePage;ApiClient.stopScheduledTask(id).then(function(){DashboardPage.pollForInfo(page)})},restart:function(){require(["confirm"],function(confirm){confirm({title:Globalize.translate("HeaderRestart"),text:Globalize.translate("MessageConfirmRestart"),confirmText:Globalize.translate("ButtonRestart"),primary:"cancel"}).then(function(){$("#btnRestartServer").buttonEnabled(!1),$("#btnShutdown").buttonEnabled(!1),Dashboard.restartServer()})})},shutdown:function(){require(["confirm"],function(confirm){confirm({title:Globalize.translate("HeaderShutdown"),text:Globalize.translate("MessageConfirmShutdown"),confirmText:Globalize.translate("ButtonShutdown"),primary:"cancel"}).then(function(){$("#btnRestartServer").buttonEnabled(!1),$("#btnShutdown").buttonEnabled(!1),ApiClient.shutdownServer()})})}},$(document).on("pageinit","#dashboardPage",DashboardPage.onPageInit).on("pageshow","#dashboardPage",DashboardPage.onPageShow).on("pagebeforehide","#dashboardPage",DashboardPage.onPageHide),function($,document,window){function getEntryHtml(entry){var html="";html+='
';var color="Error"==entry.Severity||"Fatal"==entry.Severity||"Warn"==entry.Severity?"#cc0000":"#52B54B";if(entry.UserId&&entry.UserPrimaryImageTag){var userImgUrl=ApiClient.getUserImageUrl(entry.UserId,{type:"Primary",tag:entry.UserPrimaryImageTag,height:40});html+='dvr"}else html+='dvr';html+='
',html+='
',html+=entry.Name,html+="
",html+='
';var date=datetime.parseISO8601Date(entry.Date,!0);return html+=datetime.toLocaleString(date).toLowerCase(),html+="
",html+='
',html+=entry.ShortOverview||"",html+="
",html+="
",html+="
"}function renderList(elem,result,startIndex,limit){var html=result.Items.map(getEntryHtml).join("");if(result.TotalRecordCount>limit){var query={StartIndex:startIndex,Limit:limit};html+=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1})}$(elem).html(html),$(".btnNextPage",elem).on("click",function(){reloadData(elem,startIndex+limit,limit)}),$(".btnPreviousPage",elem).on("click",function(){reloadData(elem,startIndex-limit,limit)}),$(".btnShowOverview",elem).on("click",function(){var item=$(this).parents(".newsItem"),overview=$(".newsItemLongDescription",item).html(),name=$(".notificationName",item).html();Dashboard.alert({message:'
'+overview+"
",title:name})})}function reloadData(elem,startIndex,limit){null==startIndex&&(startIndex=parseInt(elem.getAttribute("data-activitystartindex")||"0")),limit=limit||parseInt(elem.getAttribute("data-activitylimit")||"7");var minDate=new Date;minDate.setTime(minDate.getTime()-864e5),ApiClient.getJSON(ApiClient.getUrl("System/ActivityLog/Entries",{startIndex:startIndex,limit:limit,minDate:minDate.toISOString()})).then(function(result){elem.setAttribute("data-activitystartindex",startIndex),elem.setAttribute("data-activitylimit",limit),renderList(elem,result,startIndex,limit)})}function createList(elem){elem.each(function(){reloadData(this)}).addClass("activityLogListWidget");var apiClient=ApiClient;apiClient&&(Events.on(apiClient,"websocketopen",onSocketOpen),Events.on(apiClient,"websocketmessage",onSocketMessage))}function startListening(apiClient){apiClient.isWebSocketOpen()&&apiClient.sendWebSocketMessage("ActivityLogEntryStart","0,1500")}function stopListening(apiClient){apiClient.isWebSocketOpen()&&apiClient.sendWebSocketMessage("ActivityLogEntryStop","0,1500")}function onSocketOpen(){var apiClient=ApiClient;apiClient&&startListening(apiClient)}function onSocketMessage(e,data){var msg=data;"ActivityLogEntry"===msg.MessageType&&$(".activityLogListWidget").each(function(){reloadData(this)})}function destroyList(elem){var apiClient=ApiClient;apiClient&&(Events.off(apiClient,"websocketopen",onSocketOpen),Events.off(apiClient,"websocketmessage",onSocketMessage),stopListening(apiClient))}$.fn.activityLogList=function(action){"destroy"==action?(this.removeClass("activityLogListWidget"),destroyList(this)):createList(this);var apiClient=ApiClient;return apiClient&&startListening(apiClient),this}}(jQuery,document,window),function($,document,window){function dismissWelcome(page,userId){ApiClient.getDisplayPreferences("dashboard",userId,"dashboard").then(function(result){result.CustomPrefs[welcomeTourKey]=welcomeDismissValue,ApiClient.updateDisplayPreferences("dashboard",result,userId,"dashboard"),$(page).off("pageshow",onPageShowCheckTour)})}function showWelcomeIfNeeded(page,apiClient){var userId=Dashboard.getCurrentUserId();apiClient.getDisplayPreferences("dashboard",userId,"dashboard").then(function(result){if(result.CustomPrefs[welcomeTourKey]==welcomeDismissValue)$(".welcomeMessage",page).hide();else{var elem=$(".welcomeMessage",page).show();result.CustomPrefs[welcomeTourKey]?($(".tourHeader",elem).html(Globalize.translate("HeaderWelcomeBack")),$(".tourButtonText",elem).html(Globalize.translate("ButtonTakeTheTourToSeeWhatsNew"))):($(".tourHeader",elem).html(Globalize.translate("HeaderWelcomeToProjectServerDashboard")),$(".tourButtonText",elem).html(Globalize.translate("ButtonTakeTheTour")))}})}function takeTour(page,userId){require(["slideshow"],function(){var slides=[{imageUrl:"css/images/tour/admin/dashboard.png",title:Globalize.translate("DashboardTourDashboard")},{imageUrl:"css/images/tour/admin/help.png",title:Globalize.translate("DashboardTourHelp")},{imageUrl:"css/images/tour/admin/users.png",title:Globalize.translate("DashboardTourUsers")},{imageUrl:"css/images/tour/admin/sync.png",title:Globalize.translate("DashboardTourSync")},{imageUrl:"css/images/tour/admin/cinemamode.png",title:Globalize.translate("DashboardTourCinemaMode")},{imageUrl:"css/images/tour/admin/chapters.png",title:Globalize.translate("DashboardTourChapters")},{imageUrl:"css/images/tour/admin/subtitles.png",title:Globalize.translate("DashboardTourSubtitles")},{imageUrl:"css/images/tour/admin/plugins.png",title:Globalize.translate("DashboardTourPlugins")},{imageUrl:"css/images/tour/admin/notifications.png",title:Globalize.translate("DashboardTourNotifications")},{imageUrl:"css/images/tour/admin/scheduledtasks.png",title:Globalize.translate("DashboardTourScheduledTasks")},{imageUrl:"css/images/tour/admin/mobile.png",title:Globalize.translate("DashboardTourMobile")},{imageUrl:"css/images/tour/enjoy.jpg",title:Globalize.translate("MessageEnjoyYourStay")}];require(["slideshow"],function(slideshow){var newSlideShow=new slideshow({slides:slides,interactive:!0,loop:!1});newSlideShow.show(),dismissWelcome(page,userId),$(".welcomeMessage",page).hide()})})}function onPageShowCheckTour(){var page=this,apiClient=ApiClient;apiClient&&!AppInfo.isNativeApp&&showWelcomeIfNeeded(page,apiClient)}var welcomeDismissValue="12",welcomeTourKey="welcomeTour";$(document).on("pageinit","#dashboardPage",function(){var page=this;$(".btnTakeTour",page).on("click",function(){takeTour(page,Dashboard.getCurrentUserId())})}).on("pageshow","#dashboardPage",onPageShowCheckTour)}(jQuery,document,window),pageClassOn("pageshow","type-interior",function(){var page=this;Dashboard.getPluginSecurityInfo().then(function(pluginSecurityInfo){if(!page.querySelector(".customSupporterPromotion")&&($(".supporterPromotion",page).remove(),!pluginSecurityInfo.IsMBSupporter&&AppInfo.enableSupporterMembership)){var html='";page.querySelector(".content-primary").insertAdjacentHTML("afterbegin",html)}})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/device.js b/dashboard-ui/scripts/device.js index 5948801287..d53bb52291 100644 --- a/dashboard-ui/scripts/device.js +++ b/dashboard-ui/scripts/device.js @@ -1,96 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - function load(page, device, capabilities) { - - if (capabilities.SupportsContentUploading) { - $('#fldCameraUploadPath', page).removeClass('hide'); - } else { - $('#fldCameraUploadPath', page).addClass('hide'); - } - - $('#txtCustomName', page).val(device.CustomName || ''); - $('#txtUploadPath', page).val(device.CameraUploadPath || ''); - $('.reportedName', page).html(device.ReportedName || ''); - } - - function loadData(page) { - - Dashboard.showLoadingMsg(); - - var id = getParameterByName('id'); - - var promise1 = ApiClient.getJSON(ApiClient.getUrl('Devices/Info', { Id: id })); - var promise2 = ApiClient.getJSON(ApiClient.getUrl('Devices/Capabilities', { Id: id })); - - Promise.all([promise1, promise2]).then(function (responses) { - - load(page, responses[0], responses[1]); - - Dashboard.hideLoadingMsg(); - }); - } - - function save(page) { - - var id = getParameterByName('id'); - - ApiClient.ajax({ - - url: ApiClient.getUrl('Devices/Options', { Id: id }), - type: 'POST', - data: JSON.stringify({ - - CustomName: $('#txtCustomName', page).val(), - CameraUploadPath: $('#txtUploadPath', page).val() - - }), - contentType: "application/json" - - }).then(Dashboard.processServerConfigurationUpdateResult); - } - - function onSubmit() { - var form = this; - var page = $(form).parents('.page'); - - save(page); - - return false; - } - - $(document).on('pageinit', "#devicePage", function () { - - var page = this; - - $('#btnSelectUploadPath', page).on("click.selectDirectory", function () { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - callback: function (path) { - - if (path) { - $('#txtUploadPath', page).val(path); - } - picker.close(); - }, - - header: Globalize.translate('HeaderSelectUploadPath') - }); - }); - }); - - $('.deviceForm').off('submit', onSubmit).on('submit', onSubmit); - - }).on('pageshow', "#devicePage", function () { - - var page = this; - - loadData(page); - }); - -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";function load(page,device,capabilities){capabilities.SupportsContentUploading?$("#fldCameraUploadPath",page).removeClass("hide"):$("#fldCameraUploadPath",page).addClass("hide"),$("#txtCustomName",page).val(device.CustomName||""),$("#txtUploadPath",page).val(device.CameraUploadPath||""),$(".reportedName",page).html(device.ReportedName||"")}function loadData(page){Dashboard.showLoadingMsg();var id=getParameterByName("id"),promise1=ApiClient.getJSON(ApiClient.getUrl("Devices/Info",{Id:id})),promise2=ApiClient.getJSON(ApiClient.getUrl("Devices/Capabilities",{Id:id}));Promise.all([promise1,promise2]).then(function(responses){load(page,responses[0],responses[1]),Dashboard.hideLoadingMsg()})}function save(page){var id=getParameterByName("id");ApiClient.ajax({url:ApiClient.getUrl("Devices/Options",{Id:id}),type:"POST",data:JSON.stringify({CustomName:$("#txtCustomName",page).val(),CameraUploadPath:$("#txtUploadPath",page).val()}),contentType:"application/json"}).then(Dashboard.processServerConfigurationUpdateResult)}function onSubmit(){var form=this,page=$(form).parents(".page");return save(page),!1}$(document).on("pageinit","#devicePage",function(){var page=this;$("#btnSelectUploadPath",page).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&$("#txtUploadPath",page).val(path),picker.close()},header:Globalize.translate("HeaderSelectUploadPath")})})}),$(".deviceForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#devicePage",function(){var page=this;loadData(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/devices.js b/dashboard-ui/scripts/devices.js index 12f5c37e56..7dafef7422 100644 --- a/dashboard-ui/scripts/devices.js +++ b/dashboard-ui/scripts/devices.js @@ -1,113 +1 @@ -define(['jQuery', 'listViewStyle'], function ($) { - 'use strict'; - - function deleteDevice(page, id) { - - var msg = Globalize.translate('DeleteDeviceConfirmation'); - - require(['confirm'], function (confirm) { - - confirm(msg, Globalize.translate('HeaderDeleteDevice')).then(function () { - - Dashboard.showLoadingMsg(); - - ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl('Devices', { - Id: id - }) - - }).then(function () { - - loadData(page); - }); - }); - - }); - } - - function load(page, devices) { - - var html = ''; - - if (devices.length) { - html += '
'; - } - - html += devices.map(function (d) { - - var deviceHtml = ''; - deviceHtml += '
'; - - deviceHtml += 'tablet_android'; - - if (d.AppName && d.LastUserName) { - deviceHtml += ''; - - return deviceHtml; - - }).join(''); - - if (devices.length) { - html += '
'; - } - - var elem = $('.devicesList', page).html(html).trigger('create'); - - $('.btnDeleteDevice', elem).on('click', function () { - - deleteDevice(page, this.getAttribute('data-id')); - }); - } - - function loadData(page) { - Dashboard.showLoadingMsg(); - - ApiClient.getJSON(ApiClient.getUrl('Devices', { - - SupportsPersistentIdentifier: true - - })).then(function (result) { - - load(page, result.Items); - - Dashboard.hideLoadingMsg(); - }); - } - - $(document).on('pageshow', "#devicesPage", function () { - - var page = this; - - loadData(page); - - }); - -}); \ No newline at end of file +define(["jQuery","listViewStyle"],function($){"use strict";function deleteDevice(page,id){var msg=Globalize.translate("DeleteDeviceConfirmation");require(["confirm"],function(confirm){confirm(msg,Globalize.translate("HeaderDeleteDevice")).then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Devices",{Id:id})}).then(function(){loadData(page)})})})}function load(page,devices){var html="";devices.length&&(html+='
'),html+=devices.map(function(d){var deviceHtml="";return deviceHtml+='
',deviceHtml+='tablet_android',deviceHtml+=d.AppName&&d.LastUserName?'"}).join(""),devices.length&&(html+="
");var elem=$(".devicesList",page).html(html).trigger("create");$(".btnDeleteDevice",elem).on("click",function(){deleteDevice(page,this.getAttribute("data-id"))})}function loadData(page){Dashboard.showLoadingMsg(),ApiClient.getJSON(ApiClient.getUrl("Devices",{SupportsPersistentIdentifier:!0})).then(function(result){load(page,result.Items),Dashboard.hideLoadingMsg()})}$(document).on("pageshow","#devicesPage",function(){var page=this;loadData(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/dlnaprofile.js b/dashboard-ui/scripts/dlnaprofile.js index d7ebba257b..c481a9fb7a 100644 --- a/dashboard-ui/scripts/dlnaprofile.js +++ b/dashboard-ui/scripts/dlnaprofile.js @@ -1,1181 +1 @@ -define(['jQuery', 'fnchecked', 'jqmlistview', 'emby-select', 'emby-button', 'emby-input', 'emby-checkbox', 'listViewStyle'], function ($) { - 'use strict'; - - var currentProfile; - - var currentSubProfile; - var isSubProfileNew; - - var allText = Globalize.translate('LabelAll'); - - function loadProfile(page) { - - Dashboard.showLoadingMsg(); - - var promise1 = getProfile(); - var promise2 = ApiClient.getUsers(); - - Promise.all([promise1, promise2]).then(function (responses) { - - currentProfile = responses[0]; - - renderProfile(page, currentProfile, responses[1]); - - Dashboard.hideLoadingMsg(); - - }); - } - - function getProfile() { - - var id = getParameterByName('id'); - var url = id ? 'Dlna/Profiles/' + id : - 'Dlna/Profiles/Default'; - - return ApiClient.getJSON(ApiClient.getUrl(url)); - } - - function renderProfile(page, profile, users) { - - $('#txtName', page).val(profile.Name); - - $('.chkMediaType', page).each(function () { - this.checked = (profile.SupportedMediaTypes || '').split(',').indexOf(this.getAttribute('data-value')) != -1; - - }); - - $('#chkEnableAlbumArtInDidl', page).checked(profile.EnableAlbumArtInDidl); - $('#chkEnableSingleImageLimit', page).checked(profile.EnableSingleAlbumArtLimit); - - renderXmlDocumentAttributes(page, profile.XmlRootAttributes || []); - - var idInfo = profile.Identification || {}; - - renderIdentificationHeaders(page, idInfo.Headers || []); - renderSubtitleProfiles(page, profile.SubtitleProfiles || []); - - $('#txtInfoFriendlyName', page).val(profile.FriendlyName || ''); - $('#txtInfoModelName', page).val(profile.ModelName || ''); - $('#txtInfoModelNumber', page).val(profile.ModelNumber || ''); - $('#txtInfoModelDescription', page).val(profile.ModelDescription || ''); - $('#txtInfoModelUrl', page).val(profile.ModelUrl || ''); - $('#txtInfoManufacturer', page).val(profile.Manufacturer || ''); - $('#txtInfoManufacturerUrl', page).val(profile.ManufacturerUrl || ''); - $('#txtInfoSerialNumber', page).val(profile.SerialNumber || ''); - - $('#txtIdFriendlyName', page).val(idInfo.FriendlyName || ''); - $('#txtIdModelName', page).val(idInfo.ModelName || ''); - $('#txtIdModelNumber', page).val(idInfo.ModelNumber || ''); - $('#txtIdModelDescription', page).val(idInfo.ModelDescription || ''); - $('#txtIdModelUrl', page).val(idInfo.ModelUrl || ''); - $('#txtIdManufacturer', page).val(idInfo.Manufacturer || ''); - $('#txtIdManufacturerUrl', page).val(idInfo.ManufacturerUrl || ''); - $('#txtIdSerialNumber', page).val(idInfo.SerialNumber || ''); - $('#txtIdDeviceDescription', page).val(idInfo.DeviceDescription || ''); - - $('#txtAlbumArtPn', page).val(profile.AlbumArtPn || ''); - $('#txtAlbumArtMaxWidth', page).val(profile.MaxAlbumArtWidth || ''); - $('#txtAlbumArtMaxHeight', page).val(profile.MaxAlbumArtHeight || ''); - $('#txtIconMaxWidth', page).val(profile.MaxIconWidth || ''); - $('#txtIconMaxHeight', page).val(profile.MaxIconHeight || ''); - - $('#chkIgnoreTranscodeByteRangeRequests', page).checked(profile.IgnoreTranscodeByteRangeRequests); - $('#txtMaxAllowedBitrate', page).val(profile.MaxStreamingBitrate || ''); - - $('#txtMusicStreamingTranscodingBitrate', page).val(profile.MusicStreamingTranscodingBitrate || ''); - - $('#chkRequiresPlainFolders', page).checked(profile.RequiresPlainFolders); - $('#chkRequiresPlainVideoItems', page).checked(profile.RequiresPlainVideoItems); - - $('#txtProtocolInfo', page).val(profile.ProtocolInfo || ''); - $('#txtXDlnaCap', page).val(profile.XDlnaCap || ''); - $('#txtXDlnaDoc', page).val(profile.XDlnaDoc || ''); - $('#txtSonyAggregationFlags', page).val(profile.SonyAggregationFlags || ''); - - profile.DirectPlayProfiles = (profile.DirectPlayProfiles || []); - profile.TranscodingProfiles = (profile.TranscodingProfiles || []); - profile.ContainerProfiles = (profile.ContainerProfiles || []); - profile.CodecProfiles = (profile.CodecProfiles || []); - profile.ResponseProfiles = (profile.ResponseProfiles || []); - - var usersHtml = '' + users.map(function (u) { - return ''; - }).join(''); - $('#selectUser', page).html(usersHtml).val(profile.UserId || ''); - - renderSubProfiles(page, profile); - } - - function renderIdentificationHeaders(page, headers) { - - var index = 0; - - var html = '
' + headers.map(function (h) { - - var li = '
'; - - li += 'info'; - li += '
'; - - li += '

' + h.Name + ': ' + (h.Value || '') + '

'; - li += '
' + (h.Match || '') + '
'; - - li += '
'; - - li += ''; - - li += '
'; - - index++; - - return li; - - }).join('') + '
'; - - var elem = $('.httpHeaderIdentificationList', page).html(html).trigger('create'); - - $('.btnDeleteIdentificationHeader', elem).on('click', function () { - - var itemIndex = parseInt(this.getAttribute('data-index')); - - currentProfile.Identification.Headers.splice(itemIndex, 1); - - renderIdentificationHeaders(page, currentProfile.Identification.Headers); - }); - } - - function editIdentificationHeader(page, header) { - - isSubProfileNew = header == null; - header = header || {}; - currentSubProfile = header; - - var popup = $('#identificationHeaderPopup', page); - - $('#txtIdentificationHeaderName', popup).val(header.Name || ''); - $('#txtIdentificationHeaderValue', popup).val(header.Value || ''); - $('#selectMatchType', popup).val(header.Match || 'Equals'); - - popup.popup('open'); - } - - function saveIdentificationHeader(page) { - - currentSubProfile.Name = $('#txtIdentificationHeaderName', page).val(); - currentSubProfile.Value = $('#txtIdentificationHeaderValue', page).val(); - currentSubProfile.Match = $('#selectMatchType', page).val(); - - if (isSubProfileNew) { - - currentProfile.Identification = currentProfile.Identification || {}; - currentProfile.Identification.Headers = currentProfile.Identification.Headers || []; - - currentProfile.Identification.Headers.push(currentSubProfile); - } - - renderIdentificationHeaders(page, currentProfile.Identification.Headers); - - currentSubProfile = null; - - $('#identificationHeaderPopup', page).popup('close'); - } - - function renderXmlDocumentAttributes(page, attribute) { - - var index = 0; - - var html = '
' + attribute.map(function (h) { - - var li = '
'; - - li += 'info'; - li += '
'; - - li += '

' + h.Name + ' = ' + (h.Value || '') + '

'; - - li += '
'; - - li += ''; - - li += '
'; - - return li; - - }).join('') + '
'; - - var elem = $('.xmlDocumentAttributeList', page).html(html).trigger('create'); - - $('.btnDeleteXmlAttribute', elem).on('click', function () { - - var itemIndex = parseInt(this.getAttribute('data-index')); - - currentProfile.XmlRootAttributes.splice(itemIndex, 1); - - renderXmlDocumentAttributes(page, currentProfile.XmlRootAttributes); - }); - } - - function editXmlDocumentAttribute(page, attribute) { - - isSubProfileNew = attribute == null; - attribute = attribute || {}; - currentSubProfile = attribute; - - var popup = $('#xmlAttributePopup', page); - - $('#txtXmlAttributeName', popup).val(attribute.Name || ''); - $('#txtXmlAttributeValue', popup).val(attribute.Value || ''); - - popup.popup('open'); - } - - function saveXmlDocumentAttribute(page) { - - currentSubProfile.Name = $('#txtXmlAttributeName', page).val(); - currentSubProfile.Value = $('#txtXmlAttributeValue', page).val(); - - if (isSubProfileNew) { - - currentProfile.XmlRootAttributes.push(currentSubProfile); - } - - renderXmlDocumentAttributes(page, currentProfile.XmlRootAttributes); - - currentSubProfile = null; - - $('#xmlAttributePopup', page).popup('close'); - } - - function renderSubtitleProfiles(page, profiles) { - - var index = 0; - - var html = ''; - - var elem = $('.subtitleProfileList', page).html(html).trigger('create'); - - $('.btnDeleteProfile', elem).on('click', function () { - - var itemIndex = parseInt(this.getAttribute('data-index')); - - currentProfile.SubtitleProfiles.splice(itemIndex, 1); - - renderSubtitleProfiles(page, currentProfile.SubtitleProfiles); - }); - - $('.lnkEditSubProfile', elem).on('click', function () { - - var itemIndex = parseInt(this.getAttribute('data-index')); - - editSubtitleProfile(page, currentProfile.SubtitleProfiles[itemIndex]); - }); - } - - function editSubtitleProfile(page, profile) { - - isSubProfileNew = profile == null; - profile = profile || {}; - currentSubProfile = profile; - - var popup = $('#subtitleProfilePopup', page); - - $('#txtSubtitleProfileFormat', popup).val(profile.Format || ''); - $('#selectSubtitleProfileMethod', popup).val(profile.Method || ''); - $('#selectSubtitleProfileDidlMode', popup).val(profile.DidlMode || ''); - - popup.popup('open'); - } - - function saveSubtitleProfile(page) { - - currentSubProfile.Format = $('#txtSubtitleProfileFormat', page).val(); - currentSubProfile.Method = $('#selectSubtitleProfileMethod', page).val(); - currentSubProfile.DidlMode = $('#selectSubtitleProfileDidlMode', page).val(); - - if (isSubProfileNew) { - - currentProfile.SubtitleProfiles.push(currentSubProfile); - } - - renderSubtitleProfiles(page, currentProfile.SubtitleProfiles); - - currentSubProfile = null; - - $('#subtitleProfilePopup', page).popup('close'); - } - - function renderSubProfiles(page, profile) { - - renderDirectPlayProfiles(page, profile.DirectPlayProfiles); - renderTranscodingProfiles(page, profile.TranscodingProfiles); - renderContainerProfiles(page, profile.ContainerProfiles); - renderCodecProfiles(page, profile.CodecProfiles); - renderResponseProfiles(page, profile.ResponseProfiles); - } - - function saveDirectPlayProfile(page) { - - currentSubProfile.Type = $('#selectDirectPlayProfileType', page).val(); - currentSubProfile.Container = $('#txtDirectPlayContainer', page).val(); - currentSubProfile.AudioCodec = $('#txtDirectPlayAudioCodec', page).val(); - currentSubProfile.VideoCodec = $('#txtDirectPlayVideoCodec', page).val(); - - if (isSubProfileNew) { - - currentProfile.DirectPlayProfiles.push(currentSubProfile); - } - - renderSubProfiles(page, currentProfile); - - currentSubProfile = null; - - $('#popupEditDirectPlayProfile', page).popup('close'); - } - - function renderDirectPlayProfiles(page, profiles) { - - var html = ''; - - html += ''; - - var elem = $('.directPlayProfiles', page).html(html).trigger('create'); - - $('.btnDeleteProfile', elem).on('click', function () { - - var index = this.getAttribute('data-profileindex'); - deleteDirectPlayProfile(page, index); - }); - - $('.lnkEditSubProfile', elem).on('click', function () { - - var index = parseInt(this.getAttribute('data-profileindex')); - - editDirectPlayProfile(page, currentProfile.DirectPlayProfiles[index]); - }); - } - - function deleteDirectPlayProfile(page, index) { - - currentProfile.DirectPlayProfiles.splice(index, 1); - - renderDirectPlayProfiles(page, currentProfile.DirectPlayProfiles); - - } - - function editDirectPlayProfile(page, directPlayProfile) { - - isSubProfileNew = directPlayProfile == null; - directPlayProfile = directPlayProfile || {}; - currentSubProfile = directPlayProfile; - - var popup = $('#popupEditDirectPlayProfile', page); - - $('#selectDirectPlayProfileType', popup).val(directPlayProfile.Type || 'Video').trigger('change'); - $('#txtDirectPlayContainer', popup).val(directPlayProfile.Container || ''); - $('#txtDirectPlayAudioCodec', popup).val(directPlayProfile.AudioCodec || ''); - $('#txtDirectPlayVideoCodec', popup).val(directPlayProfile.VideoCodec || ''); - - popup.popup('open'); - } - - function renderTranscodingProfiles(page, profiles) { - - var html = ''; - - html += ''; - - var elem = $('.transcodingProfiles', page).html(html).trigger('create'); - - $('.btnDeleteProfile', elem).on('click', function () { - - var index = this.getAttribute('data-profileindex'); - deleteTranscodingProfile(page, index); - }); - - $('.lnkEditSubProfile', elem).on('click', function () { - - var index = parseInt(this.getAttribute('data-profileindex')); - - editTranscodingProfile(page, currentProfile.TranscodingProfiles[index]); - }); - } - - function editTranscodingProfile(page, transcodingProfile) { - - isSubProfileNew = transcodingProfile == null; - transcodingProfile = transcodingProfile || {}; - currentSubProfile = transcodingProfile; - - var popup = $('#transcodingProfilePopup', page); - - $('#selectTranscodingProfileType', popup).val(transcodingProfile.Type || 'Video').trigger('change'); - $('#txtTranscodingContainer', popup).val(transcodingProfile.Container || ''); - $('#txtTranscodingAudioCodec', popup).val(transcodingProfile.AudioCodec || ''); - $('#txtTranscodingVideoCodec', popup).val(transcodingProfile.VideoCodec || ''); - $('#selectTranscodingProtocol', popup).val(transcodingProfile.Protocol || 'Http'); - - $('#chkEnableMpegtsM2TsMode', popup).checked(transcodingProfile.EnableMpegtsM2TsMode || false); - $('#chkEstimateContentLength', popup).checked(transcodingProfile.EstimateContentLength || false); - $('#chkReportByteRangeRequests', popup).checked(transcodingProfile.TranscodeSeekInfo == 'Bytes'); - - $('.radioTabButton:first', popup).trigger('click'); - - popup.popup('open'); - } - - function deleteTranscodingProfile(page, index) { - - currentProfile.TranscodingProfiles.splice(index, 1); - - renderTranscodingProfiles(page, currentProfile.TranscodingProfiles); - - } - - function saveTranscodingProfile(page) { - - currentSubProfile.Type = $('#selectTranscodingProfileType', page).val(); - currentSubProfile.Container = $('#txtTranscodingContainer', page).val(); - currentSubProfile.AudioCodec = $('#txtTranscodingAudioCodec', page).val(); - currentSubProfile.VideoCodec = $('#txtTranscodingVideoCodec', page).val(); - currentSubProfile.Protocol = $('#selectTranscodingProtocol', page).val(); - currentSubProfile.Context = 'Streaming'; - - currentSubProfile.EnableMpegtsM2TsMode = $('#chkEnableMpegtsM2TsMode', page).checked(); - currentSubProfile.EstimateContentLength = $('#chkEstimateContentLength', page).checked(); - currentSubProfile.TranscodeSeekInfo = $('#chkReportByteRangeRequests', page).checked() ? 'Bytes' : 'Auto'; - - if (isSubProfileNew) { - - currentProfile.TranscodingProfiles.push(currentSubProfile); - } - - renderSubProfiles(page, currentProfile); - - currentSubProfile = null; - - $('#transcodingProfilePopup', page).popup('close'); - } - - function renderContainerProfiles(page, profiles) { - - var html = ''; - - html += ''; - - var elem = $('.containerProfiles', page).html(html).trigger('create'); - - $('.btnDeleteProfile', elem).on('click', function () { - - var index = this.getAttribute('data-profileindex'); - deleteContainerProfile(page, index); - }); - - $('.lnkEditSubProfile', elem).on('click', function () { - - var index = parseInt(this.getAttribute('data-profileindex')); - - editContainerProfile(page, currentProfile.ContainerProfiles[index]); - }); - } - - function deleteContainerProfile(page, index) { - - currentProfile.ContainerProfiles.splice(index, 1); - - renderContainerProfiles(page, currentProfile.ContainerProfiles); - - } - - function editContainerProfile(page, containerProfile) { - - isSubProfileNew = containerProfile == null; - containerProfile = containerProfile || {}; - currentSubProfile = containerProfile; - - var popup = $('#containerProfilePopup', page); - - $('#selectContainerProfileType', popup).val(containerProfile.Type || 'Video').trigger('change'); - $('#txtContainerProfileContainer', popup).val(containerProfile.Container || ''); - - $('.radioTabButton:first', popup).trigger('click'); - - popup.popup('open'); - } - - function saveContainerProfile(page) { - - currentSubProfile.Type = $('#selectContainerProfileType', page).val(); - currentSubProfile.Container = $('#txtContainerProfileContainer', page).val(); - - if (isSubProfileNew) { - - currentProfile.ContainerProfiles.push(currentSubProfile); - } - - renderSubProfiles(page, currentProfile); - - currentSubProfile = null; - - $('#containerProfilePopup', page).popup('close'); - } - - function renderCodecProfiles(page, profiles) { - - var html = ''; - - html += ''; - - var elem = $('.codecProfiles', page).html(html).trigger('create'); - - $('.btnDeleteProfile', elem).on('click', function () { - - var index = this.getAttribute('data-profileindex'); - deleteCodecProfile(page, index); - }); - - $('.lnkEditSubProfile', elem).on('click', function () { - - var index = parseInt(this.getAttribute('data-profileindex')); - - editCodecProfile(page, currentProfile.CodecProfiles[index]); - }); - } - - function deleteCodecProfile(page, index) { - - currentProfile.CodecProfiles.splice(index, 1); - - renderCodecProfiles(page, currentProfile.CodecProfiles); - - } - - function editCodecProfile(page, codecProfile) { - - isSubProfileNew = codecProfile == null; - codecProfile = codecProfile || {}; - currentSubProfile = codecProfile; - - var popup = $('#codecProfilePopup', page); - - $('#selectCodecProfileType', popup).val(codecProfile.Type || 'Video').trigger('change'); - $('#txtCodecProfileCodec', popup).val(codecProfile.Codec || ''); - - $('.radioTabButton:first', popup).trigger('click'); - - popup.popup('open'); - } - - function saveCodecProfile(page) { - - currentSubProfile.Type = $('#selectCodecProfileType', page).val(); - currentSubProfile.Codec = $('#txtCodecProfileCodec', page).val(); - - if (isSubProfileNew) { - - currentProfile.CodecProfiles.push(currentSubProfile); - } - - renderSubProfiles(page, currentProfile); - - currentSubProfile = null; - - $('#codecProfilePopup', page).popup('close'); - } - - function renderResponseProfiles(page, profiles) { - - var html = ''; - - html += ''; - - var elem = $('.mediaProfiles', page).html(html).trigger('create'); - - $('.btnDeleteProfile', elem).on('click', function () { - - var index = this.getAttribute('data-profileindex'); - deleteResponseProfile(page, index); - }); - - $('.lnkEditSubProfile', elem).on('click', function () { - - var index = parseInt(this.getAttribute('data-profileindex')); - - editResponseProfile(page, currentProfile.ResponseProfiles[index]); - }); - } - - function deleteResponseProfile(page, index) { - - currentProfile.ResponseProfiles.splice(index, 1); - - renderResponseProfiles(page, currentProfile.ResponseProfiles); - } - - function editResponseProfile(page, responseProfile) { - - isSubProfileNew = responseProfile == null; - responseProfile = responseProfile || {}; - currentSubProfile = responseProfile; - - var popup = $('#responseProfilePopup', page); - - $('#selectResponseProfileType', popup).val(responseProfile.Type || 'Video').trigger('change'); - $('#txtResponseProfileContainer', popup).val(responseProfile.Container || ''); - $('#txtResponseProfileAudioCodec', popup).val(responseProfile.AudioCodec || ''); - $('#txtResponseProfileVideoCodec', popup).val(responseProfile.VideoCodec || ''); - - $('.radioTabButton:first', popup).trigger('click'); - - popup.popup('open'); - } - - function saveResponseProfile(page) { - - currentSubProfile.Type = $('#selectResponseProfileType', page).val(); - currentSubProfile.Container = $('#txtResponseProfileContainer', page).val(); - currentSubProfile.AudioCodec = $('#txtResponseProfileAudioCodec', page).val(); - currentSubProfile.VideoCodec = $('#txtResponseProfileVideoCodec', page).val(); - - if (isSubProfileNew) { - - currentProfile.ResponseProfiles.push(currentSubProfile); - } - - renderSubProfiles(page, currentProfile); - - currentSubProfile = null; - - $('#responseProfilePopup', page).popup('close'); - } - - function saveProfile(page, profile) { - - updateProfile(page, profile); - - var id = getParameterByName('id'); - - if (id) { - - ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("Dlna/Profiles/" + id), - data: JSON.stringify(profile), - contentType: "application/json" - }).then(function () { - - require(['toast'], function (toast) { - toast('Settings saved.'); - }); - }, Dashboard.processErrorResponse); - - } else { - - ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("Dlna/Profiles"), - data: JSON.stringify(profile), - contentType: "application/json" - }).then(function () { - - Dashboard.navigate('dlnaprofiles.html'); - - }, Dashboard.processErrorResponse); - - } - - Dashboard.hideLoadingMsg(); - } - - function updateProfile(page, profile) { - - profile.Name = $('#txtName', page).val(); - profile.EnableAlbumArtInDidl = $('#chkEnableAlbumArtInDidl', page).checked(); - profile.EnableSingleAlbumArtLimit = $('#chkEnableSingleImageLimit', page).checked(); - - profile.SupportedMediaTypes = $('.chkMediaType:checked', page).get().map(function (c) { - return c.getAttribute('data-value'); - }).join(','); - - profile.Identification = profile.Identification || {}; - - profile.FriendlyName = $('#txtInfoFriendlyName', page).val(); - profile.ModelName = $('#txtInfoModelName', page).val(); - profile.ModelNumber = $('#txtInfoModelNumber', page).val(); - profile.ModelDescription = $('#txtInfoModelDescription', page).val(); - profile.ModelUrl = $('#txtInfoModelUrl', page).val(); - profile.Manufacturer = $('#txtInfoManufacturer', page).val(); - profile.ManufacturerUrl = $('#txtInfoManufacturerUrl', page).val(); - profile.SerialNumber = $('#txtInfoSerialNumber', page).val(); - - profile.Identification.FriendlyName = $('#txtIdFriendlyName', page).val(); - profile.Identification.ModelName = $('#txtIdModelName', page).val(); - profile.Identification.ModelNumber = $('#txtIdModelNumber', page).val(); - profile.Identification.ModelDescription = $('#txtIdModelDescription', page).val(); - profile.Identification.ModelUrl = $('#txtIdModelUrl', page).val(); - profile.Identification.Manufacturer = $('#txtIdManufacturer', page).val(); - profile.Identification.ManufacturerUrl = $('#txtIdManufacturerUrl', page).val(); - profile.Identification.SerialNumber = $('#txtIdSerialNumber', page).val(); - profile.Identification.DeviceDescription = $('#txtIdDeviceDescription', page).val(); - - profile.AlbumArtPn = $('#txtAlbumArtPn', page).val(); - profile.MaxAlbumArtWidth = $('#txtAlbumArtMaxWidth', page).val(); - profile.MaxAlbumArtHeight = $('#txtAlbumArtMaxHeight', page).val(); - profile.MaxIconWidth = $('#txtIconMaxWidth', page).val(); - profile.MaxIconHeight = $('#txtIconMaxHeight', page).val(); - - profile.RequiresPlainFolders = $('#chkRequiresPlainFolders', page).checked(); - profile.RequiresPlainVideoItems = $('#chkRequiresPlainVideoItems', page).checked(); - - profile.IgnoreTranscodeByteRangeRequests = $('#chkIgnoreTranscodeByteRangeRequests', page).checked(); - profile.MaxStreamingBitrate = $('#txtMaxAllowedBitrate', page).val(); - - profile.MusicStreamingTranscodingBitrate = $('#txtMusicStreamingTranscodingBitrate', page).val(); - - profile.ProtocolInfo = $('#txtProtocolInfo', page).val(); - profile.XDlnaCap = $('#txtXDlnaCap', page).val(); - profile.XDlnaDoc = $('#txtXDlnaDoc', page).val(); - profile.SonyAggregationFlags = $('#txtSonyAggregationFlags', page).val(); - - profile.UserId = $('#selectUser', page).val(); - } - - $(document).on('pageinit', "#dlnaProfilePage", function () { - - var page = this; - - $('.radioTabButton', page).on('click', function () { - - $(this).siblings().removeClass('ui-btn-active'); - $(this).addClass('ui-btn-active'); - - var value = this.tagName == 'A' ? this.getAttribute('data-value') : this.value; - var elem = $('.' + value, page); - elem.siblings('.tabContent').hide(); - - elem.show(); - }); - - $('#selectDirectPlayProfileType', page).on('change', function () { - - if (this.value == 'Video') { - $('#fldDirectPlayVideoCodec', page).show(); - } else { - $('#fldDirectPlayVideoCodec', page).hide(); - } - - if (this.value == 'Photo') { - $('#fldDirectPlayAudioCodec', page).hide(); - } else { - $('#fldDirectPlayAudioCodec', page).show(); - } - - }); - - $('#selectTranscodingProfileType', page).on('change', function () { - - if (this.value == 'Video') { - $('#fldTranscodingVideoCodec', page).show(); - $('#fldTranscodingProtocol', page).show(); - $('#fldEnableMpegtsM2TsMode', page).show(); - } else { - $('#fldTranscodingVideoCodec', page).hide(); - $('#fldTranscodingProtocol', page).hide(); - $('#fldEnableMpegtsM2TsMode', page).hide(); - } - - if (this.value == 'Photo') { - $('#fldTranscodingAudioCodec', page).hide(); - - $('#fldEstimateContentLength', page).hide(); - $('#fldReportByteRangeRequests', page).hide(); - - } else { - $('#fldTranscodingAudioCodec', page).show(); - - $('#fldEstimateContentLength', page).show(); - $('#fldReportByteRangeRequests', page).show(); - } - - }); - - $('#selectResponseProfileType', page).on('change', function () { - - if (this.value == 'Video') { - $('#fldResponseProfileVideoCodec', page).show(); - } else { - $('#fldResponseProfileVideoCodec', page).hide(); - } - - if (this.value == 'Photo') { - $('#fldResponseProfileAudioCodec', page).hide(); - } else { - $('#fldResponseProfileAudioCodec', page).show(); - } - - }); - - $('.btnAddDirectPlayProfile', page).on('click', function () { - - editDirectPlayProfile(page); - - }); - - $('.btnAddTranscodingProfile', page).on('click', function () { - - editTranscodingProfile(page); - - }); - - $('.btnAddContainerProfile', page).on('click', function () { - - editContainerProfile(page); - - }); - - $('.btnAddCodecProfile', page).on('click', function () { - - editCodecProfile(page); - - }); - - $('.btnAddResponseProfile', page).on('click', function () { - - editResponseProfile(page); - - }); - - $('.btnAddIdentificationHttpHeader', page).on('click', function () { - - editIdentificationHeader(page); - }); - - $('.btnAddXmlDocumentAttribute', page).on('click', function () { - - editXmlDocumentAttribute(page); - }); - - $('.btnAddSubtitleProfile', page).on('click', function () { - - editSubtitleProfile(page); - }); - - $('.dlnaProfileForm').off('submit', DlnaProfilePage.onSubmit).on('submit', DlnaProfilePage.onSubmit); - $('.editDirectPlayProfileForm').off('submit', DlnaProfilePage.onDirectPlayFormSubmit).on('submit', DlnaProfilePage.onDirectPlayFormSubmit); - $('.transcodingProfileForm').off('submit', DlnaProfilePage.onTranscodingProfileFormSubmit).on('submit', DlnaProfilePage.onTranscodingProfileFormSubmit); - $('.containerProfileForm').off('submit', DlnaProfilePage.onContainerProfileFormSubmit).on('submit', DlnaProfilePage.onContainerProfileFormSubmit); - $('.codecProfileForm').off('submit', DlnaProfilePage.onCodecProfileFormSubmit).on('submit', DlnaProfilePage.onCodecProfileFormSubmit); - $('.editResponseProfileForm').off('submit', DlnaProfilePage.onResponseProfileFormSubmit).on('submit', DlnaProfilePage.onResponseProfileFormSubmit); - $('.identificationHeaderForm').off('submit', DlnaProfilePage.onIdentificationHeaderFormSubmit).on('submit', DlnaProfilePage.onIdentificationHeaderFormSubmit); - $('.xmlAttributeForm').off('submit', DlnaProfilePage.onXmlAttributeFormSubmit).on('submit', DlnaProfilePage.onXmlAttributeFormSubmit); - $('.subtitleProfileForm').off('submit', DlnaProfilePage.onSubtitleProfileFormSubmit).on('submit', DlnaProfilePage.onSubtitleProfileFormSubmit); - - }).on('pageshow', "#dlnaProfilePage", function () { - - var page = this; - - $('#radioInfo', page).trigger('click'); - - loadProfile(page); - }); - - window.DlnaProfilePage = { - onSubmit: function () { - - Dashboard.showLoadingMsg(); - - var form = this; - var page = $(form).parents('.page'); - - saveProfile(page, currentProfile); - - return false; - }, - - onDirectPlayFormSubmit: function () { - - var form = this; - var page = $(form).parents('.page'); - - saveDirectPlayProfile(page); - - return false; - }, - - onTranscodingProfileFormSubmit: function () { - - var form = this; - var page = $(form).parents('.page'); - - saveTranscodingProfile(page); - - return false; - - }, - - onContainerProfileFormSubmit: function () { - var form = this; - var page = $(form).parents('.page'); - - saveContainerProfile(page); - - return false; - - }, - - onCodecProfileFormSubmit: function () { - var form = this; - var page = $(form).parents('.page'); - - saveCodecProfile(page); - - return false; - }, - - onResponseProfileFormSubmit: function () { - var form = this; - var page = $(form).parents('.page'); - - saveResponseProfile(page); - - return false; - }, - - onIdentificationHeaderFormSubmit: function () { - - var form = this; - var page = $(form).parents('.page'); - - saveIdentificationHeader(page); - - return false; - }, - - onXmlAttributeFormSubmit: function () { - - var form = this; - var page = $(form).parents('.page'); - - saveXmlDocumentAttribute(page); - - return false; - }, - - onSubtitleProfileFormSubmit: function () { - - var form = this; - var page = $(form).parents('.page'); - - saveSubtitleProfile(page); - - return false; - } - }; - -}); \ No newline at end of file +define(["jQuery","fnchecked","jqmlistview","emby-select","emby-button","emby-input","emby-checkbox","listViewStyle"],function($){"use strict";function loadProfile(page){Dashboard.showLoadingMsg();var promise1=getProfile(),promise2=ApiClient.getUsers();Promise.all([promise1,promise2]).then(function(responses){currentProfile=responses[0],renderProfile(page,currentProfile,responses[1]),Dashboard.hideLoadingMsg()})}function getProfile(){var id=getParameterByName("id"),url=id?"Dlna/Profiles/"+id:"Dlna/Profiles/Default";return ApiClient.getJSON(ApiClient.getUrl(url))}function renderProfile(page,profile,users){$("#txtName",page).val(profile.Name),$(".chkMediaType",page).each(function(){this.checked=(profile.SupportedMediaTypes||"").split(",").indexOf(this.getAttribute("data-value"))!=-1}),$("#chkEnableAlbumArtInDidl",page).checked(profile.EnableAlbumArtInDidl),$("#chkEnableSingleImageLimit",page).checked(profile.EnableSingleAlbumArtLimit),renderXmlDocumentAttributes(page,profile.XmlRootAttributes||[]);var idInfo=profile.Identification||{};renderIdentificationHeaders(page,idInfo.Headers||[]),renderSubtitleProfiles(page,profile.SubtitleProfiles||[]),$("#txtInfoFriendlyName",page).val(profile.FriendlyName||""),$("#txtInfoModelName",page).val(profile.ModelName||""),$("#txtInfoModelNumber",page).val(profile.ModelNumber||""),$("#txtInfoModelDescription",page).val(profile.ModelDescription||""),$("#txtInfoModelUrl",page).val(profile.ModelUrl||""),$("#txtInfoManufacturer",page).val(profile.Manufacturer||""),$("#txtInfoManufacturerUrl",page).val(profile.ManufacturerUrl||""),$("#txtInfoSerialNumber",page).val(profile.SerialNumber||""),$("#txtIdFriendlyName",page).val(idInfo.FriendlyName||""),$("#txtIdModelName",page).val(idInfo.ModelName||""),$("#txtIdModelNumber",page).val(idInfo.ModelNumber||""),$("#txtIdModelDescription",page).val(idInfo.ModelDescription||""),$("#txtIdModelUrl",page).val(idInfo.ModelUrl||""),$("#txtIdManufacturer",page).val(idInfo.Manufacturer||""),$("#txtIdManufacturerUrl",page).val(idInfo.ManufacturerUrl||""),$("#txtIdSerialNumber",page).val(idInfo.SerialNumber||""),$("#txtIdDeviceDescription",page).val(idInfo.DeviceDescription||""),$("#txtAlbumArtPn",page).val(profile.AlbumArtPn||""),$("#txtAlbumArtMaxWidth",page).val(profile.MaxAlbumArtWidth||""),$("#txtAlbumArtMaxHeight",page).val(profile.MaxAlbumArtHeight||""),$("#txtIconMaxWidth",page).val(profile.MaxIconWidth||""),$("#txtIconMaxHeight",page).val(profile.MaxIconHeight||""),$("#chkIgnoreTranscodeByteRangeRequests",page).checked(profile.IgnoreTranscodeByteRangeRequests),$("#txtMaxAllowedBitrate",page).val(profile.MaxStreamingBitrate||""),$("#txtMusicStreamingTranscodingBitrate",page).val(profile.MusicStreamingTranscodingBitrate||""),$("#chkRequiresPlainFolders",page).checked(profile.RequiresPlainFolders),$("#chkRequiresPlainVideoItems",page).checked(profile.RequiresPlainVideoItems),$("#txtProtocolInfo",page).val(profile.ProtocolInfo||""),$("#txtXDlnaCap",page).val(profile.XDlnaCap||""),$("#txtXDlnaDoc",page).val(profile.XDlnaDoc||""),$("#txtSonyAggregationFlags",page).val(profile.SonyAggregationFlags||""),profile.DirectPlayProfiles=profile.DirectPlayProfiles||[],profile.TranscodingProfiles=profile.TranscodingProfiles||[],profile.ContainerProfiles=profile.ContainerProfiles||[],profile.CodecProfiles=profile.CodecProfiles||[],profile.ResponseProfiles=profile.ResponseProfiles||[];var usersHtml=""+users.map(function(u){return'"}).join("");$("#selectUser",page).html(usersHtml).val(profile.UserId||""),renderSubProfiles(page,profile)}function renderIdentificationHeaders(page,headers){var index=0,html='
'+headers.map(function(h){var li='
';return li+='info',li+='
',li+='

'+h.Name+": "+(h.Value||"")+"

",li+='
'+(h.Match||"")+"
",li+="
",li+='',li+="
",index++,li}).join("")+"
",elem=$(".httpHeaderIdentificationList",page).html(html).trigger("create");$(".btnDeleteIdentificationHeader",elem).on("click",function(){var itemIndex=parseInt(this.getAttribute("data-index"));currentProfile.Identification.Headers.splice(itemIndex,1),renderIdentificationHeaders(page,currentProfile.Identification.Headers)})}function editIdentificationHeader(page,header){isSubProfileNew=null==header,header=header||{},currentSubProfile=header;var popup=$("#identificationHeaderPopup",page);$("#txtIdentificationHeaderName",popup).val(header.Name||""),$("#txtIdentificationHeaderValue",popup).val(header.Value||""),$("#selectMatchType",popup).val(header.Match||"Equals"),popup.popup("open")}function saveIdentificationHeader(page){currentSubProfile.Name=$("#txtIdentificationHeaderName",page).val(),currentSubProfile.Value=$("#txtIdentificationHeaderValue",page).val(),currentSubProfile.Match=$("#selectMatchType",page).val(),isSubProfileNew&&(currentProfile.Identification=currentProfile.Identification||{},currentProfile.Identification.Headers=currentProfile.Identification.Headers||[],currentProfile.Identification.Headers.push(currentSubProfile)),renderIdentificationHeaders(page,currentProfile.Identification.Headers),currentSubProfile=null,$("#identificationHeaderPopup",page).popup("close")}function renderXmlDocumentAttributes(page,attribute){var index=0,html='
'+attribute.map(function(h){var li='
';return li+='info',li+='
',li+='

'+h.Name+" = "+(h.Value||"")+"

",li+="
",li+='',li+="
"}).join("")+"
",elem=$(".xmlDocumentAttributeList",page).html(html).trigger("create");$(".btnDeleteXmlAttribute",elem).on("click",function(){var itemIndex=parseInt(this.getAttribute("data-index"));currentProfile.XmlRootAttributes.splice(itemIndex,1),renderXmlDocumentAttributes(page,currentProfile.XmlRootAttributes)})}function editXmlDocumentAttribute(page,attribute){isSubProfileNew=null==attribute,attribute=attribute||{},currentSubProfile=attribute;var popup=$("#xmlAttributePopup",page);$("#txtXmlAttributeName",popup).val(attribute.Name||""),$("#txtXmlAttributeValue",popup).val(attribute.Value||""),popup.popup("open")}function saveXmlDocumentAttribute(page){currentSubProfile.Name=$("#txtXmlAttributeName",page).val(),currentSubProfile.Value=$("#txtXmlAttributeValue",page).val(),isSubProfileNew&¤tProfile.XmlRootAttributes.push(currentSubProfile),renderXmlDocumentAttributes(page,currentProfile.XmlRootAttributes),currentSubProfile=null,$("#xmlAttributePopup",page).popup("close")}function renderSubtitleProfiles(page,profiles){var index=0,html='",elem=$(".subtitleProfileList",page).html(html).trigger("create");$(".btnDeleteProfile",elem).on("click",function(){var itemIndex=parseInt(this.getAttribute("data-index"));currentProfile.SubtitleProfiles.splice(itemIndex,1),renderSubtitleProfiles(page,currentProfile.SubtitleProfiles)}),$(".lnkEditSubProfile",elem).on("click",function(){var itemIndex=parseInt(this.getAttribute("data-index"));editSubtitleProfile(page,currentProfile.SubtitleProfiles[itemIndex])})}function editSubtitleProfile(page,profile){isSubProfileNew=null==profile,profile=profile||{},currentSubProfile=profile;var popup=$("#subtitleProfilePopup",page);$("#txtSubtitleProfileFormat",popup).val(profile.Format||""),$("#selectSubtitleProfileMethod",popup).val(profile.Method||""),$("#selectSubtitleProfileDidlMode",popup).val(profile.DidlMode||""),popup.popup("open")}function saveSubtitleProfile(page){currentSubProfile.Format=$("#txtSubtitleProfileFormat",page).val(),currentSubProfile.Method=$("#selectSubtitleProfileMethod",page).val(),currentSubProfile.DidlMode=$("#selectSubtitleProfileDidlMode",page).val(),isSubProfileNew&¤tProfile.SubtitleProfiles.push(currentSubProfile),renderSubtitleProfiles(page,currentProfile.SubtitleProfiles),currentSubProfile=null,$("#subtitleProfilePopup",page).popup("close")}function renderSubProfiles(page,profile){renderDirectPlayProfiles(page,profile.DirectPlayProfiles),renderTranscodingProfiles(page,profile.TranscodingProfiles),renderContainerProfiles(page,profile.ContainerProfiles),renderCodecProfiles(page,profile.CodecProfiles),renderResponseProfiles(page,profile.ResponseProfiles)}function saveDirectPlayProfile(page){currentSubProfile.Type=$("#selectDirectPlayProfileType",page).val(),currentSubProfile.Container=$("#txtDirectPlayContainer",page).val(),currentSubProfile.AudioCodec=$("#txtDirectPlayAudioCodec",page).val(),currentSubProfile.VideoCodec=$("#txtDirectPlayVideoCodec",page).val(),isSubProfileNew&¤tProfile.DirectPlayProfiles.push(currentSubProfile),renderSubProfiles(page,currentProfile),currentSubProfile=null,$("#popupEditDirectPlayProfile",page).popup("close")}function renderDirectPlayProfiles(page,profiles){var html="";html+='";var elem=$(".directPlayProfiles",page).html(html).trigger("create");$(".btnDeleteProfile",elem).on("click",function(){var index=this.getAttribute("data-profileindex");deleteDirectPlayProfile(page,index)}),$(".lnkEditSubProfile",elem).on("click",function(){var index=parseInt(this.getAttribute("data-profileindex"));editDirectPlayProfile(page,currentProfile.DirectPlayProfiles[index])})}function deleteDirectPlayProfile(page,index){currentProfile.DirectPlayProfiles.splice(index,1),renderDirectPlayProfiles(page,currentProfile.DirectPlayProfiles)}function editDirectPlayProfile(page,directPlayProfile){isSubProfileNew=null==directPlayProfile,directPlayProfile=directPlayProfile||{},currentSubProfile=directPlayProfile;var popup=$("#popupEditDirectPlayProfile",page);$("#selectDirectPlayProfileType",popup).val(directPlayProfile.Type||"Video").trigger("change"),$("#txtDirectPlayContainer",popup).val(directPlayProfile.Container||""),$("#txtDirectPlayAudioCodec",popup).val(directPlayProfile.AudioCodec||""),$("#txtDirectPlayVideoCodec",popup).val(directPlayProfile.VideoCodec||""),popup.popup("open")}function renderTranscodingProfiles(page,profiles){var html="";html+='";var elem=$(".transcodingProfiles",page).html(html).trigger("create");$(".btnDeleteProfile",elem).on("click",function(){var index=this.getAttribute("data-profileindex");deleteTranscodingProfile(page,index)}),$(".lnkEditSubProfile",elem).on("click",function(){var index=parseInt(this.getAttribute("data-profileindex"));editTranscodingProfile(page,currentProfile.TranscodingProfiles[index])})}function editTranscodingProfile(page,transcodingProfile){isSubProfileNew=null==transcodingProfile,transcodingProfile=transcodingProfile||{},currentSubProfile=transcodingProfile;var popup=$("#transcodingProfilePopup",page);$("#selectTranscodingProfileType",popup).val(transcodingProfile.Type||"Video").trigger("change"),$("#txtTranscodingContainer",popup).val(transcodingProfile.Container||""),$("#txtTranscodingAudioCodec",popup).val(transcodingProfile.AudioCodec||""),$("#txtTranscodingVideoCodec",popup).val(transcodingProfile.VideoCodec||""),$("#selectTranscodingProtocol",popup).val(transcodingProfile.Protocol||"Http"),$("#chkEnableMpegtsM2TsMode",popup).checked(transcodingProfile.EnableMpegtsM2TsMode||!1),$("#chkEstimateContentLength",popup).checked(transcodingProfile.EstimateContentLength||!1),$("#chkReportByteRangeRequests",popup).checked("Bytes"==transcodingProfile.TranscodeSeekInfo),$(".radioTabButton:first",popup).trigger("click"),popup.popup("open")}function deleteTranscodingProfile(page,index){currentProfile.TranscodingProfiles.splice(index,1),renderTranscodingProfiles(page,currentProfile.TranscodingProfiles)}function saveTranscodingProfile(page){currentSubProfile.Type=$("#selectTranscodingProfileType",page).val(),currentSubProfile.Container=$("#txtTranscodingContainer",page).val(),currentSubProfile.AudioCodec=$("#txtTranscodingAudioCodec",page).val(),currentSubProfile.VideoCodec=$("#txtTranscodingVideoCodec",page).val(),currentSubProfile.Protocol=$("#selectTranscodingProtocol",page).val(),currentSubProfile.Context="Streaming",currentSubProfile.EnableMpegtsM2TsMode=$("#chkEnableMpegtsM2TsMode",page).checked(),currentSubProfile.EstimateContentLength=$("#chkEstimateContentLength",page).checked(),currentSubProfile.TranscodeSeekInfo=$("#chkReportByteRangeRequests",page).checked()?"Bytes":"Auto",isSubProfileNew&¤tProfile.TranscodingProfiles.push(currentSubProfile),renderSubProfiles(page,currentProfile),currentSubProfile=null,$("#transcodingProfilePopup",page).popup("close")}function renderContainerProfiles(page,profiles){var html="";html+='";var elem=$(".containerProfiles",page).html(html).trigger("create");$(".btnDeleteProfile",elem).on("click",function(){var index=this.getAttribute("data-profileindex");deleteContainerProfile(page,index)}),$(".lnkEditSubProfile",elem).on("click",function(){var index=parseInt(this.getAttribute("data-profileindex"));editContainerProfile(page,currentProfile.ContainerProfiles[index])})}function deleteContainerProfile(page,index){currentProfile.ContainerProfiles.splice(index,1),renderContainerProfiles(page,currentProfile.ContainerProfiles)}function editContainerProfile(page,containerProfile){isSubProfileNew=null==containerProfile,containerProfile=containerProfile||{},currentSubProfile=containerProfile;var popup=$("#containerProfilePopup",page);$("#selectContainerProfileType",popup).val(containerProfile.Type||"Video").trigger("change"),$("#txtContainerProfileContainer",popup).val(containerProfile.Container||""),$(".radioTabButton:first",popup).trigger("click"),popup.popup("open")}function saveContainerProfile(page){currentSubProfile.Type=$("#selectContainerProfileType",page).val(),currentSubProfile.Container=$("#txtContainerProfileContainer",page).val(),isSubProfileNew&¤tProfile.ContainerProfiles.push(currentSubProfile),renderSubProfiles(page,currentProfile),currentSubProfile=null,$("#containerProfilePopup",page).popup("close")}function renderCodecProfiles(page,profiles){var html="";html+='";var elem=$(".codecProfiles",page).html(html).trigger("create");$(".btnDeleteProfile",elem).on("click",function(){var index=this.getAttribute("data-profileindex");deleteCodecProfile(page,index)}),$(".lnkEditSubProfile",elem).on("click",function(){var index=parseInt(this.getAttribute("data-profileindex"));editCodecProfile(page,currentProfile.CodecProfiles[index])})}function deleteCodecProfile(page,index){currentProfile.CodecProfiles.splice(index,1),renderCodecProfiles(page,currentProfile.CodecProfiles)}function editCodecProfile(page,codecProfile){isSubProfileNew=null==codecProfile,codecProfile=codecProfile||{},currentSubProfile=codecProfile;var popup=$("#codecProfilePopup",page);$("#selectCodecProfileType",popup).val(codecProfile.Type||"Video").trigger("change"),$("#txtCodecProfileCodec",popup).val(codecProfile.Codec||""),$(".radioTabButton:first",popup).trigger("click"),popup.popup("open")}function saveCodecProfile(page){currentSubProfile.Type=$("#selectCodecProfileType",page).val(),currentSubProfile.Codec=$("#txtCodecProfileCodec",page).val(),isSubProfileNew&¤tProfile.CodecProfiles.push(currentSubProfile),renderSubProfiles(page,currentProfile),currentSubProfile=null,$("#codecProfilePopup",page).popup("close")}function renderResponseProfiles(page,profiles){var html="";html+='";var elem=$(".mediaProfiles",page).html(html).trigger("create");$(".btnDeleteProfile",elem).on("click",function(){var index=this.getAttribute("data-profileindex");deleteResponseProfile(page,index)}),$(".lnkEditSubProfile",elem).on("click",function(){var index=parseInt(this.getAttribute("data-profileindex"));editResponseProfile(page,currentProfile.ResponseProfiles[index])})}function deleteResponseProfile(page,index){currentProfile.ResponseProfiles.splice(index,1),renderResponseProfiles(page,currentProfile.ResponseProfiles)}function editResponseProfile(page,responseProfile){isSubProfileNew=null==responseProfile,responseProfile=responseProfile||{},currentSubProfile=responseProfile;var popup=$("#responseProfilePopup",page);$("#selectResponseProfileType",popup).val(responseProfile.Type||"Video").trigger("change"),$("#txtResponseProfileContainer",popup).val(responseProfile.Container||""),$("#txtResponseProfileAudioCodec",popup).val(responseProfile.AudioCodec||""),$("#txtResponseProfileVideoCodec",popup).val(responseProfile.VideoCodec||""),$(".radioTabButton:first",popup).trigger("click"),popup.popup("open")}function saveResponseProfile(page){currentSubProfile.Type=$("#selectResponseProfileType",page).val(),currentSubProfile.Container=$("#txtResponseProfileContainer",page).val(),currentSubProfile.AudioCodec=$("#txtResponseProfileAudioCodec",page).val(),currentSubProfile.VideoCodec=$("#txtResponseProfileVideoCodec",page).val(),isSubProfileNew&¤tProfile.ResponseProfiles.push(currentSubProfile),renderSubProfiles(page,currentProfile),currentSubProfile=null,$("#responseProfilePopup",page).popup("close")}function saveProfile(page,profile){updateProfile(page,profile);var id=getParameterByName("id");id?ApiClient.ajax({type:"POST",url:ApiClient.getUrl("Dlna/Profiles/"+id),data:JSON.stringify(profile),contentType:"application/json"}).then(function(){require(["toast"],function(toast){toast("Settings saved.")})},Dashboard.processErrorResponse):ApiClient.ajax({type:"POST",url:ApiClient.getUrl("Dlna/Profiles"),data:JSON.stringify(profile),contentType:"application/json"}).then(function(){Dashboard.navigate("dlnaprofiles.html")},Dashboard.processErrorResponse),Dashboard.hideLoadingMsg()}function updateProfile(page,profile){profile.Name=$("#txtName",page).val(),profile.EnableAlbumArtInDidl=$("#chkEnableAlbumArtInDidl",page).checked(),profile.EnableSingleAlbumArtLimit=$("#chkEnableSingleImageLimit",page).checked(),profile.SupportedMediaTypes=$(".chkMediaType:checked",page).get().map(function(c){return c.getAttribute("data-value")}).join(","),profile.Identification=profile.Identification||{},profile.FriendlyName=$("#txtInfoFriendlyName",page).val(),profile.ModelName=$("#txtInfoModelName",page).val(),profile.ModelNumber=$("#txtInfoModelNumber",page).val(),profile.ModelDescription=$("#txtInfoModelDescription",page).val(),profile.ModelUrl=$("#txtInfoModelUrl",page).val(),profile.Manufacturer=$("#txtInfoManufacturer",page).val(),profile.ManufacturerUrl=$("#txtInfoManufacturerUrl",page).val(),profile.SerialNumber=$("#txtInfoSerialNumber",page).val(),profile.Identification.FriendlyName=$("#txtIdFriendlyName",page).val(),profile.Identification.ModelName=$("#txtIdModelName",page).val(),profile.Identification.ModelNumber=$("#txtIdModelNumber",page).val(),profile.Identification.ModelDescription=$("#txtIdModelDescription",page).val(),profile.Identification.ModelUrl=$("#txtIdModelUrl",page).val(),profile.Identification.Manufacturer=$("#txtIdManufacturer",page).val(),profile.Identification.ManufacturerUrl=$("#txtIdManufacturerUrl",page).val(),profile.Identification.SerialNumber=$("#txtIdSerialNumber",page).val(),profile.Identification.DeviceDescription=$("#txtIdDeviceDescription",page).val(),profile.AlbumArtPn=$("#txtAlbumArtPn",page).val(),profile.MaxAlbumArtWidth=$("#txtAlbumArtMaxWidth",page).val(),profile.MaxAlbumArtHeight=$("#txtAlbumArtMaxHeight",page).val(),profile.MaxIconWidth=$("#txtIconMaxWidth",page).val(),profile.MaxIconHeight=$("#txtIconMaxHeight",page).val(),profile.RequiresPlainFolders=$("#chkRequiresPlainFolders",page).checked(),profile.RequiresPlainVideoItems=$("#chkRequiresPlainVideoItems",page).checked(),profile.IgnoreTranscodeByteRangeRequests=$("#chkIgnoreTranscodeByteRangeRequests",page).checked(),profile.MaxStreamingBitrate=$("#txtMaxAllowedBitrate",page).val(),profile.MusicStreamingTranscodingBitrate=$("#txtMusicStreamingTranscodingBitrate",page).val(),profile.ProtocolInfo=$("#txtProtocolInfo",page).val(),profile.XDlnaCap=$("#txtXDlnaCap",page).val(),profile.XDlnaDoc=$("#txtXDlnaDoc",page).val(),profile.SonyAggregationFlags=$("#txtSonyAggregationFlags",page).val(),profile.UserId=$("#selectUser",page).val()}var currentProfile,currentSubProfile,isSubProfileNew,allText=Globalize.translate("LabelAll");$(document).on("pageinit","#dlnaProfilePage",function(){var page=this;$(".radioTabButton",page).on("click",function(){$(this).siblings().removeClass("ui-btn-active"),$(this).addClass("ui-btn-active");var value="A"==this.tagName?this.getAttribute("data-value"):this.value,elem=$("."+value,page);elem.siblings(".tabContent").hide(),elem.show()}),$("#selectDirectPlayProfileType",page).on("change",function(){"Video"==this.value?$("#fldDirectPlayVideoCodec",page).show():$("#fldDirectPlayVideoCodec",page).hide(),"Photo"==this.value?$("#fldDirectPlayAudioCodec",page).hide():$("#fldDirectPlayAudioCodec",page).show()}),$("#selectTranscodingProfileType",page).on("change",function(){"Video"==this.value?($("#fldTranscodingVideoCodec",page).show(),$("#fldTranscodingProtocol",page).show(),$("#fldEnableMpegtsM2TsMode",page).show()):($("#fldTranscodingVideoCodec",page).hide(),$("#fldTranscodingProtocol",page).hide(),$("#fldEnableMpegtsM2TsMode",page).hide()),"Photo"==this.value?($("#fldTranscodingAudioCodec",page).hide(),$("#fldEstimateContentLength",page).hide(),$("#fldReportByteRangeRequests",page).hide()):($("#fldTranscodingAudioCodec",page).show(),$("#fldEstimateContentLength",page).show(),$("#fldReportByteRangeRequests",page).show())}),$("#selectResponseProfileType",page).on("change",function(){"Video"==this.value?$("#fldResponseProfileVideoCodec",page).show():$("#fldResponseProfileVideoCodec",page).hide(),"Photo"==this.value?$("#fldResponseProfileAudioCodec",page).hide():$("#fldResponseProfileAudioCodec",page).show()}),$(".btnAddDirectPlayProfile",page).on("click",function(){editDirectPlayProfile(page)}),$(".btnAddTranscodingProfile",page).on("click",function(){editTranscodingProfile(page)}),$(".btnAddContainerProfile",page).on("click",function(){editContainerProfile(page)}),$(".btnAddCodecProfile",page).on("click",function(){editCodecProfile(page)}),$(".btnAddResponseProfile",page).on("click",function(){editResponseProfile(page)}),$(".btnAddIdentificationHttpHeader",page).on("click",function(){editIdentificationHeader(page)}),$(".btnAddXmlDocumentAttribute",page).on("click",function(){editXmlDocumentAttribute(page)}),$(".btnAddSubtitleProfile",page).on("click",function(){editSubtitleProfile(page)}),$(".dlnaProfileForm").off("submit",DlnaProfilePage.onSubmit).on("submit",DlnaProfilePage.onSubmit),$(".editDirectPlayProfileForm").off("submit",DlnaProfilePage.onDirectPlayFormSubmit).on("submit",DlnaProfilePage.onDirectPlayFormSubmit),$(".transcodingProfileForm").off("submit",DlnaProfilePage.onTranscodingProfileFormSubmit).on("submit",DlnaProfilePage.onTranscodingProfileFormSubmit),$(".containerProfileForm").off("submit",DlnaProfilePage.onContainerProfileFormSubmit).on("submit",DlnaProfilePage.onContainerProfileFormSubmit),$(".codecProfileForm").off("submit",DlnaProfilePage.onCodecProfileFormSubmit).on("submit",DlnaProfilePage.onCodecProfileFormSubmit),$(".editResponseProfileForm").off("submit",DlnaProfilePage.onResponseProfileFormSubmit).on("submit",DlnaProfilePage.onResponseProfileFormSubmit),$(".identificationHeaderForm").off("submit",DlnaProfilePage.onIdentificationHeaderFormSubmit).on("submit",DlnaProfilePage.onIdentificationHeaderFormSubmit),$(".xmlAttributeForm").off("submit",DlnaProfilePage.onXmlAttributeFormSubmit).on("submit",DlnaProfilePage.onXmlAttributeFormSubmit),$(".subtitleProfileForm").off("submit",DlnaProfilePage.onSubtitleProfileFormSubmit).on("submit",DlnaProfilePage.onSubtitleProfileFormSubmit)}).on("pageshow","#dlnaProfilePage",function(){var page=this;$("#radioInfo",page).trigger("click"),loadProfile(page)}),window.DlnaProfilePage={onSubmit:function(){Dashboard.showLoadingMsg();var form=this,page=$(form).parents(".page");return saveProfile(page,currentProfile),!1},onDirectPlayFormSubmit:function(){var form=this,page=$(form).parents(".page");return saveDirectPlayProfile(page),!1},onTranscodingProfileFormSubmit:function(){var form=this,page=$(form).parents(".page");return saveTranscodingProfile(page),!1},onContainerProfileFormSubmit:function(){var form=this,page=$(form).parents(".page");return saveContainerProfile(page),!1},onCodecProfileFormSubmit:function(){var form=this,page=$(form).parents(".page");return saveCodecProfile(page),!1},onResponseProfileFormSubmit:function(){var form=this,page=$(form).parents(".page");return saveResponseProfile(page),!1},onIdentificationHeaderFormSubmit:function(){var form=this,page=$(form).parents(".page");return saveIdentificationHeader(page),!1},onXmlAttributeFormSubmit:function(){var form=this,page=$(form).parents(".page");return saveXmlDocumentAttribute(page),!1},onSubtitleProfileFormSubmit:function(){var form=this,page=$(form).parents(".page");return saveSubtitleProfile(page),!1}}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/dlnaprofiles.js b/dashboard-ui/scripts/dlnaprofiles.js index 636033f167..c41b4e770c 100644 --- a/dashboard-ui/scripts/dlnaprofiles.js +++ b/dashboard-ui/scripts/dlnaprofiles.js @@ -1,122 +1 @@ -define(['jQuery', 'listViewStyle'], function ($) { - 'use strict'; - - function loadProfiles(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getJSON(ApiClient.getUrl("Dlna/ProfileInfos")).then(function (result) { - - renderUserProfiles(page, result); - renderSystemProfiles(page, result); - - Dashboard.hideLoadingMsg(); - }); - - } - - function renderUserProfiles(page, profiles) { - - renderProfiles(page, page.querySelector('.customProfiles'), profiles.filter(function (p) { - return p.Type == 'User'; - })); - } - - function renderSystemProfiles(page, profiles) { - - renderProfiles(page, page.querySelector('.systemProfiles'), profiles.filter(function (p) { - return p.Type == 'System'; - })); - } - - function renderProfiles(page, element, profiles) { - - var html = ''; - - if (profiles.length) { - html += '
'; - } - - for (var i = 0, length = profiles.length; i < length; i++) { - - var profile = profiles[i]; - - html += '
'; - - html += ""; - html += 'dvr'; - html += ""; - - html += ''; - - if (profile.Type == 'User') { - html += ''; - } - - html += '
'; - } - - if (profiles.length) { - html += '
'; - } - - element.innerHTML = html; - - $('.btnDeleteProfile', element).on('click', function () { - - var id = this.getAttribute('data-profileid'); - deleteProfile(page, id); - }); - } - - function deleteProfile(page, id) { - - require(['confirm'], function (confirm) { - - confirm(Globalize.translate('MessageConfirmProfileDeletion'), Globalize.translate('HeaderConfirmProfileDeletion')).then(function () { - - Dashboard.showLoadingMsg(); - - ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl("Dlna/Profiles/" + id) - - }).then(function () { - - Dashboard.hideLoadingMsg(); - - loadProfiles(page); - }); - }); - }); - } - - function getTabs() { - return [ - { - href: 'dlnasettings.html', - name: Globalize.translate('TabSettings') - }, - { - href: 'dlnaprofiles.html', - name: Globalize.translate('TabProfiles') - }]; - } - - $(document).on('pageshow', "#dlnaProfilesPage", function () { - - LibraryMenu.setTabs('dlna', 1, getTabs); - var page = this; - - loadProfiles(page); - - }); - -}); +define(["jQuery","listViewStyle"],function($){"use strict";function loadProfiles(page){Dashboard.showLoadingMsg(),ApiClient.getJSON(ApiClient.getUrl("Dlna/ProfileInfos")).then(function(result){renderUserProfiles(page,result),renderSystemProfiles(page,result),Dashboard.hideLoadingMsg()})}function renderUserProfiles(page,profiles){renderProfiles(page,page.querySelector(".customProfiles"),profiles.filter(function(p){return"User"==p.Type}))}function renderSystemProfiles(page,profiles){renderProfiles(page,page.querySelector(".systemProfiles"),profiles.filter(function(p){return"System"==p.Type}))}function renderProfiles(page,element,profiles){var html="";profiles.length&&(html+='
');for(var i=0,length=profiles.length;i',html+="",html+='dvr',html+="",html+='","User"==profile.Type&&(html+=''),html+="
"}profiles.length&&(html+="
"),element.innerHTML=html,$(".btnDeleteProfile",element).on("click",function(){var id=this.getAttribute("data-profileid");deleteProfile(page,id)})}function deleteProfile(page,id){require(["confirm"],function(confirm){confirm(Globalize.translate("MessageConfirmProfileDeletion"),Globalize.translate("HeaderConfirmProfileDeletion")).then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Dlna/Profiles/"+id)}).then(function(){Dashboard.hideLoadingMsg(),loadProfiles(page)})})})}function getTabs(){return[{href:"dlnasettings.html",name:Globalize.translate("TabSettings")},{href:"dlnaprofiles.html",name:Globalize.translate("TabProfiles")}]}$(document).on("pageshow","#dlnaProfilesPage",function(){LibraryMenu.setTabs("dlna",1,getTabs);var page=this;loadProfiles(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/dlnasettings.js b/dashboard-ui/scripts/dlnasettings.js index 91325e5de5..2ea7077265 100644 --- a/dashboard-ui/scripts/dlnasettings.js +++ b/dashboard-ui/scripts/dlnasettings.js @@ -1,83 +1 @@ -define(['jQuery', 'fnchecked'], function ($) { - 'use strict'; - - function loadPage(page, config, users) { - - page.querySelector('#chkEnablePlayTo').checked = config.EnablePlayTo; - page.querySelector('#chkEnableDlnaDebugLogging').checked = config.EnableDebugLog; - - $('#txtClientDiscoveryInterval', page).val(config.ClientDiscoveryIntervalSeconds); - - $('#chkEnableServer', page).checked(config.EnableServer); - $('#chkBlastAliveMessages', page).checked(config.BlastAliveMessages); - $('#txtBlastInterval', page).val(config.BlastAliveMessageIntervalSeconds); - - var usersHtml = users.map(function (u) { - return ''; - }).join(''); - - $('#selectUser', page).html(usersHtml).val(config.DefaultUserId || ''); - - Dashboard.hideLoadingMsg(); - } - - function onSubmit() { - - Dashboard.showLoadingMsg(); - - var form = this; - - ApiClient.getNamedConfiguration("dlna").then(function (config) { - - config.EnablePlayTo = form.querySelector('#chkEnablePlayTo').checked; - config.EnableDebugLog = form.querySelector('#chkEnableDlnaDebugLogging').checked; - - config.ClientDiscoveryIntervalSeconds = $('#txtClientDiscoveryInterval', form).val(); - - config.EnableServer = $('#chkEnableServer', form).checked(); - config.BlastAliveMessages = $('#chkBlastAliveMessages', form).checked(); - config.BlastAliveMessageIntervalSeconds = $('#txtBlastInterval', form).val(); - config.DefaultUserId = $('#selectUser', form).val(); - - ApiClient.updateNamedConfiguration("dlna", config).then(Dashboard.processServerConfigurationUpdateResult); - }); - - // Disable default form submission - return false; - } - - function getTabs() { - return [ - { - href: 'dlnasettings.html', - name: Globalize.translate('TabSettings') - }, - { - href: 'dlnaprofiles.html', - name: Globalize.translate('TabProfiles') - }]; - } - - $(document).on('pageinit', "#dlnaSettingsPage", function () { - - $('.dlnaSettingsForm').off('submit', onSubmit).on('submit', onSubmit); - - }).on('pageshow', "#dlnaSettingsPage", function () { - - LibraryMenu.setTabs('dlna', 0, getTabs); - Dashboard.showLoadingMsg(); - - var page = this; - - var promise1 = ApiClient.getNamedConfiguration("dlna"); - var promise2 = ApiClient.getUsers(); - - Promise.all([promise1, promise2]).then(function (responses) { - - loadPage(page, responses[0], responses[1]); - - }); - - }); - -}); +define(["jQuery","fnchecked"],function($){"use strict";function loadPage(page,config,users){page.querySelector("#chkEnablePlayTo").checked=config.EnablePlayTo,page.querySelector("#chkEnableDlnaDebugLogging").checked=config.EnableDebugLog,$("#txtClientDiscoveryInterval",page).val(config.ClientDiscoveryIntervalSeconds),$("#chkEnableServer",page).checked(config.EnableServer),$("#chkBlastAliveMessages",page).checked(config.BlastAliveMessages),$("#txtBlastInterval",page).val(config.BlastAliveMessageIntervalSeconds);var usersHtml=users.map(function(u){return'"}).join("");$("#selectUser",page).html(usersHtml).val(config.DefaultUserId||""),Dashboard.hideLoadingMsg()}function onSubmit(){Dashboard.showLoadingMsg();var form=this;return ApiClient.getNamedConfiguration("dlna").then(function(config){config.EnablePlayTo=form.querySelector("#chkEnablePlayTo").checked,config.EnableDebugLog=form.querySelector("#chkEnableDlnaDebugLogging").checked,config.ClientDiscoveryIntervalSeconds=$("#txtClientDiscoveryInterval",form).val(),config.EnableServer=$("#chkEnableServer",form).checked(),config.BlastAliveMessages=$("#chkBlastAliveMessages",form).checked(),config.BlastAliveMessageIntervalSeconds=$("#txtBlastInterval",form).val(),config.DefaultUserId=$("#selectUser",form).val(),ApiClient.updateNamedConfiguration("dlna",config).then(Dashboard.processServerConfigurationUpdateResult)}),!1}function getTabs(){return[{href:"dlnasettings.html",name:Globalize.translate("TabSettings")},{href:"dlnaprofiles.html",name:Globalize.translate("TabProfiles")}]}$(document).on("pageinit","#dlnaSettingsPage",function(){$(".dlnaSettingsForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#dlnaSettingsPage",function(){LibraryMenu.setTabs("dlna",0,getTabs),Dashboard.showLoadingMsg();var page=this,promise1=ApiClient.getNamedConfiguration("dlna"),promise2=ApiClient.getUsers();Promise.all([promise1,promise2]).then(function(responses){loadPage(page,responses[0],responses[1])})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/edititemmetadata.js b/dashboard-ui/scripts/edititemmetadata.js index d99c2f9284..11b1edb0ee 100644 --- a/dashboard-ui/scripts/edititemmetadata.js +++ b/dashboard-ui/scripts/edititemmetadata.js @@ -1,38 +1 @@ -define(['loading'], function (loading) { - 'use strict'; - - function reload(context, itemId) { - - loading.show(); - - if (itemId) { - require(['metadataEditor'], function (metadataEditor) { - - metadataEditor.embed(context.querySelector('.editPageInnerContent'), itemId, ApiClient.serverInfo().Id); - }); - } else { - context.querySelector('.editPageInnerContent').innerHTML = ''; - loading.hide(); - } - } - - return function (view, params) { - - view.addEventListener('viewshow', function () { - reload(this, MetadataEditor.getCurrentItemId()); - }); - - MetadataEditor.setCurrentItemId(null); - - view.querySelector('.libraryTree').addEventListener('itemclicked', function (event) { - - var data = event.detail; - - if (data.id != MetadataEditor.getCurrentItemId()) { - - MetadataEditor.setCurrentItemId(data.id); - reload(view, data.id); - } - }); - }; -}); +define(["loading"],function(loading){"use strict";function reload(context,itemId){loading.show(),itemId?require(["metadataEditor"],function(metadataEditor){metadataEditor.embed(context.querySelector(".editPageInnerContent"),itemId,ApiClient.serverInfo().Id)}):(context.querySelector(".editPageInnerContent").innerHTML="",loading.hide())}return function(view,params){view.addEventListener("viewshow",function(){reload(this,MetadataEditor.getCurrentItemId())}),MetadataEditor.setCurrentItemId(null),view.querySelector(".libraryTree").addEventListener("itemclicked",function(event){var data=event.detail;data.id!=MetadataEditor.getCurrentItemId()&&(MetadataEditor.setCurrentItemId(data.id),reload(view,data.id))})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/editorsidebar.js b/dashboard-ui/scripts/editorsidebar.js index be3d853b7f..631eba0699 100644 --- a/dashboard-ui/scripts/editorsidebar.js +++ b/dashboard-ui/scripts/editorsidebar.js @@ -1,482 +1 @@ -define(['datetime', 'jQuery', 'material-icons'], function (datetime, $) { - 'use strict'; - - function getNode(item, folderState, selected) { - - var htmlName = getNodeInnerHtml(item); - - var node = { - id: item.Id, - text: htmlName, - - state: { - opened: item.IsFolder && folderState == 'open', - selected: selected - }, - - li_attr: { - serveritemtype: item.Type, - collectiontype: item.CollectionType - } - }; - - if (item.IsFolder) { - node.children = [ - { - text: 'Loading...', - icon: false - }]; - node.icon = false; - } - else { - node.icon = false; - } - - if (node.state.opened) { - node.li_attr.loadedFromServer = true; - } - - if (selected) { - selectedNodeId = item.Id; - } - - return node; - } - - function getNodeInnerHtml(item) { - - var name = item.Name; - - // Channel number - if (item.Number) { - name = item.Number + " - " + name; - } - if (item.IndexNumber != null && item.Type != "Season") { - name = item.IndexNumber + " - " + name; - } - - var cssClass = "editorNode"; - - if (item.LocationType == "Offline") { - cssClass += " offlineEditorNode"; - } - - var htmlName = "
"; - - if (item.LockData) { - htmlName += 'lock'; - } - - htmlName += name; - - if (!item.ImageTags || !item.ImageTags.Primary) { - htmlName += ''; - } - - if (!item.BackdropImageTags || !item.BackdropImageTags.length) { - if (item.Type !== "Episode" && item.Type !== "Season" && item.MediaType !== "Audio" && item.Type !== "TvChannel" && item.Type !== "MusicAlbum") { - htmlName += ''; - } - } - - if (!item.ImageTags || !item.ImageTags.Logo) { - if (item.Type == "Movie" || item.Type == "Trailer" || item.Type == "Series" || item.Type == "MusicArtist" || item.Type == "BoxSet") { - htmlName += ''; - } - } - - if (item.Type == "Episode" && item.LocationType == "Virtual") { - - try { - if (item.PremiereDate && (new Date().getTime() >= datetime.parseISO8601Date(item.PremiereDate, true).getTime())) { - htmlName += ''; - } - } catch (err) { - - } - - } - - htmlName += "
"; - - return htmlName; - } - - function loadChildrenOfRootNode(page, scope, callback) { - - ApiClient.getLiveTvChannels({ limit: 0 }).then(function (result) { - - var nodes = []; - - nodes.push({ - - id: 'MediaFolders', - text: Globalize.translate('HeaderMediaFolders'), - state: { - opened: true - }, - li_attr: { - itemtype: 'mediafolders', - loadedFromServer: true - }, - icon: false - }); - - if (result.TotalRecordCount) { - - nodes.push({ - - id: 'livetv', - text: Globalize.translate('HeaderLiveTV'), - state: { - opened: false - }, - li_attr: { - itemtype: 'livetv' - }, - children: [ - { - text: 'Loading...', - icon: false - }], - icon: false - }); - } - - callback.call(scope, nodes); - - nodesToLoad.push('MediaFolders'); - }); - } - - function loadLiveTvChannels(service, openItems, callback) { - - ApiClient.getLiveTvChannels({ - - ServiceName: service, - AddCurrentProgram: false - - }).then(function (result) { - - var nodes = result.Items.map(function (i) { - - var state = openItems.indexOf(i.Id) == -1 ? 'closed' : 'open'; - - return getNode(i, state, false); - - }); - - callback(nodes); - - }); - - } - - function loadMediaFolders(page, scope, openItems, callback) { - - ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders")).then(function (result) { - - var nodes = result.Items.map(function (n) { - - var state = openItems.indexOf(n.Id) == -1 ? 'closed' : 'open'; - - return getNode(n, state, false); - - }); - - callback.call(scope, nodes); - - for (var i = 0, length = nodes.length; i < length; i++) { - if (nodes[i].state.opened) { - - nodesToLoad.push(nodes[i].id); - } - } - - }); - - } - - function loadNode(page, scope, node, openItems, selectedId, currentUser, callback) { - - var id = node.id; - - if (id == '#') { - - loadChildrenOfRootNode(page, scope, callback); - return; - } - - if (id == 'livetv') { - - loadLiveTvChannels(id, openItems, callback); - return; - } - - if (id == 'MediaFolders') { - - loadMediaFolders(page, scope, openItems, callback); - return; - } - - var query = { - ParentId: id, - Fields: 'Settings' - }; - - var itemtype = node.li_attr.itemtype; - - if (itemtype != "Season" && itemtype != "Series") { - query.SortBy = "SortName"; - } - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - var nodes = result.Items.map(function (n) { - - var state = openItems.indexOf(n.Id) == -1 ? 'closed' : 'open'; - - return getNode(n, state, n.Id == selectedId); - - }); - - callback.call(scope, nodes); - - for (var i = 0, length = nodes.length; i < length; i++) { - if (nodes[i].state.opened) { - - nodesToLoad.push(nodes[i].id); - } - } - - }); - - } - - function scrollToNode(id) { - - var elem = $('#' + id)[0]; - - if (elem) { - // commenting out for now because it's causing the whole window to scroll in chrome - elem.scrollIntoView(); - } - } - - function initializeTree(page, currentUser, openItems, selectedId) { - - require(['jstree'], function () { - initializeTreeInternal(page, currentUser, openItems, selectedId); - }); - } - - function onNodeSelect(event, data) { - var node = data.node; - - var eventData = { - id: node.id, - itemType: node.li_attr.itemtype, - serverItemType: node.li_attr.serveritemtype, - collectionType: node.li_attr.collectiontype - }; - - if (eventData.itemType != 'livetv' && eventData.itemType != 'mediafolders') { - - // We'd like to prevent these from being editable but this removes the ability to perform a top level refresh - //if (eventData.serverItemType != 'UserView' && eventData.serverItemType != 'CollectionFolder' && !eventData.collectionType) - { - this.dispatchEvent(new CustomEvent('itemclicked', { - detail: eventData, - bubbles: true, - cancelable: false - })); - } - } - } - - function onNodeOpen(event, data) { - - var page = $(this).parents('.page')[0]; - var node = data.node; - - if (node.children && node.children) { - loadNodesToLoad(page, node); - } - - if (node.li_attr && node.id != '#' && !node.li_attr.loadedFromServer) { - - node.li_attr.loadedFromServer = true; - - $.jstree.reference(".libraryTree", page).load_node(node.id, loadNodeCallback); - } - } - - function onNodeLoad(event, data) { - - var page = $(this).parents('.page')[0]; - var node = data.node; - - if (node.children && node.children) { - loadNodesToLoad(page, node); - } - - if (node.li_attr && node.id != '#' && !node.li_attr.loadedFromServer) { - - node.li_attr.loadedFromServer = true; - - $.jstree.reference(".libraryTree", page).load_node(node.id, loadNodeCallback); - } - } - - function initializeTreeInternal(page, currentUser, openItems, selectedId) { - - nodesToLoad = []; - selectedNodeId = null; - - $.jstree.destroy(); - - $('.libraryTree', page).jstree({ - - "plugins": ["wholerow"], - - core: { - - check_callback: true, - data: function (node, callback) { - - loadNode(page, this, node, openItems, selectedId, currentUser, callback); - }, - - themes: { - variant: 'large' - } - } - - }).off('select_node.jstree', onNodeSelect).on('select_node.jstree', onNodeSelect).off('open_node.jstree', onNodeOpen).on('open_node.jstree', onNodeOpen).off('load_node.jstree', onNodeLoad).on('load_node.jstree', onNodeLoad); - } - - function loadNodesToLoad(page, node) { - - var children = node.children; - - for (var i = 0, length = children.length; i < length; i++) { - - var child = children[i]; - - if (nodesToLoad.indexOf(child) != -1) { - - nodesToLoad = nodesToLoad.filter(function (n) { - return n != child; - }); - - $.jstree.reference(".libraryTree", page).load_node(child, loadNodeCallback); - } - } - } - - function loadNodeCallback(node) { - - if (selectedNodeId && node.children && node.children.indexOf(selectedNodeId) != -1) { - - setTimeout(function () { - - scrollToNode(selectedNodeId); - }, 500); - } - } - - var nodesToLoad = []; - var selectedNodeId; - - function updateEditorNode(page, item) { - - var elem = $('#' + item.Id + '>a', page)[0]; - - if (elem == null) { - return; - } - - $('.editorNode', elem).remove(); - - $(elem).append(getNodeInnerHtml(item)); - - if (item.IsFolder) { - - var tree = jQuery.jstree._reference(".libraryTree"); - var currentNode = tree._get_node(null, false); - tree.refresh(currentNode); - } - } - - $(document).on('itemsaved', ".metadataEditorPage", function (e, item) { - - updateEditorNode(this, item); - - }).on('pagebeforeshow', ".metadataEditorPage", function () { - - require(['css!css/metadataeditor.css']); - - }).on('pagebeforeshow', ".metadataEditorPage", function () { - - var page = this; - - Dashboard.getCurrentUser().then(function (user) { - - var id = getCurrentItemId(); - - if (id) { - - ApiClient.getAncestorItems(id, user.Id).then(function (ancestors) { - - var ids = ancestors.map(function (i) { - return i.Id; - }); - - initializeTree(page, user, ids, id); - }); - - } else { - initializeTree(page, user, []); - } - - }); - - }).on('pagebeforehide', ".metadataEditorPage", function () { - - var page = this; - - $('.libraryTree', page).off('select_node.jstree', onNodeSelect).off('open_node.jstree', onNodeOpen).off('load_node.jstree', onNodeLoad); - - }); - - var itemId; - function setCurrentItemId(id) { - itemId = id; - } - - function getCurrentItemId() { - - if (itemId) { - return itemId; - } - - var url = window.location.hash || window.location.href; - - return getParameterByName('id', url); - } - - window.MetadataEditor = { - getItemPromise: function () { - var currentItemId = getCurrentItemId(); - - if (currentItemId) { - return ApiClient.getItem(Dashboard.getCurrentUserId(), currentItemId); - } - - return ApiClient.getRootFolder(Dashboard.getCurrentUserId()); - }, - getCurrentItemId: getCurrentItemId, - setCurrentItemId: setCurrentItemId - }; - -}); \ No newline at end of file +define(["datetime","jQuery","material-icons"],function(datetime,$){"use strict";function getNode(item,folderState,selected){var htmlName=getNodeInnerHtml(item),node={id:item.Id,text:htmlName,state:{opened:item.IsFolder&&"open"==folderState,selected:selected},li_attr:{serveritemtype:item.Type,collectiontype:item.CollectionType}};return item.IsFolder?(node.children=[{text:"Loading...",icon:!1}],node.icon=!1):node.icon=!1,node.state.opened&&(node.li_attr.loadedFromServer=!0),selected&&(selectedNodeId=item.Id),node}function getNodeInnerHtml(item){var name=item.Name;item.Number&&(name=item.Number+" - "+name),null!=item.IndexNumber&&"Season"!=item.Type&&(name=item.IndexNumber+" - "+name);var cssClass="editorNode";"Offline"==item.LocationType&&(cssClass+=" offlineEditorNode");var htmlName="
";if(item.LockData&&(htmlName+='lock'),htmlName+=name,item.ImageTags&&item.ImageTags.Primary||(htmlName+=''),item.BackdropImageTags&&item.BackdropImageTags.length||"Episode"!==item.Type&&"Season"!==item.Type&&"Audio"!==item.MediaType&&"TvChannel"!==item.Type&&"MusicAlbum"!==item.Type&&(htmlName+=''),item.ImageTags&&item.ImageTags.Logo||"Movie"!=item.Type&&"Trailer"!=item.Type&&"Series"!=item.Type&&"MusicArtist"!=item.Type&&"BoxSet"!=item.Type||(htmlName+=''),"Episode"==item.Type&&"Virtual"==item.LocationType)try{item.PremiereDate&&(new Date).getTime()>=datetime.parseISO8601Date(item.PremiereDate,!0).getTime()&&(htmlName+='')}catch(err){}return htmlName+="
"}function loadChildrenOfRootNode(page,scope,callback){ApiClient.getLiveTvChannels({limit:0}).then(function(result){var nodes=[];nodes.push({id:"MediaFolders",text:Globalize.translate("HeaderMediaFolders"),state:{opened:!0},li_attr:{itemtype:"mediafolders",loadedFromServer:!0},icon:!1}),result.TotalRecordCount&&nodes.push({id:"livetv",text:Globalize.translate("HeaderLiveTV"),state:{opened:!1},li_attr:{itemtype:"livetv"},children:[{text:"Loading...",icon:!1}],icon:!1}),callback.call(scope,nodes),nodesToLoad.push("MediaFolders")})}function loadLiveTvChannels(service,openItems,callback){ApiClient.getLiveTvChannels({ServiceName:service,AddCurrentProgram:!1}).then(function(result){var nodes=result.Items.map(function(i){var state=openItems.indexOf(i.Id)==-1?"closed":"open";return getNode(i,state,!1)});callback(nodes)})}function loadMediaFolders(page,scope,openItems,callback){ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders")).then(function(result){var nodes=result.Items.map(function(n){var state=openItems.indexOf(n.Id)==-1?"closed":"open";return getNode(n,state,!1)});callback.call(scope,nodes);for(var i=0,length=nodes.length;ia",page)[0];if(null!=elem&&($(".editorNode",elem).remove(),$(elem).append(getNodeInnerHtml(item)),item.IsFolder)){var tree=jQuery.jstree._reference(".libraryTree"),currentNode=tree._get_node(null,!1);tree.refresh(currentNode)}}function setCurrentItemId(id){itemId=id}function getCurrentItemId(){if(itemId)return itemId;var url=window.location.hash||window.location.href;return getParameterByName("id",url)}var selectedNodeId,nodesToLoad=[];$(document).on("itemsaved",".metadataEditorPage",function(e,item){updateEditorNode(this,item)}).on("pagebeforeshow",".metadataEditorPage",function(){require(["css!css/metadataeditor.css"])}).on("pagebeforeshow",".metadataEditorPage",function(){var page=this;Dashboard.getCurrentUser().then(function(user){var id=getCurrentItemId();id?ApiClient.getAncestorItems(id,user.Id).then(function(ancestors){var ids=ancestors.map(function(i){return i.Id});initializeTree(page,user,ids,id)}):initializeTree(page,user,[])})}).on("pagebeforehide",".metadataEditorPage",function(){var page=this;$(".libraryTree",page).off("select_node.jstree",onNodeSelect).off("open_node.jstree",onNodeOpen).off("load_node.jstree",onNodeLoad)});var itemId;window.MetadataEditor={getItemPromise:function(){var currentItemId=getCurrentItemId();return currentItemId?ApiClient.getItem(Dashboard.getCurrentUserId(),currentItemId):ApiClient.getRootFolder(Dashboard.getCurrentUserId())},getCurrentItemId:getCurrentItemId,setCurrentItemId:setCurrentItemId}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/encodingsettings.js b/dashboard-ui/scripts/encodingsettings.js index 211bd36c67..e17d6dde00 100644 --- a/dashboard-ui/scripts/encodingsettings.js +++ b/dashboard-ui/scripts/encodingsettings.js @@ -1,203 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - function loadPage(page, config, systemInfo) { - - page.querySelector('#chkEnableThrottle').checked = config.EnableThrottling; - - $('#selectVideoDecoder', page).val(config.HardwareAccelerationType); - $('#selectThreadCount', page).val(config.EncodingThreadCount); - $('#txtDownMixAudioBoost', page).val(config.DownMixAudioBoost); - page.querySelector('.txtEncoderPath').value = config.EncoderAppPath || ''; - $('#txtTranscodingTempPath', page).val(config.TranscodingTempPath || ''); - $('#txtVaapiDevice', page).val(config.VaapiDevice || ''); - - page.querySelector('#selectH264Preset').value = config.H264Preset || ''; - page.querySelector('#txtH264Crf').value = config.H264Crf || ''; - - var selectEncoderPath = page.querySelector('#selectEncoderPath'); - - selectEncoderPath.value = systemInfo.EncoderLocationType; - onSelectEncoderPathChange.call(selectEncoderPath); - - page.querySelector('#selectVideoDecoder').dispatchEvent(new CustomEvent('change', { - bubbles: true - })); - - Dashboard.hideLoadingMsg(); - } - - function onSaveEncodingPathFailure(response) { - - Dashboard.hideLoadingMsg(); - - var msg = ''; - - // This is a fallback that handles both 404 and 400 (no path entered) - msg = Globalize.translate('FFmpegSavePathNotFound'); - - require(['alert'], function (alert) { - alert(msg); - }); - } - - function updateEncoder(form) { - - return ApiClient.getSystemInfo().then(function (systemInfo) { - - return ApiClient.ajax({ - url: ApiClient.getUrl('System/MediaEncoder/Path'), - type: 'POST', - data: { - Path: form.querySelector('.txtEncoderPath').value, - PathType: form.querySelector('#selectEncoderPath').value - } - }).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure); - }); - } - - function onSubmit() { - - var form = this; - - var onDecoderConfirmed = function () { - Dashboard.showLoadingMsg(); - - ApiClient.getNamedConfiguration("encoding").then(function (config) { - - config.DownMixAudioBoost = $('#txtDownMixAudioBoost', form).val(); - config.TranscodingTempPath = $('#txtTranscodingTempPath', form).val(); - config.EncodingThreadCount = $('#selectThreadCount', form).val(); - config.HardwareAccelerationType = $('#selectVideoDecoder', form).val(); - config.VaapiDevice = $('#txtVaapiDevice', form).val(); - - config.H264Preset = form.querySelector('#selectH264Preset').value; - config.H264Crf = parseInt(form.querySelector('#txtH264Crf').value || '0'); - - config.EnableThrottling = form.querySelector('#chkEnableThrottle').checked; - - ApiClient.updateNamedConfiguration("encoding", config).then(function () { - - updateEncoder(form); - }); - }); - }; - - if ($('#selectVideoDecoder', form).val()) { - - require(['alert'], function (alert) { - alert({ - title: Globalize.translate('TitleHardwareAcceleration'), - text: Globalize.translate('HardwareAccelerationWarning') - }).then(onDecoderConfirmed); - }); - - } else { - onDecoderConfirmed(); - } - - - // Disable default form submission - return false; - } - - function onSelectEncoderPathChange(e) { - - var page = $(this).parents('.page')[0]; - - if (this.value == 'Custom') { - page.querySelector('.fldEncoderPath').classList.remove('hide'); - page.querySelector('.txtEncoderPath').setAttribute('required', 'required'); - } else { - page.querySelector('.fldEncoderPath').classList.add('hide'); - page.querySelector('.txtEncoderPath').removeAttribute('required'); - } - } - - $(document).on('pageinit', "#encodingSettingsPage", function () { - - var page = this; - - page.querySelector('#selectVideoDecoder').addEventListener('change', function () { - - if (this.value == 'vaapi') { - - page.querySelector('.fldVaapiDevice').classList.remove('hide'); - page.querySelector('#txtVaapiDevice').setAttribute('required', 'required'); - - } else { - page.querySelector('.fldVaapiDevice').classList.add('hide'); - page.querySelector('#txtVaapiDevice').removeAttribute('required'); - } - }); - - $('#btnSelectEncoderPath', page).on("click.selectDirectory", function () { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - includeFiles: true, - callback: function (path) { - - if (path) { - $('.txtEncoderPath', page).val(path); - } - picker.close(); - } - }); - }); - }); - - $('#btnSelectTranscodingTempPath', page).on("click.selectDirectory", function () { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - callback: function (path) { - - if (path) { - $('#txtTranscodingTempPath', page).val(path); - } - picker.close(); - }, - - header: Globalize.translate('HeaderSelectTranscodingPath'), - - instruction: Globalize.translate('HeaderSelectTranscodingPathHelp') - }); - }); - }); - - $('.encodingSettingsForm').off('submit', onSubmit).on('submit', onSubmit); - - page.querySelector('#selectEncoderPath').addEventListener('change', onSelectEncoderPathChange); - - }).on('pageshow', "#encodingSettingsPage", function () { - - Dashboard.showLoadingMsg(); - - var page = this; - - ApiClient.getNamedConfiguration("encoding").then(function (config) { - - ApiClient.getSystemInfo().then(function (systemInfo) { - - if (systemInfo.EncoderLocationType == "External") { - page.querySelector('.fldSelectEncoderPathType').classList.add('hide'); - } else { - page.querySelector('.fldSelectEncoderPathType').classList.remove('hide'); - } - - loadPage(page, config, systemInfo); - }); - }); - - }); - -}); +define(["jQuery"],function($){"use strict";function loadPage(page,config,systemInfo){page.querySelector("#chkEnableThrottle").checked=config.EnableThrottling,$("#selectVideoDecoder",page).val(config.HardwareAccelerationType),$("#selectThreadCount",page).val(config.EncodingThreadCount),$("#txtDownMixAudioBoost",page).val(config.DownMixAudioBoost),page.querySelector(".txtEncoderPath").value=config.EncoderAppPath||"",$("#txtTranscodingTempPath",page).val(config.TranscodingTempPath||""),$("#txtVaapiDevice",page).val(config.VaapiDevice||""),page.querySelector("#selectH264Preset").value=config.H264Preset||"",page.querySelector("#txtH264Crf").value=config.H264Crf||"";var selectEncoderPath=page.querySelector("#selectEncoderPath");selectEncoderPath.value=systemInfo.EncoderLocationType,onSelectEncoderPathChange.call(selectEncoderPath),page.querySelector("#selectVideoDecoder").dispatchEvent(new CustomEvent("change",{bubbles:!0})),Dashboard.hideLoadingMsg()}function onSaveEncodingPathFailure(response){Dashboard.hideLoadingMsg();var msg="";msg=Globalize.translate("FFmpegSavePathNotFound"),require(["alert"],function(alert){alert(msg)})}function updateEncoder(form){return ApiClient.getSystemInfo().then(function(systemInfo){return ApiClient.ajax({url:ApiClient.getUrl("System/MediaEncoder/Path"),type:"POST",data:{Path:form.querySelector(".txtEncoderPath").value,PathType:form.querySelector("#selectEncoderPath").value}}).then(Dashboard.processServerConfigurationUpdateResult,onSaveEncodingPathFailure)})}function onSubmit(){var form=this,onDecoderConfirmed=function(){Dashboard.showLoadingMsg(),ApiClient.getNamedConfiguration("encoding").then(function(config){config.DownMixAudioBoost=$("#txtDownMixAudioBoost",form).val(),config.TranscodingTempPath=$("#txtTranscodingTempPath",form).val(),config.EncodingThreadCount=$("#selectThreadCount",form).val(),config.HardwareAccelerationType=$("#selectVideoDecoder",form).val(),config.VaapiDevice=$("#txtVaapiDevice",form).val(),config.H264Preset=form.querySelector("#selectH264Preset").value,config.H264Crf=parseInt(form.querySelector("#txtH264Crf").value||"0"),config.EnableThrottling=form.querySelector("#chkEnableThrottle").checked,ApiClient.updateNamedConfiguration("encoding",config).then(function(){updateEncoder(form)})})};return $("#selectVideoDecoder",form).val()?require(["alert"],function(alert){alert({title:Globalize.translate("TitleHardwareAcceleration"),text:Globalize.translate("HardwareAccelerationWarning")}).then(onDecoderConfirmed)}):onDecoderConfirmed(),!1}function onSelectEncoderPathChange(e){var page=$(this).parents(".page")[0];"Custom"==this.value?(page.querySelector(".fldEncoderPath").classList.remove("hide"),page.querySelector(".txtEncoderPath").setAttribute("required","required")):(page.querySelector(".fldEncoderPath").classList.add("hide"),page.querySelector(".txtEncoderPath").removeAttribute("required"))}$(document).on("pageinit","#encodingSettingsPage",function(){var page=this;page.querySelector("#selectVideoDecoder").addEventListener("change",function(){"vaapi"==this.value?(page.querySelector(".fldVaapiDevice").classList.remove("hide"),page.querySelector("#txtVaapiDevice").setAttribute("required","required")):(page.querySelector(".fldVaapiDevice").classList.add("hide"),page.querySelector("#txtVaapiDevice").removeAttribute("required"))}),$("#btnSelectEncoderPath",page).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({includeFiles:!0,callback:function(path){path&&$(".txtEncoderPath",page).val(path),picker.close()}})})}),$("#btnSelectTranscodingTempPath",page).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&$("#txtTranscodingTempPath",page).val(path),picker.close()},header:Globalize.translate("HeaderSelectTranscodingPath"),instruction:Globalize.translate("HeaderSelectTranscodingPathHelp")})})}),$(".encodingSettingsForm").off("submit",onSubmit).on("submit",onSubmit),page.querySelector("#selectEncoderPath").addEventListener("change",onSelectEncoderPathChange)}).on("pageshow","#encodingSettingsPage",function(){Dashboard.showLoadingMsg();var page=this;ApiClient.getNamedConfiguration("encoding").then(function(config){ApiClient.getSystemInfo().then(function(systemInfo){"External"==systemInfo.EncoderLocationType?page.querySelector(".fldSelectEncoderPathType").classList.add("hide"):page.querySelector(".fldSelectEncoderPathType").classList.remove("hide"),loadPage(page,config,systemInfo)})})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/episodes.js b/dashboard-ui/scripts/episodes.js index ea689eb89a..ae0aaa2b27 100644 --- a/dashboard-ui/scripts/episodes.js +++ b/dashboard-ui/scripts/episodes.js @@ -1,266 +1 @@ -define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, cardBuilder) { - 'use strict'; - - return function (view, params, tabContent) { - - var self = this; - var pageSize = libraryBrowser.getDefaultPageSize(); - - var data = {}; - - function getPageData(context) { - var key = getSavedQueryKey(context); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - SortBy: "SeriesSortName,SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Episode", - Recursive: true, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData", - IsMissing: false, - IsVirtualUnaired: false, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", - StartIndex: 0, - Limit: pageSize - }, - view: libraryBrowser.getSavedView(key) || 'Poster' - }; - - pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData; - } - - function getQuery(context) { - - return getPageData(context).query; - } - - function getSavedQueryKey(context) { - - if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('episodes'); - } - return context.savedQueryKey; - } - - function onViewStyleChange() { - - var viewStyle = self.getCurrentViewStyle(); - - var itemsContainer = tabContent.querySelector('.itemsContainer'); - - if (viewStyle == "List") { - - itemsContainer.classList.add('vertical-list'); - itemsContainer.classList.remove('vertical-wrap'); - } - else { - - itemsContainer.classList.remove('vertical-list'); - itemsContainer.classList.add('vertical-wrap'); - } - itemsContainer.innerHTML = ''; - } - - function reloadItems(page) { - - Dashboard.showLoadingMsg(); - - var query = getQuery(page); - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - var pagingHtml = LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false, - addLayoutButton: false, - sortButton: false, - filterButton: false - }); - - var viewStyle = self.getCurrentViewStyle(); - - var html; - var itemsContainer = tabContent.querySelector('.itemsContainer'); - - if (viewStyle == "List") { - - html = listView.getListViewHtml({ - items: result.Items, - sortBy: query.SortBy, - showParentTitle: true - }); - } - else if (viewStyle == "PosterCard") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "backdrop", - showTitle: true, - showParentTitle: true, - scalable: true, - cardLayout: true - }); - } - else { - - // poster - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "backdrop", - showTitle: true, - showParentTitle: true, - overlayText: true, - scalable: true, - overlayPlayButton: true - }); - } - - var i, length; - var elems = tabContent.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].innerHTML = pagingHtml; - } - - function onNextPageClick() { - query.StartIndex += query.Limit; - reloadItems(tabContent); - } - - function onPreviousPageClick() { - query.StartIndex -= query.Limit; - reloadItems(tabContent); - } - - elems = tabContent.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); - } - - elems = tabContent.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); - } - - itemsContainer.innerHTML = html; - imageLoader.lazyChildren(itemsContainer); - - libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); - - Dashboard.hideLoadingMsg(); - }); - } - - self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { - - var filterDialog = new filterDialogFactory({ - query: getQuery(tabContent), - mode: 'episodes' - }); - - Events.on(filterDialog, 'filterchange', function () { - reloadItems(tabContent); - }); - - filterDialog.show(); - }); - }; - - function initPage(tabContent) { - - tabContent.querySelector('.itemsContainer').addEventListener('needsrefresh', function () { - - reloadItems(tabContent); - }); - - tabContent.querySelector('.btnFilter').addEventListener('click', function () { - self.showFilterMenu(); - }); - - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { - libraryBrowser.showSortMenu({ - items: [{ - name: Globalize.translate('OptionNameSort'), - id: 'SeriesSortName,SortName' - }, - { - name: Globalize.translate('OptionTvdbRating'), - id: 'CommunityRating,SeriesSortName,SortName' - }, - { - name: Globalize.translate('OptionDateAdded'), - id: 'DateCreated,SeriesSortName,SortName' - }, - { - name: Globalize.translate('OptionPremiereDate'), - id: 'PremiereDate,SeriesSortName,SortName' - }, - { - name: Globalize.translate('OptionDatePlayed'), - id: 'DatePlayed,SeriesSortName,SortName' - }, - { - name: Globalize.translate('OptionParentalRating'), - id: 'OfficialRating,SeriesSortName,SortName' - }, - { - name: Globalize.translate('OptionPlayCount'), - id: 'PlayCount,SeriesSortName,SortName' - }, - { - name: Globalize.translate('OptionRuntime'), - id: 'Runtime,SeriesSortName,SortName' - }], - callback: function () { - reloadItems(tabContent); - }, - query: getQuery(tabContent), - button: e.target - }); - }); - - var btnSelectView = tabContent.querySelector('.btnSelectView'); - btnSelectView.addEventListener('click', function (e) { - - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); - }); - - btnSelectView.addEventListener('layoutchange', function (e) { - - var viewStyle = e.detail.viewStyle; - getPageData(tabContent).view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); - onViewStyleChange(); - reloadItems(tabContent); - }); - } - - self.getCurrentViewStyle = function () { - return getPageData(tabContent).view; - }; - - initPage(tabContent); - onViewStyleChange(); - - self.renderTab = function () { - - reloadItems(tabContent); - }; - - self.destroy = function () { - }; - }; -}); \ No newline at end of file +define(["events","libraryBrowser","imageLoader","listView","cardBuilder","emby-itemscontainer"],function(events,libraryBrowser,imageLoader,listView,cardBuilder){"use strict";return function(view,params,tabContent){function getPageData(context){var key=getSavedQueryKey(context),pageData=data[key];return pageData||(pageData=data[key]={query:{SortBy:"SeriesSortName,SortName",SortOrder:"Ascending",IncludeItemTypes:"Episode",Recursive:!0,Fields:"PrimaryImageAspectRatio,MediaSourceCount,UserData",IsMissing:!1,IsVirtualUnaired:!1,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb",StartIndex:0,Limit:pageSize},view:libraryBrowser.getSavedView(key)||"Poster"},pageData.query.ParentId=params.topParentId,libraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(context){return getPageData(context).query}function getSavedQueryKey(context){return context.savedQueryKey||(context.savedQueryKey=libraryBrowser.getSavedQueryKey("episodes")),context.savedQueryKey}function onViewStyleChange(){var viewStyle=self.getCurrentViewStyle(),itemsContainer=tabContent.querySelector(".itemsContainer");"List"==viewStyle?(itemsContainer.classList.add("vertical-list"),itemsContainer.classList.remove("vertical-wrap")):(itemsContainer.classList.remove("vertical-list"),itemsContainer.classList.add("vertical-wrap")),itemsContainer.innerHTML=""}function reloadItems(page){Dashboard.showLoadingMsg();var query=getQuery(page);ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){function onNextPageClick(){query.StartIndex+=query.Limit,reloadItems(tabContent)}function onPreviousPageClick(){query.StartIndex-=query.Limit,reloadItems(tabContent)}window.scrollTo(0,0);var html,pagingHtml=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1,addLayoutButton:!1,sortButton:!1,filterButton:!1}),viewStyle=self.getCurrentViewStyle(),itemsContainer=tabContent.querySelector(".itemsContainer");html="List"==viewStyle?listView.getListViewHtml({items:result.Items,sortBy:query.SortBy,showParentTitle:!0}):"PosterCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",showTitle:!0,showParentTitle:!0,scalable:!0,cardLayout:!0}):cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",showTitle:!0,showParentTitle:!0,overlayText:!0,scalable:!0,overlayPlayButton:!0});var i,length,elems=tabContent.querySelectorAll(".paging");for(i=0,length=elems.length;i",void Dashboard.alert({message:msg,title:Globalize.translate("HeaderForgotPassword")})}}return function(view,params){function onSubmit(e){return ApiClient.ajax({type:"POST",url:ApiClient.getUrl("Users/ForgotPassword"),dataType:"json",data:{EnteredUsername:view.querySelector("#txtName").value}}).then(processForgotPasswordResult),e.preventDefault(),!1}view.querySelector("form").addEventListener("submit",onSubmit)}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/forgotpasswordpin.js b/dashboard-ui/scripts/forgotpasswordpin.js index 5c167a094f..e23314ea11 100644 --- a/dashboard-ui/scripts/forgotpasswordpin.js +++ b/dashboard-ui/scripts/forgotpasswordpin.js @@ -1,56 +1 @@ -define([], function () { - 'use strict'; - - function processForgotPasswordResult(result) { - - if (result.Success) { - - var msg = Globalize.translate('MessagePasswordResetForUsers'); - - msg += '
'; - msg += '
'; - msg += result.UsersReset.join('
'); - - Dashboard.alert({ - - message: msg, - title: Globalize.translate('HeaderPasswordReset'), - - callback: function () { - - window.location.href = 'login.html'; - } - }); - return; - } - - Dashboard.alert({ - - message: Globalize.translate('MessageInvalidForgotPasswordPin'), - title: Globalize.translate('HeaderPasswordReset') - }); - return; - } - - return function (view, params) { - - function onSubmit(e) { - - ApiClient.ajax({ - - type: 'POST', - url: ApiClient.getUrl('Users/ForgotPassword/Pin'), - dataType: 'json', - data: { - Pin: view.querySelector('#txtPin').value - } - - }).then(processForgotPasswordResult); - - e.preventDefault(); - return false; - } - - view.querySelector('form').addEventListener('submit', onSubmit); - }; -}); \ No newline at end of file +define([],function(){"use strict";function processForgotPasswordResult(result){if(result.Success){var msg=Globalize.translate("MessagePasswordResetForUsers");return msg+="
",msg+="
",msg+=result.UsersReset.join("
"),void Dashboard.alert({message:msg,title:Globalize.translate("HeaderPasswordReset"),callback:function(){window.location.href="login.html"}})}Dashboard.alert({message:Globalize.translate("MessageInvalidForgotPasswordPin"),title:Globalize.translate("HeaderPasswordReset")})}return function(view,params){function onSubmit(e){return ApiClient.ajax({type:"POST",url:ApiClient.getUrl("Users/ForgotPassword/Pin"),dataType:"json",data:{Pin:view.querySelector("#txtPin").value}}).then(processForgotPasswordResult),e.preventDefault(),!1}view.querySelector("form").addEventListener("submit",onSubmit)}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/gamegenrepage.js b/dashboard-ui/scripts/gamegenrepage.js index f3af6e7e9f..7e294097e0 100644 --- a/dashboard-ui/scripts/gamegenrepage.js +++ b/dashboard-ui/scripts/gamegenrepage.js @@ -1,84 +1 @@ -define(['jQuery', 'imageLoader'], function ($, imageLoader) { - 'use strict'; - - // The base query options - var query = { - - SortBy: "SortName", - SortOrder: "Ascending", - Recursive: true, - Fields: "DateCreated,ItemCounts", - StartIndex: 0 - }; - - function getSavedQueryKey() { - - return LibraryBrowser.getSavedQueryKey(); - } - - function reloadItems(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getGameGenres(Dashboard.getCurrentUserId(), query).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - var html = ''; - - $('.listTopPaging', page).html(LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false - })); - - html = LibraryBrowser.getPosterViewHtml({ - items: result.Items, - shape: "backdrop", - preferThumb: true, - context: 'games', - showItemCounts: true, - centerText: true, - lazy: true - }); - - var elem = page.querySelector('#items'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - - $('.btnNextPage', page).on('click', function () { - query.StartIndex += query.Limit; - reloadItems(page); - }); - - $('.btnPreviousPage', page).on('click', function () { - query.StartIndex -= query.Limit; - reloadItems(page); - }); - - LibraryBrowser.saveQueryValues(getSavedQueryKey(), query); - - Dashboard.hideLoadingMsg(); - }); - } - - $(document).on('pagebeforeshow', "#gameGenresPage", function () { - - query.ParentId = LibraryMenu.getTopParentId(); - - var limit = LibraryBrowser.getDefaultPageSize(); - - // If the default page size has changed, the start index will have to be reset - if (limit != query.Limit) { - query.Limit = limit; - query.StartIndex = 0; - } - - LibraryBrowser.loadSavedQueryValues(getSavedQueryKey(), query); - - reloadItems(this); - }); - -}); \ No newline at end of file +define(["jQuery","imageLoader"],function($,imageLoader){"use strict";function getSavedQueryKey(){return LibraryBrowser.getSavedQueryKey()}function reloadItems(page){Dashboard.showLoadingMsg(),ApiClient.getGameGenres(Dashboard.getCurrentUserId(),query).then(function(result){window.scrollTo(0,0);var html="";$(".listTopPaging",page).html(LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1})),html=LibraryBrowser.getPosterViewHtml({items:result.Items,shape:"backdrop",preferThumb:!0,context:"games",showItemCounts:!0,centerText:!0,lazy:!0});var elem=page.querySelector("#items");elem.innerHTML=html,imageLoader.lazyChildren(elem),$(".btnNextPage",page).on("click",function(){query.StartIndex+=query.Limit,reloadItems(page)}),$(".btnPreviousPage",page).on("click",function(){query.StartIndex-=query.Limit,reloadItems(page)}),LibraryBrowser.saveQueryValues(getSavedQueryKey(),query),Dashboard.hideLoadingMsg()})}var query={SortBy:"SortName",SortOrder:"Ascending",Recursive:!0,Fields:"DateCreated,ItemCounts",StartIndex:0};$(document).on("pagebeforeshow","#gameGenresPage",function(){query.ParentId=LibraryMenu.getTopParentId();var limit=LibraryBrowser.getDefaultPageSize();limit!=query.Limit&&(query.Limit=limit,query.StartIndex=0),LibraryBrowser.loadSavedQueryValues(getSavedQueryKey(),query),reloadItems(this)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/gamespage.js b/dashboard-ui/scripts/gamespage.js index b97e6cf510..f42b133c16 100644 --- a/dashboard-ui/scripts/gamespage.js +++ b/dashboard-ui/scripts/gamespage.js @@ -1,186 +1 @@ -define(['jQuery', 'listView', 'imageLoader'], function ($, listView, imageLoader) { - 'use strict'; - - var data = {}; - - function getPageData(context) { - var key = getSavedQueryKey(context); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - SortBy: "SortName", - SortOrder: "Ascending", - MediaTypes: "Game", - Recursive: true, - Fields: "Genres,Studios,PrimaryImageAspectRatio,SortName", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - StartIndex: 0, - Limit: LibraryBrowser.getDefaultPageSize() - }, - view: LibraryBrowser.getSavedView(key) || 'Poster' - }; - - pageData.query.ParentId = LibraryMenu.getTopParentId(); - LibraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData; - } - - function getQuery(context) { - - return getPageData(context).query; - } - - function getSavedQueryKey(context) { - - if (!context.savedQueryKey) { - context.savedQueryKey = LibraryBrowser.getSavedQueryKey('games'); - } - return context.savedQueryKey; - } - - function reloadItems(page) { - - Dashboard.showLoadingMsg(); - - var query = getQuery(page); - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - var html = ''; - - $('.listTopPaging', page).html(LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - filterButton: true - })); - - var view = getPageData(page).view; - - if (view == "List") { - - html = listView.getListViewHtml({ - items: result.Items, - context: 'games', - sortBy: query.SortBy - }); - } - else if (view == "Poster") { - html = LibraryBrowser.getPosterViewHtml({ - items: result.Items, - shape: "auto", - context: 'games', - showTitle: true, - showParentTitle: true, - centerText: true - }); - } - else if (view == "PosterCard") { - html = LibraryBrowser.getPosterViewHtml({ - items: result.Items, - shape: "auto", - context: 'games', - showTitle: true, - showParentTitle: true, - cardLayout: true - }); - } - - var elem = page.querySelector('#items'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - - $('.btnNextPage', page).on('click', function () { - query.StartIndex += query.Limit; - reloadItems(page); - }); - - $('.btnPreviousPage', page).on('click', function () { - query.StartIndex -= query.Limit; - reloadItems(page); - }); - - $('.btnFilter', page).on('click', function () { - showFilterMenu(page); - }); - - LibraryBrowser.saveQueryValues(getSavedQueryKey(page), query); - - Dashboard.hideLoadingMsg(); - }); - } - - function showFilterMenu(page) { - - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { - - var filterDialog = new filterDialogFactory({ - query: getQuery(page), - mode: 'games' - }); - - Events.on(filterDialog, 'filterchange', function () { - reloadItems(page); - }); - - filterDialog.show(); - }); - } - - $(document).on('pageinit', "#gamesPage", function () { - - var page = this; - - $('.alphabetPicker', this).on('alphaselect', function (e, character) { - - var query = getQuery(page); - query.NameStartsWithOrGreater = character; - query.StartIndex = 0; - - reloadItems(page); - - }).on('alphaclear', function (e) { - - var query = getQuery(page); - query.NameStartsWithOrGreater = ''; - - reloadItems(page); - }); - - }).on('pagebeforeshow', "#gamesPage", function () { - - var page = this; - var query = getQuery(page); - query.ParentId = LibraryMenu.getTopParentId(); - - var limit = LibraryBrowser.getDefaultPageSize(); - - // If the default page size has changed, the start index will have to be reset - if (limit != query.Limit) { - query.Limit = limit; - query.StartIndex = 0; - } - - var viewkey = getSavedQueryKey(page); - - LibraryBrowser.loadSavedQueryValues(viewkey, query); - - LibraryBrowser.getSavedViewSetting(viewkey).then(function (val) { - - if (val) { - $('#selectView', page).val(val).trigger('change'); - } else { - reloadItems(page); - } - }); - }); - -}); \ No newline at end of file +define(["jQuery","listView","imageLoader"],function($,listView,imageLoader){"use strict";function getPageData(context){var key=getSavedQueryKey(context),pageData=data[key];return pageData||(pageData=data[key]={query:{SortBy:"SortName",SortOrder:"Ascending",MediaTypes:"Game",Recursive:!0,Fields:"Genres,Studios,PrimaryImageAspectRatio,SortName",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",StartIndex:0,Limit:LibraryBrowser.getDefaultPageSize()},view:LibraryBrowser.getSavedView(key)||"Poster"},pageData.query.ParentId=LibraryMenu.getTopParentId(),LibraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(context){return getPageData(context).query}function getSavedQueryKey(context){return context.savedQueryKey||(context.savedQueryKey=LibraryBrowser.getSavedQueryKey("games")),context.savedQueryKey}function reloadItems(page){Dashboard.showLoadingMsg();var query=getQuery(page);ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){window.scrollTo(0,0);var html="";$(".listTopPaging",page).html(LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,filterButton:!0}));var view=getPageData(page).view;"List"==view?html=listView.getListViewHtml({items:result.Items,context:"games",sortBy:query.SortBy}):"Poster"==view?html=LibraryBrowser.getPosterViewHtml({items:result.Items,shape:"auto",context:"games",showTitle:!0,showParentTitle:!0,centerText:!0}):"PosterCard"==view&&(html=LibraryBrowser.getPosterViewHtml({items:result.Items,shape:"auto",context:"games",showTitle:!0,showParentTitle:!0,cardLayout:!0}));var elem=page.querySelector("#items");elem.innerHTML=html,imageLoader.lazyChildren(elem),$(".btnNextPage",page).on("click",function(){query.StartIndex+=query.Limit,reloadItems(page)}),$(".btnPreviousPage",page).on("click",function(){query.StartIndex-=query.Limit,reloadItems(page)}),$(".btnFilter",page).on("click",function(){showFilterMenu(page)}),LibraryBrowser.saveQueryValues(getSavedQueryKey(page),query),Dashboard.hideLoadingMsg()})}function showFilterMenu(page){require(["components/filterdialog/filterdialog"],function(filterDialogFactory){var filterDialog=new filterDialogFactory({query:getQuery(page),mode:"games"});Events.on(filterDialog,"filterchange",function(){reloadItems(page)}),filterDialog.show()})}var data={};$(document).on("pageinit","#gamesPage",function(){var page=this;$(".alphabetPicker",this).on("alphaselect",function(e,character){var query=getQuery(page);query.NameStartsWithOrGreater=character,query.StartIndex=0,reloadItems(page)}).on("alphaclear",function(e){var query=getQuery(page);query.NameStartsWithOrGreater="",reloadItems(page)})}).on("pagebeforeshow","#gamesPage",function(){var page=this,query=getQuery(page);query.ParentId=LibraryMenu.getTopParentId();var limit=LibraryBrowser.getDefaultPageSize();limit!=query.Limit&&(query.Limit=limit,query.StartIndex=0);var viewkey=getSavedQueryKey(page);LibraryBrowser.loadSavedQueryValues(viewkey,query),LibraryBrowser.getSavedViewSetting(viewkey).then(function(val){val?$("#selectView",page).val(val).trigger("change"):reloadItems(page)})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/gamesrecommendedpage.js b/dashboard-ui/scripts/gamesrecommendedpage.js index b2e6dd1370..2d89ab7ed9 100644 --- a/dashboard-ui/scripts/gamesrecommendedpage.js +++ b/dashboard-ui/scripts/gamesrecommendedpage.js @@ -1,72 +1 @@ -define(['jQuery', 'imageLoader'], function ($, imageLoader) { - 'use strict'; - - $(document).on('pagebeforeshow', "#gamesRecommendedPage", function () { - - var parentId = LibraryMenu.getTopParentId(); - var userId = Dashboard.getCurrentUserId(); - - var page = this; - - var options = { - - IncludeItemTypes: "Game", - Limit: 18, - Fields: "PrimaryImageAspectRatio", - ParentId: parentId, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb" - }; - - ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { - - var recentlyAddedItems = page.querySelector('#recentlyAddedItems'); - recentlyAddedItems.innerHTML = LibraryBrowser.getPosterViewHtml({ - items: items, - transparent: true, - borderless: true, - shape: 'auto', - lazy: true - - }); - imageLoader.lazyChildren(recentlyAddedItems); - - }); - - options = { - - SortBy: "DatePlayed", - SortOrder: "Descending", - MediaTypes: "Game", - Limit: 18, - Recursive: true, - Filters: "IsPlayed", - Fields: "ItemCounts,AudioInfo,PrimaryImageAspectRatio", - ParentId: parentId, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb" - }; - - ApiClient.getItems(userId, options).then(function (result) { - - if (result.Items.length) { - $('#recentlyPlayedSection', page).show(); - } else { - $('#recentlyPlayedSection', page).hide(); - } - - var recentlyPlayedItems = page.querySelector('#recentlyPlayedItems'); - recentlyPlayedItems.innerHTML = LibraryBrowser.getPosterViewHtml({ - items: result.Items, - transparent: true, - borderless: true, - shape: 'auto', - lazy: true - - }); - imageLoader.lazyChildren(recentlyPlayedItems); - }); - - }); - -}); \ No newline at end of file +define(["jQuery","imageLoader"],function($,imageLoader){"use strict";$(document).on("pagebeforeshow","#gamesRecommendedPage",function(){var parentId=LibraryMenu.getTopParentId(),userId=Dashboard.getCurrentUserId(),page=this,options={IncludeItemTypes:"Game",Limit:18,Fields:"PrimaryImageAspectRatio",ParentId:parentId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb"};ApiClient.getJSON(ApiClient.getUrl("Users/"+userId+"/Items/Latest",options)).then(function(items){var recentlyAddedItems=page.querySelector("#recentlyAddedItems");recentlyAddedItems.innerHTML=LibraryBrowser.getPosterViewHtml({items:items,transparent:!0,borderless:!0,shape:"auto",lazy:!0}),imageLoader.lazyChildren(recentlyAddedItems)}),options={SortBy:"DatePlayed",SortOrder:"Descending",MediaTypes:"Game",Limit:18,Recursive:!0,Filters:"IsPlayed",Fields:"ItemCounts,AudioInfo,PrimaryImageAspectRatio",ParentId:parentId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb"},ApiClient.getItems(userId,options).then(function(result){result.Items.length?$("#recentlyPlayedSection",page).show():$("#recentlyPlayedSection",page).hide();var recentlyPlayedItems=page.querySelector("#recentlyPlayedItems");recentlyPlayedItems.innerHTML=LibraryBrowser.getPosterViewHtml({items:result.Items,transparent:!0,borderless:!0,shape:"auto",lazy:!0}),imageLoader.lazyChildren(recentlyPlayedItems)})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/gamestudiospage.js b/dashboard-ui/scripts/gamestudiospage.js index a4548fa81f..faec9b4215 100644 --- a/dashboard-ui/scripts/gamestudiospage.js +++ b/dashboard-ui/scripts/gamestudiospage.js @@ -1,85 +1 @@ -define(['jQuery', 'imageLoader'], function ($, imageLoader) { - 'use strict'; - - // The base query options - var query = { - - SortBy: "SortName", - SortOrder: "Ascending", - MediaTypes: "Game", - Recursive: true, - Fields: "ItemCounts", - StartIndex: 0 - }; - - function getSavedQueryKey() { - - return LibraryBrowser.getSavedQueryKey(); - } - - function reloadItems(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getStudios(Dashboard.getCurrentUserId(), query).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - var html = ''; - - $('.listTopPaging', page).html(LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false - })); - - html = LibraryBrowser.getPosterViewHtml({ - items: result.Items, - shape: "backdrop", - preferThumb: true, - context: 'games', - showItemCounts: true, - centerText: true, - lazy: true - }); - - var elem = page.querySelector('#items'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - - $('.btnNextPage', page).on('click', function () { - query.StartIndex += query.Limit; - reloadItems(page); - }); - - $('.btnPreviousPage', page).on('click', function () { - query.StartIndex -= query.Limit; - reloadItems(page); - }); - - LibraryBrowser.saveQueryValues(getSavedQueryKey(), query); - - Dashboard.hideLoadingMsg(); - }); - } - - $(document).on('pagebeforeshow', "#gameStudiosPage", function () { - - query.ParentId = LibraryMenu.getTopParentId(); - - var limit = LibraryBrowser.getDefaultPageSize(); - - // If the default page size has changed, the start index will have to be reset - if (limit != query.Limit) { - query.Limit = limit; - query.StartIndex = 0; - } - - LibraryBrowser.loadSavedQueryValues(getSavedQueryKey(), query); - - reloadItems(this); - }); - -}); \ No newline at end of file +define(["jQuery","imageLoader"],function($,imageLoader){"use strict";function getSavedQueryKey(){return LibraryBrowser.getSavedQueryKey()}function reloadItems(page){Dashboard.showLoadingMsg(),ApiClient.getStudios(Dashboard.getCurrentUserId(),query).then(function(result){window.scrollTo(0,0);var html="";$(".listTopPaging",page).html(LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1})),html=LibraryBrowser.getPosterViewHtml({items:result.Items,shape:"backdrop",preferThumb:!0,context:"games",showItemCounts:!0,centerText:!0,lazy:!0});var elem=page.querySelector("#items");elem.innerHTML=html,imageLoader.lazyChildren(elem),$(".btnNextPage",page).on("click",function(){query.StartIndex+=query.Limit,reloadItems(page)}),$(".btnPreviousPage",page).on("click",function(){query.StartIndex-=query.Limit,reloadItems(page)}),LibraryBrowser.saveQueryValues(getSavedQueryKey(),query),Dashboard.hideLoadingMsg()})}var query={SortBy:"SortName",SortOrder:"Ascending",MediaTypes:"Game",Recursive:!0,Fields:"ItemCounts",StartIndex:0};$(document).on("pagebeforeshow","#gameStudiosPage",function(){query.ParentId=LibraryMenu.getTopParentId();var limit=LibraryBrowser.getDefaultPageSize();limit!=query.Limit&&(query.Limit=limit,query.StartIndex=0),LibraryBrowser.loadSavedQueryValues(getSavedQueryKey(),query),reloadItems(this)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/gamesystemspage.js b/dashboard-ui/scripts/gamesystemspage.js index b581eeb5f1..34babe5735 100644 --- a/dashboard-ui/scripts/gamesystemspage.js +++ b/dashboard-ui/scripts/gamesystemspage.js @@ -1,77 +1 @@ -define(['jQuery', 'imageLoader'], function ($, imageLoader) { - 'use strict'; - - // The base query options - var query = { - - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "GameSystem", - Recursive: true, - Fields: "DateCreated", - StartIndex: 0, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb" - }; - - function getSavedQueryKey() { - - return LibraryBrowser.getSavedQueryKey(); - } - - function reloadItems(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - updateFilterControls(page); - - var html = LibraryBrowser.getPosterViewHtml({ - items: result.Items, - shape: "backdrop", - context: 'games', - showTitle: true, - centerText: true, - lazy: true - - }); - - var elem = page.querySelector('#items'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - - LibraryBrowser.saveQueryValues(getSavedQueryKey(), query); - - Dashboard.hideLoadingMsg(); - }); - } - - function updateFilterControls(page) { - - // Reset form values using the last used query - } - - $(document).on('pagebeforeshow', "#gamesystemsPage", function () { - - query.ParentId = LibraryMenu.getTopParentId(); - - var limit = LibraryBrowser.getDefaultPageSize(); - - // If the default page size has changed, the start index will have to be reset - if (limit != query.Limit) { - query.Limit = limit; - query.StartIndex = 0; - } - - LibraryBrowser.loadSavedQueryValues(getSavedQueryKey(), query); - - reloadItems(this); - - updateFilterControls(this); - }); - -}); +define(["jQuery","imageLoader"],function($,imageLoader){"use strict";function getSavedQueryKey(){return LibraryBrowser.getSavedQueryKey()}function reloadItems(page){Dashboard.showLoadingMsg(),ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){window.scrollTo(0,0),updateFilterControls(page);var html=LibraryBrowser.getPosterViewHtml({items:result.Items,shape:"backdrop",context:"games",showTitle:!0,centerText:!0,lazy:!0}),elem=page.querySelector("#items");elem.innerHTML=html,imageLoader.lazyChildren(elem),LibraryBrowser.saveQueryValues(getSavedQueryKey(),query),Dashboard.hideLoadingMsg()})}function updateFilterControls(page){}var query={SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"GameSystem",Recursive:!0,Fields:"DateCreated",StartIndex:0,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb"};$(document).on("pagebeforeshow","#gamesystemsPage",function(){query.ParentId=LibraryMenu.getTopParentId();var limit=LibraryBrowser.getDefaultPageSize();limit!=query.Limit&&(query.Limit=limit,query.StartIndex=0),LibraryBrowser.loadSavedQueryValues(getSavedQueryKey(),query),reloadItems(this),updateFilterControls(this)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/homefavorites.js b/dashboard-ui/scripts/homefavorites.js index 499c1206d5..2c543785f2 100644 --- a/dashboard-ui/scripts/homefavorites.js +++ b/dashboard-ui/scripts/homefavorites.js @@ -1,15 +1 @@ -define(['components/favoriteitems'], function (favoriteItems) { - 'use strict'; - - return function (view, params, tabContent) { - - var self = this; - - self.renderTab = function () { - - var parentId = null; - favoriteItems.render(tabContent, Dashboard.getCurrentUserId(), parentId); - }; - }; - -}); \ No newline at end of file +define(["components/favoriteitems"],function(favoriteItems){"use strict";return function(view,params,tabContent){var self=this;self.renderTab=function(){var parentId=null;favoriteItems.render(tabContent,Dashboard.getCurrentUserId(),parentId)}}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/homenextup.js b/dashboard-ui/scripts/homenextup.js index cc27ea01b2..28c26a1fc5 100644 --- a/dashboard-ui/scripts/homenextup.js +++ b/dashboard-ui/scripts/homenextup.js @@ -1,71 +1 @@ -define(['components/categorysyncbuttons', 'cardBuilder', 'apphost', 'imageLoader', 'emby-itemscontainer'], function (categorysyncbuttons, cardBuilder, appHost, imageLoader) { - 'use strict'; - - function getNextUpPromise() { - - var query = { - - Limit: 24, - Fields: "PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo", - UserId: Dashboard.getCurrentUserId(), - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb" - }; - - return ApiClient.getNextUpEpisodes(query); - } - function loadNextUp(page, promise) { - - promise.then(function (result) { - - if (result.Items.length) { - page.querySelector('.noNextUpItems').classList.add('hide'); - } else { - page.querySelector('.noNextUpItems').classList.remove('hide'); - } - - var html = ''; - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - html += cardBuilder.getCardsHtml({ - items: result.Items, - shape: "backdrop", - showTitle: true, - showParentTitle: true, - overlayText: false, - lazy: true, - preferThumb: true, - showDetailsMenu: true, - centerText: !supportsImageAnalysis, - overlayPlayButton: true, - context: 'home-nextup', - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - }); - - var elem = page.querySelector('#nextUpItems'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - Dashboard.hideLoadingMsg(); - }); - } - return function (view, params, tabContent) { - - var self = this; - var nextUpPromise; - - categorysyncbuttons.init(view); - - self.preRender = function () { - nextUpPromise = getNextUpPromise(); - }; - - self.renderTab = function () { - - Dashboard.showLoadingMsg(); - loadNextUp(view, nextUpPromise); - }; - }; - -}); \ No newline at end of file +define(["components/categorysyncbuttons","cardBuilder","apphost","imageLoader","emby-itemscontainer"],function(categorysyncbuttons,cardBuilder,appHost,imageLoader){"use strict";function getNextUpPromise(){var query={Limit:24,Fields:"PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo",UserId:Dashboard.getCurrentUserId(),ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb"};return ApiClient.getNextUpEpisodes(query)}function loadNextUp(page,promise){promise.then(function(result){result.Items.length?page.querySelector(".noNextUpItems").classList.add("hide"):page.querySelector(".noNextUpItems").classList.remove("hide");var html="",supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",showTitle:!0,showParentTitle:!0,overlayText:!1,lazy:!0,preferThumb:!0,showDetailsMenu:!0,centerText:!supportsImageAnalysis,overlayPlayButton:!0,context:"home-nextup",cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis});var elem=page.querySelector("#nextUpItems");elem.innerHTML=html,imageLoader.lazyChildren(elem),Dashboard.hideLoadingMsg()})}return function(view,params,tabContent){var nextUpPromise,self=this;categorysyncbuttons.init(view),self.preRender=function(){nextUpPromise=getNextUpPromise()},self.renderTab=function(){Dashboard.showLoadingMsg(),loadNextUp(view,nextUpPromise)}}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/homeupcoming.js b/dashboard-ui/scripts/homeupcoming.js index f5084c03e2..7f2eb69b37 100644 --- a/dashboard-ui/scripts/homeupcoming.js +++ b/dashboard-ui/scripts/homeupcoming.js @@ -1,155 +1 @@ -define(['datetime', 'cardBuilder', 'apphost', 'imageLoader', 'emby-itemscontainer', 'scrollStyles'], function (datetime, cardBuilder, appHost, imageLoader) { - 'use strict'; - - function getUpcomingPromise() { - - Dashboard.showLoadingMsg(); - - var query = { - - Limit: 40, - Fields: "AirTime,UserData", - UserId: Dashboard.getCurrentUserId(), - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - EnableTotalRecordCount: false - }; - - return ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming", query)); - } - - function loadUpcoming(page, promise) { - - promise.then(function (result) { - - var items = result.Items; - - if (items.length) { - page.querySelector('.noItemsMessage').style.display = 'none'; - } else { - page.querySelector('.noItemsMessage').style.display = 'block'; - } - - var elem = page.querySelector('#upcomingItems'); - renderUpcoming(elem, items); - - Dashboard.hideLoadingMsg(); - }); - } - - function enableScrollX() { - return browserInfo.mobile; - } - - function getThumbShape() { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - } - - function renderUpcoming(elem, items) { - - var groups = []; - - var currentGroupName = ''; - var currentGroup = []; - - var i, length; - - for (i = 0, length = items.length; i < length; i++) { - - var item = items[i]; - - var dateText = ''; - - if (item.PremiereDate) { - try { - - var premiereDate = datetime.parseISO8601Date(item.PremiereDate, true); - - if (datetime.isRelativeDay(premiereDate, -1)) { - dateText = Globalize.translate('Yesterday'); - } else { - dateText = LibraryBrowser.getFutureDateText(premiereDate, true); - } - - } catch (err) { - } - } - - if (dateText != currentGroupName) { - - if (currentGroup.length) { - groups.push({ - name: currentGroupName, - items: currentGroup - }); - } - - currentGroupName = dateText; - currentGroup = [item]; - } else { - currentGroup.push(item); - } - } - - var html = ''; - - for (i = 0, length = groups.length; i < length; i++) { - - var group = groups[i]; - - html += '
'; - html += '

' + group.name + '

'; - - var allowBottomPadding = true; - - if (enableScrollX()) { - allowBottomPadding = false; - html += '
'; - } else { - html += '
'; - } - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - html += cardBuilder.getCardsHtml({ - items: group.items, - showLocationTypeIndicator: false, - shape: getThumbShape(), - showTitle: true, - preferThumb: true, - lazy: true, - showDetailsMenu: true, - centerText: !supportsImageAnalysis, - context: 'home-upcoming', - overlayMoreButton: !supportsImageAnalysis, - showParentTitle: true, - allowBottomPadding: allowBottomPadding, - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - - }); - html += '
'; - - html += '
'; - } - - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - } - return function (view, params, tabContent) { - - var self = this; - var upcomingPromise; - - self.preRender = function () { - upcomingPromise = getUpcomingPromise(); - }; - - self.renderTab = function () { - - Dashboard.showLoadingMsg(); - loadUpcoming(view, upcomingPromise); - }; - }; - -}); \ No newline at end of file +define(["datetime","cardBuilder","apphost","imageLoader","emby-itemscontainer","scrollStyles"],function(datetime,cardBuilder,appHost,imageLoader){"use strict";function getUpcomingPromise(){Dashboard.showLoadingMsg();var query={Limit:40,Fields:"AirTime,UserData",UserId:Dashboard.getCurrentUserId(),ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",EnableTotalRecordCount:!1};return ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming",query))}function loadUpcoming(page,promise){promise.then(function(result){var items=result.Items;items.length?page.querySelector(".noItemsMessage").style.display="none":page.querySelector(".noItemsMessage").style.display="block";var elem=page.querySelector("#upcomingItems");renderUpcoming(elem,items),Dashboard.hideLoadingMsg()})}function enableScrollX(){return browserInfo.mobile}function getThumbShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function renderUpcoming(elem,items){var i,length,groups=[],currentGroupName="",currentGroup=[];for(i=0,length=items.length;i',html+='

'+group.name+"

";var allowBottomPadding=!0;enableScrollX()?(allowBottomPadding=!1,html+='
'):html+='
';var supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:group.items,showLocationTypeIndicator:!1,shape:getThumbShape(),showTitle:!0,preferThumb:!0,lazy:!0,showDetailsMenu:!0,centerText:!supportsImageAnalysis,context:"home-upcoming",overlayMoreButton:!supportsImageAnalysis,showParentTitle:!0,allowBottomPadding:allowBottomPadding,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
",html+="
"}elem.innerHTML=html,imageLoader.lazyChildren(elem)}return function(view,params,tabContent){var upcomingPromise,self=this;self.preRender=function(){upcomingPromise=getUpcomingPromise()},self.renderTab=function(){Dashboard.showLoadingMsg(),loadUpcoming(view,upcomingPromise)}}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/indexpage.js b/dashboard-ui/scripts/indexpage.js index 2be50971d8..62cf4c6e27 100644 --- a/dashboard-ui/scripts/indexpage.js +++ b/dashboard-ui/scripts/indexpage.js @@ -1,368 +1 @@ -define(['libraryBrowser', 'playbackManager', 'emby-tabs', 'emby-button'], function (libraryBrowser, playbackManager) { - 'use strict'; - - var defaultFirstSection = 'smalllibrarytiles'; - - function getDefaultSection(index) { - - switch (index) { - - case 0: - return defaultFirstSection; - case 1: - return 'resume'; - case 2: - return 'nextup'; - case 3: - return 'latestmedia'; - case 4: - return 'latesttvrecordings'; - default: - return ''; - } - } - - function loadSection(page, user, userSettings, index) { - - var userId = user.Id; - - var section = userSettings.get('homesection' + index) || getDefaultSection(index); - - if (section == 'folders') { - section = defaultFirstSection; - } - - var elem = page.querySelector('.section' + index); - - if (section == 'latestmedia') { - return Sections.loadRecentlyAdded(elem, user); - } - else if (section == 'librarytiles') { - return Sections.loadLibraryTiles(elem, user, 'backdrop', index); - } - else if (section == 'smalllibrarytiles') { - return Sections.loadLibraryTiles(elem, user, 'smallBackdrop', index); - } - else if (section == 'smalllibrarytiles-automobile') { - return Sections.loadLibraryTiles(elem, user, 'smallBackdrop', index); - } - else if (section == 'librarytiles-automobile') { - return Sections.loadLibraryTiles(elem, user, 'backdrop', index); - } - else if (section == 'librarybuttons') { - return Sections.loadlibraryButtons(elem, userId, index); - } - else if (section == 'resume') { - return Sections.loadResume(elem, userId); - } - else if (section == 'nextup') { - return Sections.loadNextUp(elem, userId); - } - else if (section == 'latesttvrecordings') { - return Sections.loadLatestLiveTvRecordings(elem, userId); - } - else if (section == 'latestchannelmedia') { - return Sections.loadLatestChannelMedia(elem, userId); - - } else { - - elem.innerHTML = ''; - - return Promise.resolve(); - } - } - - function loadSections(page, user, userSettings) { - - var i, length; - var sectionCount = 5; - - var elem = page.querySelector('.sections'); - - //if (!elem.innerHTML.length) { - var html = ''; - for (i = 0, length = sectionCount; i < length; i++) { - - html += '
'; - } - - elem.innerHTML = html; - //} - - var promises = []; - - for (i = 0, length = sectionCount; i < length; i++) { - - promises.push(loadSection(page, user, userSettings, i)); - } - - return Promise.all(promises); - } - - var homePageDismissValue = '14'; - var homePageTourKey = 'homePageTour'; - - function displayPreferencesKey() { - if (AppInfo.isNativeApp) { - return 'Emby Mobile'; - } - - return 'webclient'; - } - - function dismissWelcome(page, userId) { - - getDisplayPreferences('home', userId).then(function (result) { - - result.CustomPrefs[homePageTourKey] = homePageDismissValue; - ApiClient.updateDisplayPreferences('home', result, userId, displayPreferencesKey()); - }); - } - - function showWelcomeIfNeeded(page, displayPreferences) { - - if (displayPreferences.CustomPrefs[homePageTourKey] == homePageDismissValue) { - page.querySelector('.welcomeMessage').classList.add('hide'); - } else { - - Dashboard.hideLoadingMsg(); - - var elem = page.querySelector('.welcomeMessage'); - elem.classList.remove('hide'); - - if (displayPreferences.CustomPrefs[homePageTourKey]) { - - elem.querySelector('.tourHeader').innerHTML = Globalize.translate('HeaderWelcomeBack'); - elem.querySelector('.tourButtonText').innerHTML = Globalize.translate('ButtonTakeTheTourToSeeWhatsNew'); - - } else { - - elem.querySelector('.tourHeader').innerHTML = Globalize.translate('HeaderWelcomeToProjectWebClient'); - elem.querySelector('.tourButtonText').innerHTML = Globalize.translate('ButtonTakeTheTour'); - } - } - } - - function takeTour(page, userId) { - - require(['slideshow'], function () { - - var slides = [ - { imageUrl: 'css/images/tour/web/tourcontent.jpg', title: Globalize.translate('WebClientTourContent') }, - { imageUrl: 'css/images/tour/web/tourmovies.jpg', title: Globalize.translate('WebClientTourMovies') }, - { imageUrl: 'css/images/tour/web/tourmouseover.jpg', title: Globalize.translate('WebClientTourMouseOver') }, - { imageUrl: 'css/images/tour/web/tourtaphold.jpg', title: Globalize.translate('WebClientTourTapHold') }, - { imageUrl: 'css/images/tour/web/tourmysync.png', title: Globalize.translate('WebClientTourMySync') }, - { imageUrl: 'css/images/tour/web/toureditor.png', title: Globalize.translate('WebClientTourMetadataManager') }, - { imageUrl: 'css/images/tour/web/tourplaylist.png', title: Globalize.translate('WebClientTourPlaylists') }, - { imageUrl: 'css/images/tour/web/tourcollections.jpg', title: Globalize.translate('WebClientTourCollections') }, - { imageUrl: 'css/images/tour/web/tourusersettings1.png', title: Globalize.translate('WebClientTourUserPreferences1') }, - { imageUrl: 'css/images/tour/web/tourusersettings2.png', title: Globalize.translate('WebClientTourUserPreferences2') }, - { imageUrl: 'css/images/tour/web/tourusersettings3.png', title: Globalize.translate('WebClientTourUserPreferences3') }, - { imageUrl: 'css/images/tour/web/tourusersettings4.png', title: Globalize.translate('WebClientTourUserPreferences4') }, - { imageUrl: 'css/images/tour/web/tourmobile1.jpg', title: Globalize.translate('WebClientTourMobile1') }, - { imageUrl: 'css/images/tour/web/tourmobile2.png', title: Globalize.translate('WebClientTourMobile2') }, - { imageUrl: 'css/images/tour/enjoy.jpg', title: Globalize.translate('MessageEnjoyYourStay') } - ]; - - require(['slideshow'], function (slideshow) { - - var newSlideShow = new slideshow({ - slides: slides, - interactive: true, - loop: false - }); - - newSlideShow.show(); - - dismissWelcome(page, userId); - page.querySelector('.welcomeMessage').classList.add('hide'); - }); - }); - } - - function getRequirePromise(deps) { - - return new Promise(function (resolve, reject) { - - require(deps, resolve); - }); - } - - function loadHomeTab(page, tabContent) { - - if (window.ApiClient) { - var userId = Dashboard.getCurrentUserId(); - Dashboard.showLoadingMsg(); - - var promises = [ - getDisplayPreferences('home', userId), - Dashboard.getCurrentUser(), - getRequirePromise(['userSettings']) - ]; - - Promise.all(promises).then(function(responses) { - var displayPreferences = responses[0]; - var user = responses[1]; - var userSettings = responses[2]; - - loadSections(tabContent, user, userSettings).then(function () { - - if (!AppInfo.isNativeApp) { - showWelcomeIfNeeded(page, displayPreferences); - } - Dashboard.hideLoadingMsg(); - }); - }); - } - } - - function getDisplayPreferences(key, userId) { - - return ApiClient.getDisplayPreferences(key, userId, displayPreferencesKey()); - } - - return function (view, params) { - - var self = this; - - self.renderTab = function () { - var tabContent = view.querySelector('.pageTabContent[data-index=\'' + 0 + '\']'); - loadHomeTab(view, tabContent); - }; - - var viewTabs = view.querySelector('.libraryViewNav'); - - libraryBrowser.configurePaperLibraryTabs(view, viewTabs, view.querySelectorAll('.pageTabContent'), [0, 1, 2, 3], AppInfo.enableHomeTabs); - - var tabControllers = []; - var renderedTabs = []; - - function getTabController(page, index, callback) { - - var depends = []; - - switch (index) { - - case 0: - depends.push('scripts/sections'); - break; - case 1: - depends.push('scripts/homenextup'); - break; - case 2: - depends.push('scripts/homefavorites'); - break; - case 3: - depends.push('scripts/homeupcoming'); - break; - default: - return; - } - - require(depends, function (controllerFactory) { - var tabContent; - if (index == 0) { - tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); - self.tabContent = tabContent; - } - var controller = tabControllers[index]; - if (!controller) { - tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); - controller = index ? new controllerFactory(view, params, tabContent) : self; - tabControllers[index] = controller; - - if (controller.initTab) { - controller.initTab(); - } - } - - callback(controller); - }); - } - - function preLoadTab(page, index) { - - getTabController(page, index, function (controller) { - if (renderedTabs.indexOf(index) == -1) { - if (controller.preRender) { - controller.preRender(); - } - } - }); - } - - function loadTab(page, index) { - - getTabController(page, index, function (controller) { - if (renderedTabs.indexOf(index) == -1) { - renderedTabs.push(index); - controller.renderTab(); - } - }); - } - - viewTabs.addEventListener('beforetabchange', function (e) { - preLoadTab(view, parseInt(e.detail.selectedTabIndex)); - }); - - viewTabs.addEventListener('tabchange', function (e) { - loadTab(view, parseInt(e.detail.selectedTabIndex)); - }); - - view.querySelector('.btnTakeTour').addEventListener('click', function () { - takeTour(view, Dashboard.getCurrentUserId()); - }); - - if (AppInfo.enableHomeTabs) { - view.classList.remove('noSecondaryNavPage'); - view.querySelector('.libraryViewNav').classList.remove('hide'); - } else { - view.classList.add('noSecondaryNavPage'); - view.querySelector('.libraryViewNav').classList.add('hide'); - } - - function onPlaybackStop(e, state) { - - if (state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') { - - viewTabs.triggerTabChange(); - } - } - - function onWebSocketMessage(e, data) { - - var msg = data; - - if (msg.MessageType === "UserDataChanged") { - - if (msg.Data.UserId == Dashboard.getCurrentUserId()) { - - renderedTabs = []; - } - } - - } - - view.addEventListener('viewshow', function (e) { - Events.on(playbackManager, 'playbackstop', onPlaybackStop); - Events.on(ApiClient, "websocketmessage", onWebSocketMessage); - }); - - view.addEventListener('viewbeforehide', function (e) { - Events.off(playbackManager, 'playbackstop', onPlaybackStop); - Events.off(ApiClient, "websocketmessage", onWebSocketMessage); - }); - - require(["headroom-window"], function (headroom) { - headroom.add(viewTabs); - self.headroom = headroom; - }); - - view.addEventListener('viewdestroy', function (e) { - if (self.headroom) { - self.headroom.remove(viewTabs); - } - }); - }; -}); \ No newline at end of file +define(["libraryBrowser","playbackManager","emby-tabs","emby-button"],function(libraryBrowser,playbackManager){"use strict";function getDefaultSection(index){switch(index){case 0:return defaultFirstSection;case 1:return"resume";case 2:return"nextup";case 3:return"latestmedia";case 4:return"latesttvrecordings";default:return""}}function loadSection(page,user,userSettings,index){var userId=user.Id,section=userSettings.get("homesection"+index)||getDefaultSection(index);"folders"==section&&(section=defaultFirstSection);var elem=page.querySelector(".section"+index);return"latestmedia"==section?Sections.loadRecentlyAdded(elem,user):"librarytiles"==section?Sections.loadLibraryTiles(elem,user,"backdrop",index):"smalllibrarytiles"==section?Sections.loadLibraryTiles(elem,user,"smallBackdrop",index):"smalllibrarytiles-automobile"==section?Sections.loadLibraryTiles(elem,user,"smallBackdrop",index):"librarytiles-automobile"==section?Sections.loadLibraryTiles(elem,user,"backdrop",index):"librarybuttons"==section?Sections.loadlibraryButtons(elem,userId,index):"resume"==section?Sections.loadResume(elem,userId):"nextup"==section?Sections.loadNextUp(elem,userId):"latesttvrecordings"==section?Sections.loadLatestLiveTvRecordings(elem,userId):"latestchannelmedia"==section?Sections.loadLatestChannelMedia(elem,userId):(elem.innerHTML="",Promise.resolve())}function loadSections(page,user,userSettings){var i,length,sectionCount=5,elem=page.querySelector(".sections"),html="";for(i=0,length=sectionCount;i
';elem.innerHTML=html;var promises=[];for(i=0,length=sectionCount;i'; - - html += '
'; - html += '

'; - html += section.name; - html += '

'; - html += ''; - html += '
'; - - html += '
'; - html += '
'; - - html += '
'; - - return html; - - }).join(''); - - var sectionElems = elem.querySelectorAll('.homePageSection'); - for (var i = 0, length = sectionElems.length; i < length; i++) { - renderSection(page, item, sectionElems[i], sectionElems[i].getAttribute('data-type')); - } - } - - function renderSection(page, item, element, type) { - - switch (type) { - - case 'Program': - loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Program", - PersonTypes: "", - ArtistIds: "", - Limit: 10 - }, { - shape: "backdrop", - showTitle: true, - centerText: true, - overlayMoreButton: true, - preferThumb: true, - overlayText: false, - showAirTime: true, - showAirDateTime: true, - showChannelName: true - }); - break; - - case 'Movie': - loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Movie", - PersonTypes: "", - ArtistIds: "", - Limit: 10 - }, { - shape: "portrait", - showTitle: true, - centerText: true, - overlayMoreButton: true, - overlayText: false - }); - break; - - case 'MusicVideo': - loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "MusicVideo", - PersonTypes: "", - ArtistIds: "", - Limit: 10 - }, { - shape: "portrait", - showTitle: true, - centerText: true, - overlayPlayButton: true - }); - break; - - case 'Game': - loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Game", - PersonTypes: "", - ArtistIds: "", - Limit: 10 - }, { - shape: "portrait", - showTitle: true, - centerText: true, - overlayMoreButton: true - }); - break; - - case 'Trailer': - loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Trailer", - PersonTypes: "", - ArtistIds: "", - Limit: 10 - }, { - shape: "portrait", - showTitle: true, - centerText: true, - overlayPlayButton: true - }); - break; - - case 'Series': - loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Series", - PersonTypes: "", - ArtistIds: "", - Limit: 10 - }, { - shape: "portrait", - showTitle: true, - centerText: true, - overlayMoreButton: true - }); - break; - - case 'MusicAlbum': - loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "MusicAlbum", - PersonTypes: "", - ArtistIds: "", - Limit: 8 - }, { - shape: "square", - playFromHere: true, - showTitle: true, - showParentTitle: true, - coverImage: true, - centerText: true, - overlayPlayButton: true - }); - break; - - case 'MusicArtist': - loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "MusicArtist", - PersonTypes: "", - ArtistIds: "", - Limit: 8 - }, { - shape: "square", - playFromHere: true, - showTitle: true, - showParentTitle: true, - coverImage: true, - centerText: true, - overlayPlayButton: true - }); - break; - - case 'Episode': - loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Episode", - PersonTypes: "", - ArtistIds: "", - Limit: 6 - }, { - shape: "backdrop", - showTitle: true, - showParentTitle: true, - centerText: true, - overlayPlayButton: true - }); - break; - - case 'Audio': - loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Audio", - PersonTypes: "", - ArtistIds: "", - Limit: 40 - }, { - playFromHere: true, - action: 'playallfromhere', - smallIcon: true, - artist: true - }); - break; - - default: - break; - } - } - - function loadItems(element, item, type, query, listOptions) { - - query = getQuery(query, item); - - getItemsFunction(query, item)(query.StartIndex, query.Limit, query.Fields).then(function (result) { - - var html = ''; - - if (query.Limit && result.TotalRecordCount > query.Limit) { - // Add more button - var link = element.querySelector('a'); - link.classList.remove('hide'); - link.setAttribute('href', getMoreItemsHref(item, type)); - } else { - element.querySelector('a').classList.add('hide'); - } - - listOptions.items = result.Items; - var itemsContainer = element.querySelector('.itemsContainer'); - - if (type == 'Audio') { - html = listView.getListViewHtml(listOptions); - itemsContainer.classList.remove('vertical-wrap'); - itemsContainer.classList.add('vertical-list'); - } else { - html = cardBuilder.getCardsHtml(listOptions); - itemsContainer.classList.add('vertical-wrap'); - itemsContainer.classList.remove('vertical-list'); - } - - itemsContainer.innerHTML = html; - - imageLoader.lazyChildren(itemsContainer); - }); - } - - function getMoreItemsHref(item, type) { - - if (item.Type == 'Genre' || item.Type == 'MusicGenre' || item.Type == 'GameGenre') { - return 'secondaryitems.html?type=' + type + '&genreId=' + item.Id; - } - - if (item.Type == 'Studio') { - return 'secondaryitems.html?type=' + type + '&studioId=' + item.Id; - } - - if (item.Type == 'MusicArtist') { - return 'secondaryitems.html?type=' + type + '&artistId=' + item.Id; - } - - if (item.Type == 'Person') { - return 'secondaryitems.html?type=' + type + '&personId=' + item.Id; - } - - return 'secondaryitems.html?type=' + type + '&parentId=' + item.Id; - } - - function addCurrentItemToQuery(query, item) { - - if (item.Type == "Person") { - query.PersonIds = item.Id; - } - else if (item.Type == "Genre") { - query.Genres = item.Name; - } - else if (item.Type == "MusicGenre") { - query.Genres = item.Name; - } - else if (item.Type == "GameGenre") { - query.Genres = item.Name; - } - else if (item.Type == "Studio") { - query.StudioIds = item.Id; - } - else if (item.Type == "MusicArtist") { - query.ArtistIds = item.Id; - } - } - - function getQuery(options, item) { - - var query = { - - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "", - Recursive: true, - Fields: "AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio,BasicSyncInfo", - Limit: LibraryBrowser.getDefaultPageSize(), - StartIndex: 0, - CollapseBoxSetItems: false - }; - - query = Object.assign(query, options || {}); - - if (query.IncludeItemTypes == "Audio") { - query.SortBy = "AlbumArtist,Album,SortName"; - } - - addCurrentItemToQuery(query, item); - - return query; - } - - function getItemsFunction(options, item) { - - var query = getQuery(options, item); - - return function (index, limit, fields) { - - query.StartIndex = index; - query.Limit = limit; - - if (fields) { - query.Fields += "," + fields; - } - - return ApiClient.getItems(Dashboard.getCurrentUserId(), query); - - }; - - } - - window.ItemsByName = { - renderItems: renderItems - }; - -}); \ No newline at end of file +define(["listView","cardBuilder","imageLoader","emby-itemscontainer"],function(listView,cardBuilder,imageLoader){"use strict";function renderItems(page,item){var sections=[];item.ArtistCount&§ions.push({name:Globalize.translate("TabArtists"),type:"MusicArtist"}),item.ProgramCount&&"Person"==item.Type&§ions.push({name:Globalize.translate("HeaderUpcomingOnTV"),type:"Program"}),item.MovieCount&§ions.push({name:Globalize.translate("TabMovies"),type:"Movie"}),item.SeriesCount&§ions.push({name:Globalize.translate("TabSeries"),type:"Series"}),item.EpisodeCount&§ions.push({name:Globalize.translate("TabEpisodes"),type:"Episode"}),item.TrailerCount&§ions.push({name:Globalize.translate("TabTrailers"),type:"Trailer"}),item.GameCount&§ions.push({name:Globalize.translate("TabGames"),type:"Game"}),item.AlbumCount&§ions.push({name:Globalize.translate("TabAlbums"),type:"MusicAlbum"}),item.SongCount&§ions.push({name:Globalize.translate("TabSongs"),type:"Audio"}),item.MusicVideoCount&§ions.push({name:Globalize.translate("TabMusicVideos"),type:"MusicVideo"});var elem=page.querySelector("#childrenContent");elem.innerHTML=sections.map(function(section){var html="";return html+='
',html+="
",html+='

',html+=section.name,html+="

",html+='",html+="
",html+='
',html+="
",html+="
"}).join("");for(var sectionElems=elem.querySelectorAll(".homePageSection"),i=0,length=sectionElems.length;iquery.Limit){var link=element.querySelector("a");link.classList.remove("hide"),link.setAttribute("href",getMoreItemsHref(item,type))}else element.querySelector("a").classList.add("hide");listOptions.items=result.Items;var itemsContainer=element.querySelector(".itemsContainer");"Audio"==type?(html=listView.getListViewHtml(listOptions),itemsContainer.classList.remove("vertical-wrap"),itemsContainer.classList.add("vertical-list")):(html=cardBuilder.getCardsHtml(listOptions),itemsContainer.classList.add("vertical-wrap"),itemsContainer.classList.remove("vertical-list")),itemsContainer.innerHTML=html,imageLoader.lazyChildren(itemsContainer)})}function getMoreItemsHref(item,type){return"Genre"==item.Type||"MusicGenre"==item.Type||"GameGenre"==item.Type?"secondaryitems.html?type="+type+"&genreId="+item.Id:"Studio"==item.Type?"secondaryitems.html?type="+type+"&studioId="+item.Id:"MusicArtist"==item.Type?"secondaryitems.html?type="+type+"&artistId="+item.Id:"Person"==item.Type?"secondaryitems.html?type="+type+"&personId="+item.Id:"secondaryitems.html?type="+type+"&parentId="+item.Id}function addCurrentItemToQuery(query,item){"Person"==item.Type?query.PersonIds=item.Id:"Genre"==item.Type?query.Genres=item.Name:"MusicGenre"==item.Type?query.Genres=item.Name:"GameGenre"==item.Type?query.Genres=item.Name:"Studio"==item.Type?query.StudioIds=item.Id:"MusicArtist"==item.Type&&(query.ArtistIds=item.Id)}function getQuery(options,item){var query={SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"",Recursive:!0,Fields:"AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio,BasicSyncInfo",Limit:LibraryBrowser.getDefaultPageSize(),StartIndex:0,CollapseBoxSetItems:!1};return query=Object.assign(query,options||{}),"Audio"==query.IncludeItemTypes&&(query.SortBy="AlbumArtist,Album,SortName"),addCurrentItemToQuery(query,item),query}function getItemsFunction(options,item){var query=getQuery(options,item);return function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,fields&&(query.Fields+=","+fields),ApiClient.getItems(Dashboard.getCurrentUserId(),query)}}window.ItemsByName={renderItems:renderItems}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index c5d0494021..931440a29e 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -1,2465 +1,2 @@ -define(['layoutManager', 'cardBuilder', 'datetime', 'mediaInfo', 'backdrop', 'listView', 'itemContextMenu', 'itemHelper', 'userdataButtons', 'dom', 'indicators', 'apphost', 'imageLoader', 'libraryMenu', 'globalize', 'browser', 'events', 'scrollHelper', 'playbackManager', 'scrollStyles', 'emby-itemscontainer', 'emby-checkbox'], function (layoutManager, cardBuilder, datetime, mediaInfo, backdrop, listView, itemContextMenu, itemHelper, userdataButtons, dom, indicators, appHost, imageLoader, libraryMenu, globalize, browser, events, scrollHelper, playbackManager) { - 'use strict'; - - function getPromise(params) { - - var id = params.id; - - if (id) { - return ApiClient.getItem(Dashboard.getCurrentUserId(), id); - } - - if (params.seriesTimerId) { - return ApiClient.getLiveTvSeriesTimer(params.seriesTimerId); - } - - var name = params.genre; - - if (name) { - return ApiClient.getGenre(name, Dashboard.getCurrentUserId()); - } - - name = params.musicgenre; - - if (name) { - return ApiClient.getMusicGenre(name, Dashboard.getCurrentUserId()); - } - - name = params.gamegenre; - - if (name) { - return ApiClient.getGameGenre(name, Dashboard.getCurrentUserId()); - } - - name = params.musicartist; - - if (name) { - return ApiClient.getArtist(name, Dashboard.getCurrentUserId()); - } - else { - throw new Error('Invalid request'); - } - } - - var currentItem; - var currentRecordingFields; - - function reload(page, params) { - - Dashboard.showLoadingMsg(); - - getPromise(params).then(function (item) { - - reloadFromItem(page, params, item); - }); - } - - function hideAll(page, className, show) { - - var i, length; - var elems = page.querySelectorAll('.' + className); - for (i = 0, length = elems.length; i < length; i++) { - if (show) { - elems[i].classList.remove('hide'); - } else { - elems[i].classList.add('hide'); - } - } - } - - function getContextMenuOptions(item, button) { - - var options = { - item: item, - open: false, - play: false, - playAllFromHere: false, - queueAllFromHere: false, - positionTo: button, - cancelTimer: false, - record: false, - deleteItem: item.IsFolder === true, - shuffle: false, - instantMix: false - }; - - if (appHost.supports('sync')) { - // Will be displayed via button - options.syncLocal = false; - } - - return options; - } - - function renderSyncLocalContainer(page, params, user, item) { - - if (page.syncToggleInstance) { - page.syncToggleInstance.refresh(item); - return; - } - - require(['syncToggle'], function (syncToggle) { - - page.syncToggleInstance = new syncToggle({ - user: user, - item: item, - container: page.querySelector('.syncLocalContainer') - }); - - events.on(page.syncToggleInstance, 'sync', function () { - reload(page, params); - }); - }); - } - - function getProgramScheduleHtml(items, options) { - - options = options || {}; - - var html = ''; - html += '
'; - html += listView.getListViewHtml({ - items: items, - enableUserDataButtons: false, - image: false, - showProgramDateTime: true, - mediaInfo: false, - action: 'none', - moreButton: false, - recordButton: false - }); - - html += '
'; - - return html; - } - - function renderSeriesTimerSchedule(page, seriesTimerId) { - - ApiClient.getLiveTvTimers({ - UserId: ApiClient.getCurrentUserId(), - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", - SortBy: "StartDate", - EnableTotalRecordCount: false, - EnableUserData: false, - SeriesTimerId: seriesTimerId, - Fields: "ChannelInfo" - - }).then(function (result) { - - if (result.Items.length && result.Items[0].SeriesTimerId != seriesTimerId) { - result.Items = []; - } - - var html = getProgramScheduleHtml(result.Items); - - var scheduleTab = page.querySelector('.seriesTimerSchedule'); - scheduleTab.innerHTML = html; - - imageLoader.lazyChildren(scheduleTab); - }); - } - - function renderSeriesTimerEditor(page, item, user) { - - if (item.Type !== 'SeriesTimer') { - return; - } - - if (!user.Policy.EnableLiveTvManagement) { - page.querySelector('.seriesTimerScheduleSection').classList.add('hide'); - page.querySelector('.btnCancelSeriesTimer').classList.add('hide'); - return; - } - - require(['seriesRecordingEditor'], function (seriesRecordingEditor) { - seriesRecordingEditor.embed(item, ApiClient.serverId(), { - context: page.querySelector('.seriesRecordingEditor') - }); - }); - - page.querySelector('.seriesTimerScheduleSection').classList.remove('hide'); - page.querySelector('.btnCancelSeriesTimer').classList.remove('hide'); - - renderSeriesTimerSchedule(page, item.Id); - } - - function reloadFromItem(page, params, item) { - - currentItem = item; - - var context = params.context; - - LibraryBrowser.renderName(item, page.querySelector('.itemName'), false, context); - LibraryBrowser.renderParentName(item, page.querySelector('.parentName'), context); - libraryMenu.setTitle(''); - - Dashboard.getCurrentUser().then(function (user) { - - window.scrollTo(0, 0); - - renderSeriesTimerEditor(page, item, user); - - renderImage(page, item, user); - renderLogo(page, item, ApiClient); - - setInitialCollapsibleState(page, item, context, user); - renderDetails(page, item, context); - - if (dom.getWindowSize().innerWidth >= 800) { - backdrop.setBackdrops([item]); - } else { - backdrop.clear(); - } - - LibraryBrowser.renderDetailPageBackdrop(page, item, imageLoader); - - libraryMenu.setTransparentMenu(true); - - var canPlay = false; - - if (item.Type == 'Program') { - - var now = new Date(); - - if (now >= datetime.parseISO8601Date(item.StartDate, true) && now < datetime.parseISO8601Date(item.EndDate, true)) { - hideAll(page, 'btnPlay', true); - canPlay = true; - } else { - hideAll(page, 'btnPlay'); - } - hideAll(page, 'btnResume'); - hideAll(page, 'btnInstantMix'); - hideAll(page, 'btnShuffle'); - } - else if (playbackManager.canPlay(item)) { - hideAll(page, 'btnPlay', true); - - var enableInstantMix = ['Audio', 'MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type) !== -1; - hideAll(page, 'btnInstantMix', enableInstantMix); - - var enableShuffle = item.IsFolder || ['MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type) !== -1; - hideAll(page, 'btnShuffle', enableShuffle); - - canPlay = true; - - hideAll(page, 'btnResume', item.UserData && item.UserData.PlaybackPositionTicks > 0); - } - else { - hideAll(page, 'btnPlay'); - hideAll(page, 'btnResume'); - hideAll(page, 'btnInstantMix'); - hideAll(page, 'btnShuffle'); - } - - var hasAnyButton = canPlay; - - if ((item.LocalTrailerCount || (item.RemoteTrailers && item.RemoteTrailers.length)) && item.PlayAccess == 'Full') { - hideAll(page, 'btnPlayTrailer', true); - hasAnyButton = true; - } else { - hideAll(page, 'btnPlayTrailer'); - } - - if (item.CanDelete && !item.IsFolder) { - hideAll(page, 'btnDeleteItem', true); - hasAnyButton = true; - } else { - hideAll(page, 'btnDeleteItem'); - } - - renderSyncLocalContainer(page, params, user, item); - - if (hasAnyButton || item.Type !== 'Program') { - hideAll(page, 'mainDetailButtons', true); - } else { - hideAll(page, 'mainDetailButtons'); - } - - showRecordingFields(page, item, user); - - var groupedVersions = (item.MediaSources || []).filter(function (g) { - return g.Type == "Grouping"; - }); - - if (user.Policy.IsAdministrator && groupedVersions.length) { - page.querySelector('.splitVersionContainer').classList.remove('hide'); - } else { - page.querySelector('.splitVersionContainer').classList.add('hide'); - } - - itemContextMenu.getCommands(getContextMenuOptions(item)).then(function (commands) { - if (commands.length) { - hideAll(page, 'btnMoreCommands', true); - } else { - hideAll(page, 'btnMoreCommands'); - } - }); - - var itemBirthday = page.querySelector('#itemBirthday'); - if (item.Type == "Person" && item.PremiereDate) { - - try { - var birthday = datetime.parseISO8601Date(item.PremiereDate, true).toDateString(); - - itemBirthday.classList.remove('hide'); - itemBirthday.innerHTML = globalize.translate('BirthDateValue').replace('{0}', birthday); - } - catch (err) { - itemBirthday.classList.add('hide'); - } - } else { - itemBirthday.classList.add('hide'); - } - - var itemDeathDate = page.querySelector('#itemDeathDate'); - if (item.Type == "Person" && item.EndDate) { - - try { - var deathday = datetime.parseISO8601Date(item.EndDate, true).toDateString(); - - itemDeathDate.classList.remove('hide'); - itemDeathDate.innerHTML = globalize.translate('DeathDateValue').replace('{0}', deathday); - } - catch (err) { - itemDeathDate.classList.add('hide'); - } - } else { - } - - var itemBirthLocation = page.querySelector('#itemBirthLocation'); - if (item.Type == "Person" && item.ProductionLocations && item.ProductionLocations.length) { - - var gmap = '' + item.ProductionLocations[0] + ''; - - itemBirthLocation.classList.remove('hide'); - itemBirthLocation.innerHTML = globalize.translate('BirthPlaceValue').replace('{0}', gmap); - } else { - itemBirthLocation.classList.add('hide'); - } - }); - - setPeopleHeader(page, item); - - page.dispatchEvent(new CustomEvent("displayingitem", { - detail: { - item: item, - context: context - }, - bubbles: true - })); - - Dashboard.hideLoadingMsg(); - } - - function logoImageUrl(item, apiClient, options) { - - options = options || {}; - options.type = "Logo"; - - if (item.ImageTags && item.ImageTags.Logo) { - - options.tag = item.ImageTags.Logo; - return apiClient.getScaledImageUrl(item.Id, options); - } - - if (item.ParentLogoImageTag) { - options.tag = item.ParentLogoImageTag; - return apiClient.getScaledImageUrl(item.ParentLogoItemId, options); - } - - return null; - } - - function bounceIn(elem) { - var keyframes = [ - { transform: 'scale3d(.3, .3, .3)', opacity: '0', offset: 0 }, - { transform: 'scale3d(1.1, 1.1, 1.1)', offset: 0.2 }, - { transform: 'scale3d(.9, .9, .9)', offset: 0.4 }, - { transform: 'scale3d(1.03, 1.03, 1.03)', opacity: '1', offset: 0.6 }, - { transform: 'scale3d(.97, .97, .97)', offset: 0.8 }, - { transform: 'scale3d(1, 1, 1)', opacity: '1', offset: 1 }]; - var timing = { duration: 900, iterations: 1, easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' }; - return elem.animate(keyframes, timing); - } - - function renderLogo(page, item, apiClient) { - var url = logoImageUrl(item, apiClient, { - maxWidth: 300 - }); - - var detailLogo = page.querySelector('.detailLogo'); - - if (url) { - detailLogo.classList.remove('hide'); - detailLogo.classList.add('lazy'); - detailLogo.setAttribute('data-src', url); - imageLoader.lazyImage(detailLogo); - - //if (detailLogo.animate) { - // setTimeout(function() { - // bounceIn(detailLogo); - // }, 100); - //} - - } else { - detailLogo.classList.add('hide'); - } - } - - function showRecordingFields(page, item, user) { - - if (currentRecordingFields) { - return; - } - - var recordingFieldsElement = page.querySelector('.recordingFields'); - - if (item.Type == 'Program' && user.Policy.EnableLiveTvManagement) { - - require(['recordingFields'], function (recordingFields) { - - currentRecordingFields = new recordingFields({ - parent: recordingFieldsElement, - programId: item.Id, - serverId: item.ServerId - }); - recordingFieldsElement.classList.remove('hide'); - }); - } else { - recordingFieldsElement.classList.add('hide'); - recordingFieldsElement.innerHTML = ''; - } - } - - function renderLinks(linksElem, item) { - - var links = []; - - if (item.HomePageUrl) { - links.push('' + globalize.translate('ButtonWebsite') + ''); - } - - if (item.ExternalUrls) { - - for (var i = 0, length = item.ExternalUrls.length; i < length; i++) { - - var url = item.ExternalUrls[i]; - - links.push('' + url.Name + ''); - } - } - - if (links.length) { - - var html = links.join(''); - - linksElem.innerHTML = html; - linksElem.classList.remove('hide'); - - } else { - linksElem.classList.add('hide'); - } - } - - function shadeBlendConvert(p, from, to) { - if (typeof (p) != "number" || p < -1 || p > 1 || typeof (from) != "string" || (from[0] != 'r' && from[0] != '#') || (typeof (to) != "string" && typeof (to) != "undefined")) return null; //ErrorCheck - - var sbcRip = function (d) { - var l = d.length, RGB = new Object(); - if (l > 9) { - d = d.split(","); - if (d.length < 3 || d.length > 4) return null; //ErrorCheck - RGB[0] = i(d[0].slice(4)), RGB[1] = i(d[1]), RGB[2] = i(d[2]), RGB[3] = d[3] ? parseFloat(d[3]) : -1; - } else { - if (l == 8 || l == 6 || l < 4) return null; //ErrorCheck - if (l < 6) d = "#" + d[1] + d[1] + d[2] + d[2] + d[3] + d[3] + (l > 4 ? d[4] + "" + d[4] : ""); //3 digit - d = i(d.slice(1), 16), RGB[0] = d >> 16 & 255, RGB[1] = d >> 8 & 255, RGB[2] = d & 255, RGB[3] = l == 9 || l == 5 ? r(((d >> 24 & 255) / 255) * 10000) / 10000 : -1; - } - return RGB; - }; - - var i = parseInt, r = Math.round, h = from.length > 9, h = typeof (to) == "string" ? to.length > 9 ? true : to == "c" ? !h : false : h, b = p < 0, p = b ? p * -1 : p, to = to && to != "c" ? to : b ? "#000000" : "#FFFFFF", f = sbcRip(from), t = sbcRip(to); - if (!f || !t) return null; //ErrorCheck - if (h) return "rgb(" + r((t[0] - f[0]) * p + f[0]) + "," + r((t[1] - f[1]) * p + f[1]) + "," + r((t[2] - f[2]) * p + f[2]) + (f[3] < 0 && t[3] < 0 ? ")" : "," + (f[3] > -1 && t[3] > -1 ? r(((t[3] - f[3]) * p + f[3]) * 10000) / 10000 : t[3] < 0 ? f[3] : t[3]) + ")"); - else return "#" + (0x100000000 + (f[3] > -1 && t[3] > -1 ? r(((t[3] - f[3]) * p + f[3]) * 255) : t[3] > -1 ? r(t[3] * 255) : f[3] > -1 ? r(f[3] * 255) : 255) * 0x1000000 + r((t[0] - f[0]) * p + f[0]) * 0x10000 + r((t[1] - f[1]) * p + f[1]) * 0x100 + r((t[2] - f[2]) * p + f[2])).toString(16).slice(f[3] > -1 || t[3] > -1 ? 1 : 3); - } - - function loadSwatch(page, item) { - - var imageTags = item.ImageTags || {}; - - if (item.PrimaryImageTag) { - imageTags.Primary = item.PrimaryImageTag; - } - - var url; - var imageHeight = 300; - - if (item.SeriesId && item.SeriesPrimaryImageTag) { - - url = ApiClient.getScaledImageUrl(item.SeriesId, { - type: "Primary", - maxHeight: imageHeight, - tag: item.SeriesPrimaryImageTag - }); - } - else if (imageTags.Primary) { - - url = ApiClient.getScaledImageUrl(item.Id, { - type: "Primary", - maxHeight: imageHeight, - tag: item.ImageTags.Primary - }); - } - - if (!url) { - return; - } - - var img = new Image(); - img.onload = function () { - - imageLoader.getVibrantInfoFromElement(img, url).then(function (vibrantInfo) { - - vibrantInfo = vibrantInfo.split('|'); - var detailPageContent = page.querySelector('.detailPageContent'); - var detailPagePrimaryContainer = page.querySelector('.detailPagePrimaryContainer'); - - detailPageContent.style.color = vibrantInfo[1]; - - detailPagePrimaryContainer.style.backgroundColor = vibrantInfo[0]; - - }); - }; - - img.src = url; - } - - function renderImage(page, item, user) { - - var container = page.querySelector('.detailImageContainer'); - - LibraryBrowser.renderDetailImage(container, item, user.Policy.IsAdministrator && item.MediaType != 'Photo', null, imageLoader, indicators); - - //loadSwatch(page, item); - } - - function refreshDetailImageUserData(elem, item) { - - var detailImageProgressContainer = elem.querySelector('.detailImageProgressContainer'); - - detailImageProgressContainer.innerHTML = indicators.getProgressBarHtml(item); - } - - function refreshImage(page, item, user) { - - refreshDetailImageUserData(page.querySelector('.detailImageContainer'), item); - } - - function setPeopleHeader(page, item) { - - if (item.MediaType == "Audio" || item.Type == "MusicAlbum" || item.MediaType == "Book" || item.MediaType == "Photo") { - page.querySelector('#peopleHeader').innerHTML = globalize.translate('HeaderPeople'); - } else { - page.querySelector('#peopleHeader').innerHTML = globalize.translate('HeaderCastAndCrew'); - } - - } - - function renderNextUp(page, item, user) { - - var section = page.querySelector('.nextUpSection'); - - if (item.Type != 'Series') { - section.classList.add('hide'); - return; - } - - ApiClient.getNextUpEpisodes({ - - SeriesId: item.Id, - UserId: user.Id - - }).then(function (result) { - - if (result.Items.length) { - section.classList.remove('hide'); - } else { - section.classList.add('hide'); - } - - var html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: getThumbShape(false), - showTitle: true, - displayAsSpecial: item.Type == "Season" && item.IndexNumber, - overlayText: true, - lazy: true, - overlayPlayButton: true - }); - - var itemsContainer = section.querySelector('.nextUpItems'); - - itemsContainer.innerHTML = html; - imageLoader.lazyChildren(itemsContainer); - }); - } - - function setInitialCollapsibleState(page, item, context, user) { - - page.querySelector('.collectionItems').innerHTML = ''; - - if (item.Type == 'TvChannel') { - - page.querySelector('#childrenCollapsible').classList.remove('hide'); - renderChannelGuide(page, item, user); - } - else if (item.Type == 'Playlist') { - - page.querySelector('#childrenCollapsible').classList.remove('hide'); - renderPlaylistItems(page, item, user); - } - else if (item.Type == 'Studio' || item.Type == 'Person' || item.Type == 'Genre' || item.Type == 'MusicGenre' || item.Type == 'GameGenre' || item.Type == 'MusicArtist') { - - page.querySelector('#childrenCollapsible').classList.remove('hide'); - renderItemsByName(page, item, user); - } - else if (item.IsFolder || item.Type == 'Episode') { - - if (item.Type == "BoxSet") { - page.querySelector('#childrenCollapsible').classList.add('hide'); - } - renderChildren(page, item); - } - else { - page.querySelector('#childrenCollapsible').classList.add('hide'); - } - - if (item.Type == 'Series') { - - renderSeriesSchedule(page, item, user); - } - - if (item.Type == 'Series') { - - renderNextUp(page, item, user); - } else { - page.querySelector('.nextUpSection').classList.add('hide'); - } - - if (item.MediaSources && item.MediaSources.length) { - renderMediaSources(page, user, item); - } - - renderScenes(page, item); - - if (!item.SpecialFeatureCount || item.SpecialFeatureCount == 0 || item.Type == "Series") { - page.querySelector('#specialsCollapsible').classList.add('hide'); - } else { - page.querySelector('#specialsCollapsible').classList.remove('hide'); - renderSpecials(page, item, user, 6); - } - if (!item.People || !item.People.length) { - page.querySelector('#castCollapsible').classList.add('hide'); - } else { - page.querySelector('#castCollapsible').classList.remove('hide'); - renderCast(page, item, context, enableScrollX() ? null : 12); - } - - if (item.PartCount && item.PartCount > 1) { - page.querySelector('#additionalPartsCollapsible').classList.remove('hide'); - renderAdditionalParts(page, item, user); - } else { - page.querySelector('#additionalPartsCollapsible').classList.add('hide'); - } - - page.querySelector('#themeSongsCollapsible').classList.add('hide'); - page.querySelector('#themeVideosCollapsible').classList.add('hide'); - - if (item.Type == "MusicAlbum") { - renderMusicVideos(page, item, user); - } else { - page.querySelector('#musicVideosCollapsible').classList.add('hide'); - } - - renderThemeMedia(page, item, user); - - if (enableScrollX()) { - renderCriticReviews(page, item); - } else { - renderCriticReviews(page, item, 1); - } - } - - function renderOverview(elems, item) { - - for (var i = 0, length = elems.length; i < length; i++) { - var elem = elems[i]; - var overview = item.Overview || ''; - - if (overview) { - elem.innerHTML = overview; - - elem.classList.remove('hide'); - - var anchors = elem.querySelectorAll('a'); - for (var j = 0, length2 = anchors.length; j < length2; j++) { - anchors[j].setAttribute("target", "_blank"); - } - - } else { - elem.innerHTML = ''; - - elem.classList.add('hide'); - } - } - } - - function renderDetails(page, item, context, isStatic) { - - renderSimilarItems(page, item, context); - renderMoreFromItems(page, item); - - var taglineElement = page.querySelector('.tagline'); - - if (item.Taglines && item.Taglines.length) { - taglineElement.classList.remove('hide'); - taglineElement.innerHTML = item.Taglines[0]; - } else { - taglineElement.classList.add('hide'); - } - - var overview = page.querySelector('.overview'); - var externalLinksElem = page.querySelector('.itemExternalLinks'); - - if (item.Type === 'Season' || item.Type === 'MusicAlbum' || item.Type === 'MusicArtist') { - overview.classList.add('detailsHiddenOnMobile'); - externalLinksElem.classList.add('detailsHiddenOnMobile'); - } - - renderOverview([overview], item); - - renderAwardSummary(page.querySelector('#awardSummary'), item); - - var i, length; - var itemMiscInfo = page.querySelectorAll('.itemMiscInfo-primary'); - for (i = 0, length = itemMiscInfo.length; i < length; i++) { - mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, { - interactive: true, - episodeTitle: false - }); - if (itemMiscInfo[i].innerHTML) { - itemMiscInfo[i].classList.remove('hide'); - } else { - itemMiscInfo[i].classList.add('hide'); - } - } - itemMiscInfo = page.querySelectorAll('.itemMiscInfo-secondary'); - for (i = 0, length = itemMiscInfo.length; i < length; i++) { - mediaInfo.fillSecondaryMediaInfo(itemMiscInfo[i], item, { - interactive: true - }); - if (itemMiscInfo[i].innerHTML) { - itemMiscInfo[i].classList.remove('hide'); - } else { - itemMiscInfo[i].classList.add('hide'); - } - } - var itemGenres = page.querySelectorAll('.itemGenres'); - for (i = 0, length = itemGenres.length; i < length; i++) { - renderGenres(itemGenres[i], item, null, isStatic); - } - - renderStudios(page.querySelector('.itemStudios'), item, isStatic); - renderUserDataIcons(page, item); - renderLinks(externalLinksElem, item); - - page.querySelector('.criticRatingScore').innerHTML = (item.CriticRating || '0') + '%'; - - if (item.CriticRatingSummary) { - page.querySelector('#criticRatingSummary').classList.remove('hide'); - page.querySelector('.criticRatingSummaryText').innerHTML = item.CriticRatingSummary; - - } else { - page.querySelector('#criticRatingSummary').classList.add('hide'); - } - - renderTags(page, item); - - renderSeriesAirTime(page, item, isStatic); - - if (renderDynamicMediaIcons(page, item)) { - page.querySelector('.mediaInfoIcons').classList.remove('hide'); - } else { - page.querySelector('.mediaInfoIcons').classList.add('hide'); - } - - var artist = page.querySelectorAll('.artist'); - for (i = 0, length = artist.length; i < length; i++) { - if (item.ArtistItems && item.ArtistItems.length && item.Type != "MusicAlbum") { - artist[i].classList.remove('hide'); - artist[i].innerHTML = getArtistLinksHtml(item.ArtistItems, context); - } else { - artist[i].classList.add('hide'); - } - } - - if (item.MediaSources && item.MediaSources.length && item.Path) { - page.querySelector('.audioVideoMediaInfo').classList.remove('hide'); - } else { - page.querySelector('.audioVideoMediaInfo').classList.add('hide'); - } - - if (item.MediaType == 'Photo') { - page.querySelector('.photoInfo').classList.remove('hide'); - renderPhotoInfo(page, item); - } else { - page.querySelector('.photoInfo').classList.add('hide'); - } - } - - function renderDynamicMediaIcons(view, item) { - - var html = mediaInfo.getMediaInfoStats(item).map(function (mediaInfoItem) { - - var text = mediaInfoItem.text; - - if (mediaInfoItem.type === 'added') { - return '
' + text + '
'; - } - - return '
' + text + '
'; - - }).join(''); - - view.querySelector('.mediaInfoIcons').innerHTML = html; - - return html; - } - - function renderPhotoInfo(page, item) { - - var html = ''; - - var attributes = []; - - if (item.CameraMake) { - attributes.push(createAttribute(globalize.translate('MediaInfoCameraMake'), item.CameraMake)); - } - - if (item.CameraModel) { - attributes.push(createAttribute(globalize.translate('MediaInfoCameraModel'), item.CameraModel)); - } - - if (item.Altitude) { - attributes.push(createAttribute(globalize.translate('MediaInfoAltitude'), item.Altitude.toFixed(1))); - } - - if (item.Aperture) { - attributes.push(createAttribute(globalize.translate('MediaInfoAperture'), 'F' + item.Aperture.toFixed(1))); - } - - if (item.ExposureTime) { - - var val = 1 / item.ExposureTime; - - attributes.push(createAttribute(globalize.translate('MediaInfoExposureTime'), '1/' + val + ' s')); - } - - if (item.FocalLength) { - attributes.push(createAttribute(globalize.translate('MediaInfoFocalLength'), item.FocalLength.toFixed(1) + ' mm')); - } - - if (item.ImageOrientation) { - //attributes.push(createAttribute(Globalize.translate('MediaInfoOrientation'), item.ImageOrientation)); - } - - if (item.IsoSpeedRating) { - attributes.push(createAttribute(globalize.translate('MediaInfoIsoSpeedRating'), item.IsoSpeedRating)); - } - - if (item.Latitude) { - attributes.push(createAttribute(globalize.translate('MediaInfoLatitude'), item.Latitude.toFixed(1))); - } - - if (item.Longitude) { - attributes.push(createAttribute(globalize.translate('MediaInfoLongitude'), item.Longitude.toFixed(1))); - } - - if (item.ShutterSpeed) { - attributes.push(createAttribute(globalize.translate('MediaInfoShutterSpeed'), item.ShutterSpeed)); - } - - if (item.Software) { - attributes.push(createAttribute(globalize.translate('MediaInfoSoftware'), item.Software)); - } - - html += attributes.join('
'); - - page.querySelector('.photoInfoContent').innerHTML = html; - } - - function getArtistLinksHtml(artists, context) { - - var html = []; - - for (var i = 0, length = artists.length; i < length; i++) { - - var artist = artists[i]; - - html.push('' + artist.Name + ''); - - } - - html = html.join(' / '); - - if (artists.length == 1) { - return globalize.translate('ValueArtist', html); - } - if (artists.length > 1) { - return globalize.translate('ValueArtists', html); - } - - return html; - } - - function enableScrollX() { - return browserInfo.mobile && screen.availWidth <= 1000; - } - - function getPortraitShape(scrollX) { - if (scrollX == null) { - scrollX = enableScrollX(); - } - return scrollX ? 'overflowPortrait' : 'portrait'; - } - - function getSquareShape(scrollX) { - if (scrollX == null) { - scrollX = enableScrollX(); - } - return scrollX ? 'overflowSquare' : 'square'; - } - - function getThumbShape(scrollX) { - - if (scrollX == null) { - scrollX = enableScrollX(); - } - return scrollX ? 'overflowBackdrop' : 'backdrop'; - } - - function renderMoreFromItems(page, item) { - - var moreFromSection = page.querySelector('#moreFromSection'); - - if (!moreFromSection) { - return; - } - - if (item.Type != 'MusicAlbum' || !item.AlbumArtists || !item.AlbumArtists.length) { - moreFromSection.classList.add('hide'); - return; - } - - ApiClient.getItems(Dashboard.getCurrentUserId(), { - - IncludeItemTypes: "MusicAlbum", - ArtistIds: item.AlbumArtists[0].Id, - Recursive: true, - ExcludeItemIds: item.Id - - }).then(function (result) { - - if (!result.Items.length) { - moreFromSection.classList.add('hide'); - return; - } - moreFromSection.classList.remove('hide'); - - moreFromSection.querySelector('.moreFromHeader').innerHTML = globalize.translate('MoreFromValue', item.AlbumArtists[0].Name); - - var html = ''; - - if (enableScrollX()) { - html += '
'; - } else { - html += '
'; - } - - var shape = item.Type == "MusicAlbum" || item.Type == "MusicArtist" ? getSquareShape() : getPortraitShape(); - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - html += cardBuilder.getCardsHtml({ - items: result.Items, - shape: shape, - showParentTitle: item.Type == "MusicAlbum", - centerText: !supportsImageAnalysis, - showTitle: item.Type == "MusicAlbum" || item.Type == "Game" || item.Type == "MusicArtist", - coverImage: item.Type == "MusicAlbum" || item.Type == "MusicArtist", - overlayPlayButton: true, - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - }); - html += '
'; - - var similarContent = page.querySelector('#moreFromItems'); - similarContent.innerHTML = html; - imageLoader.lazyChildren(similarContent); - }); - } - - function renderSimilarItems(page, item, context) { - - var similarCollapsible = page.querySelector('#similarCollapsible'); - - if (!similarCollapsible) { - return; - } - - if (item.Type == "Movie" || item.Type == "Trailer" || item.Type == "Series" || item.Type == "Program" || item.Type == "Recording" || item.Type == "Game" || item.Type == "MusicAlbum" || item.Type == "MusicArtist" || item.Type == "ChannelVideoItem") { - similarCollapsible.classList.remove('hide'); - } - else { - similarCollapsible.classList.add('hide'); - return; - } - - var shape = item.Type == "MusicAlbum" || item.Type == "MusicArtist" ? getSquareShape() : getPortraitShape(); - - var options = { - userId: Dashboard.getCurrentUserId(), - limit: item.Type == "MusicAlbum" || item.Type == "MusicArtist" ? 8 : 10, - fields: "PrimaryImageAspectRatio,UserData,CanDelete" - }; - - if (item.Type == 'MusicAlbum' && item.AlbumArtists && item.AlbumArtists.length) { - options.ExcludeArtistIds = item.AlbumArtists[0].Id; - } - - if (enableScrollX()) { - options.limit = 12; - } - - ApiClient.getSimilarItems(item.Id, options).then(function (result) { - - if (!result.Items.length) { - - similarCollapsible.classList.add('hide'); - return; - } - - similarCollapsible.classList.remove('hide'); - - var html = ''; - - if (enableScrollX()) { - html += '
'; - } else { - html += '
'; - } - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = supportsImageAnalysis && (item.Type == "MusicAlbum" || item.Type == "Game" || item.Type == "MusicArtist"); - - html += cardBuilder.getCardsHtml({ - items: result.Items, - shape: shape, - showParentTitle: item.Type == "MusicAlbum", - centerText: !cardLayout, - showTitle: item.Type == "MusicAlbum" || item.Type == "Game" || item.Type == "MusicArtist", - context: context, - lazy: true, - showDetailsMenu: true, - coverImage: item.Type == "MusicAlbum" || item.Type == "MusicArtist", - overlayPlayButton: true, - cardLayout: cardLayout, - vibrant: cardLayout && supportsImageAnalysis - }); - html += '
'; - - var similarContent = similarCollapsible.querySelector('.similarContent'); - similarContent.innerHTML = html; - imageLoader.lazyChildren(similarContent); - }); - } - - function renderSeriesAirTime(page, item, isStatic) { - - var seriesAirTime = page.querySelector('#seriesAirTime'); - - if (item.Type != "Series") { - seriesAirTime.classList.add('hide'); - return; - } - - var html = ''; - - if (item.AirDays && item.AirDays.length) { - html += item.AirDays.length == 7 ? 'daily' : item.AirDays.map(function (a) { - return a + "s"; - - }).join(','); - } - - if (item.AirTime) { - html += ' at ' + item.AirTime; - } - - if (item.Studios.length) { - - if (isStatic) { - html += ' on ' + item.Studios[0].Name; - } else { - - var context = inferContext(item); - - var href = LibraryBrowser.getHref(item.Studios[0], context); - html += ' on ' + item.Studios[0].Name + ''; - } - } - - if (html) { - html = (item.Status == 'Ended' ? 'Aired ' : 'Airs ') + html; - - seriesAirTime.innerHTML = html; - seriesAirTime.classList.remove('hide'); - } else { - seriesAirTime.classList.add('hide'); - } - } - - function renderTags(page, item) { - - var itemTags = page.querySelector('.itemTags'); - - if (item.Tags && item.Tags.length) { - - var html = ''; - for (var i = 0, length = item.Tags.length; i < length; i++) { - - html += '
' + item.Tags[i] + '
'; - - } - - itemTags.innerHTML = html; - itemTags.classList.remove('hide'); - - } else { - itemTags.classList.add('hide'); - } - } - - function getEpisodesFunction(seriesId, query) { - - query = Object.assign({}, query); - - return function (index, limit, fields) { - - query.StartIndex = index; - query.Limit = limit; - query.Fields = fields; - - return ApiClient.getEpisodes(seriesId, query); - - }; - - } - - function getAlbumSongsFunction(query) { - - query = Object.assign({}, query); - - return function (index, limit, fields) { - - query.StartIndex = index; - query.Limit = limit; - query.Fields = fields; - - return ApiClient.getItems(Dashboard.getCurrentUserId(), query); - - }; - - } - - var _childrenItemsFunction = null; - function renderChildren(page, item) { - - _childrenItemsFunction = null; - - var fields = "ItemCounts,AudioInfo,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete"; - - var query = { - ParentId: item.Id, - Fields: fields - }; - - // Let the server pre-sort boxsets - if (item.Type !== "BoxSet") { - query.SortBy = "SortName"; - } - - var userId = Dashboard.getCurrentUserId(); - var promise; - - if (item.Type == "Series") { - - promise = ApiClient.getSeasons(item.Id, { - - userId: userId, - Fields: fields - }); - } - else if (item.Type == "Season") { - - // Use dedicated episodes endpoint - promise = ApiClient.getEpisodes(item.SeriesId, { - - seasonId: item.Id, - userId: userId, - Fields: fields - }); - - _childrenItemsFunction = getEpisodesFunction(item.SeriesId, { - - seasonId: item.Id, - userId: userId, - Fields: fields - }); - } - else if (item.Type == "Episode" && item.SeriesId && item.SeasonId) { - - // Use dedicated episodes endpoint - promise = ApiClient.getEpisodes(item.SeriesId, { - - seasonId: item.SeasonId, - userId: userId, - Fields: fields - }); - - _childrenItemsFunction = getEpisodesFunction(item.SeriesId, { - - seasonId: item.SeasonId, - userId: userId, - Fields: fields - }); - } - else if (item.Type == "MusicAlbum") { - - _childrenItemsFunction = getAlbumSongsFunction(query); - } - - promise = promise || ApiClient.getItems(Dashboard.getCurrentUserId(), query); - - promise.then(function (result) { - - var html = ''; - - var scrollX = false; - var isList = false; - - var scrollClass = 'hiddenScrollX'; - var childrenItemsContainer = page.querySelector('.childrenItemsContainer'); - - if (item.Type == "MusicAlbum") { - - html = listView.getListViewHtml({ - items: result.Items, - smallIcon: true, - showIndex: true, - index: 'disc', - showIndexNumber: true, - playFromHere: true, - action: 'playallfromhere', - image: false, - artist: 'auto', - containerAlbumArtist: item.AlbumArtist, - addToListButton: true - }); - isList = true; - } - else if (item.Type == "Series") { - - scrollX = enableScrollX(); - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: getPortraitShape(), - showTitle: true, - centerText: true, - lazy: true, - overlayPlayButton: true, - allowBottomPadding: !scrollX - }); - } - else if (item.Type == "Season" || item.Type == "Episode") { - - if (item.Type === 'Episode') { - childrenItemsContainer.classList.add('darkScroller'); - } - - scrollX = item.Type == "Episode"; - if (!browser.touch) { - scrollClass = 'smoothScrollX'; - } - - if (result.Items.length == 1 && item.Type === 'Episode') { - - return; - - } else { - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: getThumbShape(scrollX), - showTitle: true, - displayAsSpecial: item.Type == "Season" && item.IndexNumber, - playFromHere: true, - overlayText: true, - lazy: true, - showDetailsMenu: true, - overlayPlayButton: true, - allowBottomPadding: !scrollX, - includeParentInfoInTitle: false - }); - } - } - else if (item.Type == "GameSystem") { - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "auto", - showTitle: true, - centerText: true, - lazy: true, - showDetailsMenu: true - }); - } - - page.querySelector('#childrenCollapsible').classList.remove('hide'); - - if (scrollX) { - childrenItemsContainer.classList.add(scrollClass); - childrenItemsContainer.classList.remove('vertical-wrap'); - childrenItemsContainer.classList.remove('vertical-list'); - } else { - childrenItemsContainer.classList.remove('hiddenScrollX'); - childrenItemsContainer.classList.remove('smoothScrollX'); - - if (isList) { - childrenItemsContainer.classList.add('vertical-list'); - childrenItemsContainer.classList.remove('vertical-wrap'); - } else { - childrenItemsContainer.classList.add('vertical-wrap'); - childrenItemsContainer.classList.remove('vertical-list'); - } - } - - childrenItemsContainer.innerHTML = html; - imageLoader.lazyChildren(childrenItemsContainer); - - if (item.Type == "BoxSet") { - - var collectionItemTypes = [ - { name: globalize.translate('HeaderMovies'), type: 'Movie' }, - { name: globalize.translate('HeaderSeries'), type: 'Series' }, - { name: globalize.translate('HeaderAlbums'), type: 'MusicAlbum' }, - { name: globalize.translate('HeaderGames'), type: 'Game' }, - { name: globalize.translate('HeaderBooks'), type: 'Book' } - ]; - - renderCollectionItems(page, item, collectionItemTypes, result.Items); - } - else if (item.Type === 'Episode') { - - var card = childrenItemsContainer.querySelector('.card[data-id="' + item.Id + '"]'); - if (card) { - scrollHelper.toStart(childrenItemsContainer, card.previousSibling || card, true); - } - } - }); - - if (item.Type == "Season") { - page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderEpisodes'); - } - else if (item.Type == "Episode") { - page.querySelector('#childrenTitle').innerHTML = globalize.translate('MoreFromValue', item.SeasonName); - } - else if (item.Type == "Series") { - page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderSeasons'); - } - else if (item.Type == "MusicAlbum") { - page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderTracks'); - } - else if (item.Type == "GameSystem") { - page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderGames'); - } - else { - page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderItems'); - } - - if (item.Type == "MusicAlbum") { - page.querySelector('.childrenSectionHeader', page).classList.add('hide'); - } else { - page.querySelector('.childrenSectionHeader', page).classList.remove('hide'); - } - } - - function renderItemsByName(page, item, user) { - - require('scripts/itembynamedetailpage'.split(','), function () { - - - window.ItemsByName.renderItems(page, item); - }); - } - - function renderPlaylistItems(page, item, user) { - - require('scripts/playlistedit'.split(','), function () { - - - PlaylistViewer.render(page, item); - }); - } - - function renderChannelGuide(page, item, user) { - - require('scripts/livetvchannel,scripts/livetvcomponents,livetvcss'.split(','), function (liveTvChannelPage) { - - liveTvChannelPage.renderPrograms(page, item.Id); - }); - } - - function renderSeriesSchedule(page, item, user) { - - return; - ApiClient.getLiveTvPrograms({ - - UserId: Dashboard.getCurrentUserId(), - HasAired: false, - SortBy: "StartDate", - EnableTotalRecordCount: false, - EnableImages: false, - ImageTypeLimit: 0, - Limit: 50, - EnableUserData: false, - LibrarySeriesId: item.Id - - }).then(function (result) { - - if (result.Items.length) { - page.querySelector('#seriesScheduleSection').classList.remove('hide'); - - } else { - page.querySelector('#seriesScheduleSection').classList.add('hide'); - } - - page.querySelector('#seriesScheduleList').innerHTML = listView.getListViewHtml({ - items: result.Items, - enableUserDataButtons: false, - showParentTitle: false, - image: false, - showProgramDateTime: true, - mediaInfo: false, - showTitle: true, - moreButton: false, - action: 'programdialog' - }); - - Dashboard.hideLoadingMsg(); - }); - } - - function inferContext(item) { - - if (item.Type == 'Movie' || item.Type == 'BoxSet') { - return 'movies'; - } - if (item.Type == 'Series' || item.Type == 'Season' || item.Type == 'Episode') { - return 'tvshows'; - } - if (item.Type == 'Game' || item.Type == 'GameSystem') { - return 'games'; - } - if (item.Type == 'Game' || item.Type == 'GameSystem') { - return 'games'; - } - if (item.Type == 'MusicArtist' || item.Type == 'MusicAlbum') { - return 'music'; - } - - return null; - } - - function renderStudios(elem, item, isStatic) { - - var context = inferContext(item); - - if (item.Studios && item.Studios.length && item.Type != "Series" && false) { - - var html = ''; - - for (var i = 0, length = item.Studios.length; i < length; i++) { - - if (i > 0) { - html += '  /  '; - } - - if (isStatic) { - html += item.Studios[i].Name; - } else { - - item.Studios[i].Type = 'Studio'; - var href = LibraryBrowser.getHref(item.Studios[i], context); - html += '' + item.Studios[i].Name + ''; - } - } - - var translationKey = item.Studios.length > 1 ? "ValueStudios" : "ValueStudio"; - - html = globalize.translate(translationKey, html); - - elem.innerHTML = html; - elem.classList.remove('hide'); - - } else { - elem.classList.add('hide'); - } - } - - function renderGenres(elem, item, limit, isStatic) { - - var context = inferContext(item); - - var html = ''; - - var genres = item.Genres || []; - - for (var i = 0, length = genres.length; i < length; i++) { - - if (limit && i >= limit) { - break; - } - - if (i > 0) { - html += ''; - } - - var param = item.Type == "Audio" || item.Type == "MusicArtist" || item.Type == "MusicAlbum" ? "musicgenre" : "genre"; - - if (item.MediaType == "Game") { - param = "gamegenre"; - } - - if (isStatic) { - html += genres[i]; - } else { - - var type; - switch (context) { - case 'tvshows': - type = 'Series'; - break; - case 'games': - type = 'Game'; - break; - case 'music': - type = 'MusicAlbum'; - break; - default: - type = 'Movie'; - break; - } - - var url = "secondaryitems.html?type=" + type + "&" + param + "=" + ApiClient.encodeName(genres[i]); - - html += '' + genres[i] + ''; - } - } - - elem.innerHTML = html; - } - - function renderAwardSummary(elem, item) { - if (item.AwardSummary) { - elem.classList.remove('hide'); - elem.innerHTML = globalize.translate('ValueAwards', item.AwardSummary); - } else { - elem.classList.add('hide'); - } - } - - function renderCollectionItems(page, parentItem, types, items) { - - // First empty out existing content - page.querySelector('.collectionItems').innerHTML = ''; - var i, length; - - for (i = 0, length = types.length; i < length; i++) { - - var type = types[i]; - - var typeItems = items.filter(function (curr) { - - return curr.Type == type.type; - - }); - - if (typeItems.length) { - renderCollectionItemType(page, parentItem, type, typeItems); - } - } - - var otherType = { name: globalize.translate('HeaderOtherItems') }; - - var otherTypeItems = items.filter(function (curr) { - - return !types.filter(function (t) { - - return t.type == curr.Type; - - }).length; - - }); - - if (otherTypeItems.length) { - renderCollectionItemType(page, parentItem, otherType, otherTypeItems); - } - - if (!items.length) { - renderCollectionItemType(page, parentItem, { name: globalize.translate('HeaderItems') }, items); - } - } - - function renderCollectionItemType(page, parentItem, type, items) { - - var html = ''; - - html += '
'; - - html += '
'; - html += '

'; - html += '' + type.name + ''; - - html += '

'; - html += ''; - html += '
'; - - html += '
'; - - var shape = type.type == 'MusicAlbum' ? getSquareShape(false) : getPortraitShape(false); - - html += cardBuilder.getCardsHtml({ - items: items, - shape: shape, - showTitle: true, - centerText: true, - lazy: true, - showDetailsMenu: true, - overlayMoreButton: true, - showAddToCollection: false, - showRemoveFromCollection: true, - collectionId: parentItem.Id - }); - html += '
'; - - html += '
'; - - var collectionItems = page.querySelector('.collectionItems'); - collectionItems.insertAdjacentHTML('beforeend', html); - imageLoader.lazyChildren(collectionItems); - - collectionItems.querySelector('.btnAddToCollection').addEventListener('click', function () { - require(['alert'], function (alert) { - alert({ - text: globalize.translate('AddItemToCollectionHelp'), - html: globalize.translate('AddItemToCollectionHelp') + '

' + globalize.translate('ButtonLearnMore') + '' - }); - }); - }); - } - - function renderUserDataIcons(page, item) { - - var userDataIcons = page.querySelectorAll('.userDataIcons'); - - for (var i = 0, length = userDataIcons.length; i < length; i++) { - - if (item.Type == 'Program' || item.Type == 'SeriesTimer') { - userDataIcons[i].classList.add('hide'); - } else { - userDataIcons[i].classList.remove('hide'); - } - - userdataButtons.fill({ - item: item, - style: 'fab-mini', - element: userDataIcons[i] - }); - } - } - - function renderCriticReviews(page, item, limit) { - - if (item.Type != "Movie" && item.Type != "Trailer" && item.Type != "MusicVideo") { - page.querySelector('#criticReviewsCollapsible').classList.add('hide'); - return; - } - - var options = {}; - - if (limit) { - options.limit = limit; - } - - ApiClient.getCriticReviews(item.Id, options).then(function (result) { - - if (result.TotalRecordCount || item.CriticRatingSummary || item.AwardSummary) { - page.querySelector('#criticReviewsCollapsible').classList.remove('hide'); - renderCriticReviewsContent(page, result, limit); - } else { - page.querySelector('#criticReviewsCollapsible').classList.add('hide'); - } - }); - } - - function renderCriticReviewsContent(page, result, limit) { - - var html = ''; - - var reviews = result.Items; - for (var i = 0, length = reviews.length; i < length; i++) { - - var review = reviews[i]; - - html += '
'; - html += '
'; - - if (review.Score != null) { - //html += review.Score; - } - else if (review.Likes != null) { - - if (review.Likes) { - html += '
'; - } else { - html += '
'; - } - } - - html += '
'; - - html += '

' + review.Caption + '

'; - - var vals = []; - - if (review.ReviewerName) { - vals.push(review.ReviewerName); - } - if (review.Publisher) { - vals.push(review.Publisher); - } - - html += '
' + vals.join(', ') + '.'; - if (review.Date) { - - try { - - var date = datetime.toLocaleDateString(datetime.parseISO8601Date(review.Date, true)); - - html += '' + date + ''; - } - catch (error) { - - } - - } - html += '
'; - - if (review.Url) { - html += ''; - } - - html += '
'; - - html += '
'; - html += '
'; - } - - if (limit && result.TotalRecordCount > limit) { - html += '

'; - } - - var criticReviewsContent = page.querySelector('#criticReviewsContent'); - criticReviewsContent.innerHTML = html; - - if (enableScrollX()) { - criticReviewsContent.classList.add('hiddenScrollX'); - } else { - criticReviewsContent.classList.remove('hiddenScrollX'); - } - } - - function renderThemeMedia(page, item) { - - if (item.Type === 'SeriesTimer' || item.Type === 'Timer' || item.Type === 'Genre' || item.Type === 'MusicGenre' || item.Type === 'GameGenre' || item.Type === 'Studio' || item.Type === 'Person') { - return; - } - - ApiClient.getThemeMedia(Dashboard.getCurrentUserId(), item.Id, true).then(function (result) { - - var themeSongs = result.ThemeSongsResult.OwnerId == item.Id ? - result.ThemeSongsResult.Items : - []; - - var themeVideos = result.ThemeVideosResult.OwnerId == item.Id ? - result.ThemeVideosResult.Items : - []; - - renderThemeSongs(page, themeSongs); - renderThemeVideos(page, themeVideos); - }); - } - - function renderThemeSongs(page, items) { - - if (items.length) { - - page.querySelector('#themeSongsCollapsible').classList.remove('hide'); - - var html = listView.getListViewHtml({ - items: items - }); - - page.querySelector('#themeSongsContent').innerHTML = html; - } else { - page.querySelector('#themeSongsCollapsible').classList.add('hide'); - } - } - - function renderThemeVideos(page, items, user) { - - if (items.length) { - - page.querySelector('#themeVideosCollapsible').classList.remove('hide'); - - var themeVideosContent = page.querySelector('#themeVideosContent'); - themeVideosContent.innerHTML = getVideosHtml(items, user); - imageLoader.lazyChildren(themeVideosContent); - } else { - page.querySelector('#themeVideosCollapsible').classList.add('hide'); - } - } - - function renderMusicVideos(page, item, user) { - - ApiClient.getItems(user.Id, { - - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "MusicVideo", - Recursive: true, - Fields: "DateCreated,CanDelete", - Albums: item.Name - - }).then(function (result) { - if (result.Items.length) { - - page.querySelector('#musicVideosCollapsible').classList.remove('hide'); - - var musicVideosContent = page.querySelector('.musicVideosContent'); - musicVideosContent.innerHTML = getVideosHtml(result.Items, user); - imageLoader.lazyChildren(musicVideosContent); - - } else { - page.querySelector('#musicVideosCollapsible').classList.add('hide'); - } - }); - - } - - function renderAdditionalParts(page, item, user) { - - ApiClient.getAdditionalVideoParts(user.Id, item.Id).then(function (result) { - - if (result.Items.length) { - - page.querySelector('#additionalPartsCollapsible').classList.remove('hide'); - - var additionalPartsContent = page.querySelector('#additionalPartsContent'); - additionalPartsContent.innerHTML = getVideosHtml(result.Items, user); - imageLoader.lazyChildren(additionalPartsContent); - - } else { - page.querySelector('#additionalPartsCollapsible').classList.add('hide'); - } - }); - } - - function renderScenes(page, item) { - - var chapters = item.Chapters || []; - - // If there are no chapter images, don't show a bunch of empty tiles - if (chapters.length && !chapters[0].ImageTag) { - chapters = []; - } - - if (!chapters.length) { - page.querySelector('#scenesCollapsible').classList.add('hide'); - } else { - page.querySelector('#scenesCollapsible').classList.remove('hide'); - - var scenesContent = page.querySelector('#scenesContent'); - - if (enableScrollX()) { - scenesContent.classList.add('smoothScrollX'); - } else { - scenesContent.classList.add('vertical-wrap'); - } - - require(['chaptercardbuilder'], function (chaptercardbuilder) { - - chaptercardbuilder.buildChapterCards(item, chapters, { - itemsContainer: scenesContent, - coverImage: true, - width: 400, - backdropShape: getThumbShape(), - squareShape: getSquareShape() - }); - }); - } - } - - function renderMediaSources(page, user, item) { - - var html = item.MediaSources.map(function (v) { - - return getMediaSourceHtml(user, item, v); - - }).join('
'); - - if (item.MediaSources.length > 1) { - html = '
' + html; - } - - var mediaInfoContent = page.querySelector('#mediaInfoContent'); - mediaInfoContent.innerHTML = html; - } - - function getMediaSourceHtml(user, item, version) { - - var html = ''; - - if (version.Name && item.MediaSources.length > 1) { - html += '
' + version.Name + '

'; - } - - for (var i = 0, length = version.MediaStreams.length; i < length; i++) { - - var stream = version.MediaStreams[i]; - - if (stream.Type == "Data") { - continue; - } - - html += '
'; - - var displayType = globalize.translate('MediaInfoStreamType' + stream.Type); - - html += '

' + displayType + '

'; - - var attributes = []; - - if (stream.Language && stream.Type != "Video") { - attributes.push(createAttribute(globalize.translate('MediaInfoLanguage'), stream.Language)); - } - - if (stream.Codec) { - attributes.push(createAttribute(globalize.translate('MediaInfoCodec'), stream.Codec.toUpperCase())); - } - - if (stream.CodecTag) { - attributes.push(createAttribute(globalize.translate('MediaInfoCodecTag'), stream.CodecTag)); - } - - if (stream.IsAVC != null) { - attributes.push(createAttribute('AVC', (stream.IsAVC ? 'Yes' : 'No'))); - } - - if (stream.Profile) { - attributes.push(createAttribute(globalize.translate('MediaInfoProfile'), stream.Profile)); - } - - if (stream.Level) { - attributes.push(createAttribute(globalize.translate('MediaInfoLevel'), stream.Level)); - } - - if (stream.Width || stream.Height) { - attributes.push(createAttribute(globalize.translate('MediaInfoResolution'), stream.Width + 'x' + stream.Height)); - } - - if (stream.AspectRatio && stream.Codec != "mjpeg") { - attributes.push(createAttribute(globalize.translate('MediaInfoAspectRatio'), stream.AspectRatio)); - } - - if (stream.Type == "Video") { - if (stream.IsAnamorphic != null) { - attributes.push(createAttribute(globalize.translate('MediaInfoAnamorphic'), (stream.IsAnamorphic ? 'Yes' : 'No'))); - } - - attributes.push(createAttribute(globalize.translate('MediaInfoInterlaced'), (stream.IsInterlaced ? 'Yes' : 'No'))); - } - - if (stream.AverageFrameRate || stream.RealFrameRate) { - attributes.push(createAttribute(globalize.translate('MediaInfoFramerate'), (stream.AverageFrameRate || stream.RealFrameRate))); - } - - if (stream.ChannelLayout) { - attributes.push(createAttribute(globalize.translate('MediaInfoLayout'), stream.ChannelLayout)); - } - if (stream.Channels) { - attributes.push(createAttribute(globalize.translate('MediaInfoChannels'), stream.Channels + ' ch')); - } - - if (stream.BitRate && stream.Codec != "mjpeg") { - attributes.push(createAttribute(globalize.translate('MediaInfoBitrate'), (parseInt(stream.BitRate / 1000)) + ' kbps')); - } - - if (stream.SampleRate) { - attributes.push(createAttribute(globalize.translate('MediaInfoSampleRate'), stream.SampleRate + ' Hz')); - } - - if (stream.BitDepth) { - attributes.push(createAttribute(globalize.translate('MediaInfoBitDepth'), stream.BitDepth + ' bit')); - } - - if (stream.PixelFormat) { - attributes.push(createAttribute(globalize.translate('MediaInfoPixelFormat'), stream.PixelFormat)); - } - - if (stream.RefFrames) { - attributes.push(createAttribute(globalize.translate('MediaInfoRefFrames'), stream.RefFrames)); - } - - if (stream.NalLengthSize) { - attributes.push(createAttribute('NAL', stream.NalLengthSize)); - } - - if (stream.Type != "Video") { - attributes.push(createAttribute(globalize.translate('MediaInfoDefault'), (stream.IsDefault ? 'Yes' : 'No'))); - } - if (stream.Type == "Subtitle") { - attributes.push(createAttribute(globalize.translate('MediaInfoForced'), (stream.IsForced ? 'Yes' : 'No'))); - attributes.push(createAttribute(globalize.translate('MediaInfoExternal'), (stream.IsExternal ? 'Yes' : 'No'))); - } - - if (stream.Type == "Video" && version.Timestamp) { - attributes.push(createAttribute(globalize.translate('MediaInfoTimestamp'), version.Timestamp)); - } - - if (stream.DisplayTitle) { - attributes.push(createAttribute('Title', stream.DisplayTitle)); - } - - html += attributes.join('
'); - - html += '
'; - } - - if (version.Container) { - html += '
' + globalize.translate('MediaInfoContainer') + '' + version.Container + '
'; - } - - if (version.Formats && version.Formats.length) { - //html += '
'+Globalize.translate('MediaInfoFormat')+'' + version.Formats.join(',') + '
'; - } - - if (version.Path && version.Protocol != 'Http' && user && user.Policy.IsAdministrator) { - html += '
' + globalize.translate('MediaInfoPath') + '' + version.Path + '
'; - } - - if (version.Size) { - - var size = (version.Size / (1024 * 1024)).toFixed(0); - - html += '
' + globalize.translate('MediaInfoSize') + '' + size + ' MB
'; - } - - return html; - } - - function createAttribute(label, value) { - return '' + label + '' + value + '' - } - - function getVideosHtml(items, user, limit, moreButtonClass) { - - var html = cardBuilder.getCardsHtml({ - items: items, - shape: "auto", - showTitle: true, - action: 'play', - overlayText: true, - showRuntime: true - }); - - if (limit && items.length > limit) { - html += '

'; - } - - return html; - } - - function renderSpecials(page, item, user, limit) { - - ApiClient.getSpecialFeatures(user.Id, item.Id).then(function (specials) { - - var specialsContent = page.querySelector('#specialsContent'); - specialsContent.innerHTML = getVideosHtml(specials, user, limit, "moreSpecials"); - imageLoader.lazyChildren(specialsContent); - - }); - } - - function renderCast(page, item, context, limit, isStatic) { - - var people = item.People || []; - var castContent = page.querySelector('#castContent'); - - if (enableScrollX()) { - castContent.classList.add('smoothScrollX'); - limit = 32; - } else { - castContent.classList.add('vertical-wrap'); - } - - var limitExceeded = limit && people.length > limit; - - if (limitExceeded) { - people = people.slice(0); - people.length = Math.min(limit, people.length); - } - - require(['peoplecardbuilder'], function (peoplecardbuilder) { - - peoplecardbuilder.buildPeopleCards(people, { - itemsContainer: castContent, - coverImage: true, - serverId: item.ServerId, - width: 160, - shape: getPortraitShape() - }); - }); - - var morePeopleButton = page.querySelector('.morePeople'); - if (morePeopleButton) { - if (limitExceeded && !enableScrollX()) { - morePeopleButton.classList.remove('hide'); - } else { - morePeopleButton.classList.add('hide'); - } - } - } - - function play(startPosition) { - - playbackManager.play({ - items: [currentItem], - startPositionTicks: startPosition - }); - } - - function splitVersions(page, params) { - - require(['confirm'], function (confirm) { - - confirm("Are you sure you wish to split the media sources into separate items?", "Split Media Apart").then(function () { - - Dashboard.showLoadingMsg(); - - ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl("Videos/" + params.id + "/AlternateSources") - - }).then(function () { - - Dashboard.hideLoadingMsg(); - - reload(page, params); - }); - }); - }); - } - - function playTrailer(page) { - - playbackManager.playTrailers(currentItem); - } - - function showPlayMenu(item, target) { - - require(['playMenu'], function (playMenu) { - playMenu.show({ - item: item, - positionTo: target - }); - }); - } - - function playCurrentItem(button, mode) { - - var item = currentItem; - - if (item.Type === 'Program') { - - ApiClient.getLiveTvChannel(item.ChannelId, Dashboard.getCurrentUserId()).then(function (channel) { - - playbackManager.play({ - items: [channel] - }); - }); - - return; - } - - if (mode === 'playmenu') { - showPlayMenu(item, button); - } else { - playbackManager.play({ - items: [item], - startPositionTicks: item.UserData && mode === 'resume' ? item.UserData.PlaybackPositionTicks : 0 - }); - } - } - - function deleteTimer(page, params, id) { - - require(['confirm'], function (confirm) { - - confirm(globalize.translate('MessageConfirmRecordingCancellation'), globalize.translate('HeaderConfirmRecordingCancellation')).then(function () { - - Dashboard.showLoadingMsg(); - - ApiClient.cancelLiveTvTimer(id).then(function () { - - require(['toast'], function (toast) { - toast(globalize.translate('MessageRecordingCancelled')); - }); - - reload(page, params); - }); - }); - }); - } - - function itemDetailPage() { - - var self = this; - - self.play = play; - self.setInitialCollapsibleState = setInitialCollapsibleState; - self.renderDetails = renderDetails; - self.renderCriticReviews = renderCriticReviews; - self.renderCast = renderCast; - self.renderScenes = renderScenes; - self.renderMediaSources = renderMediaSources; - } - - window.ItemDetailPage = new itemDetailPage(); - - function onPlayClick() { - - var mode = this.getAttribute('data-mode'); - playCurrentItem(this, mode); - } - - function onInstantMixClick() { - playbackManager.instantMix(currentItem); - } - - function onShuffleClick() { - playbackManager.shuffle(currentItem); - } - - function onDeleteClick() { - - require(['deleteHelper'], function (deleteHelper) { - - deleteHelper.deleteItem({ - item: currentItem, - navigate: true - }); - }); - } - - function onCancelSeriesTimerClick() { - - require(['recordingHelper'], function (recordingHelper) { - - recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id, currentItem.ServerId).then(function () { - Dashboard.navigate('livetv.html'); - }); - }); - } - - return function (view, params) { - - function onPlayTrailerClick() { - playTrailer(view); - } - - function onMoreCommandsClick() { - var button = this; - - itemContextMenu.show(getContextMenuOptions(currentItem, button)).then(function (result) { - - if (result.deleted) { - Emby.Page.goHome(); - - } else if (result.updated) { - reload(view, params); - } - }); - } - - var elems = view.querySelectorAll('.btnPlay'); - var i, length; - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPlayClick); - } - - view.querySelector('.btnResume').addEventListener('click', onPlayClick); - view.querySelector('.btnInstantMix').addEventListener('click', onInstantMixClick); - view.querySelector('.btnShuffle').addEventListener('click', onShuffleClick); - - elems = view.querySelectorAll('.btnPlayTrailer'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPlayTrailerClick); - } - - elems = view.querySelectorAll('.btnCancelSeriesTimer'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onCancelSeriesTimerClick); - } - - elems = view.querySelectorAll('.btnDeleteItem'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onDeleteClick); - } - - view.querySelector('.btnSplitVersions').addEventListener('click', function () { - - splitVersions(view, params); - }); - - elems = view.querySelectorAll('.btnMoreCommands'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onMoreCommandsClick); - } - - view.addEventListener('click', function (e) { - - if (dom.parentWithClass(e.target, 'moreScenes')) { - Dashboard.getCurrentUser().then(function (user) { - renderScenes(view, currentItem, user); - }); - } - else if (dom.parentWithClass(e.target, 'morePeople')) { - renderCast(view, currentItem, params.context); - } - else if (dom.parentWithClass(e.target, 'moreSpecials')) { - Dashboard.getCurrentUser().then(function (user) { - renderSpecials(view, currentItem, user); - }); - } - else if (dom.parentWithClass(e.target, 'moreCriticReviews')) { - renderCriticReviews(view, currentItem); - } - }); - - view.querySelector('.collectionItems').addEventListener('needsrefresh', function (e) { - - renderChildren(view, currentItem); - }); - - function editImages() { - return new Promise(function (resolve, reject) { - - require(['imageEditor'], function (imageEditor) { - - imageEditor.show({ - - itemId: currentItem.Id, - serverId: currentItem.ServerId - - }).then(resolve, reject); - }); - }); - } - - view.querySelector('.detailImageContainer').addEventListener('click', function (e) { - var itemDetailGalleryLink = dom.parentWithClass(e.target, 'itemDetailGalleryLink'); - if (itemDetailGalleryLink) { - editImages().then(function () { - reload(view, params); - }); - } - }); - - function onWebSocketMessage(e, data) { - - var msg = data; - - if (msg.MessageType === "UserDataChanged") { - - if (currentItem && msg.Data.UserId == Dashboard.getCurrentUserId()) { - - var key = currentItem.UserData.Key; - - var userData = msg.Data.UserDataList.filter(function (u) { - - return u.Key == key; - })[0]; - - if (userData) { - - currentItem.UserData = userData; - - Dashboard.getCurrentUser().then(function (user) { - - refreshImage(view, currentItem, user); - }); - } - } - } - - } - - view.addEventListener('viewbeforeshow', function () { - var page = this; - reload(page, params); - - events.on(ApiClient, 'websocketmessage', onWebSocketMessage); - }); - - view.addEventListener('viewbeforehide', function () { - - currentItem = null; - currentRecordingFields = null; - - events.off(ApiClient, 'websocketmessage', onWebSocketMessage); - libraryMenu.setTransparentMenu(false); - }); - - view.addEventListener('viewdestroy', function () { - - if (view.syncToggleInstance) { - view.syncToggleInstance.destroy(); - view.syncToggleInstance = null; - } - }); - }; -}); \ No newline at end of file +define(["layoutManager","cardBuilder","datetime","mediaInfo","backdrop","listView","itemContextMenu","itemHelper","userdataButtons","dom","indicators","apphost","imageLoader","libraryMenu","globalize","browser","events","scrollHelper","playbackManager","scrollStyles","emby-itemscontainer","emby-checkbox"],function(layoutManager,cardBuilder,datetime,mediaInfo,backdrop,listView,itemContextMenu,itemHelper,userdataButtons,dom,indicators,appHost,imageLoader,libraryMenu,globalize,browser,events,scrollHelper,playbackManager){"use strict";function getPromise(params){var id=params.id;if(id)return ApiClient.getItem(Dashboard.getCurrentUserId(),id);if(params.seriesTimerId)return ApiClient.getLiveTvSeriesTimer(params.seriesTimerId);var name=params.genre;if(name)return ApiClient.getGenre(name,Dashboard.getCurrentUserId());if(name=params.musicgenre)return ApiClient.getMusicGenre(name,Dashboard.getCurrentUserId());if(name=params.gamegenre)return ApiClient.getGameGenre(name,Dashboard.getCurrentUserId());if(name=params.musicartist)return ApiClient.getArtist(name,Dashboard.getCurrentUserId());throw new Error("Invalid request")}function reload(page,params){Dashboard.showLoadingMsg(),getPromise(params).then(function(item){reloadFromItem(page,params,item)})}function hideAll(page,className,show){var i,length,elems=page.querySelectorAll("."+className);for(i=0,length=elems.length;i"}function renderSeriesTimerSchedule(page,seriesTimerId){ApiClient.getLiveTvTimers({UserId:ApiClient.getCurrentUserId(),ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb",SortBy:"StartDate",EnableTotalRecordCount:!1,EnableUserData:!1,SeriesTimerId:seriesTimerId,Fields:"ChannelInfo"}).then(function(result){result.Items.length&&result.Items[0].SeriesTimerId!=seriesTimerId&&(result.Items=[]);var html=getProgramScheduleHtml(result.Items),scheduleTab=page.querySelector(".seriesTimerSchedule");scheduleTab.innerHTML=html,imageLoader.lazyChildren(scheduleTab)})}function renderSeriesTimerEditor(page,item,user){if("SeriesTimer"===item.Type){if(!user.Policy.EnableLiveTvManagement)return page.querySelector(".seriesTimerScheduleSection").classList.add("hide"),void page.querySelector(".btnCancelSeriesTimer").classList.add("hide");require(["seriesRecordingEditor"],function(seriesRecordingEditor){seriesRecordingEditor.embed(item,ApiClient.serverId(),{context:page.querySelector(".seriesRecordingEditor")})}),page.querySelector(".seriesTimerScheduleSection").classList.remove("hide"),page.querySelector(".btnCancelSeriesTimer").classList.remove("hide"),renderSeriesTimerSchedule(page,item.Id)}}function reloadFromItem(page,params,item){currentItem=item;var context=params.context;LibraryBrowser.renderName(item,page.querySelector(".itemName"),!1,context),LibraryBrowser.renderParentName(item,page.querySelector(".parentName"),context),libraryMenu.setTitle(""),Dashboard.getCurrentUser().then(function(user){window.scrollTo(0,0),renderSeriesTimerEditor(page,item,user),renderImage(page,item,user),renderLogo(page,item,ApiClient),setInitialCollapsibleState(page,item,context,user),renderDetails(page,item,context),dom.getWindowSize().innerWidth>=800?backdrop.setBackdrops([item]):backdrop.clear(),LibraryBrowser.renderDetailPageBackdrop(page,item,imageLoader),libraryMenu.setTransparentMenu(!0);var canPlay=!1;if("Program"==item.Type){var now=new Date;now>=datetime.parseISO8601Date(item.StartDate,!0)&&now0)}else hideAll(page,"btnPlay"),hideAll(page,"btnResume"),hideAll(page,"btnInstantMix"),hideAll(page,"btnShuffle");var hasAnyButton=canPlay;(item.LocalTrailerCount||item.RemoteTrailers&&item.RemoteTrailers.length)&&"Full"==item.PlayAccess?(hideAll(page,"btnPlayTrailer",!0),hasAnyButton=!0):hideAll(page,"btnPlayTrailer"),item.CanDelete&&!item.IsFolder?(hideAll(page,"btnDeleteItem",!0),hasAnyButton=!0):hideAll(page,"btnDeleteItem"),renderSyncLocalContainer(page,params,user,item),hasAnyButton||"Program"!==item.Type?hideAll(page,"mainDetailButtons",!0):hideAll(page,"mainDetailButtons"),showRecordingFields(page,item,user);var groupedVersions=(item.MediaSources||[]).filter(function(g){return"Grouping"==g.Type});user.Policy.IsAdministrator&&groupedVersions.length?page.querySelector(".splitVersionContainer").classList.remove("hide"):page.querySelector(".splitVersionContainer").classList.add("hide"),itemContextMenu.getCommands(getContextMenuOptions(item)).then(function(commands){commands.length?hideAll(page,"btnMoreCommands",!0):hideAll(page,"btnMoreCommands")});var itemBirthday=page.querySelector("#itemBirthday");if("Person"==item.Type&&item.PremiereDate)try{var birthday=datetime.parseISO8601Date(item.PremiereDate,!0).toDateString();itemBirthday.classList.remove("hide"),itemBirthday.innerHTML=globalize.translate("BirthDateValue").replace("{0}",birthday)}catch(err){itemBirthday.classList.add("hide")}else itemBirthday.classList.add("hide");var itemDeathDate=page.querySelector("#itemDeathDate");if("Person"==item.Type&&item.EndDate)try{var deathday=datetime.parseISO8601Date(item.EndDate,!0).toDateString();itemDeathDate.classList.remove("hide"),itemDeathDate.innerHTML=globalize.translate("DeathDateValue").replace("{0}",deathday)}catch(err){itemDeathDate.classList.add("hide")}var itemBirthLocation=page.querySelector("#itemBirthLocation");if("Person"==item.Type&&item.ProductionLocations&&item.ProductionLocations.length){var gmap=''+item.ProductionLocations[0]+"";itemBirthLocation.classList.remove("hide"),itemBirthLocation.innerHTML=globalize.translate("BirthPlaceValue").replace("{0}",gmap)}else itemBirthLocation.classList.add("hide")}),setPeopleHeader(page,item),page.dispatchEvent(new CustomEvent("displayingitem",{detail:{item:item,context:context},bubbles:!0})),Dashboard.hideLoadingMsg()}function logoImageUrl(item,apiClient,options){return options=options||{},options.type="Logo",item.ImageTags&&item.ImageTags.Logo?(options.tag=item.ImageTags.Logo,apiClient.getScaledImageUrl(item.Id,options)):item.ParentLogoImageTag?(options.tag=item.ParentLogoImageTag,apiClient.getScaledImageUrl(item.ParentLogoItemId,options)):null}function renderLogo(page,item,apiClient){var url=logoImageUrl(item,apiClient,{maxWidth:300}),detailLogo=page.querySelector(".detailLogo");url?(detailLogo.classList.remove("hide"),detailLogo.classList.add("lazy"),detailLogo.setAttribute("data-src",url),imageLoader.lazyImage(detailLogo)):detailLogo.classList.add("hide")}function showRecordingFields(page,item,user){if(!currentRecordingFields){var recordingFieldsElement=page.querySelector(".recordingFields");"Program"==item.Type&&user.Policy.EnableLiveTvManagement?require(["recordingFields"],function(recordingFields){currentRecordingFields=new recordingFields({parent:recordingFieldsElement,programId:item.Id,serverId:item.ServerId}),recordingFieldsElement.classList.remove("hide")}):(recordingFieldsElement.classList.add("hide"),recordingFieldsElement.innerHTML="")}}function renderLinks(linksElem,item){var links=[];if(item.HomePageUrl&&links.push(''+globalize.translate("ButtonWebsite")+""),item.ExternalUrls)for(var i=0,length=item.ExternalUrls.length;i'+url.Name+"")}if(links.length){var html=links.join('');linksElem.innerHTML=html,linksElem.classList.remove("hide")}else linksElem.classList.add("hide")}function renderImage(page,item,user){var container=page.querySelector(".detailImageContainer");LibraryBrowser.renderDetailImage(container,item,user.Policy.IsAdministrator&&"Photo"!=item.MediaType,null,imageLoader,indicators)}function refreshDetailImageUserData(elem,item){var detailImageProgressContainer=elem.querySelector(".detailImageProgressContainer");detailImageProgressContainer.innerHTML=indicators.getProgressBarHtml(item)}function refreshImage(page,item,user){refreshDetailImageUserData(page.querySelector(".detailImageContainer"),item)}function setPeopleHeader(page,item){"Audio"==item.MediaType||"MusicAlbum"==item.Type||"Book"==item.MediaType||"Photo"==item.MediaType?page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderPeople"):page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderCastAndCrew")}function renderNextUp(page,item,user){var section=page.querySelector(".nextUpSection");return"Series"!=item.Type?void section.classList.add("hide"):void ApiClient.getNextUpEpisodes({SeriesId:item.Id,UserId:user.Id}).then(function(result){result.Items.length?section.classList.remove("hide"):section.classList.add("hide");var html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(!1),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,overlayText:!0,lazy:!0,overlayPlayButton:!0}),itemsContainer=section.querySelector(".nextUpItems");itemsContainer.innerHTML=html,imageLoader.lazyChildren(itemsContainer)})}function setInitialCollapsibleState(page,item,context,user){page.querySelector(".collectionItems").innerHTML="","TvChannel"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderChannelGuide(page,item,user)):"Playlist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderPlaylistItems(page,item,user)):"Studio"==item.Type||"Person"==item.Type||"Genre"==item.Type||"MusicGenre"==item.Type||"GameGenre"==item.Type||"MusicArtist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderItemsByName(page,item,user)):item.IsFolder||"Episode"==item.Type?("BoxSet"==item.Type&&page.querySelector("#childrenCollapsible").classList.add("hide"),renderChildren(page,item)):page.querySelector("#childrenCollapsible").classList.add("hide"),"Series"==item.Type&&renderSeriesSchedule(page,item,user),"Series"==item.Type?renderNextUp(page,item,user):page.querySelector(".nextUpSection").classList.add("hide"),item.MediaSources&&item.MediaSources.length&&renderMediaSources(page,user,item),renderScenes(page,item),item.SpecialFeatureCount&&0!=item.SpecialFeatureCount&&"Series"!=item.Type?(page.querySelector("#specialsCollapsible").classList.remove("hide"),renderSpecials(page,item,user,6)):page.querySelector("#specialsCollapsible").classList.add("hide"),item.People&&item.People.length?(page.querySelector("#castCollapsible").classList.remove("hide"),renderCast(page,item,context,enableScrollX()?null:12)):page.querySelector("#castCollapsible").classList.add("hide"),item.PartCount&&item.PartCount>1?(page.querySelector("#additionalPartsCollapsible").classList.remove("hide"),renderAdditionalParts(page,item,user)):page.querySelector("#additionalPartsCollapsible").classList.add("hide"),page.querySelector("#themeSongsCollapsible").classList.add("hide"),page.querySelector("#themeVideosCollapsible").classList.add("hide"),"MusicAlbum"==item.Type?renderMusicVideos(page,item,user):page.querySelector("#musicVideosCollapsible").classList.add("hide"),renderThemeMedia(page,item,user),enableScrollX()?renderCriticReviews(page,item):renderCriticReviews(page,item,1)}function renderOverview(elems,item){for(var i=0,length=elems.length;i'+text+"
":'
'+text+"
"}).join("");return view.querySelector(".mediaInfoIcons").innerHTML=html,html}function renderPhotoInfo(page,item){var html="",attributes=[];if(item.CameraMake&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraMake"),item.CameraMake)),item.CameraModel&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraModel"),item.CameraModel)),item.Altitude&&attributes.push(createAttribute(globalize.translate("MediaInfoAltitude"),item.Altitude.toFixed(1))),item.Aperture&&attributes.push(createAttribute(globalize.translate("MediaInfoAperture"),"F"+item.Aperture.toFixed(1))),item.ExposureTime){var val=1/item.ExposureTime;attributes.push(createAttribute(globalize.translate("MediaInfoExposureTime"),"1/"+val+" s"))}item.FocalLength&&attributes.push(createAttribute(globalize.translate("MediaInfoFocalLength"),item.FocalLength.toFixed(1)+" mm")),item.ImageOrientation,item.IsoSpeedRating&&attributes.push(createAttribute(globalize.translate("MediaInfoIsoSpeedRating"),item.IsoSpeedRating)),item.Latitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLatitude"),item.Latitude.toFixed(1))),item.Longitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLongitude"),item.Longitude.toFixed(1))),item.ShutterSpeed&&attributes.push(createAttribute(globalize.translate("MediaInfoShutterSpeed"),item.ShutterSpeed)),item.Software&&attributes.push(createAttribute(globalize.translate("MediaInfoSoftware"),item.Software)),html+=attributes.join("
"),page.querySelector(".photoInfoContent").innerHTML=html}function getArtistLinksHtml(artists,context){for(var html=[],i=0,length=artists.length;i'+artist.Name+"")}return html=html.join(" / "),1==artists.length?globalize.translate("ValueArtist",html):artists.length>1?globalize.translate("ValueArtists",html):html}function enableScrollX(){return browserInfo.mobile&&screen.availWidth<=1e3}function getPortraitShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowPortrait":"portrait"}function getSquareShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowSquare":"square"}function getThumbShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowBackdrop":"backdrop"}function renderMoreFromItems(page,item){var moreFromSection=page.querySelector("#moreFromSection");if(moreFromSection)return"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length?void ApiClient.getItems(Dashboard.getCurrentUserId(),{IncludeItemTypes:"MusicAlbum",ArtistIds:item.AlbumArtists[0].Id,Recursive:!0,ExcludeItemIds:item.Id}).then(function(result){if(!result.Items.length)return void moreFromSection.classList.add("hide");moreFromSection.classList.remove("hide"),moreFromSection.querySelector(".moreFromHeader").innerHTML=globalize.translate("MoreFromValue",item.AlbumArtists[0].Name);var html="";html+=enableScrollX()?'
':'
';var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!supportsImageAnalysis,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
";var similarContent=page.querySelector("#moreFromItems");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)}):void moreFromSection.classList.add("hide")}function renderSimilarItems(page,item,context){var similarCollapsible=page.querySelector("#similarCollapsible");if(similarCollapsible){if("Movie"!=item.Type&&"Trailer"!=item.Type&&"Series"!=item.Type&&"Program"!=item.Type&&"Recording"!=item.Type&&"Game"!=item.Type&&"MusicAlbum"!=item.Type&&"MusicArtist"!=item.Type&&"ChannelVideoItem"!=item.Type)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),options={userId:Dashboard.getCurrentUserId(),limit:"MusicAlbum"==item.Type||"MusicArtist"==item.Type?8:10,fields:"PrimaryImageAspectRatio,UserData,CanDelete"};"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length&&(options.ExcludeArtistIds=item.AlbumArtists[0].Id),enableScrollX()&&(options.limit=12),ApiClient.getSimilarItems(item.Id,options).then(function(result){if(!result.Items.length)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var html="";html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis&&("MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type);html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!cardLayout,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,context:context,lazy:!0,showDetailsMenu:!0,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:cardLayout,vibrant:cardLayout&&supportsImageAnalysis}),html+="
";var similarContent=similarCollapsible.querySelector(".similarContent");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)})}}function renderSeriesAirTime(page,item,isStatic){var seriesAirTime=page.querySelector("#seriesAirTime");if("Series"!=item.Type)return void seriesAirTime.classList.add("hide");var html="";if(item.AirDays&&item.AirDays.length&&(html+=7==item.AirDays.length?"daily":item.AirDays.map(function(a){return a+"s"}).join(",")),item.AirTime&&(html+=" at "+item.AirTime),item.Studios.length)if(isStatic)html+=" on "+item.Studios[0].Name;else{var context=inferContext(item),href=LibraryBrowser.getHref(item.Studios[0],context);html+=' on '+item.Studios[0].Name+""}html?(html=("Ended"==item.Status?"Aired ":"Airs ")+html,seriesAirTime.innerHTML=html,seriesAirTime.classList.remove("hide")):seriesAirTime.classList.add("hide")}function renderTags(page,item){var itemTags=page.querySelector(".itemTags");if(item.Tags&&item.Tags.length){for(var html="",i=0,length=item.Tags.length;i'+item.Tags[i]+"
";itemTags.innerHTML=html,itemTags.classList.remove("hide")}else itemTags.classList.add("hide")}function getEpisodesFunction(seriesId,query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getEpisodes(seriesId,query)}}function getAlbumSongsFunction(query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getItems(Dashboard.getCurrentUserId(),query)}}function renderChildren(page,item){_childrenItemsFunction=null;var fields="ItemCounts,AudioInfo,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete",query={ParentId:item.Id,Fields:fields};"BoxSet"!==item.Type&&(query.SortBy="SortName");var promise,userId=Dashboard.getCurrentUserId();"Series"==item.Type?promise=ApiClient.getSeasons(item.Id,{userId:userId,Fields:fields}):"Season"==item.Type?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields})):"Episode"==item.Type&&item.SeriesId&&item.SeasonId?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields})):"MusicAlbum"==item.Type&&(_childrenItemsFunction=getAlbumSongsFunction(query)),promise=promise||ApiClient.getItems(Dashboard.getCurrentUserId(),query),promise.then(function(result){var html="",scrollX=!1,isList=!1,scrollClass="hiddenScrollX",childrenItemsContainer=page.querySelector(".childrenItemsContainer");if("MusicAlbum"==item.Type)html=listView.getListViewHtml({items:result.Items,smallIcon:!0,showIndex:!0,index:"disc",showIndexNumber:!0,playFromHere:!0,action:"playallfromhere",image:!1,artist:"auto",containerAlbumArtist:item.AlbumArtist,addToListButton:!0}),isList=!0;else if("Series"==item.Type)scrollX=enableScrollX(),html=cardBuilder.getCardsHtml({items:result.Items,shape:getPortraitShape(),showTitle:!0,centerText:!0,lazy:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX});else if("Season"==item.Type||"Episode"==item.Type){if("Episode"===item.Type&&childrenItemsContainer.classList.add("darkScroller"),scrollX="Episode"==item.Type,browser.touch||(scrollClass="smoothScrollX"),1==result.Items.length&&"Episode"===item.Type)return;html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(scrollX),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,playFromHere:!0,overlayText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX,includeParentInfoInTitle:!1})}else"GameSystem"==item.Type&&(html=cardBuilder.getCardsHtml({items:result.Items,shape:"auto",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0}));if(page.querySelector("#childrenCollapsible").classList.remove("hide"),scrollX?(childrenItemsContainer.classList.add(scrollClass),childrenItemsContainer.classList.remove("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list")):(childrenItemsContainer.classList.remove("hiddenScrollX"),childrenItemsContainer.classList.remove("smoothScrollX"),isList?(childrenItemsContainer.classList.add("vertical-list"),childrenItemsContainer.classList.remove("vertical-wrap")):(childrenItemsContainer.classList.add("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list"))),childrenItemsContainer.innerHTML=html,imageLoader.lazyChildren(childrenItemsContainer),"BoxSet"==item.Type){var collectionItemTypes=[{name:globalize.translate("HeaderMovies"),type:"Movie"},{name:globalize.translate("HeaderSeries"),type:"Series"},{name:globalize.translate("HeaderAlbums"),type:"MusicAlbum"},{name:globalize.translate("HeaderGames"),type:"Game"},{name:globalize.translate("HeaderBooks"),type:"Book"}];renderCollectionItems(page,item,collectionItemTypes,result.Items)}else if("Episode"===item.Type){var card=childrenItemsContainer.querySelector('.card[data-id="'+item.Id+'"]');card&&scrollHelper.toStart(childrenItemsContainer,card.previousSibling||card,!0)}}),"Season"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderEpisodes"):"Episode"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("MoreFromValue",item.SeasonName):"Series"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderSeasons"):"MusicAlbum"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderTracks"):"GameSystem"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderGames"):page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderItems"),"MusicAlbum"==item.Type?page.querySelector(".childrenSectionHeader",page).classList.add("hide"):page.querySelector(".childrenSectionHeader",page).classList.remove("hide")}function renderItemsByName(page,item,user){require("scripts/itembynamedetailpage".split(","),function(){window.ItemsByName.renderItems(page,item)})}function renderPlaylistItems(page,item,user){require("scripts/playlistedit".split(","),function(){PlaylistViewer.render(page,item)})}function renderChannelGuide(page,item,user){require("scripts/livetvchannel,scripts/livetvcomponents,livetvcss".split(","),function(liveTvChannelPage){liveTvChannelPage.renderPrograms(page,item.Id)})}function renderSeriesSchedule(page,item,user){}function inferContext(item){return"Movie"==item.Type||"BoxSet"==item.Type?"movies":"Series"==item.Type||"Season"==item.Type||"Episode"==item.Type?"tvshows":"Game"==item.Type||"GameSystem"==item.Type?"games":"Game"==item.Type||"GameSystem"==item.Type?"games":"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"music":null}function renderStudios(elem,item,isStatic){var context=inferContext(item);if(item.Studios&&item.Studios.length&&"Series"!=item.Type,1)elem.classList.add("hide");else{for(var html="",i=0,length=item.Studios.length;i0&&(html+="  /  "),isStatic)html+=item.Studios[i].Name;else{item.Studios[i].Type="Studio";var href=LibraryBrowser.getHref(item.Studios[i],context);html+=''+item.Studios[i].Name+""}var translationKey=item.Studios.length>1?"ValueStudios":"ValueStudio";html=globalize.translate(translationKey,html),elem.innerHTML=html,elem.classList.remove("hide")}}function renderGenres(elem,item,limit,isStatic){for(var context=inferContext(item),html="",genres=item.Genres||[],i=0,length=genres.length;i=limit);i++){i>0&&(html+='');var param="Audio"==item.Type||"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"musicgenre":"genre";if("Game"==item.MediaType&&(param="gamegenre"),isStatic)html+=genres[i];else{var type;switch(context){case"tvshows":type="Series";break;case"games":type="Game";break;case"music":type="MusicAlbum";break;default:type="Movie"}var url="secondaryitems.html?type="+type+"&"+param+"="+ApiClient.encodeName(genres[i]);html+=''+genres[i]+""}}elem.innerHTML=html}function renderAwardSummary(elem,item){item.AwardSummary?(elem.classList.remove("hide"),elem.innerHTML=globalize.translate("ValueAwards",item.AwardSummary)):elem.classList.add("hide")}function renderCollectionItems(page,parentItem,types,items){page.querySelector(".collectionItems").innerHTML="";var i,length;for(i=0,length=types.length;i",html+="",html+='',html+="
",html+='
';var shape="MusicAlbum"==type.type?getSquareShape(!1):getPortraitShape(!1);html+=cardBuilder.getCardsHtml({items:items,shape:shape,showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayMoreButton:!0,showAddToCollection:!1,showRemoveFromCollection:!0,collectionId:parentItem.Id}),html+="
",html+="
";var collectionItems=page.querySelector(".collectionItems");collectionItems.insertAdjacentHTML("beforeend",html), +imageLoader.lazyChildren(collectionItems),collectionItems.querySelector(".btnAddToCollection").addEventListener("click",function(){require(["alert"],function(alert){alert({text:globalize.translate("AddItemToCollectionHelp"),html:globalize.translate("AddItemToCollectionHelp")+'

'+globalize.translate("ButtonLearnMore")+""})})})}function renderUserDataIcons(page,item){for(var userDataIcons=page.querySelectorAll(".userDataIcons"),i=0,length=userDataIcons.length;i',html+='
',null!=review.Score||null!=review.Likes&&(html+=review.Likes?"
":"
"),html+='
',html+='

'+review.Caption+"

";var vals=[];if(review.ReviewerName&&vals.push(review.ReviewerName),review.Publisher&&vals.push(review.Publisher),html+='
'+vals.join(", ")+".",review.Date)try{var date=datetime.toLocaleDateString(datetime.parseISO8601Date(review.Date,!0));html+=''+date+""}catch(error){}html+="
",review.Url&&(html+='"),html+="
",html+="
",html+=""}limit&&result.TotalRecordCount>limit&&(html+='

");var criticReviewsContent=page.querySelector("#criticReviewsContent");criticReviewsContent.innerHTML=html,enableScrollX()?criticReviewsContent.classList.add("hiddenScrollX"):criticReviewsContent.classList.remove("hiddenScrollX")}function renderThemeMedia(page,item){"SeriesTimer"!==item.Type&&"Timer"!==item.Type&&"Genre"!==item.Type&&"MusicGenre"!==item.Type&&"GameGenre"!==item.Type&&"Studio"!==item.Type&&"Person"!==item.Type&&ApiClient.getThemeMedia(Dashboard.getCurrentUserId(),item.Id,!0).then(function(result){var themeSongs=result.ThemeSongsResult.OwnerId==item.Id?result.ThemeSongsResult.Items:[],themeVideos=result.ThemeVideosResult.OwnerId==item.Id?result.ThemeVideosResult.Items:[];renderThemeSongs(page,themeSongs),renderThemeVideos(page,themeVideos)})}function renderThemeSongs(page,items){if(items.length){page.querySelector("#themeSongsCollapsible").classList.remove("hide");var html=listView.getListViewHtml({items:items});page.querySelector("#themeSongsContent").innerHTML=html}else page.querySelector("#themeSongsCollapsible").classList.add("hide")}function renderThemeVideos(page,items,user){if(items.length){page.querySelector("#themeVideosCollapsible").classList.remove("hide");var themeVideosContent=page.querySelector("#themeVideosContent");themeVideosContent.innerHTML=getVideosHtml(items,user),imageLoader.lazyChildren(themeVideosContent)}else page.querySelector("#themeVideosCollapsible").classList.add("hide")}function renderMusicVideos(page,item,user){ApiClient.getItems(user.Id,{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"MusicVideo",Recursive:!0,Fields:"DateCreated,CanDelete",Albums:item.Name}).then(function(result){if(result.Items.length){page.querySelector("#musicVideosCollapsible").classList.remove("hide");var musicVideosContent=page.querySelector(".musicVideosContent");musicVideosContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(musicVideosContent)}else page.querySelector("#musicVideosCollapsible").classList.add("hide")})}function renderAdditionalParts(page,item,user){ApiClient.getAdditionalVideoParts(user.Id,item.Id).then(function(result){if(result.Items.length){page.querySelector("#additionalPartsCollapsible").classList.remove("hide");var additionalPartsContent=page.querySelector("#additionalPartsContent");additionalPartsContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(additionalPartsContent)}else page.querySelector("#additionalPartsCollapsible").classList.add("hide")})}function renderScenes(page,item){var chapters=item.Chapters||[];if(chapters.length&&!chapters[0].ImageTag&&(chapters=[]),chapters.length){page.querySelector("#scenesCollapsible").classList.remove("hide");var scenesContent=page.querySelector("#scenesContent");enableScrollX()?scenesContent.classList.add("smoothScrollX"):scenesContent.classList.add("vertical-wrap"),require(["chaptercardbuilder"],function(chaptercardbuilder){chaptercardbuilder.buildChapterCards(item,chapters,{itemsContainer:scenesContent,coverImage:!0,width:400,backdropShape:getThumbShape(),squareShape:getSquareShape()})})}else page.querySelector("#scenesCollapsible").classList.add("hide")}function renderMediaSources(page,user,item){var html=item.MediaSources.map(function(v){return getMediaSourceHtml(user,item,v)}).join('
');item.MediaSources.length>1&&(html="
"+html);var mediaInfoContent=page.querySelector("#mediaInfoContent");mediaInfoContent.innerHTML=html}function getMediaSourceHtml(user,item,version){var html="";version.Name&&item.MediaSources.length>1&&(html+='
'+version.Name+"

");for(var i=0,length=version.MediaStreams.length;i';var displayType=globalize.translate("MediaInfoStreamType"+stream.Type);html+='

'+displayType+"

";var attributes=[];stream.Language&&"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoLanguage"),stream.Language)),stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoCodec"),stream.Codec.toUpperCase())),stream.CodecTag&&attributes.push(createAttribute(globalize.translate("MediaInfoCodecTag"),stream.CodecTag)),null!=stream.IsAVC&&attributes.push(createAttribute("AVC",stream.IsAVC?"Yes":"No")),stream.Profile&&attributes.push(createAttribute(globalize.translate("MediaInfoProfile"),stream.Profile)),stream.Level&&attributes.push(createAttribute(globalize.translate("MediaInfoLevel"),stream.Level)),(stream.Width||stream.Height)&&attributes.push(createAttribute(globalize.translate("MediaInfoResolution"),stream.Width+"x"+stream.Height)),stream.AspectRatio&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoAspectRatio"),stream.AspectRatio)),"Video"==stream.Type&&(null!=stream.IsAnamorphic&&attributes.push(createAttribute(globalize.translate("MediaInfoAnamorphic"),stream.IsAnamorphic?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoInterlaced"),stream.IsInterlaced?"Yes":"No"))),(stream.AverageFrameRate||stream.RealFrameRate)&&attributes.push(createAttribute(globalize.translate("MediaInfoFramerate"),stream.AverageFrameRate||stream.RealFrameRate)),stream.ChannelLayout&&attributes.push(createAttribute(globalize.translate("MediaInfoLayout"),stream.ChannelLayout)),stream.Channels&&attributes.push(createAttribute(globalize.translate("MediaInfoChannels"),stream.Channels+" ch")),stream.BitRate&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoBitrate"),parseInt(stream.BitRate/1e3)+" kbps")),stream.SampleRate&&attributes.push(createAttribute(globalize.translate("MediaInfoSampleRate"),stream.SampleRate+" Hz")),stream.BitDepth&&attributes.push(createAttribute(globalize.translate("MediaInfoBitDepth"),stream.BitDepth+" bit")),stream.PixelFormat&&attributes.push(createAttribute(globalize.translate("MediaInfoPixelFormat"),stream.PixelFormat)),stream.RefFrames&&attributes.push(createAttribute(globalize.translate("MediaInfoRefFrames"),stream.RefFrames)),stream.NalLengthSize&&attributes.push(createAttribute("NAL",stream.NalLengthSize)),"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoDefault"),stream.IsDefault?"Yes":"No")),"Subtitle"==stream.Type&&(attributes.push(createAttribute(globalize.translate("MediaInfoForced"),stream.IsForced?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoExternal"),stream.IsExternal?"Yes":"No"))),"Video"==stream.Type&&version.Timestamp&&attributes.push(createAttribute(globalize.translate("MediaInfoTimestamp"),version.Timestamp)),stream.DisplayTitle&&attributes.push(createAttribute("Title",stream.DisplayTitle)),html+=attributes.join("
"),html+=""}}if(version.Container&&(html+='
'+globalize.translate("MediaInfoContainer")+''+version.Container+"
"),version.Formats&&version.Formats.length,version.Path&&"Http"!=version.Protocol&&user&&user.Policy.IsAdministrator&&(html+='
'+globalize.translate("MediaInfoPath")+''+version.Path+"
"),version.Size){var size=(version.Size/1048576).toFixed(0);html+='
'+globalize.translate("MediaInfoSize")+''+size+" MB
"}return html}function createAttribute(label,value){return''+label+''+value+""}function getVideosHtml(items,user,limit,moreButtonClass){var html=cardBuilder.getCardsHtml({items:items,shape:"auto",showTitle:!0,action:"play",overlayText:!0,showRuntime:!0});return limit&&items.length>limit&&(html+='

"),html}function renderSpecials(page,item,user,limit){ApiClient.getSpecialFeatures(user.Id,item.Id).then(function(specials){var specialsContent=page.querySelector("#specialsContent");specialsContent.innerHTML=getVideosHtml(specials,user,limit,"moreSpecials"),imageLoader.lazyChildren(specialsContent)})}function renderCast(page,item,context,limit,isStatic){var people=item.People||[],castContent=page.querySelector("#castContent");enableScrollX()?(castContent.classList.add("smoothScrollX"),limit=32):castContent.classList.add("vertical-wrap");var limitExceeded=limit&&people.length>limit;limitExceeded&&(people=people.slice(0),people.length=Math.min(limit,people.length)),require(["peoplecardbuilder"],function(peoplecardbuilder){peoplecardbuilder.buildPeopleCards(people,{itemsContainer:castContent,coverImage:!0,serverId:item.ServerId,width:160,shape:getPortraitShape()})});var morePeopleButton=page.querySelector(".morePeople");morePeopleButton&&(limitExceeded&&!enableScrollX()?morePeopleButton.classList.remove("hide"):morePeopleButton.classList.add("hide"))}function play(startPosition){playbackManager.play({items:[currentItem],startPositionTicks:startPosition})}function splitVersions(page,params){require(["confirm"],function(confirm){confirm("Are you sure you wish to split the media sources into separate items?","Split Media Apart").then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Videos/"+params.id+"/AlternateSources")}).then(function(){Dashboard.hideLoadingMsg(),reload(page,params)})})})}function playTrailer(page){playbackManager.playTrailers(currentItem)}function showPlayMenu(item,target){require(["playMenu"],function(playMenu){playMenu.show({item:item,positionTo:target})})}function playCurrentItem(button,mode){var item=currentItem;return"Program"===item.Type?void ApiClient.getLiveTvChannel(item.ChannelId,Dashboard.getCurrentUserId()).then(function(channel){playbackManager.play({items:[channel]})}):void("playmenu"===mode?showPlayMenu(item,button):playbackManager.play({items:[item],startPositionTicks:item.UserData&&"resume"===mode?item.UserData.PlaybackPositionTicks:0}))}function itemDetailPage(){var self=this;self.play=play,self.setInitialCollapsibleState=setInitialCollapsibleState,self.renderDetails=renderDetails,self.renderCriticReviews=renderCriticReviews,self.renderCast=renderCast,self.renderScenes=renderScenes,self.renderMediaSources=renderMediaSources}function onPlayClick(){var mode=this.getAttribute("data-mode");playCurrentItem(this,mode)}function onInstantMixClick(){playbackManager.instantMix(currentItem)}function onShuffleClick(){playbackManager.shuffle(currentItem)}function onDeleteClick(){require(["deleteHelper"],function(deleteHelper){deleteHelper.deleteItem({item:currentItem,navigate:!0})})}function onCancelSeriesTimerClick(){require(["recordingHelper"],function(recordingHelper){recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id,currentItem.ServerId).then(function(){Dashboard.navigate("livetv.html")})})}var currentItem,currentRecordingFields,_childrenItemsFunction=null;return window.ItemDetailPage=new itemDetailPage,function(view,params){function onPlayTrailerClick(){playTrailer(view)}function onMoreCommandsClick(){var button=this;itemContextMenu.show(getContextMenuOptions(currentItem,button)).then(function(result){result.deleted?Emby.Page.goHome():result.updated&&reload(view,params)})}function editImages(){return new Promise(function(resolve,reject){require(["imageEditor"],function(imageEditor){imageEditor.show({itemId:currentItem.Id,serverId:currentItem.ServerId}).then(resolve,reject)})})}function onWebSocketMessage(e,data){var msg=data;if("UserDataChanged"===msg.MessageType&¤tItem&&msg.Data.UserId==Dashboard.getCurrentUserId()){var key=currentItem.UserData.Key,userData=msg.Data.UserDataList.filter(function(u){return u.Key==key})[0];userData&&(currentItem.UserData=userData,Dashboard.getCurrentUser().then(function(user){refreshImage(view,currentItem,user)}))}}var i,length,elems=view.querySelectorAll(".btnPlay");for(i=0,length=elems.length;i'; - } - } else { - view.querySelector('.btnNewCollection').classList.add('hide'); - } - - var elem = view.querySelector('#items'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - - var i, length; - var elems = view.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].innerHTML = pagingHtml; - } - - function onNextPageClick() { - query.StartIndex += query.Limit; - reloadItems(view); - } - - function onPreviousPageClick() { - query.StartIndex -= query.Limit; - reloadItems(view); - } - - elems = view.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); - } - - elems = view.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); - } - - libraryBrowser.saveQueryValues(params.parentId, query); - - var name = item.Name; - - if (item.IndexNumber != null) { - name = item.IndexNumber + " - " + name; - } - if (item.ParentIndexNumber != null) { - name = item.ParentIndexNumber + "." + name; - } - - LibraryMenu.setTitle(name); - - view.dispatchEvent(new CustomEvent("displayingitem", { - detail: { - item: item - }, - bubbles: true - })); - - Dashboard.hideLoadingMsg(); - }); - } - - function showFilterMenu() { - - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { - - var filterDialog = new filterDialogFactory({ - query: getQuery() - }); - - Events.on(filterDialog, 'filterchange', function () { - reloadItems(); - }); - - filterDialog.show(); - }); - } - - var alphaPickerElement = view.querySelector('.alphaPicker'); - alphaPickerElement.addEventListener('alphavaluechanged', function (e) { - var newValue = e.detail.value; - var query = getQuery(); - query.NameStartsWithOrGreater = newValue; - query.StartIndex = 0; - reloadItems(view); - }); - - self.alphaPicker = new alphaPicker({ - element: alphaPickerElement, - valueChangeEvent: 'click' - }); - - function updateFilterControls() { - - var query = getQuery(); - - self.alphaPicker.value(query.NameStartsWithOrGreater); - } - - var btnSelectView = view.querySelector('.btnSelectView'); - btnSelectView.addEventListener('click', function (e) { - - libraryBrowser.showLayoutMenu(e.target, getPageData().view, 'List,Poster,PosterCard,Thumb'.split(',')); - }); - - btnSelectView.addEventListener('layoutchange', function (e) { - var layout = e.detail.viewStyle; - getPageData().view = layout; - libraryBrowser.saveViewSetting(getSavedQueryKey(), layout); - onViewStyleChange(); - reloadItems(view); - }); - - onViewStyleChange(); - - view.querySelector('.btnFilter').addEventListener('click', function () { - showFilterMenu(); - }); - - // On callback make sure to set StartIndex = 0 - view.querySelector('.btnSort').addEventListener('click', function () { - libraryBrowser.showSortMenu({ - items: [{ - name: Globalize.translate('OptionNameSort'), - id: 'IsFolder,SortName' - }, - { - name: Globalize.translate('OptionCommunityRating'), - id: 'CommunityRating,SortName' - }, - { - name: Globalize.translate('OptionCriticRating'), - id: 'CriticRating,SortName' - }, - { - name: Globalize.translate('OptionDateAdded'), - id: 'DateCreated,SortName' - }, - { - name: Globalize.translate('OptionDatePlayed'), - id: 'DatePlayed,SortName' - }, - { - name: Globalize.translate('OptionParentalRating'), - id: 'OfficialRating,SortName' - }, - { - name: Globalize.translate('OptionPlayCount'), - id: 'PlayCount,SortName' - }, - { - name: Globalize.translate('OptionReleaseDate'), - id: 'PremiereDate,SortName' - }, - { - name: Globalize.translate('OptionRuntime'), - id: 'Runtime,SortName' - }], - callback: function () { - reloadItems(view); - }, - query: getQuery() - }); - }); - - // The button is created dynamically - view.querySelector('.btnNewCollection').addEventListener('click', function () { - - require(['collectionEditor'], function (collectionEditor) { - - var serverId = ApiClient.serverInfo().Id; - new collectionEditor().show({ - items: [], - serverId: serverId - }); - - }); - }); - - view.addEventListener('viewbeforeshow', function (e) { - reloadItems(view); - updateFilterControls(); - }); - - view.addEventListener('viewdestroy', function (e) { - if (self.alphaPicker) { - self.alphaPicker.destroy(); - } - }); - }; -}); \ No newline at end of file +define(["libraryBrowser","alphaPicker","listView","cardBuilder","imageLoader","emby-itemscontainer"],function(libraryBrowser,alphaPicker,listView,cardBuilder,imageLoader){"use strict";return function(view,params){function getPageData(){var pageData=data;if(!pageData){pageData=data={query:{SortBy:"IsFolder,SortName",SortOrder:"Ascending",Fields:"DateCreated,PrimaryImageAspectRatio,MediaSourceCount",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",StartIndex:0,Limit:libraryBrowser.getDefaultPageSize()}},pageData.query.Filters="",pageData.query.NameStartsWithOrGreater="";var key=getSavedQueryKey();pageData.view=libraryBrowser.getSavedView(key)||"Poster",pageData.query.ParentId=params.parentId||null,libraryBrowser.loadSavedQueryValues(key,pageData.query)}return pageData}function getQuery(){return getPageData().query}function getSavedQueryKey(){return view.savedQueryKey||(view.savedQueryKey=libraryBrowser.getSavedQueryKey("itemsv1")),view.savedQueryKey}function onViewStyleChange(){var viewStyle=getPageData(view).view,itemsContainer=view.querySelector("#items");"List"==viewStyle?(itemsContainer.classList.add("vertical-list"),itemsContainer.classList.remove("vertical-wrap")):(itemsContainer.classList.remove("vertical-list"),itemsContainer.classList.add("vertical-wrap"),itemsContainer.classList.add("centered")),itemsContainer.innerHTML=""}function reloadItems(){Dashboard.showLoadingMsg();var query=getQuery(),userId=Dashboard.getCurrentUserId(),parentItemPromise=query.ParentId?ApiClient.getItem(userId,query.ParentId):ApiClient.getRootFolder(userId),itemsPromise=ApiClient.getItems(userId,query);Promise.all([parentItemPromise,itemsPromise]).then(function(responses){function onNextPageClick(){query.StartIndex+=query.Limit,reloadItems(view)}function onPreviousPageClick(){query.StartIndex-=query.Limit,reloadItems(view)}var item=responses[0];currentItem=item;var result=responses[1];window.scrollTo(0,0);var viewStyle=getPageData(view).view,html="",pagingHtml=libraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,addLayoutButton:!1,currentLayout:viewStyle,sortButton:!1,filterButton:!1});updateFilterControls();var context=params.context,posterOptions={items:result.Items,shape:"auto",centerText:!0,lazy:!0,coverImage:"PhotoAlbum"==item.Type,context:"folders"};"PosterCard"==viewStyle?(posterOptions.showTitle=!0,posterOptions.showYear=!0,posterOptions.cardLayout=!0,posterOptions.centerText=!1,posterOptions.vibrant=!0,html=cardBuilder.getCardsHtml(posterOptions)):"List"==viewStyle?html=listView.getListViewHtml({items:result.Items,sortBy:query.SortBy}):"Thumb"==viewStyle?(posterOptions.preferThumb=!0,posterOptions.showTitle=!0,posterOptions.shape="backdrop",posterOptions.centerText=!0,posterOptions.overlayText=!1,posterOptions.overlayMoreButton=!0,html=cardBuilder.getCardsHtml(posterOptions)):(posterOptions.showTitle="photos"!=context||"auto",posterOptions.overlayText="photos"==context,posterOptions.overlayMoreButton=!0,html=cardBuilder.getCardsHtml(posterOptions)),"boxsets"==currentItem.CollectionType?(view.querySelector(".btnNewCollection").classList.remove("hide"),result.Items.length||(html='

'+Globalize.translate("MessageNoCollectionsAvailable")+"

")):view.querySelector(".btnNewCollection").classList.add("hide");var elem=view.querySelector("#items");elem.innerHTML=html,imageLoader.lazyChildren(elem);var i,length,elems=view.querySelectorAll(".paging");for(i=0,length=elems.length;i 0) { - tabs.selectedIndex(selected - 1); - } - } - }; - - require(['hammer-main'], function (hammertime) { - - hammertime.on('swipeleft', onSwipeLeft); - hammertime.on('swiperight', onSwipeRight); - - ownerpage.addEventListener('viewdestroy', function () { - hammertime.off('swipeleft', onSwipeLeft); - hammertime.off('swiperight', onSwipeRight); - }); - }); - }, - - configurePaperLibraryTabs: function (ownerpage, tabs, panels, animateTabs, enableSwipe) { - - if (!browser.safari && enableSwipe !== false) { - LibraryBrowser.configureSwipeTabs(ownerpage, tabs); - } - - ownerpage.addEventListener('viewbeforeshow', function () { - if (tabs.triggerBeforeTabChange && this.firstTabIndex == null) { - tabs.triggerBeforeTabChange(); - } - }); - - ownerpage.addEventListener('viewshow', function () { - if (this.firstTabIndex) { - tabs.selectedIndex(this.firstTabIndex); - this.firstTabIndex = null; - } else { - tabs.triggerTabChange(); - } - }); - - tabs.addEventListener('beforetabchange', function (e) { - - if (e.detail.previousIndex != null) { - panels[e.detail.previousIndex].classList.remove('is-active'); - } - - var newPanel = panels[e.detail.selectedTabIndex]; - - if (e.detail.previousIndex != null && e.detail.previousIndex != e.detail.selectedTabIndex) { - if (newPanel.animate && (animateTabs || []).indexOf(e.detail.selectedTabIndex) != -1) { - fadeInRight(newPanel); - } - } - - newPanel.classList.add('is-active'); - }); - }, - - showTab: function (url, index) { - - var afterNavigate = function () { - - document.removeEventListener('pageinit', afterNavigate); - if (window.location.href.toLowerCase().indexOf(url.toLowerCase()) != -1) { - this.firstTabIndex = index; - } - }; - - if (window.location.href.toLowerCase().indexOf(url.toLowerCase()) != -1) { - - require(['viewManager'], function (viewManager) { - afterNavigate.call(viewManager.currentView()); - }); - } else { - - pageClassOn('pageinit', 'page', afterNavigate); - Dashboard.navigate(url); - } - }, - - getArtistLinksHtml: function (artists, cssClass) { - - var html = []; - - for (var i = 0, length = artists.length; i < length; i++) { - - var artist = artists[i]; - - var css = cssClass ? (' class="' + cssClass + '"') : ''; - html.push('' + artist.Name + ''); - - } - - html = html.join(' / '); - - return html; - }, - - getHref: function (item, context, topParentId) { - - if (!item) { - throw new Error('item cannot be null'); - } - - if (item.url) { - return item.url; - } - - var url; - // Handle search hints - var id = item.Id || item.ItemId; - - if (item.Type == "SeriesTimer") { - //return "livetvseriestimer.html?id=" + id; - return "itemdetails.html?seriesTimerId=" + id; - } - - if (item.CollectionType == 'livetv') { - return 'livetv.html'; - } - - if (item.CollectionType == 'channels') { - - return 'channels.html'; - } - - if (context != 'folders') { - if (item.CollectionType == 'movies') { - return 'movies.html?topParentId=' + item.Id; - } - - if (item.CollectionType == 'boxsets') { - return 'itemlist.html?topParentId=' + item.Id + '&parentId=' + item.Id; - } - - if (item.CollectionType == 'tvshows') { - return 'tv.html?topParentId=' + item.Id; - } - - if (item.CollectionType == 'music') { - return 'music.html?topParentId=' + item.Id; - } - - if (item.CollectionType == 'games') { - return id ? "itemlist.html?parentId=" + id : "#"; - //return 'gamesrecommended.html?topParentId=' + item.Id; - } - if (item.CollectionType == 'playlists') { - return 'playlists.html?topParentId=' + item.Id; - } - if (item.CollectionType == 'photos') { - return 'photos.html?topParentId=' + item.Id; - } - } - else if (item.IsFolder) { - if (item.Type != "BoxSet" && item.Type != "Series") { - return id ? "itemlist.html?parentId=" + id : "#"; - } - } - - if (item.Type == 'CollectionFolder') { - return 'itemlist.html?topParentId=' + item.Id + '&parentId=' + item.Id; - } - - if (item.Type == "PhotoAlbum") { - return "itemlist.html?context=photos&parentId=" + id; - } - if (item.Type == "Playlist") { - return "itemdetails.html?id=" + id; - } - if (item.Type == "TvChannel") { - return "itemdetails.html?id=" + id; - } - if (item.Type == "Channel") { - return "channelitems.html?id=" + id; - } - if ((item.IsFolder && item.SourceType == 'Channel') || item.Type == 'ChannelFolderItem') { - return "channelitems.html?id=" + item.ChannelId + '&folderId=' + item.Id; - } - if (item.Type == "Program") { - return "itemdetails.html?id=" + id; - } - - if (item.Type == "BoxSet") { - return "itemdetails.html?id=" + id; - } - if (item.Type == "MusicAlbum") { - return "itemdetails.html?id=" + id; - } - if (item.Type == "GameSystem") { - return "itemdetails.html?id=" + id; - } - if (item.Type == "Genre") { - var type; - switch (context) { - case 'tvshows': - type = 'Series'; - break; - case 'games': - type = 'Game'; - break; - default: - type = 'Movie'; - break; - } - - url = "secondaryitems.html?type=" + type + "&genreId=" + id; - if (topParentId) { - url += "&parentId=" + topParentId; - } - return url; - } - if (item.Type == "MusicGenre") { - return "itemdetails.html?id=" + id; - } - if (item.Type == "GameGenre") { - - url = "secondaryitems.html?type=Game&genreId=" + id; - if (topParentId) { - url += "&parentId=" + topParentId; - } - return url; - } - if (item.Type == "Studio") { - - var type; - switch (context) { - case 'tvshows': - type = 'Series'; - break; - case 'games': - type = 'Game'; - break; - default: - type = 'Movie'; - break; - } - - url = "secondaryitems.html?type=" + type + "&studioId=" + id; - if (topParentId) { - url += "&parentId=" + topParentId; - } - return url; - } - if (item.Type == "Person") { - return "itemdetails.html?id=" + id; - } - if (item.Type == "Recording") { - return "itemdetails.html?id=" + id; - } - - if (item.Type == "MusicArtist") { - return "itemdetails.html?id=" + id; - } - - var contextSuffix = context ? ('&context=' + context) : ''; - - if (item.Type == "Series" || item.Type == "Season" || item.Type == "Episode") { - return "itemdetails.html?id=" + id + contextSuffix; - } - - if (item.IsFolder) { - return id ? "itemlist.html?parentId=" + id : "#"; - } - - return "itemdetails.html?id=" + id; - }, - - getListItemInfo: function (elem) { - - var elemWithAttributes = elem; - - while (!elemWithAttributes.getAttribute('data-id')) { - elemWithAttributes = elemWithAttributes.parentNode; - } - - var itemId = elemWithAttributes.getAttribute('data-id'); - var index = elemWithAttributes.getAttribute('data-index'); - var mediaType = elemWithAttributes.getAttribute('data-mediatype'); - - return { - id: itemId, - index: index, - mediaType: mediaType, - context: elemWithAttributes.getAttribute('data-context') - }; - }, - - getFutureDateText: function (date) { - - var weekday = []; - weekday[0] = Globalize.translate('OptionSunday'); - weekday[1] = Globalize.translate('OptionMonday'); - weekday[2] = Globalize.translate('OptionTuesday'); - weekday[3] = Globalize.translate('OptionWednesday'); - weekday[4] = Globalize.translate('OptionThursday'); - weekday[5] = Globalize.translate('OptionFriday'); - weekday[6] = Globalize.translate('OptionSaturday'); - - var day = weekday[date.getDay()]; - date = datetime.toLocaleDateString(date); - - if (date.toLowerCase().indexOf(day.toLowerCase()) == -1) { - return day + " " + date; - } - - return date; - }, - - renderName: function (item, nameElem, linkToElement, context) { - - require(['itemHelper'], function (itemHelper) { - var name = itemHelper.getDisplayName(item, { - includeParentInfo: false - }); - - if (linkToElement) { - nameElem.innerHTML = '' + name + ''; - } else { - nameElem.innerHTML = name; - } - }); - }, - - renderParentName: function (item, parentNameElem, context) { - - var html = []; - - var contextParam = context ? ('&context=' + context) : ''; - - if (item.AlbumArtists) { - html.push(LibraryBrowser.getArtistLinksHtml(item.AlbumArtists, "detailPageParentLink")); - } else if (item.ArtistItems && item.ArtistItems.length && item.Type == "MusicVideo") { - html.push(LibraryBrowser.getArtistLinksHtml(item.ArtistItems, "detailPageParentLink")); - } else if (item.SeriesName && item.Type == "Episode") { - - html.push('' + item.SeriesName + ''); - } - - if (item.SeriesName && item.Type == "Season") { - - html.push('' + item.SeriesName + ''); - - } else if (item.ParentIndexNumber != null && item.Type == "Episode") { - - html.push('' + item.SeasonName + ''); - - } else if (item.Album && item.Type == "Audio" && (item.AlbumId || item.ParentId)) { - html.push('' + item.Album + ''); - - } else if (item.Album && item.Type == "MusicVideo" && item.AlbumId) { - html.push('' + item.Album + ''); - - } else if (item.Album) { - html.push(item.Album); - } else if (item.Type == 'Program' && item.IsSeries) { - html.push(item.Name); - } - - if (html.length) { - parentNameElem.classList.remove('hide'); - parentNameElem.innerHTML = html.join(' - '); - } else { - parentNameElem.classList.add('hide'); - } - }, - - showLayoutMenu: function (button, currentLayout, views) { - - var dispatchEvent = true; - - if (!views) { - - dispatchEvent = false; - // Add banner and list once all screens support them - views = button.getAttribute('data-layouts'); - - views = views ? views.split(',') : ['List', 'Poster', 'PosterCard', 'Thumb', 'ThumbCard']; - } - - var menuItems = views.map(function (v) { - return { - name: Globalize.translate('Option' + v), - id: v, - selected: currentLayout == v - }; - }); - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - items: menuItems, - positionTo: button, - callback: function (id) { - - button.dispatchEvent(new CustomEvent('layoutchange', { - detail: { - viewStyle: id - }, - bubbles: true, - cancelable: false - })); - - if (!dispatchEvent) { - if (window.$) { - $(button).trigger('layoutchange', [id]); - } - } - } - }); - - }); - - }, - - getQueryPagingHtml: function (options) { - - var startIndex = options.startIndex; - var limit = options.limit; - var totalRecordCount = options.totalRecordCount; - - if (limit && options.updatePageSizeSetting !== false) { - try { - appSettings.set(options.pageSizeKey || pageSizeKey, limit); - } catch (e) { - - } - } - - var html = ''; - - var recordsEnd = Math.min(startIndex + limit, totalRecordCount); - - // 20 is the minimum page size - var showControls = totalRecordCount > 20 || limit < totalRecordCount; - - html += '
'; - - if (showControls) { - html += ''; - - var startAtDisplay = totalRecordCount ? startIndex + 1 : 0; - html += startAtDisplay + '-' + recordsEnd + ' of ' + totalRecordCount; - - html += ''; - } - - if (showControls || options.viewButton || options.filterButton || options.sortButton || options.addLayoutButton) { - - html += '
'; - - if (showControls) { - - html += ''; - html += ''; - } - - if (options.addLayoutButton) { - - html += ''; - } - - if (options.sortButton) { - - html += ''; - } - - if (options.filterButton) { - - html += ''; - } - - html += '
'; - - if (showControls && options.showLimit) { - - var id = "selectPageSize"; - - var pageSizes = options.pageSizes || [20, 50, 100, 200, 300, 400, 500]; - - var optionsHtml = pageSizes.map(function (val) { - - if (limit == val) { - - return ''; - - } else { - return ''; - } - }).join(''); - - // Add styles to defeat jquery mobile - html += '
'; - } - } - - html += '
'; - - return html; - }, - - showSortMenu: function (options) { - - require(['dialogHelper', 'emby-radio'], function (dialogHelper) { - - var dlg = dialogHelper.createDialog({ - removeOnClose: true, - modal: false, - entryAnimationDuration: 160, - exitAnimationDuration: 200 - }); - - dlg.classList.add('ui-body-a'); - dlg.classList.add('background-theme-a'); - dlg.classList.add('formDialog'); - - var html = ''; - - html += '
'; - - html += '

'; - html += Globalize.translate('HeaderSortBy'); - html += '

'; - - var i, length; - var isChecked; - - html += '
'; - for (i = 0, length = options.items.length; i < length; i++) { - - var option = options.items[i]; - - var radioValue = option.id.replace(',', '_'); - isChecked = (options.query.SortBy || '').replace(',', '_') == radioValue ? ' checked' : ''; - html += ''; - } - html += '
'; - - html += '

'; - html += Globalize.translate('HeaderSortOrder'); - html += '

'; - html += '
'; - isChecked = options.query.SortOrder == 'Ascending' ? ' checked' : ''; - html += ''; - isChecked = options.query.SortOrder == 'Descending' ? ' checked' : ''; - html += ''; - html += '
'; - html += '
'; - - dlg.innerHTML = html; - - dialogHelper.open(dlg); - - function onSortByChange() { - var newValue = this.value; - if (this.checked) { - var changed = options.query.SortBy != newValue; - - options.query.SortBy = newValue.replace('_', ','); - options.query.StartIndex = 0; - - if (options.callback && changed) { - options.callback(); - } - } - } - - var sortBys = dlg.querySelectorAll('.menuSortBy'); - for (i = 0, length = sortBys.length; i < length; i++) { - sortBys[i].addEventListener('change', onSortByChange); - } - - function onSortOrderChange() { - var newValue = this.value; - if (this.checked) { - var changed = options.query.SortOrder != newValue; - - options.query.SortOrder = newValue; - options.query.StartIndex = 0; - - if (options.callback && changed) { - options.callback(); - } - } - } - - var sortOrders = dlg.querySelectorAll('.menuSortOrder'); - for (i = 0, length = sortOrders.length; i < length; i++) { - sortOrders[i].addEventListener('change', onSortOrderChange); - } - }); - }, - - renderDetailImage: function (elem, item, editable, preferThumb, imageLoader, indicators) { - - if (item.Type === 'SeriesTimer') { - editable = false; - } - - var imageTags = item.ImageTags || {}; - - if (item.PrimaryImageTag) { - imageTags.Primary = item.PrimaryImageTag; - } - - var html = ''; - - var url; - var shape = 'portrait'; - - var imageHeight = 360; - var detectRatio = false; - - if (preferThumb && imageTags.Thumb) { - - url = ApiClient.getScaledImageUrl(item.Id, { - type: "Thumb", - maxHeight: imageHeight, - tag: item.ImageTags.Thumb - }); - shape = 'thumb'; - } - else if (imageTags.Primary) { - - url = ApiClient.getScaledImageUrl(item.Id, { - type: "Primary", - maxHeight: imageHeight, - tag: item.ImageTags.Primary - }); - detectRatio = true; - } - else if (item.BackdropImageTags && item.BackdropImageTags.length) { - - url = ApiClient.getScaledImageUrl(item.Id, { - type: "Backdrop", - maxHeight: imageHeight, - tag: item.BackdropImageTags[0] - }); - shape = 'thumb'; - } - else if (imageTags.Thumb) { - - url = ApiClient.getScaledImageUrl(item.Id, { - type: "Thumb", - maxHeight: imageHeight, - tag: item.ImageTags.Thumb - }); - shape = 'thumb'; - } - else if (imageTags.Disc) { - - url = ApiClient.getScaledImageUrl(item.Id, { - type: "Disc", - maxHeight: imageHeight, - tag: item.ImageTags.Disc - }); - shape = 'square'; - } - else if (item.AlbumId && item.AlbumPrimaryImageTag) { - - url = ApiClient.getScaledImageUrl(item.AlbumId, { - type: "Primary", - maxHeight: imageHeight, - tag: item.AlbumPrimaryImageTag - }); - shape = 'square'; - } - else if (item.SeriesId && item.SeriesPrimaryImageTag) { - - url = ApiClient.getScaledImageUrl(item.SeriesId, { - type: "Primary", - maxHeight: imageHeight, - tag: item.SeriesPrimaryImageTag - }); - } - else if (item.ParentPrimaryImageItemId && item.ParentPrimaryImageTag) { - - url = ApiClient.getScaledImageUrl(item.ParentPrimaryImageItemId, { - type: "Primary", - maxHeight: imageHeight, - tag: item.ParentPrimaryImageTag - }); - } - - html += '
'; - - if (editable) { - html += ""; - } - - if (detectRatio && item.PrimaryImageAspectRatio) { - - if (item.PrimaryImageAspectRatio >= 1.48) { - shape = 'thumb'; - } else if (item.PrimaryImageAspectRatio >= .85 && item.PrimaryImageAspectRatio <= 1.34) { - shape = 'square'; - } - } - - html += ""; - - if (editable) { - html += ""; - } - - var progressHtml = item.IsFolder || !item.UserData ? '' : indicators.getProgressBarHtml(item); - - html += '
'; - if (progressHtml) { - html += progressHtml; - } - html += "
"; - - html += "
"; - - elem.innerHTML = html; - - if (shape == 'thumb') { - elem.classList.add('thumbDetailImageContainer'); - elem.classList.remove('portraitDetailImageContainer'); - elem.classList.remove('squareDetailImageContainer'); - } - else if (shape == 'square') { - elem.classList.remove('thumbDetailImageContainer'); - elem.classList.remove('portraitDetailImageContainer'); - elem.classList.add('squareDetailImageContainer'); - } else { - elem.classList.remove('thumbDetailImageContainer'); - elem.classList.add('portraitDetailImageContainer'); - elem.classList.remove('squareDetailImageContainer'); - } - - if (url) { - var img = elem.querySelector('img'); - img.onload = function () { - if (img.src.indexOf('empty.png') == -1) { - img.classList.add('loaded'); - } - }; - imageLoader.lazyImage(img, url); - } - }, - - renderDetailPageBackdrop: function (page, item, imageLoader) { - - var screenWidth = screen.availWidth; - - var imgUrl; - var hasbackdrop = false; - - var itemBackdropElement = page.querySelector('#itemBackdrop'); - - if (item.BackdropImageTags && item.BackdropImageTags.length) { - - imgUrl = ApiClient.getScaledImageUrl(item.Id, { - type: "Backdrop", - index: 0, - maxWidth: screenWidth, - tag: item.BackdropImageTags[0] - }); - - itemBackdropElement.classList.remove('noBackdrop'); - imageLoader.lazyImage(itemBackdropElement, imgUrl, false); - hasbackdrop = true; - } - else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { - - imgUrl = ApiClient.getScaledImageUrl(item.ParentBackdropItemId, { - type: 'Backdrop', - index: 0, - tag: item.ParentBackdropImageTags[0], - maxWidth: screenWidth - }); - - itemBackdropElement.classList.remove('noBackdrop'); - imageLoader.lazyImage(itemBackdropElement, imgUrl, false); - hasbackdrop = true; - } - else { - - itemBackdropElement.classList.add('noBackdrop'); - itemBackdropElement.style.backgroundImage = ''; - } - - return hasbackdrop; - } - }; - - return libraryBrowser; - - })(window, document, screen); - - window.LibraryBrowser = libraryBrowser; - - return libraryBrowser; -}); \ No newline at end of file +define(["appSettings","dom","browser","datetime","scrollStyles"],function(appSettings,dom,browser,datetime){"use strict";function fadeInRight(elem){var pct=browser.mobile?"4%":"0.5%",keyframes=[{opacity:"0",transform:"translate3d("+pct+", 0, 0)",offset:0},{opacity:"1",transform:"none",offset:1}];elem.animate(keyframes,{duration:160,iterations:1,easing:"ease-out"})}var libraryBrowser=function(window,document,screen){var pageSizeKey="pagesize_v4",libraryBrowser={getDefaultPageSize:function(key,defaultValue){return 100},getSavedQueryKey:function(modifier){return window.location.href.split("#")[0]+(modifier||"")},loadSavedQueryValues:function(key,query){var values=appSettings.get(key+"_"+Dashboard.getCurrentUserId());return values?(values=JSON.parse(values),Object.assign(query,values)):query},saveQueryValues:function(key,query){var values={};query.SortBy&&(values.SortBy=query.SortBy),query.SortOrder&&(values.SortOrder=query.SortOrder);try{appSettings.set(key+"_"+Dashboard.getCurrentUserId(),JSON.stringify(values))}catch(e){}},saveViewSetting:function(key,value){try{appSettings.set(key+"_"+Dashboard.getCurrentUserId()+"_view",value)}catch(e){}},getSavedView:function(key){var val=appSettings.get(key+"_"+Dashboard.getCurrentUserId()+"_view");return val},getSavedViewSetting:function(key){return new Promise(function(resolve,reject){var val=LibraryBrowser.getSavedView(key);resolve(val)})},allowSwipe:function(target){function allowSwipeOn(elem){return!dom.parentWithTag(elem,"input")&&(!elem.classList||!elem.classList.contains("hiddenScrollX")&&!elem.classList.contains("smoothScrollX")&&!elem.classList.contains("animatedScrollX"))}for(var parent=target;null!=parent;){if(!allowSwipeOn(parent))return!1;parent=parent.parentNode}return!0},configureSwipeTabs:function(ownerpage,tabs){if(browser.touch){var pageCount=ownerpage.querySelectorAll(".pageTabContent").length,onSwipeLeft=function(e){if(LibraryBrowser.allowSwipe(e.target)&&ownerpage.contains(e.target)){var selected=parseInt(tabs.selectedIndex()||"0");selected0&&tabs.selectedIndex(selected-1)}};require(["hammer-main"],function(hammertime){hammertime.on("swipeleft",onSwipeLeft),hammertime.on("swiperight",onSwipeRight),ownerpage.addEventListener("viewdestroy",function(){hammertime.off("swipeleft",onSwipeLeft),hammertime.off("swiperight",onSwipeRight)})})}},configurePaperLibraryTabs:function(ownerpage,tabs,panels,animateTabs,enableSwipe){browser.safari||enableSwipe===!1||LibraryBrowser.configureSwipeTabs(ownerpage,tabs),ownerpage.addEventListener("viewbeforeshow",function(){tabs.triggerBeforeTabChange&&null==this.firstTabIndex&&tabs.triggerBeforeTabChange()}),ownerpage.addEventListener("viewshow",function(){this.firstTabIndex?(tabs.selectedIndex(this.firstTabIndex),this.firstTabIndex=null):tabs.triggerTabChange()}),tabs.addEventListener("beforetabchange",function(e){null!=e.detail.previousIndex&&panels[e.detail.previousIndex].classList.remove("is-active");var newPanel=panels[e.detail.selectedTabIndex];null!=e.detail.previousIndex&&e.detail.previousIndex!=e.detail.selectedTabIndex&&newPanel.animate&&(animateTabs||[]).indexOf(e.detail.selectedTabIndex)!=-1&&fadeInRight(newPanel),newPanel.classList.add("is-active")})},showTab:function(url,index){var afterNavigate=function(){document.removeEventListener("pageinit",afterNavigate),window.location.href.toLowerCase().indexOf(url.toLowerCase())!=-1&&(this.firstTabIndex=index)};window.location.href.toLowerCase().indexOf(url.toLowerCase())!=-1?require(["viewManager"],function(viewManager){afterNavigate.call(viewManager.currentView())}):(pageClassOn("pageinit","page",afterNavigate),Dashboard.navigate(url))},getArtistLinksHtml:function(artists,cssClass){for(var html=[],i=0,length=artists.length;i'+artist.Name+"")}return html=html.join(" / ")},getHref:function(item,context,topParentId){if(!item)throw new Error("item cannot be null");if(item.url)return item.url;var url,id=item.Id||item.ItemId;if("SeriesTimer"==item.Type)return"itemdetails.html?seriesTimerId="+id;if("livetv"==item.CollectionType)return"livetv.html";if("channels"==item.CollectionType)return"channels.html";if("folders"!=context){if("movies"==item.CollectionType)return"movies.html?topParentId="+item.Id;if("boxsets"==item.CollectionType)return"itemlist.html?topParentId="+item.Id+"&parentId="+item.Id;if("tvshows"==item.CollectionType)return"tv.html?topParentId="+item.Id;if("music"==item.CollectionType)return"music.html?topParentId="+item.Id;if("games"==item.CollectionType)return id?"itemlist.html?parentId="+id:"#";if("playlists"==item.CollectionType)return"playlists.html?topParentId="+item.Id;if("photos"==item.CollectionType)return"photos.html?topParentId="+item.Id}else if(item.IsFolder&&"BoxSet"!=item.Type&&"Series"!=item.Type)return id?"itemlist.html?parentId="+id:"#";if("CollectionFolder"==item.Type)return"itemlist.html?topParentId="+item.Id+"&parentId="+item.Id;if("PhotoAlbum"==item.Type)return"itemlist.html?context=photos&parentId="+id;if("Playlist"==item.Type)return"itemdetails.html?id="+id;if("TvChannel"==item.Type)return"itemdetails.html?id="+id;if("Channel"==item.Type)return"channelitems.html?id="+id;if(item.IsFolder&&"Channel"==item.SourceType||"ChannelFolderItem"==item.Type)return"channelitems.html?id="+item.ChannelId+"&folderId="+item.Id;if("Program"==item.Type)return"itemdetails.html?id="+id;if("BoxSet"==item.Type)return"itemdetails.html?id="+id;if("MusicAlbum"==item.Type)return"itemdetails.html?id="+id;if("GameSystem"==item.Type)return"itemdetails.html?id="+id;if("Genre"==item.Type){var type;switch(context){case"tvshows":type="Series";break;case"games":type="Game";break;default:type="Movie"}return url="secondaryitems.html?type="+type+"&genreId="+id,topParentId&&(url+="&parentId="+topParentId),url}if("MusicGenre"==item.Type)return"itemdetails.html?id="+id;if("GameGenre"==item.Type)return url="secondaryitems.html?type=Game&genreId="+id,topParentId&&(url+="&parentId="+topParentId),url;if("Studio"==item.Type){var type;switch(context){case"tvshows":type="Series";break;case"games":type="Game";break;default:type="Movie"}return url="secondaryitems.html?type="+type+"&studioId="+id,topParentId&&(url+="&parentId="+topParentId),url}if("Person"==item.Type)return"itemdetails.html?id="+id;if("Recording"==item.Type)return"itemdetails.html?id="+id;if("MusicArtist"==item.Type)return"itemdetails.html?id="+id;var contextSuffix=context?"&context="+context:"";return"Series"==item.Type||"Season"==item.Type||"Episode"==item.Type?"itemdetails.html?id="+id+contextSuffix:item.IsFolder?id?"itemlist.html?parentId="+id:"#":"itemdetails.html?id="+id},getListItemInfo:function(elem){for(var elemWithAttributes=elem;!elemWithAttributes.getAttribute("data-id");)elemWithAttributes=elemWithAttributes.parentNode;var itemId=elemWithAttributes.getAttribute("data-id"),index=elemWithAttributes.getAttribute("data-index"),mediaType=elemWithAttributes.getAttribute("data-mediatype");return{id:itemId,index:index,mediaType:mediaType,context:elemWithAttributes.getAttribute("data-context")}},getFutureDateText:function(date){var weekday=[];weekday[0]=Globalize.translate("OptionSunday"),weekday[1]=Globalize.translate("OptionMonday"),weekday[2]=Globalize.translate("OptionTuesday"),weekday[3]=Globalize.translate("OptionWednesday"),weekday[4]=Globalize.translate("OptionThursday"),weekday[5]=Globalize.translate("OptionFriday"),weekday[6]=Globalize.translate("OptionSaturday");var day=weekday[date.getDay()];return date=datetime.toLocaleDateString(date),date.toLowerCase().indexOf(day.toLowerCase())==-1?day+" "+date:date},renderName:function(item,nameElem,linkToElement,context){require(["itemHelper"],function(itemHelper){var name=itemHelper.getDisplayName(item,{includeParentInfo:!1});linkToElement?nameElem.innerHTML=''+name+"":nameElem.innerHTML=name})},renderParentName:function(item,parentNameElem,context){var html=[],contextParam=context?"&context="+context:"";item.AlbumArtists?html.push(LibraryBrowser.getArtistLinksHtml(item.AlbumArtists,"detailPageParentLink")):item.ArtistItems&&item.ArtistItems.length&&"MusicVideo"==item.Type?html.push(LibraryBrowser.getArtistLinksHtml(item.ArtistItems,"detailPageParentLink")):item.SeriesName&&"Episode"==item.Type&&html.push(''+item.SeriesName+""),item.SeriesName&&"Season"==item.Type?html.push(''+item.SeriesName+""):null!=item.ParentIndexNumber&&"Episode"==item.Type?html.push(''+item.SeasonName+""):item.Album&&"Audio"==item.Type&&(item.AlbumId||item.ParentId)?html.push(''+item.Album+""):item.Album&&"MusicVideo"==item.Type&&item.AlbumId?html.push(''+item.Album+""):item.Album?html.push(item.Album):"Program"==item.Type&&item.IsSeries&&html.push(item.Name),html.length?(parentNameElem.classList.remove("hide"),parentNameElem.innerHTML=html.join(" - ")):parentNameElem.classList.add("hide")},showLayoutMenu:function(button,currentLayout,views){var dispatchEvent=!0;views||(dispatchEvent=!1,views=button.getAttribute("data-layouts"),views=views?views.split(","):["List","Poster","PosterCard","Thumb","ThumbCard"]);var menuItems=views.map(function(v){return{name:Globalize.translate("Option"+v),id:v,selected:currentLayout==v}});require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:button,callback:function(id){button.dispatchEvent(new CustomEvent("layoutchange",{detail:{viewStyle:id},bubbles:!0,cancelable:!1})),dispatchEvent||window.$&&$(button).trigger("layoutchange",[id])}})})},getQueryPagingHtml:function(options){var startIndex=options.startIndex,limit=options.limit,totalRecordCount=options.totalRecordCount;if(limit&&options.updatePageSizeSetting!==!1)try{appSettings.set(options.pageSizeKey||pageSizeKey,limit)}catch(e){}var html="",recordsEnd=Math.min(startIndex+limit,totalRecordCount),showControls=totalRecordCount>20||limit',showControls){html+='';var startAtDisplay=totalRecordCount?startIndex+1:0;html+=startAtDisplay+"-"+recordsEnd+" of "+totalRecordCount,html+=""}if((showControls||options.viewButton||options.filterButton||options.sortButton||options.addLayoutButton)&&(html+='
',showControls&&(html+='',html+=''),options.addLayoutButton&&(html+=''),options.sortButton&&(html+=''),options.filterButton&&(html+=''),html+="
",showControls&&options.showLimit)){var id="selectPageSize",pageSizes=options.pageSizes||[20,50,100,200,300,400,500],optionsHtml=pageSizes.map(function(val){return limit==val?'":'"}).join("");html+='
"}return html+=""},showSortMenu:function(options){require(["dialogHelper","emby-radio"],function(dialogHelper){function onSortByChange(){var newValue=this.value;if(this.checked){var changed=options.query.SortBy!=newValue;options.query.SortBy=newValue.replace("_",","),options.query.StartIndex=0,options.callback&&changed&&options.callback()}}function onSortOrderChange(){var newValue=this.value;if(this.checked){var changed=options.query.SortOrder!=newValue;options.query.SortOrder=newValue,options.query.StartIndex=0,options.callback&&changed&&options.callback()}}var dlg=dialogHelper.createDialog({removeOnClose:!0,modal:!1,entryAnimationDuration:160,exitAnimationDuration:200});dlg.classList.add("ui-body-a"),dlg.classList.add("background-theme-a"),dlg.classList.add("formDialog");var html="";html+='
',html+='

',html+=Globalize.translate("HeaderSortBy"),html+="

";var i,length,isChecked;for(html+="
",i=0,length=options.items.length;i"+option.name+""}html+="
",html+='

',html+=Globalize.translate("HeaderSortOrder"),html+="

",html+="
",isChecked="Ascending"==options.query.SortOrder?" checked":"",html+='",isChecked="Descending"==options.query.SortOrder?" checked":"",html+='",html+="
",html+="
",dlg.innerHTML=html,dialogHelper.open(dlg);var sortBys=dlg.querySelectorAll(".menuSortBy");for(i=0,length=sortBys.length;i',editable&&(html+=""),detectRatio&&item.PrimaryImageAspectRatio&&(item.PrimaryImageAspectRatio>=1.48?shape="thumb":item.PrimaryImageAspectRatio>=.85&&item.PrimaryImageAspectRatio<=1.34&&(shape="square")),html+="",editable&&(html+="");var progressHtml=item.IsFolder||!item.UserData?"":indicators.getProgressBarHtml(item);if(html+='
',progressHtml&&(html+=progressHtml),html+="
",html+="",elem.innerHTML=html,"thumb"==shape?(elem.classList.add("thumbDetailImageContainer"),elem.classList.remove("portraitDetailImageContainer"),elem.classList.remove("squareDetailImageContainer")):"square"==shape?(elem.classList.remove("thumbDetailImageContainer"),elem.classList.remove("portraitDetailImageContainer"),elem.classList.add("squareDetailImageContainer")):(elem.classList.remove("thumbDetailImageContainer"),elem.classList.add("portraitDetailImageContainer"),elem.classList.remove("squareDetailImageContainer")),url){var img=elem.querySelector("img");img.onload=function(){img.src.indexOf("empty.png")==-1&&img.classList.add("loaded")},imageLoader.lazyImage(img,url)}},renderDetailPageBackdrop:function(page,item,imageLoader){var imgUrl,screenWidth=screen.availWidth,hasbackdrop=!1,itemBackdropElement=page.querySelector("#itemBackdrop");return item.BackdropImageTags&&item.BackdropImageTags.length?(imgUrl=ApiClient.getScaledImageUrl(item.Id,{type:"Backdrop",index:0,maxWidth:screenWidth,tag:item.BackdropImageTags[0]}),itemBackdropElement.classList.remove("noBackdrop"),imageLoader.lazyImage(itemBackdropElement,imgUrl,!1),hasbackdrop=!0):item.ParentBackdropItemId&&item.ParentBackdropImageTags&&item.ParentBackdropImageTags.length?(imgUrl=ApiClient.getScaledImageUrl(item.ParentBackdropItemId,{type:"Backdrop",index:0,tag:item.ParentBackdropImageTags[0],maxWidth:screenWidth}),itemBackdropElement.classList.remove("noBackdrop"),imageLoader.lazyImage(itemBackdropElement,imgUrl,!1),hasbackdrop=!0):(itemBackdropElement.classList.add("noBackdrop"),itemBackdropElement.style.backgroundImage=""),hasbackdrop}};return libraryBrowser}(window,document,screen);return window.LibraryBrowser=libraryBrowser,libraryBrowser}); \ No newline at end of file diff --git a/dashboard-ui/scripts/librarymenu.js b/dashboard-ui/scripts/librarymenu.js index e91a2511ca..f00af2c59d 100644 --- a/dashboard-ui/scripts/librarymenu.js +++ b/dashboard-ui/scripts/librarymenu.js @@ -1,1076 +1 @@ -define(['layoutManager', 'viewManager', 'libraryBrowser', 'embyRouter', 'playbackManager', 'paper-icon-button-light', 'material-icons', 'scrollStyles'], function (layoutManager, viewManager, libraryBrowser, embyRouter, playbackManager) { - 'use strict'; - - var enableBottomTabs = AppInfo.isNativeApp; - var enableLibraryNavDrawer = !enableBottomTabs; - - var navDrawerElement; - var navDrawerScrollContainer; - var navDrawerInstance; - - var mainDrawerButton; - - function renderHeader() { - - var html = ''; - - html += '
'; - var backIcon = browserInfo.safari ? 'chevron_left' : ''; - - html += ''; - - html += ''; - html += ''; - - html += '

' + Globalize.translate('ButtonHome') + '

'; - - html += '
'; - - html += ''; - html += ''; - - html += ''; - - html += ''; - - html += ''; - - html += ''; - - if (!browserInfo.mobile) { - html += ''; - } - - html += '
'; - html += '
'; - - html += '
'; - html += '
'; - - var viewMenuBar = document.createElement('div'); - viewMenuBar.classList.add('viewMenuBar'); - viewMenuBar.innerHTML = html; - - document.querySelector('.skinHeader').appendChild(viewMenuBar); - - lazyLoadViewMenuBarImages(); - - bindMenuEvents(); - } - - function lazyLoadViewMenuBarImages() { - require(['imageLoader'], function (imageLoader) { - imageLoader.lazyChildren(document.querySelector('.viewMenuBar')); - }); - } - - function onBackClick() { - - embyRouter.back(); - } - - function updateUserInHeader(user) { - - var header = document.querySelector('.viewMenuBar'); - if (!header) { - return; - } - - var headerUserButton = header.querySelector('.headerUserButton'); - var hasImage; - - if (user && user.name) { - if (user.imageUrl) { - - var userButtonHeight = 26; - - var url = user.imageUrl; - - if (user.supportsImageParams) { - url += "&height=" + Math.round((userButtonHeight * Math.max(window.devicePixelRatio || 1, 2))); - } - - if (headerUserButton) { - updateHeaderUserButton(headerUserButton, url); - hasImage = true; - } - } - } - - if (headerUserButton && !hasImage) { - - updateHeaderUserButton(headerUserButton, null); - } - if (user) { - updateLocalUser(user.localUser); - } - - requiresUserRefresh = false; - } - - function updateHeaderUserButton(headerUserButton, src) { - - if (src) { - headerUserButton.classList.add('headerUserButtonRound'); - headerUserButton.classList.remove('autoSize'); - headerUserButton.innerHTML = ''; - } else { - headerUserButton.classList.remove('headerUserButtonRound'); - headerUserButton.classList.add('autoSize'); - headerUserButton.innerHTML = 'person'; - } - } - - function updateLocalUser(user) { - - var header = document.querySelector('.viewMenuBar'); - - var headerSearchButton = header.querySelector('.headerSearchButton'); - var btnCast = header.querySelector('.btnCast'); - var dashboardEntryHeaderButton = header.querySelector('.dashboardEntryHeaderButton'); - - if (user) { - btnCast.classList.remove('hide'); - - if (headerSearchButton) { - headerSearchButton.classList.remove('hide'); - } - - if (dashboardEntryHeaderButton) { - if (user.Policy.IsAdministrator) { - dashboardEntryHeaderButton.classList.remove('hide'); - } else { - dashboardEntryHeaderButton.classList.add('hide'); - } - } - - require(['apphost'], function (apphost) { - if (apphost.supports('voiceinput')) { - header.querySelector('.headerVoiceButton').classList.add('hide'); - } else { - header.querySelector('.headerVoiceButton').classList.add('hide'); - } - }); - - } else { - btnCast.classList.add('hide'); - header.querySelector('.headerVoiceButton').classList.add('hide'); - if (headerSearchButton) { - headerSearchButton.classList.add('hide'); - } - - if (dashboardEntryHeaderButton) { - dashboardEntryHeaderButton.classList.add('hide'); - } - } - } - - function showVoice() { - require(['voiceDialog'], function (voiceDialog) { - voiceDialog.showDialog(); - }); - } - - function showSearch() { - Dashboard.navigate('search.html'); - } - - function onHeaderUserButtonClick(e) { - Dashboard.showUserFlyout(e.target); - } - - function onHeaderAppsButtonClick() { - - Dashboard.navigate('home.html'); - } - - function bindMenuEvents() { - - mainDrawerButton = document.querySelector('.mainDrawerButton'); - - if (mainDrawerButton) { - mainDrawerButton.addEventListener('click', toggleMainDrawer); - } - - var headerBackButton = document.querySelector('.headerBackButton'); - if (headerBackButton) { - headerBackButton.addEventListener('click', onBackClick); - } - - var headerVoiceButton = document.querySelector('.headerVoiceButton'); - if (headerVoiceButton) { - headerVoiceButton.addEventListener('click', showVoice); - } - - var headerSearchButton = document.querySelector('.headerSearchButton'); - if (headerSearchButton) { - headerSearchButton.addEventListener('click', showSearch); - } - - var headerUserButton = document.querySelector('.headerUserButton'); - if (headerUserButton) { - headerUserButton.addEventListener('click', onHeaderUserButtonClick); - } - - var headerAppsButton = document.querySelector('.headerAppsButton'); - if (headerAppsButton) { - headerAppsButton.addEventListener('click', onHeaderAppsButtonClick); - } - - var viewMenuBar = document.querySelector(".viewMenuBar"); - initHeadRoom(viewMenuBar); - - viewMenuBar.querySelector('.btnNotifications').addEventListener('click', function () { - Dashboard.navigate('notificationlist.html'); - }); - - var btnCast = document.querySelector('.headerButton-btnCast'); - - if (btnCast) { - btnCast.addEventListener('click', onCastButtonClicked); - } - } - - function onCastButtonClicked() { - - var btn = this; - - require(['playerSelectionMenu'], function (playerSelectionMenu) { - playerSelectionMenu.show(btn); - }); - } - - function getItemHref(item, context) { - - return libraryBrowser.getHref(item, context); - } - - var requiresUserRefresh = true; - var lastOpenTime = new Date().getTime(); - - function toggleMainDrawer() { - - if (navDrawerInstance.isVisible) { - closeMainDrawer(); - } else { - openMainDrawer(); - } - } - - function openMainDrawer() { - - navDrawerInstance.open(); - lastOpenTime = new Date().getTime(); - } - - function onMainDrawerOpened() { - - if (browserInfo.mobile) { - document.body.classList.add('bodyWithPopupOpen'); - } - } - function closeMainDrawer() { - - navDrawerInstance.close(); - } - function onMainDrawerSelect(e) { - - if (!navDrawerInstance.isVisible) { - document.body.classList.remove('bodyWithPopupOpen'); - } else { - onMainDrawerOpened(); - } - } - - function refreshLibraryInfoInDrawer(user, drawer) { - - var html = ''; - - html += '
'; - - var homeHref = window.ApiClient ? 'home.html' : 'selectserver.html?showuser=1'; - - html += '' + Globalize.translate('ButtonHome') + ''; - - html += '' + Globalize.translate('ButtonRemote') + ''; - - html += '
'; - - html += '
'; - html += '
'; - - var localUser = user.localUser; - if (localUser && localUser.Policy.IsAdministrator) { - - html += '
'; - html += '
'; - - html += '
'; - html += Globalize.translate('HeaderAdmin'); - html += '
'; - - html += '' + Globalize.translate('ButtonManageServer') + ''; - html += '' + Globalize.translate('MetadataManager') + ''; - - if (!browserInfo.mobile) { - html += '' + Globalize.translate('ButtonReports') + ''; - } - html += '
'; - } - - html += '
'; - - html += '
'; - - if (user.localUser && (AppInfo.isNativeApp && browserInfo.android)) { - html += '' + Globalize.translate('ButtonSettings') + ''; - } - - html += '' + Globalize.translate('ManageOfflineDownloads') + ''; - - html += '' + Globalize.translate('SyncToOtherDevices') + ''; - - if (Dashboard.isConnectMode()) { - html += '' + Globalize.translate('ButtonSelectServer') + ''; - } - - if (user.localUser) { - html += '' + Globalize.translate('ButtonSignOut') + ''; - } - - html += '
'; - - navDrawerScrollContainer.innerHTML = html; - - var lnkManageServer = navDrawerScrollContainer.querySelector('.lnkManageServer'); - if (lnkManageServer) { - lnkManageServer.addEventListener('click', onManageServerClicked); - } - } - - function refreshDashboardInfoInDrawer(page, user) { - - loadNavDrawer().then(function () { - if (!navDrawerScrollContainer.querySelector('.adminDrawerLogo')) { - createDashboardMenu(page); - } else { - updateDashboardMenuSelectedItem(); - } - }); - } - - function updateDashboardMenuSelectedItem() { - - var links = navDrawerScrollContainer.querySelectorAll('.sidebarLink'); - - for (var i = 0, length = links.length; i < length; i++) { - var link = links[i]; - - var selected = false; - - var pageIds = link.getAttribute('data-pageids'); - if (pageIds) { - selected = pageIds.split(',').indexOf(viewManager.currentView().id) != -1 - } - - if (selected) { - link.classList.add('selectedSidebarLink'); - - var title = ''; - - link = link.querySelector('span') || link; - var secondaryTitle = (link.innerText || link.textContent).trim(); - title += secondaryTitle; - - LibraryMenu.setTitle(title); - - } else { - link.classList.remove('selectedSidebarLink'); - } - } - } - - function createDashboardMenu() { - var html = ''; - - html += ''; - - html += Dashboard.getToolsMenuHtml(); - - html = html.split('href=').join('onclick="return LibraryMenu.onLinkClicked(event, this);" href='); - - navDrawerScrollContainer.innerHTML = html; - - updateDashboardMenuSelectedItem(); - } - - function onSidebarLinkClick() { - var section = this.getElementsByClassName('sectionName')[0]; - var text = section ? section.innerHTML : this.innerHTML; - - LibraryMenu.setTitle(text); - } - - function getUserViews(apiClient, userId) { - - return apiClient.getUserViews({}, userId).then(function (result) { - - var items = result.Items; - - var list = []; - - for (var i = 0, length = items.length; i < length; i++) { - - var view = items[i]; - - list.push(view); - - if (view.CollectionType == 'livetv') { - - view.ImageTags = {}; - view.icon = 'live_tv'; - view.onclick = "LibraryBrowser.showTab('livetv.html', 0);"; - - var guideView = Object.assign({}, view); - guideView.Name = Globalize.translate('ButtonGuide'); - guideView.ImageTags = {}; - guideView.icon = 'dvr'; - guideView.url = 'livetv.html?tab=1'; - guideView.onclick = "LibraryBrowser.showTab('livetv.html', 1);"; - list.push(guideView); - } - } - - return list; - }); - } - - function showBySelector(selector, show) { - var elem = document.querySelector(selector); - - if (elem) { - if (show) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - } - } - - function updateLibraryMenu(user) { - - if (!user) { - - showBySelector('.lnkManageOffline', false); - showBySelector('.lnkSyncToOtherDevices', false); - showBySelector('.userMenuOptions', false); - return; - } - - if (user.Policy.EnableSync) { - showBySelector('.lnkSyncToOtherDevices', true); - } else { - showBySelector('.lnkSyncToOtherDevices', false); - } - - require(['apphost'], function (appHost) { - if (user.Policy.EnableSync && appHost.supports('sync')) { - showBySelector('.lnkManageOffline', true); - } else { - showBySelector('.lnkManageOffline', false); - } - }); - - var userId = Dashboard.getCurrentUserId(); - - var apiClient = window.ApiClient; - - var libraryMenuOptions = document.querySelector('.libraryMenuOptions'); - - if (!libraryMenuOptions) { - return; - } - - getUserViews(apiClient, userId).then(function (result) { - - var items = result; - - var html = ''; - html += '
'; - html += Globalize.translate('HeaderMedia'); - html += '
'; - - html += items.map(function (i) { - - var icon = 'folder'; - var color = 'inherit'; - var itemId = i.Id; - - if (i.CollectionType == "channels") { - itemId = "channels"; - } - else if (i.CollectionType == "livetv") { - itemId = "livetv"; - } - - if (i.CollectionType == "photos") { - icon = 'photo_library'; - color = "#009688"; - } - else if (i.CollectionType == "music" || i.CollectionType == "musicvideos") { - icon = 'library_music'; - color = '#FB8521'; - } - else if (i.CollectionType == "books") { - icon = 'library_books'; - color = "#1AA1E1"; - } - else if (i.CollectionType == "playlists") { - icon = 'view_list'; - color = "#795548"; - } - else if (i.CollectionType == "games") { - icon = 'games'; - color = "#F44336"; - } - else if (i.CollectionType == "movies") { - icon = 'video_library'; - color = '#CE5043'; - } - else if (i.CollectionType == "channels" || i.Type == 'Channel') { - icon = 'videocam'; - color = '#E91E63'; - } - else if (i.CollectionType == "tvshows") { - icon = 'tv'; - color = "#4CAF50"; - } - else if (i.CollectionType == "livetv") { - icon = 'live_tv'; - color = "#293AAE"; - } - - icon = i.icon || icon; - - var onclick = i.onclick ? ' function(){' + i.onclick + '}' : 'null'; - return '' + i.Name + ''; - - }).join(''); - - libraryMenuOptions.innerHTML = html; - var elem = libraryMenuOptions; - - var sidebarLinks = elem.querySelectorAll('.sidebarLink'); - for (var i = 0, length = sidebarLinks.length; i < length; i++) { - sidebarLinks[i].removeEventListener('click', onSidebarLinkClick); - sidebarLinks[i].addEventListener('click', onSidebarLinkClick); - } - }); - } - - function onManageServerClicked() { - - closeMainDrawer(); - - Dashboard.navigate('dashboard.html'); - } - - function getTopParentId() { - - return getParameterByName('topParentId') || null; - } - - function getNavigateDelay() { - // On mobile devices don't navigate until after the closing animation has completed or it may stutter - return browserInfo.mobile ? 320 : 200;; - } - - window.LibraryMenu = { - getTopParentId: getTopParentId, - - onLinkClicked: function (event, link, action) { - - if (event.which != 1) { - return true; - } - - // There doesn't seem to be a way to detect if the drawer is in the process of opening, so try to handle that here - if ((new Date().getTime() - lastOpenTime) > 200) { - - setTimeout(function () { - closeMainDrawer(); - - - setTimeout(function () { - if (action) { - action(); - } else { - Dashboard.navigate(link.href); - } - }, getNavigateDelay()); - - }, 50); - } - - event.stopPropagation(); - event.preventDefault(); - return false; - }, - - onLogoutClicked: function () { - // There doesn't seem to be a way to detect if the drawer is in the process of opening, so try to handle that here - if ((new Date().getTime() - lastOpenTime) > 200) { - - closeMainDrawer(); - - setTimeout(function () { - Dashboard.logout(); - }, getNavigateDelay()); - } - - return false; - }, - - onHardwareMenuButtonClick: function () { - toggleMainDrawer(); - }, - - onSettingsClicked: function (event) { - - if (event.which != 1) { - return true; - } - - // There doesn't seem to be a way to detect if the drawer is in the process of opening, so try to handle that here - Dashboard.navigate('dashboard.html'); - return false; - }, - - setTabs: function (type, selectedIndex, builder) { - - var viewMenuBarTabs; - - if (!type) { - if (LibraryMenu.tabType) { - - document.body.classList.remove('withTallToolbar'); - viewMenuBarTabs = document.querySelector('.viewMenuBarTabs'); - viewMenuBarTabs.innerHTML = ''; - viewMenuBarTabs.classList.add('hide'); - LibraryMenu.tabType = null; - } - return; - } - - viewMenuBarTabs = document.querySelector('.viewMenuBarTabs'); - - if (!LibraryMenu.tabType) { - viewMenuBarTabs.classList.remove('hide'); - } - - require(['emby-tabs', 'emby-button'], function () { - if (LibraryMenu.tabType != type) { - - var index = 0; - - viewMenuBarTabs.innerHTML = '
' + builder().map(function (t) { - - var tabClass = selectedIndex == index ? 'emby-tab-button emby-tab-button-active' : 'emby-tab-button'; - - var tabHtml = ''; - index++; - return tabHtml; - - }).join('') + '
'; - - document.body.classList.add('withTallToolbar'); - LibraryMenu.tabType = type; - return; - } - - viewMenuBarTabs.querySelector('[is="emby-tabs"]').selectedIndex(selectedIndex); - - LibraryMenu.tabType = type; - }); - }, - - setTitle: function (title) { - - var html = title; - - var page = viewManager.currentView(); - if (page) { - var helpUrl = page.getAttribute('data-helpurl'); - - if (helpUrl) { - html += ''; - } - } - - var libraryMenuButtonText = document.querySelector('.libraryMenuButtonText'); - if (libraryMenuButtonText) { - libraryMenuButtonText.innerHTML = html; - } - - document.title = title || 'Emby'; - }, - - setTransparentMenu: function (transparent) { - - var viewMenuBar = document.querySelector('.viewMenuBar'); - - if (viewMenuBar) { - if (transparent) { - viewMenuBar.classList.add('semiTransparent'); - } else { - viewMenuBar.classList.remove('semiTransparent'); - } - } - } - }; - - function updateCastIcon() { - - var context = document; - - var btnCast = context.querySelector('.btnCast'); - - if (!btnCast) { - return; - } - - var info = playbackManager.getPlayerInfo(); - - if (info && !info.isLocalPlayer) { - - btnCast.querySelector('i').icon = 'cast_connected'; - btnCast.classList.add('btnActiveCast'); - context.querySelector('.headerSelectedPlayer').innerHTML = info.deviceName || info.name; - - } else { - btnCast.querySelector('i').innerHTML = 'cast'; - btnCast.classList.remove('btnActiveCast'); - - context.querySelector('.headerSelectedPlayer').innerHTML = ''; - } - } - - function updateLibraryNavLinks(page) { - - var isLiveTvPage = page.classList.contains('liveTvPage'); - var isChannelsPage = page.classList.contains('channelsPage'); - var isEditorPage = page.classList.contains('metadataEditorPage'); - var isReportsPage = page.classList.contains('reportsPage'); - var isMySyncPage = page.classList.contains('mySyncPage'); - - var id = isLiveTvPage || isChannelsPage || isEditorPage || isReportsPage || isMySyncPage || page.classList.contains('allLibraryPage') ? - '' : - getTopParentId() || ''; - - var i, length; - var elems = document.getElementsByClassName('lnkMediaFolder'); - - for (i = 0, length = elems.length; i < length; i++) { - - var lnkMediaFolder = elems[i]; - var itemId = lnkMediaFolder.getAttribute('data-itemid'); - - if (isChannelsPage && itemId == 'channels') { - lnkMediaFolder.classList.add('selectedMediaFolder'); - } - else if (isLiveTvPage && itemId == 'livetv') { - lnkMediaFolder.classList.add('selectedMediaFolder'); - } - else if (isEditorPage && itemId == 'editor') { - lnkMediaFolder.classList.add('selectedMediaFolder'); - } - else if (isReportsPage && itemId == 'reports') { - lnkMediaFolder.classList.add('selectedMediaFolder'); - } - else if (isMySyncPage && itemId == 'manageoffline' && window.location.href.toString().indexOf('mode=offline') != -1) { - - lnkMediaFolder.classList.add('selectedMediaFolder'); - } - else if (isMySyncPage && itemId == 'syncotherdevices' && window.location.href.toString().indexOf('mode=offline') == -1) { - - lnkMediaFolder.classList.add('selectedMediaFolder'); - } - else if (id && itemId == id) { - lnkMediaFolder.classList.add('selectedMediaFolder'); - } - else { - lnkMediaFolder.classList.remove('selectedMediaFolder'); - } - } - } - - function onWebSocketMessage(e, data) { - - var msg = data; - - if (msg.MessageType === "UserConfigurationUpdated") { - - if (msg.Data.Id == Dashboard.getCurrentUserId()) { - - // refresh library menu - } - } - } - - function updateViewMenuBar(page) { - - var viewMenuBar = document.querySelector('.viewMenuBar'); - - if (viewMenuBar) { - if (page.classList.contains('standalonePage')) { - viewMenuBar.classList.add('hide'); - } else { - viewMenuBar.classList.remove('hide'); - } - - if (page.classList.contains('type-interior') && !layoutManager.mobile) { - viewMenuBar.classList.add('headroomDisabled'); - } else { - viewMenuBar.classList.remove('headroomDisabled'); - } - } - - if (requiresUserRefresh) { - ConnectionManager.user(window.ApiClient).then(updateUserInHeader); - } - } - - pageClassOn('pagebeforeshow', 'page', function (e) { - - var page = this; - - if (!page.classList.contains('withTabs')) { - LibraryMenu.setTabs(null); - - if (page.classList.contains('pageWithAbsoluteTabs')) { - document.body.classList.add('withTallToolbar'); - } else { - document.body.classList.remove('withTallToolbar'); - } - } - }); - - pageClassOn('pageshow', 'page', function (e) { - - var page = this; - - var isDashboardPage = page.classList.contains('type-interior'); - - if (isDashboardPage) { - if (mainDrawerButton) { - mainDrawerButton.classList.remove('hide'); - } - refreshDashboardInfoInDrawer(page); - } else { - - if (mainDrawerButton) { - if (enableLibraryNavDrawer) { - mainDrawerButton.classList.remove('hide'); - } else { - mainDrawerButton.classList.add('hide'); - } - } - - if ((navDrawerElement && navDrawerElement.classList.contains('adminDrawer')) || (!navDrawerElement && enableLibraryNavDrawer)) { - refreshLibraryDrawer(); - } - } - - setDrawerClass(page); - - updateViewMenuBar(page); - - if (!e.detail.isRestored) { - // Scroll back up so in case vertical scroll was messed with - window.scrollTo(0, 0); - } - - updateTitle(page); - updateBackButton(page); - - if (page.classList.contains('libraryPage')) { - - document.body.classList.add('libraryDocument'); - document.body.classList.remove('dashboardDocument'); - document.body.classList.remove('hideMainDrawer'); - } - else if (isDashboardPage) { - - document.body.classList.remove('libraryDocument'); - document.body.classList.add('dashboardDocument'); - document.body.classList.remove('hideMainDrawer'); - - } else { - - document.body.classList.remove('libraryDocument'); - document.body.classList.remove('dashboardDocument'); - document.body.classList.add('hideMainDrawer'); - } - - updateLibraryNavLinks(page); - }); - - function updateTitle(page) { - - var title = page.getAttribute('data-title'); - - if (title) { - LibraryMenu.setTitle(title); - } - } - - function updateBackButton(page) { - - var backButton = document.querySelector('.headerBackButton'); - - if (backButton) { - if (page.getAttribute('data-backbutton') == 'true' && embyRouter.canGoBack()) { - backButton.classList.remove('hide'); - } else { - backButton.classList.add('hide'); - } - } - } - - function initHeadRoom(elem) { - - require(["headroom-window"], function (headroom) { - - headroom.add(elem); - }); - } - - function initializeApiClient(apiClient) { - - Events.off(apiClient, 'websocketmessage', onWebSocketMessage); - - Events.on(apiClient, 'websocketmessage', onWebSocketMessage); - } - - if (window.ApiClient) { - initializeApiClient(window.ApiClient); - } - - function setDrawerClass(page) { - - var admin = false; - - if (!page) { - page = viewManager.currentView(); - } - - if (page && page.classList.contains('type-interior')) { - admin = true; - } - - var enableNavDrawer = admin || enableLibraryNavDrawer; - if (enableNavDrawer) { - loadNavDrawer().then(function () { - if (admin) { - navDrawerElement.classList.add('adminDrawer'); - navDrawerElement.classList.remove('darkDrawer'); - } else { - navDrawerElement.classList.add('darkDrawer'); - navDrawerElement.classList.remove('adminDrawer'); - } - }); - } - } - - function refreshLibraryDrawer(user) { - - if (!enableLibraryNavDrawer) { - return; - } - - loadNavDrawer().then(function () { - var promise = user ? Promise.resolve(user) : ConnectionManager.user(window.ApiClient); - - promise.then(function (user) { - refreshLibraryInfoInDrawer(user); - - updateLibraryMenu(user.localUser); - }); - }); - } - - function getNavDrawerOptions() { - - var drawerWidth = screen.availWidth - 50; - // At least 240 - drawerWidth = Math.max(drawerWidth, 240); - // But not exceeding 280 - drawerWidth = Math.min(drawerWidth, 260); - - var disableEdgeSwipe = false; - - if (browserInfo.safari) { - disableEdgeSwipe = true; - } - - // Default is 600px - //drawer.responsiveWidth = '640px'; - - return { - target: navDrawerElement, - onChange: onMainDrawerSelect, - width: drawerWidth, - disableEdgeSwipe: disableEdgeSwipe - }; - } - - function loadNavDrawer() { - - if (navDrawerInstance) { - return Promise.resolve(navDrawerInstance); - } - - return new Promise(function (resolve, reject) { - - navDrawerElement = document.querySelector('.mainDrawer'); - navDrawerScrollContainer = navDrawerElement.querySelector('.scrollContainer'); - - require(['navdrawer'], function (navdrawer) { - navDrawerInstance = new navdrawer(getNavDrawerOptions()); - navDrawerElement.classList.remove('hide'); - resolve(navDrawerInstance); - }); - }); - } - - renderHeader(); - - Events.on(ConnectionManager, 'apiclientcreated', function (e, apiClient) { - initializeApiClient(apiClient); - }); - - Events.on(ConnectionManager, 'localusersignedin', function (e, user) { - setDrawerClass(); - ConnectionManager.user(ConnectionManager.getApiClient(user.ServerId)).then(function (user) { - refreshLibraryDrawer(user); - updateUserInHeader(user); - }); - }); - - Events.on(ConnectionManager, 'localusersignedout', updateUserInHeader); - Events.on(playbackManager, 'playerchange', updateCastIcon); - - setDrawerClass(); - - if (enableBottomTabs) { - require(['appfooter-shared', 'dockedtabs'], function (footer, dockedtabs) { - new dockedtabs({ - appFooter: footer - }); - }); - } - - return LibraryMenu; -}); \ No newline at end of file +define(["layoutManager","viewManager","libraryBrowser","embyRouter","playbackManager","paper-icon-button-light","material-icons","scrollStyles"],function(layoutManager,viewManager,libraryBrowser,embyRouter,playbackManager){"use strict";function renderHeader(){var html="";html+='
';var backIcon=browserInfo.safari?"chevron_left":"";html+='",html+='',html+='',html+='

'+Globalize.translate("ButtonHome")+"

",html+='
',html+='',html+='',html+='',html+='',html+='',html+='',browserInfo.mobile||(html+=''),html+="
",html+="
",html+='
',html+="
";var viewMenuBar=document.createElement("div");viewMenuBar.classList.add("viewMenuBar"),viewMenuBar.innerHTML=html,document.querySelector(".skinHeader").appendChild(viewMenuBar),lazyLoadViewMenuBarImages(),bindMenuEvents()}function lazyLoadViewMenuBarImages(){require(["imageLoader"],function(imageLoader){imageLoader.lazyChildren(document.querySelector(".viewMenuBar"))})}function onBackClick(){embyRouter.back()}function updateUserInHeader(user){var header=document.querySelector(".viewMenuBar");if(header){var hasImage,headerUserButton=header.querySelector(".headerUserButton");if(user&&user.name&&user.imageUrl){var userButtonHeight=26,url=user.imageUrl;user.supportsImageParams&&(url+="&height="+Math.round(userButtonHeight*Math.max(window.devicePixelRatio||1,2))),headerUserButton&&(updateHeaderUserButton(headerUserButton,url),hasImage=!0)}headerUserButton&&!hasImage&&updateHeaderUserButton(headerUserButton,null),user&&updateLocalUser(user.localUser),requiresUserRefresh=!1}}function updateHeaderUserButton(headerUserButton,src){src?(headerUserButton.classList.add("headerUserButtonRound"),headerUserButton.classList.remove("autoSize"),headerUserButton.innerHTML=''):(headerUserButton.classList.remove("headerUserButtonRound"),headerUserButton.classList.add("autoSize"),headerUserButton.innerHTML='person')}function updateLocalUser(user){var header=document.querySelector(".viewMenuBar"),headerSearchButton=header.querySelector(".headerSearchButton"),btnCast=header.querySelector(".btnCast"),dashboardEntryHeaderButton=header.querySelector(".dashboardEntryHeaderButton");user?(btnCast.classList.remove("hide"),headerSearchButton&&headerSearchButton.classList.remove("hide"),dashboardEntryHeaderButton&&(user.Policy.IsAdministrator?dashboardEntryHeaderButton.classList.remove("hide"):dashboardEntryHeaderButton.classList.add("hide")),require(["apphost"],function(apphost){apphost.supports("voiceinput")?header.querySelector(".headerVoiceButton").classList.add("hide"):header.querySelector(".headerVoiceButton").classList.add("hide")})):(btnCast.classList.add("hide"),header.querySelector(".headerVoiceButton").classList.add("hide"),headerSearchButton&&headerSearchButton.classList.add("hide"),dashboardEntryHeaderButton&&dashboardEntryHeaderButton.classList.add("hide"))}function showVoice(){require(["voiceDialog"],function(voiceDialog){voiceDialog.showDialog()})}function showSearch(){Dashboard.navigate("search.html")}function onHeaderUserButtonClick(e){Dashboard.showUserFlyout(e.target)}function onHeaderAppsButtonClick(){Dashboard.navigate("home.html")}function bindMenuEvents(){mainDrawerButton=document.querySelector(".mainDrawerButton"),mainDrawerButton&&mainDrawerButton.addEventListener("click",toggleMainDrawer);var headerBackButton=document.querySelector(".headerBackButton");headerBackButton&&headerBackButton.addEventListener("click",onBackClick);var headerVoiceButton=document.querySelector(".headerVoiceButton");headerVoiceButton&&headerVoiceButton.addEventListener("click",showVoice);var headerSearchButton=document.querySelector(".headerSearchButton");headerSearchButton&&headerSearchButton.addEventListener("click",showSearch);var headerUserButton=document.querySelector(".headerUserButton");headerUserButton&&headerUserButton.addEventListener("click",onHeaderUserButtonClick);var headerAppsButton=document.querySelector(".headerAppsButton");headerAppsButton&&headerAppsButton.addEventListener("click",onHeaderAppsButtonClick);var viewMenuBar=document.querySelector(".viewMenuBar");initHeadRoom(viewMenuBar),viewMenuBar.querySelector(".btnNotifications").addEventListener("click",function(){Dashboard.navigate("notificationlist.html")});var btnCast=document.querySelector(".headerButton-btnCast");btnCast&&btnCast.addEventListener("click",onCastButtonClicked)}function onCastButtonClicked(){var btn=this;require(["playerSelectionMenu"],function(playerSelectionMenu){playerSelectionMenu.show(btn)})}function getItemHref(item,context){return libraryBrowser.getHref(item,context)}function toggleMainDrawer(){navDrawerInstance.isVisible?closeMainDrawer():openMainDrawer()}function openMainDrawer(){navDrawerInstance.open(),lastOpenTime=(new Date).getTime()}function onMainDrawerOpened(){browserInfo.mobile&&document.body.classList.add("bodyWithPopupOpen")}function closeMainDrawer(){navDrawerInstance.close()}function onMainDrawerSelect(e){navDrawerInstance.isVisible?onMainDrawerOpened():document.body.classList.remove("bodyWithPopupOpen")}function refreshLibraryInfoInDrawer(user,drawer){var html="";html+='
';var homeHref=window.ApiClient?"home.html":"selectserver.html?showuser=1";html+=''+Globalize.translate("ButtonHome")+"",html+=''+Globalize.translate("ButtonRemote")+"",html+='
',html+='
',html+="
";var localUser=user.localUser;localUser&&localUser.Policy.IsAdministrator&&(html+='
',html+='
',html+='
',html+=Globalize.translate("HeaderAdmin"),html+="
",html+=''+Globalize.translate("ButtonManageServer")+"",html+=''+Globalize.translate("MetadataManager")+"",browserInfo.mobile||(html+=''+Globalize.translate("ButtonReports")+""),html+="
"),html+='
',html+='
',user.localUser&&AppInfo.isNativeApp&&browserInfo.android&&(html+=''+Globalize.translate("ButtonSettings")+""),html+=''+Globalize.translate("ManageOfflineDownloads")+"",html+=''+Globalize.translate("SyncToOtherDevices")+"",Dashboard.isConnectMode()&&(html+=''+Globalize.translate("ButtonSelectServer")+""),user.localUser&&(html+=''+Globalize.translate("ButtonSignOut")+""),html+="
",navDrawerScrollContainer.innerHTML=html;var lnkManageServer=navDrawerScrollContainer.querySelector(".lnkManageServer");lnkManageServer&&lnkManageServer.addEventListener("click",onManageServerClicked)}function refreshDashboardInfoInDrawer(page,user){loadNavDrawer().then(function(){navDrawerScrollContainer.querySelector(".adminDrawerLogo")?updateDashboardMenuSelectedItem():createDashboardMenu(page)})}function updateDashboardMenuSelectedItem(){for(var links=navDrawerScrollContainer.querySelectorAll(".sidebarLink"),i=0,length=links.length;i',html+=Globalize.translate("HeaderMedia"),html+="",html+=items.map(function(i){var icon="folder",color="inherit",itemId=i.Id;"channels"==i.CollectionType?itemId="channels":"livetv"==i.CollectionType&&(itemId="livetv"),"photos"==i.CollectionType?(icon="photo_library",color="#009688"):"music"==i.CollectionType||"musicvideos"==i.CollectionType?(icon="library_music",color="#FB8521"):"books"==i.CollectionType?(icon="library_books",color="#1AA1E1"):"playlists"==i.CollectionType?(icon="view_list",color="#795548"):"games"==i.CollectionType?(icon="games",color="#F44336"):"movies"==i.CollectionType?(icon="video_library",color="#CE5043"):"channels"==i.CollectionType||"Channel"==i.Type?(icon="videocam",color="#E91E63"):"tvshows"==i.CollectionType?(icon="tv",color="#4CAF50"):"livetv"==i.CollectionType&&(icon="live_tv",color="#293AAE"),icon=i.icon||icon;var onclick=i.onclick?" function(){"+i.onclick+"}":"null";return''+i.Name+""}).join(""),libraryMenuOptions.innerHTML=html;for(var elem=libraryMenuOptions,sidebarLinks=elem.querySelectorAll(".sidebarLink"),i=0,length=sidebarLinks.length;i200&&setTimeout(function(){closeMainDrawer(),setTimeout(function(){action?action():Dashboard.navigate(link.href)},getNavigateDelay())},50),event.stopPropagation(),event.preventDefault(),!1)},onLogoutClicked:function(){return(new Date).getTime()-lastOpenTime>200&&(closeMainDrawer(),setTimeout(function(){Dashboard.logout()},getNavigateDelay())),!1},onHardwareMenuButtonClick:function(){toggleMainDrawer()},onSettingsClicked:function(event){return 1!=event.which||(Dashboard.navigate("dashboard.html"),!1)},setTabs:function(type,selectedIndex,builder){var viewMenuBarTabs;return type?(viewMenuBarTabs=document.querySelector(".viewMenuBarTabs"),LibraryMenu.tabType||viewMenuBarTabs.classList.remove("hide"),void require(["emby-tabs","emby-button"],function(){if(LibraryMenu.tabType!=type){var index=0;return viewMenuBarTabs.innerHTML='
'+builder().map(function(t){var tabClass=selectedIndex==index?"emby-tab-button emby-tab-button-active":"emby-tab-button",tabHtml='";return index++,tabHtml}).join("")+"
",document.body.classList.add("withTallToolbar"),void(LibraryMenu.tabType=type)}viewMenuBarTabs.querySelector('[is="emby-tabs"]').selectedIndex(selectedIndex),LibraryMenu.tabType=type})):void(LibraryMenu.tabType&&(document.body.classList.remove("withTallToolbar"),viewMenuBarTabs=document.querySelector(".viewMenuBarTabs"),viewMenuBarTabs.innerHTML="",viewMenuBarTabs.classList.add("hide"),LibraryMenu.tabType=null))},setTitle:function(title){var html=title,page=viewManager.currentView();if(page){var helpUrl=page.getAttribute("data-helpurl");helpUrl&&(html+='")}var libraryMenuButtonText=document.querySelector(".libraryMenuButtonText");libraryMenuButtonText&&(libraryMenuButtonText.innerHTML=html),document.title=title||"Emby"},setTransparentMenu:function(transparent){var viewMenuBar=document.querySelector(".viewMenuBar");viewMenuBar&&(transparent?viewMenuBar.classList.add("semiTransparent"):viewMenuBar.classList.remove("semiTransparent"))}},pageClassOn("pagebeforeshow","page",function(e){var page=this;page.classList.contains("withTabs")||(LibraryMenu.setTabs(null),page.classList.contains("pageWithAbsoluteTabs")?document.body.classList.add("withTallToolbar"):document.body.classList.remove("withTallToolbar"))}),pageClassOn("pageshow","page",function(e){var page=this,isDashboardPage=page.classList.contains("type-interior");isDashboardPage?(mainDrawerButton&&mainDrawerButton.classList.remove("hide"),refreshDashboardInfoInDrawer(page)):(mainDrawerButton&&(enableLibraryNavDrawer?mainDrawerButton.classList.remove("hide"):mainDrawerButton.classList.add("hide")),(navDrawerElement&&navDrawerElement.classList.contains("adminDrawer")||!navDrawerElement&&enableLibraryNavDrawer)&&refreshLibraryDrawer()),setDrawerClass(page),updateViewMenuBar(page),e.detail.isRestored||window.scrollTo(0,0),updateTitle(page),updateBackButton(page),page.classList.contains("libraryPage")?(document.body.classList.add("libraryDocument"),document.body.classList.remove("dashboardDocument"),document.body.classList.remove("hideMainDrawer")):isDashboardPage?(document.body.classList.remove("libraryDocument"),document.body.classList.add("dashboardDocument"),document.body.classList.remove("hideMainDrawer")):(document.body.classList.remove("libraryDocument"),document.body.classList.remove("dashboardDocument"),document.body.classList.add("hideMainDrawer")),updateLibraryNavLinks(page)}),window.ApiClient&&initializeApiClient(window.ApiClient),renderHeader(),Events.on(ConnectionManager,"apiclientcreated",function(e,apiClient){initializeApiClient(apiClient)}),Events.on(ConnectionManager,"localusersignedin",function(e,user){setDrawerClass(),ConnectionManager.user(ConnectionManager.getApiClient(user.ServerId)).then(function(user){refreshLibraryDrawer(user),updateUserInHeader(user)})}),Events.on(ConnectionManager,"localusersignedout",updateUserInHeader),Events.on(playbackManager,"playerchange",updateCastIcon),setDrawerClass(),enableBottomTabs&&require(["appfooter-shared","dockedtabs"],function(footer,dockedtabs){new dockedtabs({appFooter:footer})}),LibraryMenu}); \ No newline at end of file diff --git a/dashboard-ui/scripts/livetvchannel.js b/dashboard-ui/scripts/livetvchannel.js index 507f0233bc..95781e273d 100644 --- a/dashboard-ui/scripts/livetvchannel.js +++ b/dashboard-ui/scripts/livetvchannel.js @@ -1,73 +1 @@ -define(['datetime', 'listView'], function (datetime, listView) { - 'use strict'; - - function isSameDay(date1, date2) { - - return date1.toDateString() === date2.toDateString(); - } - - function renderPrograms(page, result) { - - var html = ''; - var currentItems = []; - var currentStartDate = null; - - for (var i = 0, length = result.Items.length; i < length; i++) { - - var item = result.Items[i]; - - var itemStartDate = datetime.parseISO8601Date(item.StartDate); - - if (!currentStartDate || !isSameDay(currentStartDate, itemStartDate)) { - - if (currentItems.length) { - - html += '

' + datetime.toLocaleDateString(currentStartDate, { weekday: 'long', month: 'long', day: 'numeric' }) + '

'; - - html += '
' + listView.getListViewHtml({ - items: currentItems, - enableUserDataButtons: false, - showParentTitle: true, - image: false, - showProgramTime: true, - mediaInfo: false, - parentTitleWithTitle: true - - }) + '
'; - } - - currentStartDate = itemStartDate; - currentItems = []; - } - - currentItems.push(item); - } - - page.querySelector('#childrenContent').innerHTML = html; - } - - function loadPrograms(page, channelId) { - - ApiClient.getLiveTvPrograms({ - - ChannelIds: channelId, - UserId: Dashboard.getCurrentUserId(), - HasAired: false, - SortBy: "StartDate", - EnableTotalRecordCount: false, - EnableImages: false, - ImageTypeLimit: 0, - EnableUserData: false - - }).then(function (result) { - - renderPrograms(page, result); - Dashboard.hideLoadingMsg(); - }); - } - - return { - renderPrograms: loadPrograms - }; - -}); \ No newline at end of file +define(["datetime","listView"],function(datetime,listView){"use strict";function isSameDay(date1,date2){return date1.toDateString()===date2.toDateString()}function renderPrograms(page,result){for(var html="",currentItems=[],currentStartDate=null,i=0,length=result.Items.length;i"+datetime.toLocaleDateString(currentStartDate,{weekday:"long",month:"long",day:"numeric"})+"",html+='
'+listView.getListViewHtml({items:currentItems,enableUserDataButtons:!1,showParentTitle:!0,image:!1,showProgramTime:!0,mediaInfo:!1,parentTitleWithTitle:!0})+"
"),currentStartDate=itemStartDate,currentItems=[]),currentItems.push(item)}page.querySelector("#childrenContent").innerHTML=html}function loadPrograms(page,channelId){ApiClient.getLiveTvPrograms({ChannelIds:channelId,UserId:Dashboard.getCurrentUserId(),HasAired:!1,SortBy:"StartDate",EnableTotalRecordCount:!1,EnableImages:!1,ImageTypeLimit:0,EnableUserData:!1}).then(function(result){renderPrograms(page,result),Dashboard.hideLoadingMsg()})}return{renderPrograms:loadPrograms}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/livetvchannels.js b/dashboard-ui/scripts/livetvchannels.js index cf73495acb..f07a81b620 100644 --- a/dashboard-ui/scripts/livetvchannels.js +++ b/dashboard-ui/scripts/livetvchannels.js @@ -1,141 +1 @@ -define(['cardBuilder', 'imageLoader', 'emby-itemscontainer'], function (cardBuilder, imageLoader) { - 'use strict'; - - return function (view, params, tabContent) { - - var self = this; - var data = {}; - - function getPageData(context) { - var key = getSavedQueryKey(context); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - StartIndex: 0, - Limit: LibraryBrowser.getDefaultPageSize(), - Fields: "PrimaryImageAspectRatio" - } - }; - - LibraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData; - } - - function getQuery(context) { - - return getPageData(context).query; - } - - function getSavedQueryKey(context) { - - if (!context.savedQueryKey) { - context.savedQueryKey = LibraryBrowser.getSavedQueryKey('channels'); - } - return context.savedQueryKey; - } - - function getChannelsHtml(channels) { - - return cardBuilder.getCardsHtml({ - items: channels, - shape: "square", - showTitle: true, - lazy: true, - cardLayout: true, - showDetailsMenu: true, - showCurrentProgram: true - }); - } - - function renderChannels(context, result) { - - var query = getQuery(context); - - context.querySelector('.paging').innerHTML = LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false, - filterButton: false - }); - - var html = getChannelsHtml(result.Items); - - var elem = context.querySelector('#items'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - - var i, length; - var elems; - - function onNextPageClick() { - query.StartIndex += query.Limit; - reloadItems(context); - } - - function onPreviousPageClick() { - query.StartIndex -= query.Limit; - reloadItems(context); - } - - elems = context.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); - } - - elems = context.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); - } - - LibraryBrowser.saveQueryValues(getSavedQueryKey(context), query); - } - - function showFilterMenu(context) { - - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { - - var filterDialog = new filterDialogFactory({ - query: getQuery(context), - mode: 'livetvchannels' - }); - - Events.on(filterDialog, 'filterchange', function () { - reloadItems(context); - }); - - filterDialog.show(); - }); - } - - function reloadItems(context) { - - Dashboard.showLoadingMsg(); - - var query = getQuery(context); - - query.UserId = Dashboard.getCurrentUserId(); - - ApiClient.getLiveTvChannels(query).then(function (result) { - - renderChannels(context, result); - - Dashboard.hideLoadingMsg(); - }); - } - - tabContent.querySelector('.btnFilter').addEventListener('click', function () { - showFilterMenu(tabContent); - }); - - self.renderTab = function () { - - reloadItems(tabContent); - }; - }; - -}); \ No newline at end of file +define(["cardBuilder","imageLoader","emby-itemscontainer"],function(cardBuilder,imageLoader){"use strict";return function(view,params,tabContent){function getPageData(context){var key=getSavedQueryKey(context),pageData=data[key];return pageData||(pageData=data[key]={query:{StartIndex:0,Limit:LibraryBrowser.getDefaultPageSize(),Fields:"PrimaryImageAspectRatio"}},LibraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(context){return getPageData(context).query}function getSavedQueryKey(context){return context.savedQueryKey||(context.savedQueryKey=LibraryBrowser.getSavedQueryKey("channels")),context.savedQueryKey}function getChannelsHtml(channels){return cardBuilder.getCardsHtml({items:channels,shape:"square",showTitle:!0,lazy:!0,cardLayout:!0,showDetailsMenu:!0,showCurrentProgram:!0})}function renderChannels(context,result){function onNextPageClick(){query.StartIndex+=query.Limit,reloadItems(context)}function onPreviousPageClick(){query.StartIndex-=query.Limit,reloadItems(context)}var query=getQuery(context);context.querySelector(".paging").innerHTML=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1,filterButton:!1});var html=getChannelsHtml(result.Items),elem=context.querySelector("#items");elem.innerHTML=html,imageLoader.lazyChildren(elem);var i,length,elems;for(elems=context.querySelectorAll(".btnNextPage"),i=0,length=elems.length;i'; - } - - if (enableScrollX()) { - html += '
'; - } else { - html += '
'; - } - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = appHost.preferVisualCards || supportsImageAnalysis; - - html += cardBuilder.getCardsHtml({ - items: group.items, - shape: getBackdropShape(), - showParentTitleOrTitle: true, - showAirTime: true, - showAirEndTime: true, - showChannelName: true, - cardLayout: cardLayout, - centerText: !cardLayout, - vibrant: supportsImageAnalysis, - action: 'edit', - cardFooterAside: 'none', - preferThumb: true, - coverImage: true, - overlayText: false - - }); - html += '
'; - - if (group.name) { - html += '
'; - } - } - - return Promise.resolve(html); - } - - window.LiveTvHelpers = { - - getTimersHtml: getTimersHtml - - }; -}); \ No newline at end of file +define(["datetime","cardBuilder","apphost"],function(datetime,cardBuilder,appHost){"use strict";function enableScrollX(){return browserInfo.mobile}function getBackdropShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function getTimersHtml(timers,options){options=options||{};var i,length,items=timers.map(function(t){return t.Type="Timer",t}),groups=[],currentGroupName="",currentGroup=[];for(i=0,length=items.length;i',html+='

'+group.name+"

"),html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=appHost.preferVisualCards||supportsImageAnalysis;html+=cardBuilder.getCardsHtml({items:group.items,shape:getBackdropShape(),showParentTitleOrTitle:!0,showAirTime:!0,showAirEndTime:!0,showChannelName:!0,cardLayout:cardLayout,centerText:!cardLayout,vibrant:supportsImageAnalysis,action:"edit",cardFooterAside:"none",preferThumb:!0,coverImage:!0,overlayText:!1}),html+="
",group.name&&(html+="
")}return Promise.resolve(html)}window.LiveTvHelpers={getTimersHtml:getTimersHtml}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/livetvguide.js b/dashboard-ui/scripts/livetvguide.js index 42cb4b9acd..0392537a39 100644 --- a/dashboard-ui/scripts/livetvguide.js +++ b/dashboard-ui/scripts/livetvguide.js @@ -1,26 +1 @@ -define(['tvguide'], function (tvguide) { - 'use strict'; - - return function (view, params, tabContent) { - - var self = this; - var guideInstance; - self.renderTab = function () { - if (!guideInstance) { - guideInstance = new tvguide({ - element: tabContent - }); - } - }; - self.onShow = function () { - if (guideInstance) { - guideInstance.resume(); - } - }; - self.onHide = function () { - if (guideInstance) { - guideInstance.pause(); - } - }; - }; -}); \ No newline at end of file +define(["tvguide"],function(tvguide){"use strict";return function(view,params,tabContent){var guideInstance,self=this;self.renderTab=function(){guideInstance||(guideInstance=new tvguide({element:tabContent}))},self.onShow=function(){guideInstance&&guideInstance.resume()},self.onHide=function(){guideInstance&&guideInstance.pause()}}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/livetvguideprovider.js b/dashboard-ui/scripts/livetvguideprovider.js index 8510f983e0..b5179e4724 100644 --- a/dashboard-ui/scripts/livetvguideprovider.js +++ b/dashboard-ui/scripts/livetvguideprovider.js @@ -1,51 +1 @@ -define(['events'], function (events) { - 'use strict'; - - function onListingsSubmitted() { - - Dashboard.navigate('livetvstatus.html'); - } - - function init(page, type, providerId) { - - var url = 'components/tvproviders/' + type + '.js'; - - require([url], function (factory) { - - var instance = new factory(page, providerId, { - }); - - events.on(instance, 'submitted', onListingsSubmitted); - - instance.init(); - }); - } - - function loadTemplate(page, type, providerId) { - - var xhr = new XMLHttpRequest(); - xhr.open('GET', 'components/tvproviders/' + type + '.template.html', true); - - xhr.onload = function (e) { - - var html = this.response; - var elem = page.querySelector('.providerTemplate'); - elem.innerHTML = Globalize.translateDocument(html); - - init(page, type, providerId); - } - - xhr.send(); - } - - pageIdOn('pageshow', "liveTvGuideProviderPage", function () { - - Dashboard.showLoadingMsg(); - - var providerId = getParameterByName('id'); - var type = getParameterByName('type'); - var page = this; - loadTemplate(page, type, providerId); - }); - -}); +define(["events"],function(events){"use strict";function onListingsSubmitted(){Dashboard.navigate("livetvstatus.html")}function init(page,type,providerId){var url="components/tvproviders/"+type+".js";require([url],function(factory){var instance=new factory(page,providerId,{});events.on(instance,"submitted",onListingsSubmitted),instance.init()})}function loadTemplate(page,type,providerId){var xhr=new XMLHttpRequest;xhr.open("GET","components/tvproviders/"+type+".template.html",!0),xhr.onload=function(e){var html=this.response,elem=page.querySelector(".providerTemplate");elem.innerHTML=Globalize.translateDocument(html),init(page,type,providerId)},xhr.send()}pageIdOn("pageshow","liveTvGuideProviderPage",function(){Dashboard.showLoadingMsg();var providerId=getParameterByName("id"),type=getParameterByName("type"),page=this;loadTemplate(page,type,providerId)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/livetvitems.js b/dashboard-ui/scripts/livetvitems.js index 10ed04eaa5..f01b4a9b6d 100644 --- a/dashboard-ui/scripts/livetvitems.js +++ b/dashboard-ui/scripts/livetvitems.js @@ -1,187 +1 @@ -define(['cardBuilder', 'apphost', 'imageLoader', 'libraryBrowser', 'emby-itemscontainer'], function (cardBuilder, appHost, imageLoader, libraryBrowser) { - 'use strict'; - - return function (view, params) { - - // The base query options - var query = { - UserId: Dashboard.getCurrentUserId(), - StartIndex: 0, - Fields: "ChannelInfo", - Limit: libraryBrowser.getDefaultPageSize() - }; - - if (params.type == 'Recordings') { - query.IsInProgress = false; - - if (params.groupid) { - query.GroupId = params.groupid; - } - - } else if (params.type == 'RecordingSeries') { - query.SortOrder = 'SortName'; - query.SortOrder = 'Ascending'; - } else { - query.HasAired = false; - query.SortBy = 'StartDate,SortName'; - query.SortOrder = 'Ascending'; - } - - function getSavedQueryKey() { - return libraryBrowser.getSavedQueryKey(); - } - - function reloadItems(page) { - - Dashboard.showLoadingMsg(); - - var promise = params.type == 'Recordings' ? - ApiClient.getLiveTvRecordings(query) : - params.type == 'RecordingSeries' ? - ApiClient.getLiveTvRecordingSeries(query) : - params.IsAiring == 'true' ? - ApiClient.getLiveTvRecommendedPrograms(query) : - ApiClient.getLiveTvPrograms(query); - - promise.then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - var html = ''; - var pagingHtml = libraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false - }); - - page.querySelector('.listTopPaging').innerHTML = pagingHtml; - - var supportsImageAnalysis = appHost.supports('imageanalysis') && (params.type == 'Recordings' || params.type == 'RecordingSeries'); - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: query.IsMovie || params.type == 'RecordingSeries' ? 'portrait' : "backdrop", - preferThumb: !query.IsMovie && params.type != 'RecordingSeries', - inheritThumb: params.type == 'Recordings', - context: 'livetv', - centerText: !supportsImageAnalysis, - lazy: true, - overlayText: false, - showParentTitleOrTitle: true, - showTitle: false, - showParentTitle: query.IsSeries !== false && !query.IsMovie, - showAirTime: params.type != 'Recordings' && params.type != 'RecordingSeries', - showAirDateTime: params.type != 'Recordings' && params.type != 'RecordingSeries', - showChannelName: params.type != 'Recordings' && params.type != 'RecordingSeries', - overlayMoreButton: !supportsImageAnalysis, - showYear: query.IsMovie && params.type == 'Recordings', - showSeriesYear: params.type === 'RecordingSeries', - coverImage: true, - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - }); - - var elem = page.querySelector('.itemsContainer'); - elem.innerHTML = html + pagingHtml; - imageLoader.lazyChildren(elem); - - var i, length; - var elems; - - function onNextPageClick() { - query.StartIndex += query.Limit; - reloadItems(page); - } - - function onPreviousPageClick() { - query.StartIndex -= query.Limit; - reloadItems(page); - } - - elems = page.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); - } - - elems = page.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); - } - - libraryBrowser.saveQueryValues(getSavedQueryKey(), query); - - Dashboard.hideLoadingMsg(); - }); - } - - view.addEventListener('viewbeforeshow', function () { - - query.ParentId = LibraryMenu.getTopParentId(); - - var page = this; - - if (params.IsMovie == 'true') { - query.IsMovie = true; - } - else if (params.IsMovie == 'false') { - query.IsMovie = false; - } - if (params.IsSports == 'true') { - query.IsSports = true; - } - else if (params.IsSports == 'false') { - query.IsSports = false; - } - if (params.IsKids == 'true') { - query.IsKids = true; - } - else if (params.IsKids == 'false') { - query.IsKids = false; - } - if (params.IsAiring == 'true') { - query.IsAiring = true; - } - else if (params.IsAiring == 'false') { - query.IsAiring = false; - } - - if (params.type == 'Recordings') { - - if (params.IsMovie == 'true') { - LibraryMenu.setTitle(Globalize.translate('TabMovies')); - } else if (params.IsSports == 'true') { - LibraryMenu.setTitle(Globalize.translate('Sports')); - } else if (params.IsKids == 'true') { - LibraryMenu.setTitle(Globalize.translate('HeaderForKids')); - } else { - LibraryMenu.setTitle(Globalize.translate('TabRecordings')); - } - - } else if (params.type == 'RecordingSeries') { - - LibraryMenu.setTitle(Globalize.translate('TabSeries')); - } else { - - if (params.IsMovie == 'true') { - LibraryMenu.setTitle(Globalize.translate('HeaderUpcomingMovies')); - } else if (params.IsSports == 'true') { - LibraryMenu.setTitle(Globalize.translate('HeaderUpcomingSports')); - } else if (params.IsKids == 'true') { - LibraryMenu.setTitle(Globalize.translate('HeaderUpcomingForKids')); - } else if (params.IsAiring == 'true') { - LibraryMenu.setTitle(Globalize.translate('HeaderWhatsOnTV')); - } else { - LibraryMenu.setTitle(Globalize.translate('HeaderUpcomingPrograms')); - } - } - - var viewkey = getSavedQueryKey(); - - libraryBrowser.loadSavedQueryValues(viewkey, query); - - reloadItems(page); - }); - }; -}); \ No newline at end of file +define(["cardBuilder","apphost","imageLoader","libraryBrowser","emby-itemscontainer"],function(cardBuilder,appHost,imageLoader,libraryBrowser){"use strict";return function(view,params){function getSavedQueryKey(){return libraryBrowser.getSavedQueryKey()}function reloadItems(page){Dashboard.showLoadingMsg();var promise="Recordings"==params.type?ApiClient.getLiveTvRecordings(query):"RecordingSeries"==params.type?ApiClient.getLiveTvRecordingSeries(query):"true"==params.IsAiring?ApiClient.getLiveTvRecommendedPrograms(query):ApiClient.getLiveTvPrograms(query);promise.then(function(result){function onNextPageClick(){query.StartIndex+=query.Limit,reloadItems(page)}function onPreviousPageClick(){query.StartIndex-=query.Limit,reloadItems(page)}window.scrollTo(0,0);var html="",pagingHtml=libraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1});page.querySelector(".listTopPaging").innerHTML=pagingHtml;var supportsImageAnalysis=appHost.supports("imageanalysis")&&("Recordings"==params.type||"RecordingSeries"==params.type);html=cardBuilder.getCardsHtml({items:result.Items,shape:query.IsMovie||"RecordingSeries"==params.type?"portrait":"backdrop",preferThumb:!query.IsMovie&&"RecordingSeries"!=params.type,inheritThumb:"Recordings"==params.type,context:"livetv",centerText:!supportsImageAnalysis,lazy:!0,overlayText:!1,showParentTitleOrTitle:!0,showTitle:!1,showParentTitle:query.IsSeries!==!1&&!query.IsMovie,showAirTime:"Recordings"!=params.type&&"RecordingSeries"!=params.type,showAirDateTime:"Recordings"!=params.type&&"RecordingSeries"!=params.type,showChannelName:"Recordings"!=params.type&&"RecordingSeries"!=params.type,overlayMoreButton:!supportsImageAnalysis,showYear:query.IsMovie&&"Recordings"==params.type,showSeriesYear:"RecordingSeries"===params.type,coverImage:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis});var elem=page.querySelector(".itemsContainer");elem.innerHTML=html+pagingHtml,imageLoader.lazyChildren(elem);var i,length,elems;for(elems=page.querySelectorAll(".btnNextPage"),i=0,length=elems.length;i'; - - html += '
'; - html += group.Name; - html += '
'; - - html += '
'; - if (group.RecordingCount == 1) { - html += Globalize.translate('ValueItemCount', group.RecordingCount); - } else { - html += Globalize.translate('ValueItemCountPlural', group.RecordingCount); - } - html += '
'; - - html += ''; - html += ''; - html += ''; - - return html; - } - - function renderRecordingGroups(context, groups) { - - if (groups.length) { - context.querySelector('#recordingGroups').classList.remove('hide'); - } else { - context.querySelector('#recordingGroups').classList.add('hide'); - } - - var html = ''; - - html += '
'; - - for (var i = 0, length = groups.length; i < length; i++) { - - html += getRecordingGroupHtml(groups[i]); - } - - html += '
'; - - context.querySelector('#recordingGroupItems').innerHTML = html; - - Dashboard.hideLoadingMsg(); - } - - function enableScrollX() { - return browserInfo.mobile; - } - - function renderRecordings(elem, recordings, cardOptions) { - - if (recordings.length) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - - var recordingItems = elem.querySelector('.recordingItems'); - - if (enableScrollX()) { - recordingItems.classList.add('hiddenScrollX'); - recordingItems.classList.remove('vertical-wrap'); - } else { - recordingItems.classList.remove('hiddenScrollX'); - recordingItems.classList.add('vertical-wrap'); - } - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = appHost.preferVisualCards || supportsImageAnalysis; - - recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ - items: recordings, - shape: (enableScrollX() ? 'autooverflow' : 'auto'), - showTitle: true, - showParentTitle: true, - coverImage: true, - lazy: true, - cardLayout: cardLayout, - centerText: !cardLayout, - vibrant: supportsImageAnalysis, - allowBottomPadding: !enableScrollX(), - preferThumb: 'auto', - overlayText: false - - }, cardOptions || {})); - - imageLoader.lazyChildren(recordingItems); - } - - function getBackdropShape() { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - } - - function renderActiveRecordings(context, promise) { - - promise.then(function (result) { - - // The IsActive param is new, so handle older servers that don't support it - if (result.Items.length && result.Items[0].Status != 'InProgress') { - result.Items = []; - } - - renderRecordings(context.querySelector('#activeRecordings'), result.Items, { - shape: getBackdropShape(), - showParentTitle: false, - showTitle: true, - showAirTime: true, - showAirEndTime: true, - showChannelName: true, - cardLayout: true, - vibrant: true, - preferThumb: true, - coverImage: true - }); - }); - } - - function renderLatestRecordings(context, promise) { - - promise.then(function (result) { - - renderRecordings(context.querySelector('#latestRecordings'), result.Items, { - shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'), - showYear: true, - lines: 2 - }); - - Dashboard.hideLoadingMsg(); - }); - } - - function renderMovieRecordings(context, promise) { - - promise.then(function (result) { - - renderRecordings(context.querySelector('#movieRecordings'), result.Items, { - showYear: true, - showParentTitle: false - }); - }); - } - - function renderEpisodeRecordings(context, promise) { - - promise.then(function (result) { - - renderRecordings(context.querySelector('#episodeRecordings'), result.Items, { - showSeriesYear: true, - showParentTitle: false - }); - }); - } - - function renderSportsRecordings(context, promise) { - - promise.then(function (result) { - - renderRecordings(context.querySelector('#sportsRecordings'), result.Items, { - showYear: true, - showParentTitle: false - }); - }); - } - - function renderKidsRecordings(context, promise) { - - promise.then(function (result) { - - renderRecordings(context.querySelector('#kidsRecordings'), result.Items, { - showYear: true, - showParentTitle: false - }); - }); - } - - function onMoreClick(e) { - - var type = this.getAttribute('data-type'); - - switch (type) { - case 'latest': - Dashboard.navigate('livetvitems.html?type=Recordings'); - break; - case 'movies': - Dashboard.navigate('livetvitems.html?type=Recordings&IsMovie=true'); - break; - case 'episodes': - Dashboard.navigate('livetvitems.html?type=RecordingSeries'); - break; - case 'programs': - Dashboard.navigate('livetvitems.html?type=Recordings&IsSeries=false&IsMovie=false'); - break; - case 'kids': - Dashboard.navigate('livetvitems.html?type=Recordings&IsKids=true'); - break; - case 'sports': - Dashboard.navigate('livetvitems.html?type=Recordings&IsSports=true'); - break; - default: - break; - } - } - - return function (view, params, tabContent) { - - var self = this; - var activeRecordingsPromise; - var sportsPromise; - var kidsPromise; - var moviesPromise; - var seriesPromise; - var latestPromise; - var lastFullRender = 0; - - categorysyncbuttons.init(tabContent); - - var moreButtons = tabContent.querySelectorAll('.more'); - for (var i = 0, length = moreButtons.length; i < length; i++) { - moreButtons[i].addEventListener('click', onMoreClick); - } - tabContent.querySelector('#activeRecordings .recordingItems').addEventListener('timercancelled', function () { - self.preRender(); - self.renderTab(); - }); - - function enableFullRender() { - return (new Date().getTime() - lastFullRender) > 300000; - } - - self.preRender = function () { - - activeRecordingsPromise = ApiClient.getLiveTvRecordings({ - - UserId: Dashboard.getCurrentUserId(), - IsInProgress: true, - Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', - EnableTotalRecordCount: false, - EnableImageTypes: "Primary,Thumb,Backdrop" - }); - - if (!enableFullRender()) { - return; - } - - latestPromise = ApiClient.getLiveTvRecordings({ - - UserId: Dashboard.getCurrentUserId(), - Limit: enableScrollX() ? 12 : 8, - IsInProgress: false, - Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', - EnableTotalRecordCount: false, - EnableImageTypes: "Primary,Thumb,Backdrop" - }); - - moviesPromise = ApiClient.getLiveTvRecordings({ - - UserId: Dashboard.getCurrentUserId(), - Limit: enableScrollX() ? 12 : 8, - IsInProgress: false, - Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', - EnableTotalRecordCount: false, - IsMovie: true - }); - - seriesPromise = ApiClient.getLiveTvRecordingSeries({ - - UserId: Dashboard.getCurrentUserId(), - Limit: enableScrollX() ? 12 : 8, - IsInProgress: false, - Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', - EnableTotalRecordCount: false, - IsSeries: true - }); - - kidsPromise = ApiClient.getLiveTvRecordings({ - - UserId: Dashboard.getCurrentUserId(), - Limit: enableScrollX() ? 12 : 8, - IsInProgress: false, - Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', - EnableTotalRecordCount: false, - IsKids: true - }); - - sportsPromise = ApiClient.getLiveTvRecordings({ - UserId: Dashboard.getCurrentUserId(), - Limit: enableScrollX() ? 12 : 8, - IsInProgress: false, - Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', - EnableTotalRecordCount: false, - IsSports: true - }); - }; - - self.renderTab = function () { - - renderActiveRecordings(tabContent, activeRecordingsPromise); - - if (enableFullRender()) { - Dashboard.showLoadingMsg(); - - renderLatestRecordings(tabContent, latestPromise); - renderMovieRecordings(tabContent, moviesPromise); - renderEpisodeRecordings(tabContent, seriesPromise); - renderSportsRecordings(tabContent, sportsPromise); - renderKidsRecordings(tabContent, kidsPromise); - - ApiClient.getLiveTvRecordingGroups({ - - userId: Dashboard.getCurrentUserId() - - }).then(function (result) { - - renderRecordingGroups(tabContent, result.Items); - }); - - lastFullRender = new Date().getTime(); - } - }; - }; - -}); \ No newline at end of file +define(["components/categorysyncbuttons","cardBuilder","apphost","imageLoader","scripts/livetvcomponents","emby-button","listViewStyle","emby-itemscontainer"],function(categorysyncbuttons,cardBuilder,appHost,imageLoader){"use strict";function getRecordingGroupHtml(group){var html="";return html+='"}function renderRecordingGroups(context,groups){groups.length?context.querySelector("#recordingGroups").classList.remove("hide"):context.querySelector("#recordingGroups").classList.add("hide");var html="";html+='
';for(var i=0,length=groups.length;i",context.querySelector("#recordingGroupItems").innerHTML=html,Dashboard.hideLoadingMsg()}function enableScrollX(){return browserInfo.mobile}function renderRecordings(elem,recordings,cardOptions){recordings.length?elem.classList.remove("hide"):elem.classList.add("hide");var recordingItems=elem.querySelector(".recordingItems");enableScrollX()?(recordingItems.classList.add("hiddenScrollX"),recordingItems.classList.remove("vertical-wrap")):(recordingItems.classList.remove("hiddenScrollX"),recordingItems.classList.add("vertical-wrap"));var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=appHost.preferVisualCards||supportsImageAnalysis;recordingItems.innerHTML=cardBuilder.getCardsHtml(Object.assign({items:recordings,shape:enableScrollX()?"autooverflow":"auto",showTitle:!0,showParentTitle:!0,coverImage:!0,lazy:!0,cardLayout:cardLayout,centerText:!cardLayout,vibrant:supportsImageAnalysis,allowBottomPadding:!enableScrollX(),preferThumb:"auto",overlayText:!1},cardOptions||{})),imageLoader.lazyChildren(recordingItems)}function getBackdropShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function renderActiveRecordings(context,promise){promise.then(function(result){result.Items.length&&"InProgress"!=result.Items[0].Status&&(result.Items=[]),renderRecordings(context.querySelector("#activeRecordings"),result.Items,{shape:getBackdropShape(),showParentTitle:!1,showTitle:!0,showAirTime:!0,showAirEndTime:!0,showChannelName:!0,cardLayout:!0,vibrant:!0,preferThumb:!0,coverImage:!0})})}function renderLatestRecordings(context,promise){promise.then(function(result){renderRecordings(context.querySelector("#latestRecordings"),result.Items,{shape:enableScrollX()?"overflowBackdrop":"backdrop",showYear:!0,lines:2}),Dashboard.hideLoadingMsg()})}function renderMovieRecordings(context,promise){promise.then(function(result){renderRecordings(context.querySelector("#movieRecordings"),result.Items,{showYear:!0,showParentTitle:!1})})}function renderEpisodeRecordings(context,promise){promise.then(function(result){renderRecordings(context.querySelector("#episodeRecordings"),result.Items,{showSeriesYear:!0,showParentTitle:!1})})}function renderSportsRecordings(context,promise){promise.then(function(result){renderRecordings(context.querySelector("#sportsRecordings"),result.Items,{showYear:!0,showParentTitle:!1})})}function renderKidsRecordings(context,promise){promise.then(function(result){renderRecordings(context.querySelector("#kidsRecordings"),result.Items,{showYear:!0,showParentTitle:!1})})}function onMoreClick(e){var type=this.getAttribute("data-type");switch(type){case"latest":Dashboard.navigate("livetvitems.html?type=Recordings");break;case"movies":Dashboard.navigate("livetvitems.html?type=Recordings&IsMovie=true");break;case"episodes":Dashboard.navigate("livetvitems.html?type=RecordingSeries");break;case"programs":Dashboard.navigate("livetvitems.html?type=Recordings&IsSeries=false&IsMovie=false");break;case"kids":Dashboard.navigate("livetvitems.html?type=Recordings&IsKids=true");break;case"sports":Dashboard.navigate("livetvitems.html?type=Recordings&IsSports=true")}}return function(view,params,tabContent){function enableFullRender(){return(new Date).getTime()-lastFullRender>3e5}var activeRecordingsPromise,sportsPromise,kidsPromise,moviesPromise,seriesPromise,latestPromise,self=this,lastFullRender=0;categorysyncbuttons.init(tabContent);for(var moreButtons=tabContent.querySelectorAll(".more"),i=0,length=moreButtons.length;i'; - html += Globalize.translate('StatusRecordingProgram').replace('{0}', tuner.ChannelName); - html += ''; - } else { - - html += Globalize.translate('StatusRecording'); - } - } - else if (tuner.Status == 'LiveTv') { - - if (tuner.ChannelName) { - - html += ''; - html += Globalize.translate('StatusWatchingProgram').replace('{0}', tuner.ChannelName); - html += ''; - } else { - - html += Globalize.translate('StatusWatching'); - } - } - else { - html += tuner.Status; - } - html += '
'; - - html += ''; - - if (tuner.CanReset) { - html += ''; - } - - html += ''; - } - - html += ''; - } - - if (tuners.length) { - page.querySelector('.tunerSection').classList.remove('hide'); - } else { - page.querySelector('.tunerSection').classList.add('hide'); - } - - var elem = $('.tunerList', page).html(html); - - $('.btnResetTuner', elem).on('click', function () { - - var id = this.getAttribute('data-tunerid'); - - resetTuner(page, id); - }); - } - - function getServiceHtml(service) { - - var html = ''; - html += '
'; - - var serviceUrl = service.HomePageUrl || '#'; - - html += '

' + service.Name + '

'; - - var versionHtml = service.Version || 'Unknown'; - - if (service.HasUpdateAvailable) { - versionHtml += ' ' + Globalize.translate('LiveTvUpdateAvailable') + ''; - } - else { - versionHtml += ' ' + Globalize.translate('LabelVersionUpToDate'); - } - - html += '

' + versionHtml + '

'; - - var status = service.Status; - - if (service.Status == 'Ok') { - - status = '' + status + ''; - } else { - - if (service.StatusMessage) { - status += ' (' + service.StatusMessage + ')'; - } - - status = '' + status + ''; - } - - html += '

' + Globalize.translate('ValueStatus', status) + '

'; - - html += '
'; - - return html; - } - - function loadPage(page, liveTvInfo) { - - if (liveTvInfo.IsEnabled) { - - $('.liveTvStatusContent', page).show(); - - } else { - $('.liveTvStatusContent', page).hide(); - } - - var servicesToDisplay = liveTvInfo.Services.filter(function (s) { - - return s.IsVisible; - - }); - - if (servicesToDisplay.length) { - $('.servicesSection', page).show(); - } else { - $('.servicesSection', page).hide(); - } - - $('.servicesList', page).html(servicesToDisplay.map(getServiceHtml).join('')); - - var tuners = []; - for (var i = 0, length = liveTvInfo.Services.length; i < length; i++) { - - for (var j = 0, numTuners = liveTvInfo.Services[i].Tuners.length; j < numTuners; j++) { - tuners.push(liveTvInfo.Services[i].Tuners[j]); - } - } - - renderTuners(page, tuners); - - ApiClient.getNamedConfiguration("livetv").then(function (config) { - - renderDevices(page, config.TunerHosts); - renderProviders(page, config.ListingProviders); - }); - - Dashboard.hideLoadingMsg(); - } - - function renderDevices(page, devices) { - - var html = ''; - - if (devices.length) { - html += '
'; - - for (var i = 0, length = devices.length; i < length; i++) { - - var device = devices[i]; - - var href = 'livetvtunerprovider-' + device.Type + '.html?id=' + device.Id; - - html += '
'; - - html += 'live_tv'; - - html += ''; - - html += ''; - html += '
'; - } - - html += '
'; - } - - var elem = $('.devicesList', page).html(html); - - $('.btnDeleteDevice', elem).on('click', function () { - - var id = this.getAttribute('data-id'); - - deleteDevice(page, id); - }); - } - - function deleteDevice(page, id) { - - var message = Globalize.translate('MessageConfirmDeleteTunerDevice'); - - require(['confirm'], function (confirm) { - - confirm(message, Globalize.translate('HeaderDeleteDevice')).then(function () { - - Dashboard.showLoadingMsg(); - - ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl('LiveTv/TunerHosts', { - Id: id - }) - - }).then(function () { - - reload(page); - }); - }); - }); - } - - function reload(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getLiveTvInfo().then(function (liveTvInfo) { - - loadPage(page, liveTvInfo); - - }, function () { - - loadPage(page, { - Services: [], - IsEnabled: true - }); - }); - } - - function submitAddDeviceForm(page) { - - page.querySelector('.dlgAddDevice').close(); - Dashboard.showLoadingMsg(); - - ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl('LiveTv/TunerHosts'), - data: JSON.stringify({ - Type: $('#selectTunerDeviceType', page).val(), - Url: $('#txtDevicePath', page).val() - }), - contentType: "application/json" - - }).then(function () { - - reload(page); - - }, function () { - Dashboard.alert({ - message: Globalize.translate('ErrorAddingTunerDevice') - }); - }); - - } - - function renderProviders(page, providers) { - - var html = ''; - - if (providers.length) { - html += '
'; - - for (var i = 0, length = providers.length; i < length; i++) { - - var provider = providers[i]; - html += '
'; - - html += 'dvr'; - - html += ''; - html += ''; - html += '
'; - } - - html += '
'; - } - - var elem = $('.providerList', page).html(html); - - $('.btnOptions', elem).on('click', function () { - - var id = this.getAttribute('data-id'); - - showProviderOptions(page, id, this); - }); - } - - function showProviderOptions(page, providerId, button) { - - var items = []; - - items.push({ - name: Globalize.translate('ButtonDelete'), - id: 'delete' - }); - - items.push({ - name: Globalize.translate('MapChannels'), - id: 'map' - }); - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - items: items, - positionTo: button - - }).then(function (id) { - - switch (id) { - - case 'delete': - deleteProvider(page, providerId); - break; - case 'map': - mapChannels(page, providerId); - break; - default: - break; - } - }); - - }); - } - - function mapChannels(page, providerId) { - - require(['components/channelmapper/channelmapper'], function (channelmapper) { - new channelmapper({ - serverId: ApiClient.serverInfo().Id, - providerId: providerId - }).show(); - }); - } - - function deleteProvider(page, id) { - - var message = Globalize.translate('MessageConfirmDeleteGuideProvider'); - - require(['confirm'], function (confirm) { - - confirm(message, Globalize.translate('HeaderDeleteProvider')).then(function () { - - Dashboard.showLoadingMsg(); - - ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl('LiveTv/ListingProviders', { - Id: id - }) - - }).then(function () { - - reload(page); - - }, function () { - - reload(page); - }); - }); - }); - } - - function getTunerName(providerId) { - - providerId = providerId.toLowerCase(); - - switch (providerId) { - - case 'm3u': - return 'M3U'; - case 'hdhomerun': - return 'HDHomerun'; - case 'satip': - return 'DVB'; - default: - return 'Unknown'; - } - } - - function getProviderName(providerId) { - - providerId = providerId.toLowerCase(); - - switch (providerId) { - - case 'schedulesdirect': - return 'Schedules Direct'; - case 'xmltv': - return 'Xml TV'; - case 'emby': - return 'Emby Guide'; - default: - return 'Unknown'; - } - } - - function getProviderConfigurationUrl(providerId) { - - providerId = providerId.toLowerCase(); - - switch (providerId) { - - case 'xmltv': - return 'livetvguideprovider.html?type=xmltv'; - case 'schedulesdirect': - return 'livetvguideprovider.html?type=schedulesdirect'; - case 'emby': - return 'livetvguideprovider.html?type=emby'; - default: - break; - } - } - - function addProvider(button) { - - var menuItems = []; - - menuItems.push({ - name: 'Schedules Direct', - id: 'SchedulesDirect' - }); - - //menuItems.push({ - // name: 'Emby Guide', - // id: 'emby' - //}); - - menuItems.push({ - name: 'Xml TV', - id: 'xmltv' - }); - - menuItems.push({ - name: Globalize.translate('ButtonOther'), - id: 'other' - }); - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - items: menuItems, - positionTo: button, - callback: function (id) { - - if (id == 'other') { - Dashboard.alert({ - message: Globalize.translate('ForAdditionalLiveTvOptions') - }); - } else { - Dashboard.navigate(getProviderConfigurationUrl(id)); - } - } - }); - - }); - } - - function addDevice(button) { - - var menuItems = []; - - //menuItems.push({ - // name: getTunerName('satip'), - // id: 'satip' - //}); - - menuItems.push({ - name: 'HDHomerun', - id: 'hdhomerun' - }); - - menuItems.push({ - name: getTunerName('m3u'), - id: 'm3u' - }); - - menuItems.push({ - name: Globalize.translate('ButtonOther'), - id: 'other' - }); - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - items: menuItems, - positionTo: button, - callback: function (id) { - - if (id == 'other') { - Dashboard.alert({ - message: Globalize.translate('ForAdditionalLiveTvOptions') - }); - } else { - Dashboard.navigate('livetvtunerprovider-' + id + '.html'); - } - } - }); - - }); - } - - function getTabs() { - return [ - { - href: 'livetvstatus.html', - name: Globalize.translate('TabDevices') - }, - { - href: 'livetvsettings.html', - name: Globalize.translate('TabSettings') - }, - { - href: 'appservices.html?context=livetv', - name: Globalize.translate('TabServices') - }]; - } - - $(document).on('pageinit', "#liveTvStatusPage", function () { - - var page = this; - - $('.btnAddDevice', page).on('click', function () { - addDevice(this); - }); - - $('.formAddDevice', page).on('submit', function () { - submitAddDeviceForm(page); - return false; - }); - - $('.btnAddProvider', page).on('click', function () { - addProvider(this); - }); - - }).on('pageshow', "#liveTvStatusPage", function () { - - LibraryMenu.setTabs('livetvadmin', 0, getTabs); - var page = this; - - reload(page); - - // on here - taskButton({ - mode: 'on', - progressElem: page.querySelector('.refreshGuideProgress'), - taskKey: 'RefreshGuide', - button: page.querySelector('.btnRefresh') - }); - - }).on('pagehide', "#liveTvStatusPage", function () { - - var page = this; - - // off here - taskButton({ - mode: 'off', - progressElem: page.querySelector('.refreshGuideProgress'), - taskKey: 'RefreshGuide', - button: page.querySelector('.btnRefresh') - }); - - }); - -}); +define(["jQuery","scripts/taskbutton","listViewStyle"],function($,taskButton){"use strict";function resetTuner(page,id){var message=Globalize.translate("MessageConfirmResetTuner");require(["confirm"],function(confirm){confirm(message,Globalize.translate("HeaderResetTuner")).then(function(){Dashboard.showLoadingMsg(),ApiClient.resetLiveTvTuner(id).then(function(){Dashboard.hideLoadingMsg(),reload(page)})})})}function renderTuners(page,tuners){var html="";if(tuners.length){html+='
';for(var i=0,length=tuners.length;i',html+='live_tv',html+='
',html+='

',html+=tuner.Name,html+="

",html+='
',html+=tuner.SourceType,html+="
",html+='
',"RecordingTv"==tuner.Status?tuner.ChannelName?(html+='',html+=Globalize.translate("StatusRecordingProgram").replace("{0}",tuner.ChannelName),html+=""):html+=Globalize.translate("StatusRecording"):"LiveTv"==tuner.Status?tuner.ChannelName?(html+='',html+=Globalize.translate("StatusWatchingProgram").replace("{0}",tuner.ChannelName),html+=""):html+=Globalize.translate("StatusWatching"):html+=tuner.Status,html+="
",html+="
",tuner.CanReset&&(html+=''),html+="
"}html+=""}tuners.length?page.querySelector(".tunerSection").classList.remove("hide"):page.querySelector(".tunerSection").classList.add("hide");var elem=$(".tunerList",page).html(html);$(".btnResetTuner",elem).on("click",function(){var id=this.getAttribute("data-tunerid");resetTuner(page,id)})}function getServiceHtml(service){var html="";html+="
";var serviceUrl=service.HomePageUrl||"#";html+='

'+service.Name+"

";var versionHtml=service.Version||"Unknown";versionHtml+=service.HasUpdateAvailable?' '+Globalize.translate("LiveTvUpdateAvailable")+"":' '+Globalize.translate("LabelVersionUpToDate"),html+="

"+versionHtml+"

";var status=service.Status;return"Ok"==service.Status?status=''+status+"":(service.StatusMessage&&(status+=" ("+service.StatusMessage+")"),status=''+status+""),html+="

"+Globalize.translate("ValueStatus",status)+"

",html+="
"}function loadPage(page,liveTvInfo){liveTvInfo.IsEnabled?$(".liveTvStatusContent",page).show():$(".liveTvStatusContent",page).hide();var servicesToDisplay=liveTvInfo.Services.filter(function(s){return s.IsVisible});servicesToDisplay.length?$(".servicesSection",page).show():$(".servicesSection",page).hide(),$(".servicesList",page).html(servicesToDisplay.map(getServiceHtml).join(""));for(var tuners=[],i=0,length=liveTvInfo.Services.length;i',html+='live_tv',html+='",html+='',html+=""}html+=""}var elem=$(".devicesList",page).html(html);$(".btnDeleteDevice",elem).on("click",function(){var id=this.getAttribute("data-id");deleteDevice(page,id)})}function deleteDevice(page,id){var message=Globalize.translate("MessageConfirmDeleteTunerDevice");require(["confirm"],function(confirm){confirm(message,Globalize.translate("HeaderDeleteDevice")).then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("LiveTv/TunerHosts",{Id:id})}).then(function(){reload(page)})})})}function reload(page){Dashboard.showLoadingMsg(),ApiClient.getLiveTvInfo().then(function(liveTvInfo){loadPage(page,liveTvInfo)},function(){loadPage(page,{Services:[],IsEnabled:!0})})}function submitAddDeviceForm(page){page.querySelector(".dlgAddDevice").close(),Dashboard.showLoadingMsg(),ApiClient.ajax({type:"POST",url:ApiClient.getUrl("LiveTv/TunerHosts"),data:JSON.stringify({Type:$("#selectTunerDeviceType",page).val(),Url:$("#txtDevicePath",page).val()}),contentType:"application/json"}).then(function(){reload(page)},function(){Dashboard.alert({message:Globalize.translate("ErrorAddingTunerDevice")})})}function renderProviders(page,providers){var html="";if(providers.length){html+='
';for(var i=0,length=providers.length;i',html+='dvr',html+='",html+='',html+="
"}html+=""}var elem=$(".providerList",page).html(html);$(".btnOptions",elem).on("click",function(){var id=this.getAttribute("data-id");showProviderOptions(page,id,this)})}function showProviderOptions(page,providerId,button){var items=[];items.push({name:Globalize.translate("ButtonDelete"),id:"delete"}),items.push({name:Globalize.translate("MapChannels"),id:"map"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:items,positionTo:button}).then(function(id){switch(id){case"delete":deleteProvider(page,providerId);break;case"map":mapChannels(page,providerId)}})})}function mapChannels(page,providerId){require(["components/channelmapper/channelmapper"],function(channelmapper){new channelmapper({serverId:ApiClient.serverInfo().Id,providerId:providerId}).show()})}function deleteProvider(page,id){var message=Globalize.translate("MessageConfirmDeleteGuideProvider");require(["confirm"],function(confirm){confirm(message,Globalize.translate("HeaderDeleteProvider")).then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("LiveTv/ListingProviders",{Id:id})}).then(function(){reload(page)},function(){reload(page)})})})}function getTunerName(providerId){switch(providerId=providerId.toLowerCase()){case"m3u":return"M3U";case"hdhomerun":return"HDHomerun";case"satip":return"DVB";default:return"Unknown"}}function getProviderName(providerId){switch(providerId=providerId.toLowerCase()){case"schedulesdirect":return"Schedules Direct";case"xmltv":return"Xml TV";case"emby":return"Emby Guide";default:return"Unknown"}}function getProviderConfigurationUrl(providerId){switch(providerId=providerId.toLowerCase()){case"xmltv":return"livetvguideprovider.html?type=xmltv";case"schedulesdirect":return"livetvguideprovider.html?type=schedulesdirect";case"emby":return"livetvguideprovider.html?type=emby"}}function addProvider(button){var menuItems=[];menuItems.push({name:"Schedules Direct",id:"SchedulesDirect"}),menuItems.push({name:"Xml TV",id:"xmltv"}),menuItems.push({name:Globalize.translate("ButtonOther"),id:"other"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:button,callback:function(id){"other"==id?Dashboard.alert({message:Globalize.translate("ForAdditionalLiveTvOptions")}):Dashboard.navigate(getProviderConfigurationUrl(id))}})})}function addDevice(button){var menuItems=[];menuItems.push({name:"HDHomerun",id:"hdhomerun"}),menuItems.push({name:getTunerName("m3u"),id:"m3u"}),menuItems.push({name:Globalize.translate("ButtonOther"),id:"other"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:button,callback:function(id){"other"==id?Dashboard.alert({message:Globalize.translate("ForAdditionalLiveTvOptions")}):Dashboard.navigate("livetvtunerprovider-"+id+".html")}})})}function getTabs(){return[{href:"livetvstatus.html",name:Globalize.translate("TabDevices")},{href:"livetvsettings.html",name:Globalize.translate("TabSettings")},{href:"appservices.html?context=livetv",name:Globalize.translate("TabServices")}]}$(document).on("pageinit","#liveTvStatusPage",function(){var page=this;$(".btnAddDevice",page).on("click",function(){addDevice(this)}),$(".formAddDevice",page).on("submit",function(){return submitAddDeviceForm(page),!1}),$(".btnAddProvider",page).on("click",function(){addProvider(this)})}).on("pageshow","#liveTvStatusPage",function(){LibraryMenu.setTabs("livetvadmin",0,getTabs);var page=this;reload(page),taskButton({mode:"on",progressElem:page.querySelector(".refreshGuideProgress"),taskKey:"RefreshGuide",button:page.querySelector(".btnRefresh")})}).on("pagehide","#liveTvStatusPage",function(){var page=this;taskButton({mode:"off",progressElem:page.querySelector(".refreshGuideProgress"),taskKey:"RefreshGuide",button:page.querySelector(".btnRefresh")})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/livetvsuggested.js b/dashboard-ui/scripts/livetvsuggested.js index 27986721cc..3969af2bfd 100644 --- a/dashboard-ui/scripts/livetvsuggested.js +++ b/dashboard-ui/scripts/livetvsuggested.js @@ -1,399 +1 @@ -define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (libraryBrowser, cardBuilder, appHost, imageLoader) { - 'use strict'; - - function enableScrollX() { - return browserInfo.mobile; - } - - function renderRecordings(elem, recordings, cardOptions) { - - if (recordings.length) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - - var recordingItems = elem.querySelector('.recordingItems'); - - if (enableScrollX()) { - recordingItems.classList.add('hiddenScrollX'); - recordingItems.classList.remove('vertical-wrap'); - } else { - recordingItems.classList.remove('hiddenScrollX'); - recordingItems.classList.add('vertical-wrap'); - } - - recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ - items: recordings, - shape: (enableScrollX() ? 'autooverflow' : 'auto'), - showTitle: true, - showParentTitle: true, - coverImage: true, - lazy: true, - cardLayout: true, - vibrant: true, - allowBottomPadding: !enableScrollX(), - preferThumb: 'auto' - - }, cardOptions || {})); - - imageLoader.lazyChildren(recordingItems); - } - - function getBackdropShape() { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - } - - function renderActiveRecordings(context, promise) { - - promise.then(function (result) { - - // The IsActive param is new, so handle older servers that don't support it - if (result.Items.length && result.Items[0].Status != 'InProgress') { - result.Items = []; - } - - renderRecordings(context.querySelector('#activeRecordings'), result.Items, { - shape: getBackdropShape(), - showParentTitle: false, - showTitle: true, - showAirTime: true, - showAirEndTime: true, - showChannelName: true, - cardLayout: true, - vibrant: true, - preferThumb: true, - coverImage: true, - overlayText: false - }); - }); - } - - function getPortraitShape() { - return enableScrollX() ? 'overflowPortrait' : 'portrait'; - } - - function getLimit() { - - return enableScrollX() ? 12 : 8; - } - - function loadRecommendedPrograms(page) { - - Dashboard.showLoadingMsg(); - - var limit = getLimit(); - if (enableScrollX()) { - limit *= 2; - } - - ApiClient.getLiveTvRecommendedPrograms({ - - userId: Dashboard.getCurrentUserId(), - IsAiring: true, - limit: limit, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Thumb,Backdrop", - EnableTotalRecordCount: false, - Fields: "ChannelInfo" - - }).then(function (result) { - - renderItems(page, result.Items, 'activeProgramItems', 'play', { - showAirDateTime: false, - showAirEndTime: true - }); - Dashboard.hideLoadingMsg(); - }); - } - - function reload(page, enableFullRender) { - - renderActiveRecordings(page, ApiClient.getLiveTvRecordings({ - UserId: Dashboard.getCurrentUserId(), - IsInProgress: true, - Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', - EnableTotalRecordCount: false, - EnableImageTypes: "Primary,Thumb,Backdrop" - })); - - if (!enableFullRender) { - return; - } - - loadRecommendedPrograms(page); - - ApiClient.getLiveTvRecommendedPrograms({ - - userId: Dashboard.getCurrentUserId(), - IsAiring: false, - HasAired: false, - limit: getLimit(), - IsMovie: false, - IsSports: false, - IsKids: false, - IsSeries: true, - EnableTotalRecordCount: false, - Fields: "ChannelInfo", - EnableImageTypes: "Primary,Thumb" - - }).then(function (result) { - - renderItems(page, result.Items, 'upcomingProgramItems'); - }); - - ApiClient.getLiveTvRecommendedPrograms({ - - userId: Dashboard.getCurrentUserId(), - IsAiring: false, - HasAired: false, - limit: getLimit(), - IsMovie: true, - EnableTotalRecordCount: false, - Fields: "ChannelInfo", - EnableImageTypes: "Primary,Thumb" - - }).then(function (result) { - - renderItems(page, result.Items, 'upcomingTvMovieItems', null, { - shape: getPortraitShape(), - preferThumb: null - }); - }); - - ApiClient.getLiveTvRecommendedPrograms({ - - userId: Dashboard.getCurrentUserId(), - IsAiring: false, - HasAired: false, - limit: getLimit(), - IsSports: true, - EnableTotalRecordCount: false, - Fields: "ChannelInfo", - EnableImageTypes: "Primary,Thumb" - - }).then(function (result) { - - renderItems(page, result.Items, 'upcomingSportsItems'); - }); - - ApiClient.getLiveTvRecommendedPrograms({ - - userId: Dashboard.getCurrentUserId(), - IsAiring: false, - HasAired: false, - limit: getLimit(), - IsKids: true, - EnableTotalRecordCount: false, - Fields: "ChannelInfo", - EnableImageTypes: "Primary,Thumb" - - }).then(function (result) { - - renderItems(page, result.Items, 'upcomingKidsItems'); - }); - } - - function renderItems(page, items, sectionClass, overlayButton, cardOptions) { - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - cardOptions = cardOptions || {}; - - var html = cardBuilder.getCardsHtml(Object.assign({ - items: items, - preferThumb: true, - inheritThumb: false, - shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'), - showParentTitleOrTitle: true, - showTitle: false, - centerText: !supportsImageAnalysis, - coverImage: true, - overlayText: false, - lazy: true, - overlayMoreButton: overlayButton != 'play' && !supportsImageAnalysis, - overlayPlayButton: overlayButton == 'play', - allowBottomPadding: !enableScrollX(), - showAirTime: true, - showAirDateTime: true, - showChannelName: true, - vibrant: true, - cardLayout: supportsImageAnalysis - - }, cardOptions)); - - var elem = page.querySelector('.' + sectionClass); - - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - } - - return function (view, params) { - - var self = this; - var lastFullRender = 0; - function enableFullRender() { - return (new Date().getTime() - lastFullRender) > 300000; - } - - self.initTab = function () { - - var tabContent = view.querySelector('.pageTabContent[data-index=\'' + 0 + '\']'); - - var containers = tabContent.querySelectorAll('.itemsContainer'); - - for (var i = 0, length = containers.length; i < length; i++) { - if (enableScrollX()) { - containers[i].classList.add('hiddenScrollX'); - containers[i].classList.remove('vertical-wrap'); - } else { - containers[i].classList.remove('hiddenScrollX'); - containers[i].classList.add('vertical-wrap'); - } - } - }; - - self.renderTab = function () { - var tabContent = view.querySelector('.pageTabContent[data-index=\'' + 0 + '\']'); - - if (enableFullRender()) { - reload(tabContent, true); - lastFullRender = new Date().getTime(); - } else { - reload(tabContent); - } - }; - - var tabControllers = []; - var renderedTabs = []; - var currentTabController; - - function getTabController(page, index, callback) { - - var depends = []; - - switch (index) { - - case 0: - break; - case 1: - depends.push('scripts/livetvguide'); - break; - case 2: - depends.push('scripts/livetvchannels'); - break; - case 3: - depends.push('scripts/livetvrecordings'); - break; - case 4: - depends.push('scripts/livetvschedule'); - break; - case 5: - depends.push('scripts/livetvseriestimers'); - break; - default: - break; - } - - require(depends, function (controllerFactory) { - var tabContent; - if (index == 0) { - tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); - self.tabContent = tabContent; - } - var controller = tabControllers[index]; - if (!controller) { - tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); - controller = index ? new controllerFactory(view, params, tabContent) : self; - tabControllers[index] = controller; - - if (controller.initTab) { - controller.initTab(); - } - } - - callback(controller); - }); - } - - - function preLoadTab(page, index) { - - getTabController(page, index, function (controller) { - if (renderedTabs.indexOf(index) == -1) { - if (controller.preRender) { - controller.preRender(); - } - } - }); - } - - function loadTab(page, index) { - - getTabController(page, index, function (controller) { - - if (index === 1) { - document.body.classList.add('autoScrollY'); - } else { - document.body.classList.remove('autoScrollY'); - } - - if (renderedTabs.indexOf(index) == -1) { - - if (index === 1) { - renderedTabs.push(index); - } - controller.renderTab(); - } else { - if (controller.onShow) { - controller.onShow(); - } - } - currentTabController = controller; - }); - } - - var viewTabs = view.querySelector('.libraryViewNav'); - - libraryBrowser.configurePaperLibraryTabs(view, viewTabs, view.querySelectorAll('.pageTabContent'), [0, 2, 3, 4, 5]); - - viewTabs.addEventListener('beforetabchange', function (e) { - preLoadTab(view, parseInt(e.detail.selectedTabIndex)); - }); - - viewTabs.addEventListener('tabchange', function (e) { - - var previousTabController = tabControllers[parseInt(e.detail.previousIndex)]; - if (previousTabController && previousTabController.onHide) { - previousTabController.onHide(); - } - - loadTab(view, parseInt(e.detail.selectedTabIndex)); - }); - - view.addEventListener('viewbeforehide', function (e) { - - if (currentTabController && currentTabController.onHide) { - currentTabController.onHide(); - } - document.body.classList.remove('autoScrollY'); - }); - - require(["headroom-window"], function (headroom) { - headroom.add(viewTabs); - self.headroom = headroom; - }); - - view.addEventListener('viewdestroy', function (e) { - - if (self.headroom) { - self.headroom.remove(viewTabs); - } - tabControllers.forEach(function (t) { - if (t.destroy) { - t.destroy(); - } - }); - }); - }; -}); \ No newline at end of file +define(["libraryBrowser","cardBuilder","apphost","imageLoader","scrollStyles","emby-itemscontainer","emby-tabs","emby-button"],function(libraryBrowser,cardBuilder,appHost,imageLoader){"use strict";function enableScrollX(){return browserInfo.mobile}function renderRecordings(elem,recordings,cardOptions){recordings.length?elem.classList.remove("hide"):elem.classList.add("hide");var recordingItems=elem.querySelector(".recordingItems");enableScrollX()?(recordingItems.classList.add("hiddenScrollX"),recordingItems.classList.remove("vertical-wrap")):(recordingItems.classList.remove("hiddenScrollX"),recordingItems.classList.add("vertical-wrap")),recordingItems.innerHTML=cardBuilder.getCardsHtml(Object.assign({items:recordings,shape:enableScrollX()?"autooverflow":"auto",showTitle:!0,showParentTitle:!0,coverImage:!0,lazy:!0,cardLayout:!0,vibrant:!0,allowBottomPadding:!enableScrollX(),preferThumb:"auto"},cardOptions||{})),imageLoader.lazyChildren(recordingItems)}function getBackdropShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function renderActiveRecordings(context,promise){promise.then(function(result){result.Items.length&&"InProgress"!=result.Items[0].Status&&(result.Items=[]),renderRecordings(context.querySelector("#activeRecordings"),result.Items,{shape:getBackdropShape(),showParentTitle:!1,showTitle:!0,showAirTime:!0,showAirEndTime:!0,showChannelName:!0,cardLayout:!0,vibrant:!0,preferThumb:!0,coverImage:!0,overlayText:!1})})}function getPortraitShape(){return enableScrollX()?"overflowPortrait":"portrait"}function getLimit(){return enableScrollX()?12:8}function loadRecommendedPrograms(page){Dashboard.showLoadingMsg();var limit=getLimit();enableScrollX()&&(limit*=2),ApiClient.getLiveTvRecommendedPrograms({userId:Dashboard.getCurrentUserId(),IsAiring:!0,limit:limit,ImageTypeLimit:1,EnableImageTypes:"Primary,Thumb,Backdrop",EnableTotalRecordCount:!1,Fields:"ChannelInfo"}).then(function(result){renderItems(page,result.Items,"activeProgramItems","play",{showAirDateTime:!1,showAirEndTime:!0}),Dashboard.hideLoadingMsg()})}function reload(page,enableFullRender){renderActiveRecordings(page,ApiClient.getLiveTvRecordings({UserId:Dashboard.getCurrentUserId(),IsInProgress:!0,Fields:"CanDelete,PrimaryImageAspectRatio,BasicSyncInfo",EnableTotalRecordCount:!1,EnableImageTypes:"Primary,Thumb,Backdrop"})),enableFullRender&&(loadRecommendedPrograms(page),ApiClient.getLiveTvRecommendedPrograms({userId:Dashboard.getCurrentUserId(),IsAiring:!1,HasAired:!1,limit:getLimit(),IsMovie:!1,IsSports:!1,IsKids:!1,IsSeries:!0,EnableTotalRecordCount:!1,Fields:"ChannelInfo",EnableImageTypes:"Primary,Thumb"}).then(function(result){renderItems(page,result.Items,"upcomingProgramItems")}),ApiClient.getLiveTvRecommendedPrograms({userId:Dashboard.getCurrentUserId(),IsAiring:!1,HasAired:!1,limit:getLimit(),IsMovie:!0,EnableTotalRecordCount:!1,Fields:"ChannelInfo",EnableImageTypes:"Primary,Thumb"}).then(function(result){renderItems(page,result.Items,"upcomingTvMovieItems",null,{shape:getPortraitShape(),preferThumb:null})}),ApiClient.getLiveTvRecommendedPrograms({userId:Dashboard.getCurrentUserId(),IsAiring:!1,HasAired:!1,limit:getLimit(),IsSports:!0,EnableTotalRecordCount:!1,Fields:"ChannelInfo",EnableImageTypes:"Primary,Thumb"}).then(function(result){renderItems(page,result.Items,"upcomingSportsItems")}),ApiClient.getLiveTvRecommendedPrograms({userId:Dashboard.getCurrentUserId(),IsAiring:!1,HasAired:!1,limit:getLimit(),IsKids:!0,EnableTotalRecordCount:!1,Fields:"ChannelInfo",EnableImageTypes:"Primary,Thumb"}).then(function(result){renderItems(page,result.Items,"upcomingKidsItems")}))}function renderItems(page,items,sectionClass,overlayButton,cardOptions){var supportsImageAnalysis=appHost.supports("imageanalysis");cardOptions=cardOptions||{};var html=cardBuilder.getCardsHtml(Object.assign({items:items,preferThumb:!0,inheritThumb:!1,shape:enableScrollX()?"overflowBackdrop":"backdrop",showParentTitleOrTitle:!0,showTitle:!1,centerText:!supportsImageAnalysis,coverImage:!0,overlayText:!1,lazy:!0,overlayMoreButton:"play"!=overlayButton&&!supportsImageAnalysis,overlayPlayButton:"play"==overlayButton,allowBottomPadding:!enableScrollX(),showAirTime:!0,showAirDateTime:!0,showChannelName:!0,vibrant:!0,cardLayout:supportsImageAnalysis},cardOptions)),elem=page.querySelector("."+sectionClass);elem.innerHTML=html,imageLoader.lazyChildren(elem)}return function(view,params){function enableFullRender(){return(new Date).getTime()-lastFullRender>3e5}function getTabController(page,index,callback){var depends=[];switch(index){case 0:break;case 1:depends.push("scripts/livetvguide");break;case 2:depends.push("scripts/livetvchannels");break;case 3:depends.push("scripts/livetvrecordings");break;case 4:depends.push("scripts/livetvschedule");break;case 5:depends.push("scripts/livetvseriestimers")}require(depends,function(controllerFactory){var tabContent;0==index&&(tabContent=view.querySelector(".pageTabContent[data-index='"+index+"']"),self.tabContent=tabContent);var controller=tabControllers[index];controller||(tabContent=view.querySelector(".pageTabContent[data-index='"+index+"']"),controller=index?new controllerFactory(view,params,tabContent):self,tabControllers[index]=controller,controller.initTab&&controller.initTab()),callback(controller)})}function preLoadTab(page,index){getTabController(page,index,function(controller){renderedTabs.indexOf(index)==-1&&controller.preRender&&controller.preRender()})}function loadTab(page,index){getTabController(page,index,function(controller){1===index?document.body.classList.add("autoScrollY"):document.body.classList.remove("autoScrollY"),renderedTabs.indexOf(index)==-1?(1===index&&renderedTabs.push(index),controller.renderTab()):controller.onShow&&controller.onShow(),currentTabController=controller})}var self=this,lastFullRender=0;self.initTab=function(){for(var tabContent=view.querySelector(".pageTabContent[data-index='0']"),containers=tabContent.querySelectorAll(".itemsContainer"),i=0,length=containers.length;i'; - - var imgUrl; - - if (user.PrimaryImageTag) { - - imgUrl = apiClient.getUserImageUrl(user.Id, { - width: 300, - tag: user.PrimaryImageTag, - type: "Primary" - }); - - html += '
'; - } - else { - - var background = getMetroColor(user.Id); - - imgUrl = 'css/images/logindefault.png'; - - html += '
'; - } - - html += ''; - html += ''; - - html += '
'; - html += '
' + user.Name + '
'; - - html += '
'; - html += ''; - - html += ''; - } - - context.querySelector('#divUsers').innerHTML = html; - } - - return function (view, params) { - - var self = this; - - function getApiClient() { - - var serverId = params.serverid; - - if (serverId) { - return connectionManager.getOrCreateApiClient(serverId); - - } else { - return ApiClient; - } - } - - function showVisualForm() { - - view.querySelector('.visualLoginForm').classList.remove('hide'); - view.querySelector('.manualLoginForm').classList.add('hide'); - } - - view.querySelector('#divUsers').addEventListener('click', function (e) { - var cardContent = dom.parentWithClass(e.target, 'cardContent'); - - if (cardContent) { - - var context = view; - var id = cardContent.getAttribute('data-userid'); - var name = cardContent.getAttribute('data-username'); - var haspw = cardContent.getAttribute('data-haspw'); - - if (id == 'manual') { - context.querySelector('#txtManualName').value = ''; - showManualForm(context, true); - } - else if (haspw == 'false') { - authenticateUserByName(context, getApiClient(), name, ''); - } else { - - context.querySelector('#txtManualName').value = name; - context.querySelector('#txtManualPassword').value = ''; - showManualForm(context, true, true); - } - } - }); - - view.querySelector('.manualLoginForm').addEventListener('submit', function (e) { - - appSettings.enableAutoLogin(view.querySelector('.chkRememberLogin').checked); - - var apiClient = getApiClient(); - authenticateUserByName(view, apiClient, view.querySelector('#txtManualName').value, view.querySelector('#txtManualPassword').value); - - e.preventDefault(); - // Disable default form submission - return false; - }); - - view.querySelector('.btnForgotPassword').addEventListener('click', function () { - Dashboard.navigate('forgotpassword.html'); - }); - - view.querySelector('.btnCancel').addEventListener('click', showVisualForm); - - view.querySelector('.btnManual').addEventListener('click', function () { - view.querySelector('#txtManualName').value = ''; - showManualForm(view, true); - }); - - view.addEventListener('viewshow', function (e) { - Dashboard.showLoadingMsg(); - - var apiClient = getApiClient(); - apiClient.getPublicUsers().then(function (users) { - - if (!users.length) { - - view.querySelector('#txtManualName').value = ''; - showManualForm(view, false, false); - - } else { - - showVisualForm(); - loadUserList(view, apiClient, users); - } - - Dashboard.hideLoadingMsg(); - }); - - apiClient.getJSON(apiClient.getUrl('Branding/Configuration')).then(function (options) { - - view.querySelector('.disclaimer').innerHTML = options.LoginDisclaimer || ''; - }); - - if (Dashboard.isConnectMode()) { - view.querySelector('.connectButtons').classList.remove('hide'); - } else { - view.querySelector('.connectButtons').classList.add('hide'); - } - }); - }; -}); \ No newline at end of file +define(["appSettings","dom","connectionManager","cardStyle","emby-checkbox"],function(appSettings,dom,connectionManager){"use strict";function authenticateUserByName(page,apiClient,username,password){Dashboard.showLoadingMsg(),apiClient.authenticateUserByName(username,password).then(function(result){var newUrl,user=result.User,serverId=getParameterByName("serverid");newUrl=user.Policy.IsAdministrator&&!serverId?"dashboard.html":"home.html",Dashboard.hideLoadingMsg(),Dashboard.onServerChanged(user.Id,result.AccessToken,apiClient),Dashboard.navigate(newUrl)},function(response){page.querySelector("#txtManualName").value="",page.querySelector("#txtManualPassword").value="",Dashboard.hideLoadingMsg(),401==response.status?require(["toast"],function(toast){toast(Globalize.translate("MessageInvalidUser"))}):showServerConnectionFailure()})}function showServerConnectionFailure(){Dashboard.alert({message:Globalize.translate("MessageUnableToConnectToServer"),title:Globalize.translate("HeaderConnectionFailure")})}function showManualForm(context,showCancel,focusPassword){context.querySelector(".chkRememberLogin").checked=appSettings.enableAutoLogin(),context.querySelector(".manualLoginForm").classList.remove("hide"),context.querySelector(".visualLoginForm").classList.add("hide"),focusPassword?context.querySelector("#txtManualPassword").focus():context.querySelector("#txtManualName").focus(),showCancel?context.querySelector(".btnCancel").classList.remove("hide"):context.querySelector(".btnCancel").classList.add("hide")}function getRandomMetroColor(){var index=Math.floor(Math.random()*(metroColors.length-1));return metroColors[index]}function getMetroColor(str){if(str){for(var character=String(str.substr(0,1).charCodeAt()),sum=0,i=0;i",html+=""}context.querySelector("#divUsers").innerHTML=html}var metroColors=["#6FBD45","#4BB3DD","#4164A5","#E12026","#800080","#E1B222","#008040","#0094FF","#FF00C7","#FF870F","#7F0037"];return function(view,params){function getApiClient(){var serverId=params.serverid;return serverId?connectionManager.getOrCreateApiClient(serverId):ApiClient}function showVisualForm(){view.querySelector(".visualLoginForm").classList.remove("hide"),view.querySelector(".manualLoginForm").classList.add("hide")}view.querySelector("#divUsers").addEventListener("click",function(e){var cardContent=dom.parentWithClass(e.target,"cardContent");if(cardContent){var context=view,id=cardContent.getAttribute("data-userid"),name=cardContent.getAttribute("data-username"),haspw=cardContent.getAttribute("data-haspw");"manual"==id?(context.querySelector("#txtManualName").value="",showManualForm(context,!0)):"false"==haspw?authenticateUserByName(context,getApiClient(),name,""):(context.querySelector("#txtManualName").value=name,context.querySelector("#txtManualPassword").value="",showManualForm(context,!0,!0))}}),view.querySelector(".manualLoginForm").addEventListener("submit",function(e){appSettings.enableAutoLogin(view.querySelector(".chkRememberLogin").checked);var apiClient=getApiClient();return authenticateUserByName(view,apiClient,view.querySelector("#txtManualName").value,view.querySelector("#txtManualPassword").value),e.preventDefault(),!1}),view.querySelector(".btnForgotPassword").addEventListener("click",function(){Dashboard.navigate("forgotpassword.html")}),view.querySelector(".btnCancel").addEventListener("click",showVisualForm),view.querySelector(".btnManual").addEventListener("click",function(){view.querySelector("#txtManualName").value="",showManualForm(view,!0)}),view.addEventListener("viewshow",function(e){Dashboard.showLoadingMsg();var apiClient=getApiClient();apiClient.getPublicUsers().then(function(users){users.length?(showVisualForm(),loadUserList(view,apiClient,users)):(view.querySelector("#txtManualName").value="",showManualForm(view,!1,!1)),Dashboard.hideLoadingMsg()}),apiClient.getJSON(apiClient.getUrl("Branding/Configuration")).then(function(options){view.querySelector(".disclaimer").innerHTML=options.LoginDisclaimer||""}),Dashboard.isConnectMode()?view.querySelector(".connectButtons").classList.remove("hide"):view.querySelector(".connectButtons").classList.add("hide")})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/medialibrarypage.js b/dashboard-ui/scripts/medialibrarypage.js index ba025fe83c..e5e7e67248 100644 --- a/dashboard-ui/scripts/medialibrarypage.js +++ b/dashboard-ui/scripts/medialibrarypage.js @@ -1,496 +1 @@ -define(['jQuery', 'apphost', 'scripts/taskbutton', 'cardStyle'], function ($, appHost, taskButton) { - 'use strict'; - - function changeCollectionType(page, virtualFolder) { - - require(['alert'], function (alert) { - alert({ - title: Globalize.translate('HeaderChangeFolderType'), - text: Globalize.translate('HeaderChangeFolderTypeHelp') - }); - }); - } - - function addVirtualFolder(page) { - - require(['medialibrarycreator'], function (medialibrarycreator) { - - new medialibrarycreator().show({ - - collectionTypeOptions: getCollectionTypeOptions().filter(function (f) { - return !f.hidden; - }), - refresh: shouldRefreshLibraryAfterChanges(page) - - }).then(function (hasChanges) { - - if (hasChanges) { - reloadLibrary(page); - } - }); - }); - } - - function editVirtualFolder(page, virtualFolder) { - - require(['medialibraryeditor'], function (medialibraryeditor) { - - new medialibraryeditor().show({ - - refresh: shouldRefreshLibraryAfterChanges(page), - library: virtualFolder - - }).then(function (hasChanges) { - - if (hasChanges) { - reloadLibrary(page); - } - }); - }); - } - - function deleteVirtualFolder(page, virtualFolder) { - - var msg = Globalize.translate('MessageAreYouSureYouWishToRemoveMediaFolder'); - - if (virtualFolder.Locations.length) { - msg += "

" + Globalize.translate("MessageTheFollowingLocationWillBeRemovedFromLibrary") + "

"; - msg += virtualFolder.Locations.join("
"); - } - - require(['confirm'], function (confirm) { - - confirm(msg, Globalize.translate('HeaderRemoveMediaFolder')).then(function () { - - var refreshAfterChange = shouldRefreshLibraryAfterChanges(page); - - ApiClient.removeVirtualFolder(virtualFolder.Name, refreshAfterChange).then(function () { - reloadLibrary(page); - }); - }); - }); - } - - function renameVirtualFolder(page, virtualFolder) { - - require(['prompt'], function (prompt) { - - prompt({ - label: Globalize.translate('LabelNewName'), - confirmText: Globalize.translate('ButtonRename') - - }).then(function (newName) { - if (newName && newName != virtualFolder.Name) { - - var refreshAfterChange = shouldRefreshLibraryAfterChanges(page); - - ApiClient.renameVirtualFolder(virtualFolder.Name, newName, refreshAfterChange).then(function () { - reloadLibrary(page); - }); - } - }); - - }); - } - - function showCardMenu(page, elem, virtualFolders) { - - var card = $(elem).parents('.card')[0]; - var index = parseInt(card.getAttribute('data-index')); - var virtualFolder = virtualFolders[index]; - - var menuItems = []; - - menuItems.push({ - name: Globalize.translate('ButtonChangeContentType'), - id: 'changetype', - ironIcon: 'videocam' - }); - - menuItems.push({ - name: Globalize.translate('ButtonEditImages'), - id: 'editimages', - ironIcon: 'photo' - }); - - menuItems.push({ - name: Globalize.translate('ButtonManageFolders'), - id: 'edit', - ironIcon: 'folder_open' - }); - - menuItems.push({ - name: Globalize.translate('ButtonRemove'), - id: 'delete', - ironIcon: 'remove' - }); - - menuItems.push({ - name: Globalize.translate('ButtonRename'), - id: 'rename', - ironIcon: 'mode_edit' - }); - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - items: menuItems, - positionTo: elem, - callback: function (resultId) { - - switch (resultId) { - - case 'changetype': - changeCollectionType(page, virtualFolder); - break; - case 'edit': - editVirtualFolder(page, virtualFolder); - break; - case 'editimages': - editImages(page, virtualFolder); - break; - case 'rename': - renameVirtualFolder(page, virtualFolder); - break; - case 'delete': - deleteVirtualFolder(page, virtualFolder); - break; - default: - break; - } - } - }); - - }); - } - - function reloadLibrary(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getVirtualFolders().then(function (result) { - reloadVirtualFolders(page, result); - }); - } - - function shouldRefreshLibraryAfterChanges(page) { - - return $(page).is('#mediaLibraryPage'); - } - - function reloadVirtualFolders(page, virtualFolders) { - - var html = ''; - - virtualFolders.push({ - Name: Globalize.translate('ButtonAddMediaLibrary'), - icon: 'add_circle', - Locations: [], - showType: false, - showLocations: false, - showMenu: false, - showNameWithIcon: true - }); - - for (var i = 0, length = virtualFolders.length; i < length; i++) { - - var virtualFolder = virtualFolders[i]; - - html += getVirtualFolderHtml(page, virtualFolder, i); - } - - var divVirtualFolders = page.querySelector('#divVirtualFolders'); - divVirtualFolders.innerHTML = html; - divVirtualFolders.classList.add('itemsContainer'); - divVirtualFolders.classList.add('vertical-wrap'); - - $('.btnCardMenu', divVirtualFolders).on('click', function () { - showCardMenu(page, this, virtualFolders); - }); - - $('.addLibrary', divVirtualFolders).on('click', function () { - addVirtualFolder(page); - }); - - $('.editLibrary', divVirtualFolders).on('click', function () { - var card = $(this).parents('.card')[0]; - var index = parseInt(card.getAttribute('data-index')); - var virtualFolder = virtualFolders[index]; - - if (!virtualFolder.ItemId) { - return; - } - - editVirtualFolder(page, virtualFolder); - }); - - Dashboard.hideLoadingMsg(); - } - - function editImages(page, virtualFolder) { - - require(['imageEditor'], function (imageEditor) { - - imageEditor.show({ - - itemId: virtualFolder.ItemId, - serverId: ApiClient.serverId() - - }).then(function () { - reloadLibrary(page); - }); - }); - } - - function getCollectionTypeOptions() { - - return [ - - { name: "", value: "" }, - { name: Globalize.translate('FolderTypeMovies'), value: "movies" }, - { name: Globalize.translate('FolderTypeMusic'), value: "music" }, - { name: Globalize.translate('FolderTypeTvShows'), value: "tvshows" }, - { name: Globalize.translate('FolderTypeBooks'), value: "books", message: Globalize.translate('BookLibraryHelp') }, - { name: Globalize.translate('FolderTypeGames'), value: "games", message: Globalize.translate('MessageGamePluginRequired') }, - { name: Globalize.translate('OptionHomeVideos'), value: "homevideos" }, - { name: Globalize.translate('FolderTypeMusicVideos'), value: "musicvideos" }, - { name: Globalize.translate('FolderTypePhotos'), value: "photos" }, - { name: Globalize.translate('FolderTypeUnset'), value: "mixed", message: Globalize.translate('MessageUnsetContentHelp') } - ]; - - } - - function getIcon(type) { - - switch (type) { - case "movies": - return "local_movies"; - case "music": - return "library_music"; - case "photos": - return "photo"; - case "livetv": - return "live_tv"; - case "tvshows": - return "live_tv"; - case "games": - return "folder"; - case "trailers": - return "local_movies"; - case "homevideos": - return "video_library"; - case "musicvideos": - return "video_library"; - case "books": - return "folder"; - case "channels": - return "folder"; - case "playlists": - return "folder"; - default: - return "folder"; - } - } - - function getVirtualFolderHtml(page, virtualFolder, index) { - - var html = ''; - - var style = ""; - - if (page.classList.contains('wizardPage')) { - style += "min-width:33.3%;"; - } - - html += '
'; - - html += '
'; - html += '
'; - - html += '
'; - - html += '
'; - var imgUrl = ''; - - if (virtualFolder.PrimaryImageItemId) { - imgUrl = ApiClient.getScaledImageUrl(virtualFolder.PrimaryImageItemId, { - type: 'Primary' - }); - } - - if (imgUrl) { - html += '
'; - } else if (!virtualFolder.showNameWithIcon) { - html += '
'; - html += '' + (virtualFolder.icon || getIcon(virtualFolder.CollectionType)) + ''; - - html += '
'; - } - - if (!imgUrl && virtualFolder.showNameWithIcon) { - html += '

'; - - html += '' + (virtualFolder.icon || getIcon(virtualFolder.CollectionType)) + ''; - - if (virtualFolder.showNameWithIcon) { - html += '
'; - html += virtualFolder.Name; - html += "
"; - } - - html += '

'; - } - - // cardContent - html += "
"; - - // cardScalable - html += "
"; - - html += '
'; - - if (virtualFolder.showMenu !== false) { - var moreIcon = appHost.moreIcon == 'dots-horiz' ? '' : ''; - - html += '
'; - html += ''; - html += "
"; - } - - html += "
"; - if (virtualFolder.showNameWithIcon) { - html += ' '; - } else { - html += virtualFolder.Name; - } - html += "
"; - - var typeName = getCollectionTypeOptions().filter(function (t) { - - return t.value == virtualFolder.CollectionType; - - })[0]; - - typeName = typeName ? typeName.name : Globalize.translate('FolderTypeUnset'); - - html += "
"; - if (virtualFolder.showType === false) { - html += ' '; - } else { - html += typeName; - } - html += "
"; - - if (virtualFolder.showLocations === false) { - html += "
"; - html += ' '; - html += "
"; - } else if (!virtualFolder.Locations.length) { - html += "
"; - html += Globalize.translate('NumLocationsValue', virtualFolder.Locations.length); - html += "
"; - } - else if (virtualFolder.Locations.length == 1) { - html += "
"; - html += virtualFolder.Locations[0]; - html += "
"; - } - else { - html += "
"; - html += Globalize.translate('NumLocationsValue', virtualFolder.Locations.length); - html += "
"; - } - - // cardFooter - html += "
"; - - // cardBox - html += "
"; - - // card - html += "
"; - - return html; - } - - window.WizardLibraryPage = { - - next: function () { - - Dashboard.showLoadingMsg(); - - var apiClient = ApiClient; - - apiClient.ajax({ - type: "POST", - url: apiClient.getUrl('System/Configuration/MetadataPlugins/Autoset') - - }).then(function () { - - Dashboard.hideLoadingMsg(); - Dashboard.navigate('wizardsettings.html'); - }); - } - }; - - function getTabs() { - return [ - { - href: 'library.html', - name: Globalize.translate('HeaderLibraries') - }, - { - href: 'librarydisplay.html', - name: Globalize.translate('TabDisplay') - }, - { - href: 'metadataimages.html', - name: Globalize.translate('TabMetadata') - }, - { - href: 'metadatanfo.html', - name: Globalize.translate('TabNfoSettings') - }, - { - href: 'librarysettings.html', - name: Globalize.translate('TabAdvanced') - }]; - } - - pageClassOn('pageshow', "mediaLibraryPage", function () { - - var page = this; - reloadLibrary(page); - - }); - - pageIdOn('pageshow', "mediaLibraryPage", function () { - - LibraryMenu.setTabs('librarysetup', 0, getTabs); - var page = this; - - // on here - taskButton({ - mode: 'on', - progressElem: page.querySelector('.refreshProgress'), - taskKey: 'RefreshLibrary', - button: page.querySelector('.btnRefresh') - }); - - }); - - pageIdOn('pagebeforehide', "mediaLibraryPage", function () { - - var page = this; - - // off here - taskButton({ - mode: 'off', - progressElem: page.querySelector('.refreshProgress'), - taskKey: 'RefreshLibrary', - button: page.querySelector('.btnRefresh') - }); - - }); - -}); \ No newline at end of file +define(["jQuery","apphost","scripts/taskbutton","cardStyle"],function($,appHost,taskButton){"use strict";function changeCollectionType(page,virtualFolder){require(["alert"],function(alert){alert({title:Globalize.translate("HeaderChangeFolderType"),text:Globalize.translate("HeaderChangeFolderTypeHelp")})})}function addVirtualFolder(page){require(["medialibrarycreator"],function(medialibrarycreator){(new medialibrarycreator).show({collectionTypeOptions:getCollectionTypeOptions().filter(function(f){return!f.hidden}),refresh:shouldRefreshLibraryAfterChanges(page)}).then(function(hasChanges){hasChanges&&reloadLibrary(page)})})}function editVirtualFolder(page,virtualFolder){require(["medialibraryeditor"],function(medialibraryeditor){(new medialibraryeditor).show({refresh:shouldRefreshLibraryAfterChanges(page),library:virtualFolder}).then(function(hasChanges){hasChanges&&reloadLibrary(page)})})}function deleteVirtualFolder(page,virtualFolder){var msg=Globalize.translate("MessageAreYouSureYouWishToRemoveMediaFolder");virtualFolder.Locations.length&&(msg+="

"+Globalize.translate("MessageTheFollowingLocationWillBeRemovedFromLibrary")+"

",msg+=virtualFolder.Locations.join("
")),require(["confirm"],function(confirm){confirm(msg,Globalize.translate("HeaderRemoveMediaFolder")).then(function(){var refreshAfterChange=shouldRefreshLibraryAfterChanges(page);ApiClient.removeVirtualFolder(virtualFolder.Name,refreshAfterChange).then(function(){reloadLibrary(page)})})})}function renameVirtualFolder(page,virtualFolder){require(["prompt"],function(prompt){prompt({label:Globalize.translate("LabelNewName"),confirmText:Globalize.translate("ButtonRename")}).then(function(newName){if(newName&&newName!=virtualFolder.Name){var refreshAfterChange=shouldRefreshLibraryAfterChanges(page);ApiClient.renameVirtualFolder(virtualFolder.Name,newName,refreshAfterChange).then(function(){reloadLibrary(page)})}})})}function showCardMenu(page,elem,virtualFolders){var card=$(elem).parents(".card")[0],index=parseInt(card.getAttribute("data-index")),virtualFolder=virtualFolders[index],menuItems=[];menuItems.push({name:Globalize.translate("ButtonChangeContentType"),id:"changetype",ironIcon:"videocam"}),menuItems.push({name:Globalize.translate("ButtonEditImages"),id:"editimages",ironIcon:"photo"}),menuItems.push({name:Globalize.translate("ButtonManageFolders"),id:"edit",ironIcon:"folder_open"}),menuItems.push({name:Globalize.translate("ButtonRemove"),id:"delete",ironIcon:"remove"}),menuItems.push({name:Globalize.translate("ButtonRename"),id:"rename",ironIcon:"mode_edit"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:elem,callback:function(resultId){switch(resultId){case"changetype":changeCollectionType(page,virtualFolder);break;case"edit":editVirtualFolder(page,virtualFolder);break;case"editimages":editImages(page,virtualFolder);break;case"rename":renameVirtualFolder(page,virtualFolder);break;case"delete":deleteVirtualFolder(page,virtualFolder)}}})})}function reloadLibrary(page){Dashboard.showLoadingMsg(),ApiClient.getVirtualFolders().then(function(result){reloadVirtualFolders(page,result)})}function shouldRefreshLibraryAfterChanges(page){return $(page).is("#mediaLibraryPage")}function reloadVirtualFolders(page,virtualFolders){var html="";virtualFolders.push({Name:Globalize.translate("ButtonAddMediaLibrary"),icon:"add_circle",Locations:[],showType:!1,showLocations:!1,showMenu:!1,showNameWithIcon:!0});for(var i=0,length=virtualFolders.length;i',html+='
',html+='
',html+='
',html+='
';var imgUrl="";if(virtualFolder.PrimaryImageItemId&&(imgUrl=ApiClient.getScaledImageUrl(virtualFolder.PrimaryImageItemId,{type:"Primary"})),imgUrl?html+='
":virtualFolder.showNameWithIcon||(html+='
',html+=''+(virtualFolder.icon||getIcon(virtualFolder.CollectionType))+"",html+="
"),!imgUrl&&virtualFolder.showNameWithIcon&&(html+='

',html+=''+(virtualFolder.icon||getIcon(virtualFolder.CollectionType))+"",virtualFolder.showNameWithIcon&&(html+='
',html+=virtualFolder.Name,html+="
"),html+="

"),html+="
",html+="
",html+='
',virtualFolder.showMenu!==!1){var moreIcon="dots-horiz"==appHost.moreIcon?"":"";html+='
',html+='",html+="
"}html+="
",html+=virtualFolder.showNameWithIcon?" ":virtualFolder.Name,html+="
";var typeName=getCollectionTypeOptions().filter(function(t){return t.value==virtualFolder.CollectionType})[0];return typeName=typeName?typeName.name:Globalize.translate("FolderTypeUnset"),html+="
",html+=virtualFolder.showType===!1?" ":typeName,html+="
",virtualFolder.showLocations===!1?(html+="
",html+=" ",html+="
"):virtualFolder.Locations.length?1==virtualFolder.Locations.length?(html+="
",html+=virtualFolder.Locations[0],html+="
"):(html+="
",html+=Globalize.translate("NumLocationsValue",virtualFolder.Locations.length),html+="
"):(html+="
",html+=Globalize.translate("NumLocationsValue",virtualFolder.Locations.length),html+="
"),html+="
",html+="
",html+=""}function getTabs(){return[{href:"library.html",name:Globalize.translate("HeaderLibraries")},{href:"librarydisplay.html",name:Globalize.translate("TabDisplay")},{href:"metadataimages.html",name:Globalize.translate("TabMetadata")},{href:"metadatanfo.html",name:Globalize.translate("TabNfoSettings")},{href:"librarysettings.html",name:Globalize.translate("TabAdvanced")}]}window.WizardLibraryPage={next:function(){Dashboard.showLoadingMsg();var apiClient=ApiClient;apiClient.ajax({type:"POST",url:apiClient.getUrl("System/Configuration/MetadataPlugins/Autoset")}).then(function(){Dashboard.hideLoadingMsg(),Dashboard.navigate("wizardsettings.html")})}},pageClassOn("pageshow","mediaLibraryPage",function(){var page=this;reloadLibrary(page)}),pageIdOn("pageshow","mediaLibraryPage",function(){LibraryMenu.setTabs("librarysetup",0,getTabs);var page=this;taskButton({mode:"on",progressElem:page.querySelector(".refreshProgress"),taskKey:"RefreshLibrary",button:page.querySelector(".btnRefresh")})}),pageIdOn("pagebeforehide","mediaLibraryPage",function(){var page=this;taskButton({mode:"off",progressElem:page.querySelector(".refreshProgress"),taskKey:"RefreshLibrary",button:page.querySelector(".btnRefresh")})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/metadataimagespage.js b/dashboard-ui/scripts/metadataimagespage.js index 5da557524e..7931fdd778 100644 --- a/dashboard-ui/scripts/metadataimagespage.js +++ b/dashboard-ui/scripts/metadataimagespage.js @@ -1,624 +1 @@ -define(['jQuery', 'dom', 'listViewStyle'], function ($, dom) { - 'use strict'; - - var currentType; - - function populateLanguages(select) { - - return ApiClient.getCultures().then(function (languages) { - - var html = ""; - - html += ""; - - for (var i = 0, length = languages.length; i < length; i++) { - - var culture = languages[i]; - - html += ""; - } - - select.innerHTML = html; - }); - } - - function populateCountries(select) { - - return ApiClient.getCountries().then(function (allCountries) { - - var html = ""; - - html += ""; - - for (var i = 0, length = allCountries.length; i < length; i++) { - - var culture = allCountries[i]; - - html += ""; - } - - select.innerHTML = html; - }); - } - - function loadTabs(page, tabs) { - - var html = ''; - - for (var i = 0, length = tabs.length; i < length; i++) { - - var tab = tabs[i]; - - var isChecked = i == 0 ? ' selected="selected"' : ''; - - html += ''; - } - - $('#selectItemType', page).html(html).trigger('change'); - - Dashboard.hideLoadingMsg(); - } - - function loadType(page, type) { - - Dashboard.showLoadingMsg(); - - currentType = type; - - var promise1 = ApiClient.getServerConfiguration(); - var promise2 = ApiClient.getJSON(ApiClient.getUrl("System/Configuration/MetadataPlugins")); - - Promise.all([promise1, promise2]).then(function (responses) { - - var config = responses[0]; - var metadataPlugins = responses[1]; - - config = config.MetadataOptions.filter(function (c) { - return c.ItemType == type; - })[0]; - - if (config) { - - renderType(page, type, config, metadataPlugins); - - Dashboard.hideLoadingMsg(); - - } else { - - ApiClient.getJSON(ApiClient.getUrl("System/Configuration/MetadataOptions/Default")).then(function (defaultConfig) { - - - config = defaultConfig; - - renderType(page, type, config, metadataPlugins); - - Dashboard.hideLoadingMsg(); - }); - - } - - }); - - } - - function setVisibilityOfBackdrops(elem, visible) { - - if (visible) { - elem.show(); - - $('input', elem).attr('required', 'required'); - - } else { - elem.hide(); - - $('input', elem).attr('required', '').removeAttr('required'); - } - } - - function renderType(page, type, config, metadataPlugins) { - - var metadataInfo = metadataPlugins.filter(function (f) { - - return type == f.ItemType; - })[0]; - - setVisibilityOfBackdrops($('.backdropFields', page), metadataInfo.SupportedImageTypes.indexOf('Backdrop') != -1); - setVisibilityOfBackdrops($('.screenshotFields', page), metadataInfo.SupportedImageTypes.indexOf('Screenshot') != -1); - - $('.imageType', page).each(function () { - - var imageType = this.getAttribute('data-imagetype'); - var container = dom.parentWithTag(this, 'LABEL'); - - if (metadataInfo.SupportedImageTypes.indexOf(imageType) == -1) { - container.classList.add('hide'); - } else { - container.classList.remove('hide'); - } - - if (getImageConfig(config, imageType).Limit) { - - this.checked = true; - - } else { - this.checked = false; - } - }); - - var backdropConfig = getImageConfig(config, 'Backdrop'); - - $('#txtMaxBackdrops', page).val(backdropConfig.Limit); - $('#txtMinBackdropDownloadWidth', page).val(backdropConfig.MinWidth); - - var screenshotConfig = getImageConfig(config, 'Screenshot'); - - $('#txtMaxScreenshots', page).val(screenshotConfig.Limit); - $('#txtMinScreenshotDownloadWidth', page).val(screenshotConfig.MinWidth); - - renderMetadataLocals(page, type, config, metadataInfo); - renderMetadataFetchers(page, type, config, metadataInfo); - renderMetadataSavers(page, type, config, metadataInfo); - renderImageFetchers(page, type, config, metadataInfo); - } - - function getImageConfig(config, type) { - - return config.ImageOptions.filter(function (i) { - - return i.Type == type; - - })[0] || { - - Type: type, - MinWidth: type == 'Backdrop' ? 1280 : 0, - Limit: type == 'Backdrop' ? 3 : 1 - }; - } - - function renderImageFetchers(page, type, config, metadataInfo) { - - var plugins = metadataInfo.Plugins.filter(function (p) { - return p.Type == 'ImageFetcher'; - }); - - var html = ''; - - if (!plugins.length) { - $('.imageFetchers', page).html(html).hide(); - return; - } - - var i, length, plugin, id; - - html += '

' + Globalize.translate('LabelImageFetchers') + '

'; - html += '
'; - - for (i = 0, length = plugins.length; i < length; i++) { - - plugin = plugins[i]; - - var isChecked = config.DisabledImageFetchers.indexOf(plugin.Name) == -1 ? ' checked="checked"' : ''; - - html += '
'; - - html += ''; - - html += '
'; - - html += '

'; - html += plugin.Name; - html += '

'; - - html += '
'; - - html += ''; - html += ''; - - html += '
'; - } - - html += '
'; - html += '
' + Globalize.translate('LabelImageFetchersHelp') + '
'; - - var elem = $('.imageFetchers', page).html(html).show(); - - $('.btnDown', elem).on('click', function () { - - var elemToMove = $(this).parents('.imageFetcherItem')[0]; - - var insertAfter = $(elemToMove).next('.imageFetcherItem')[0]; - - if (insertAfter) { - elemToMove.parentNode.removeChild(elemToMove); - $(elemToMove).insertAfter(insertAfter); - } - }); - - $('.btnUp', elem).on('click', function () { - - var elemToMove = $(this).parents('.imageFetcherItem')[0]; - - var insertBefore = $(elemToMove).prev('.imageFetcherItem')[0]; - - if (insertBefore) { - elemToMove.parentNode.removeChild(elemToMove); - $(elemToMove).insertBefore(insertBefore); - } - }); - } - - function renderMetadataSavers(page, type, config, metadataInfo) { - - var plugins = metadataInfo.Plugins.filter(function (p) { - return p.Type == 'MetadataSaver'; - }); - - var html = ''; - - if (!plugins.length) { - $('.metadataSavers', page).html(html).hide(); - return; - } - - html += '

' + Globalize.translate('LabelMetadataSavers') + '

'; - html += '
'; - - for (var i = 0, length = plugins.length; i < length; i++) { - - var plugin = plugins[i]; - - var isChecked = config.DisabledMetadataSavers.indexOf(plugin.Name) == -1 ? ' checked="checked"' : ''; - - html += ''; - } - - html += '
'; - html += '
' + Globalize.translate('LabelMetadataSaversHelp') + '
'; - - page.querySelector('.metadataSavers').innerHTML = html; - } - - function renderMetadataFetchers(page, type, config, metadataInfo) { - - var plugins = metadataInfo.Plugins.filter(function (p) { - return p.Type == 'MetadataFetcher'; - }); - - var html = ''; - - if (!plugins.length) { - $('.metadataFetchers', page).html(html).hide(); - return; - } - - var i, length, plugin; - - html += '

' + Globalize.translate('LabelMetadataDownloaders') + '

'; - html += '
'; - - for (i = 0, length = plugins.length; i < length; i++) { - - plugin = plugins[i]; - - var isChecked = config.DisabledMetadataFetchers.indexOf(plugin.Name) == -1 ? ' checked="checked"' : ''; - - html += '
'; - - html += ''; - - html += '
'; - - html += '

'; - html += plugin.Name; - html += '

'; - - html += '
'; - - html += ''; - html += ''; - - html += '
'; - } - - html += '
'; - html += '
' + Globalize.translate('LabelMetadataDownloadersHelp') + '
'; - - var elem = $('.metadataFetchers', page).html(html).show(); - - $('.btnDown', elem).on('click', function () { - - var elemToMove = $(this).parents('.metadataFetcherItem')[0]; - - var insertAfter = $(elemToMove).next('.metadataFetcherItem')[0]; - - if (insertAfter) { - elemToMove.parentNode.removeChild(elemToMove); - $(elemToMove).insertAfter(insertAfter); - } - }); - - $('.btnUp', elem).on('click', function () { - - var elemToMove = $(this).parents('.metadataFetcherItem')[0]; - - var insertBefore = $(elemToMove).prev('.metadataFetcherItem')[0]; - - if (insertBefore) { - elemToMove.parentNode.removeChild(elemToMove); - $(elemToMove).insertBefore(insertBefore); - } - }); - } - - function renderMetadataLocals(page, type, config, metadataInfo) { - - var plugins = metadataInfo.Plugins.filter(function (p) { - return p.Type == 'LocalMetadataProvider'; - }); - - var html = ''; - - if (plugins.length < 2) { - $('.metadataReaders', page).html(html).hide(); - return; - } - - html += '

' + Globalize.translate('LabelMetadataReaders') + '

'; - html += '
'; - - for (var i = 0, length = plugins.length; i < length; i++) { - - var plugin = plugins[i]; - - html += '
'; - - html += 'live_tv'; - - html += '
'; - - html += '

'; - html += plugin.Name; - html += '

'; - - html += '
'; - - if (i > 0) { - html += ''; - } - else if (plugins.length > 1) { - - html += ''; - } - - html += '
'; - } - - html += '
'; - html += '
' + Globalize.translate('LabelMetadataReadersHelp') + '
'; - - $('.metadataReaders', page).html(html).show(); - } - - function loadPage(page) { - - var promises = [ - ApiClient.getServerConfiguration(), - populateLanguages(page.querySelector('#selectLanguage')), - populateCountries(page.querySelector('#selectCountry')) - ]; - - Promise.all(promises).then(function (responses) { - - var config = responses[0]; - page.querySelector('#selectLanguage').value = config.PreferredMetadataLanguage || ''; - page.querySelector('#selectCountry').value = config.MetadataCountryCode || ''; - }); - - loadTabs(page, [ - - { name: 'OptionMovies', type: 'Movie' }, - //{ name: 'Trailers', type: 'Trailer' }, - { name: 'OptionCollections', type: 'BoxSet' }, - { name: 'OptionSeries', type: 'Series' }, - { name: 'OptionSeasons', type: 'Season' }, - { name: 'OptionEpisodes', type: 'Episode' }, - { name: 'OptionGames', type: 'Game' }, - { name: 'OptionGameSystems', type: 'GameSystem' }, - //{ name: 'Game Genres', type: 'GameGenre' }, - { name: 'OptionMusicArtists', type: 'MusicArtist' }, - { name: 'OptionMusicAlbums', type: 'MusicAlbum' }, - { name: 'OptionMusicVideos', type: 'MusicVideo' }, - //{ name: 'Music Genres', type: 'MusicGenre' }, - { name: 'OptionSongs', type: 'Audio' }, - { name: 'OptionHomeVideos', type: 'Video' }, - { name: 'OptionBooks', type: 'Book' }, - { name: 'OptionPeople', type: 'Person' } - //{ name: 'Genres', type: 'Genre' }, - //{ name: 'Studios', type: 'Studio' } - ]); - } - - function saveSettingsIntoConfig(form, config) { - - config.DisabledMetadataSavers = $('.chkMetadataSaver', form).get().filter(function (c) { - - return !c.checked; - - }).map(function (c) { - - return c.getAttribute('data-pluginname'); - - }); - - config.LocalMetadataReaderOrder = $('.localReaderOption', form).get().map(function (c) { - - return c.getAttribute('data-pluginname'); - - }); - - config.DisabledMetadataFetchers = $('.chkMetadataFetcher', form).get().filter(function (c) { - return !c.checked; - }).map(function (c) { - - return c.getAttribute('data-pluginname'); - - }); - - config.MetadataFetcherOrder = $('.chkMetadataFetcher', form).get().map(function (c) { - - return c.getAttribute('data-pluginname'); - - }); - - config.DisabledImageFetchers = $('.chkImageFetcher', form).get().filter(function (c) { - return !c.checked; - }).map(function (c) { - - return c.getAttribute('data-pluginname'); - - }); - - config.ImageFetcherOrder = $('.chkImageFetcher', form).get().map(function (c) { - - return c.getAttribute('data-pluginname'); - - }); - - config.ImageOptions = $('.imageType:not(.hide)', form).get().map(function (c) { - - - return { - Type: c.getAttribute('data-imagetype'), - Limit: c.checked ? 1 : 0, - MinWidth: 0 - }; - - }); - - config.ImageOptions.push({ - Type: 'Backdrop', - Limit: $('#txtMaxBackdrops', form).val(), - MinWidth: $('#txtMinBackdropDownloadWidth', form).val() - }); - - config.ImageOptions.push({ - Type: 'Screenshot', - Limit: $('#txtMaxScreenshots', form).val(), - MinWidth: $('#txtMinScreenshotDownloadWidth', form).val() - }); - } - - function onSubmit() { - - var form = this; - - Dashboard.showLoadingMsg(); - - ApiClient.getServerConfiguration().then(function (config) { - - var type = currentType; - - var metadataOptions = config.MetadataOptions.filter(function (c) { - return c.ItemType == type; - })[0]; - - if (metadataOptions) { - - config.PreferredMetadataLanguage = form.querySelector('#selectLanguage').value; - config.MetadataCountryCode = form.querySelector('#selectCountry').value; - - saveSettingsIntoConfig(form, metadataOptions); - ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); - - } else { - - ApiClient.getJSON(ApiClient.getUrl("System/Configuration/MetadataOptions/Default")).then(function (defaultOptions) { - - defaultOptions.ItemType = type; - config.MetadataOptions.push(defaultOptions); - saveSettingsIntoConfig(form, defaultOptions); - ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); - - }); - } - }); - - // Disable default form submission - return false; - } - - function getTabs() { - return [ - { - href: 'library.html', - name: Globalize.translate('HeaderLibraries') - }, - { - href: 'librarydisplay.html', - name: Globalize.translate('TabDisplay') - }, - { - href: 'metadataimages.html', - name: Globalize.translate('TabMetadata') - }, - { - href: 'metadatanfo.html', - name: Globalize.translate('TabNfoSettings') - }, - { - href: 'librarysettings.html', - name: Globalize.translate('TabAdvanced') - }]; - } - - $(document).on('pageinit', "#metadataImagesConfigurationPage", function () { - - var page = this; - - $('.metadataReaders', page).on('click', '.btnLocalReaderMove', function () { - - var li = $(this).parents('.localReaderOption'); - var list = li.parents('.paperList'); - - if ($(this).hasClass('btnLocalReaderDown')) { - - var next = li.next(); - - li.remove().insertAfter(next); - - } else { - - var prev = li.prev(); - - li.remove().insertBefore(prev); - } - - $('.localReaderOption', list).each(function () { - - if ($(this).prev('.localReaderOption').length) { - $('.btnLocalReaderMove', this).addClass('btnLocalReaderUp').removeClass('btnLocalReaderDown').attr('icon', 'keyboard-arrow-up'); - } else { - $('.btnLocalReaderMove', this).addClass('btnLocalReaderDown').removeClass('btnLocalReaderUp').attr('icon', 'keyboard-arrow-down'); - } - - }); - }); - - $('#selectItemType', page).on('change', function () { - - loadType(page, this.value); - }); - - $('.metadataImagesConfigurationForm').off('submit', onSubmit).on('submit', onSubmit); - - }).on('pageshow', "#metadataImagesConfigurationPage", function () { - - LibraryMenu.setTabs('metadata', 2, getTabs); - Dashboard.showLoadingMsg(); - - var page = this; - - loadPage(page); - }); - -}); \ No newline at end of file +define(["jQuery","dom","listViewStyle"],function($,dom){"use strict";function populateLanguages(select){return ApiClient.getCultures().then(function(languages){var html="";html+="";for(var i=0,length=languages.length;i"+culture.DisplayName+""}select.innerHTML=html})}function populateCountries(select){return ApiClient.getCountries().then(function(allCountries){var html="";html+="";for(var i=0,length=allCountries.length;i"+culture.DisplayName+""}select.innerHTML=html})}function loadTabs(page,tabs){for(var html="",i=0,length=tabs.length;i"+Globalize.translate(tab.name)+""}$("#selectItemType",page).html(html).trigger("change"),Dashboard.hideLoadingMsg()}function loadType(page,type){Dashboard.showLoadingMsg(),currentType=type;var promise1=ApiClient.getServerConfiguration(),promise2=ApiClient.getJSON(ApiClient.getUrl("System/Configuration/MetadataPlugins"));Promise.all([promise1,promise2]).then(function(responses){var config=responses[0],metadataPlugins=responses[1];config=config.MetadataOptions.filter(function(c){return c.ItemType==type})[0],config?(renderType(page,type,config,metadataPlugins),Dashboard.hideLoadingMsg()):ApiClient.getJSON(ApiClient.getUrl("System/Configuration/MetadataOptions/Default")).then(function(defaultConfig){config=defaultConfig,renderType(page,type,config,metadataPlugins),Dashboard.hideLoadingMsg()})})}function setVisibilityOfBackdrops(elem,visible){visible?(elem.show(),$("input",elem).attr("required","required")):(elem.hide(),$("input",elem).attr("required","").removeAttr("required"))}function renderType(page,type,config,metadataPlugins){var metadataInfo=metadataPlugins.filter(function(f){return type==f.ItemType})[0];setVisibilityOfBackdrops($(".backdropFields",page),metadataInfo.SupportedImageTypes.indexOf("Backdrop")!=-1),setVisibilityOfBackdrops($(".screenshotFields",page),metadataInfo.SupportedImageTypes.indexOf("Screenshot")!=-1),$(".imageType",page).each(function(){var imageType=this.getAttribute("data-imagetype"),container=dom.parentWithTag(this,"LABEL");metadataInfo.SupportedImageTypes.indexOf(imageType)==-1?container.classList.add("hide"):container.classList.remove("hide"),getImageConfig(config,imageType).Limit?this.checked=!0:this.checked=!1});var backdropConfig=getImageConfig(config,"Backdrop");$("#txtMaxBackdrops",page).val(backdropConfig.Limit),$("#txtMinBackdropDownloadWidth",page).val(backdropConfig.MinWidth);var screenshotConfig=getImageConfig(config,"Screenshot");$("#txtMaxScreenshots",page).val(screenshotConfig.Limit),$("#txtMinScreenshotDownloadWidth",page).val(screenshotConfig.MinWidth),renderMetadataLocals(page,type,config,metadataInfo),renderMetadataFetchers(page,type,config,metadataInfo),renderMetadataSavers(page,type,config,metadataInfo),renderImageFetchers(page,type,config,metadataInfo)}function getImageConfig(config,type){return config.ImageOptions.filter(function(i){return i.Type==type})[0]||{Type:type,MinWidth:"Backdrop"==type?1280:0,Limit:"Backdrop"==type?3:1}}function renderImageFetchers(page,type,config,metadataInfo){var plugins=metadataInfo.Plugins.filter(function(p){return"ImageFetcher"==p.Type}),html="";if(!plugins.length)return void $(".imageFetchers",page).html(html).hide();var i,length,plugin;for(html+='

'+Globalize.translate("LabelImageFetchers")+"

",html+='
',i=0,length=plugins.length;i',html+='",html+='
',html+='

',html+=plugin.Name,html+="

",html+="
",html+='',html+='',html+="
"}html+="",html+='
'+Globalize.translate("LabelImageFetchersHelp")+"
";var elem=$(".imageFetchers",page).html(html).show();$(".btnDown",elem).on("click",function(){var elemToMove=$(this).parents(".imageFetcherItem")[0],insertAfter=$(elemToMove).next(".imageFetcherItem")[0];insertAfter&&(elemToMove.parentNode.removeChild(elemToMove),$(elemToMove).insertAfter(insertAfter))}),$(".btnUp",elem).on("click",function(){var elemToMove=$(this).parents(".imageFetcherItem")[0],insertBefore=$(elemToMove).prev(".imageFetcherItem")[0];insertBefore&&(elemToMove.parentNode.removeChild(elemToMove),$(elemToMove).insertBefore(insertBefore))})}function renderMetadataSavers(page,type,config,metadataInfo){var plugins=metadataInfo.Plugins.filter(function(p){return"MetadataSaver"==p.Type}),html="";if(!plugins.length)return void $(".metadataSavers",page).html(html).hide();html+='

'+Globalize.translate("LabelMetadataSavers")+"

",html+='
';for(var i=0,length=plugins.length;i"+plugin.Name+""}html+="
",html+='
'+Globalize.translate("LabelMetadataSaversHelp")+"
",page.querySelector(".metadataSavers").innerHTML=html}function renderMetadataFetchers(page,type,config,metadataInfo){var plugins=metadataInfo.Plugins.filter(function(p){return"MetadataFetcher"==p.Type}),html="";if(!plugins.length)return void $(".metadataFetchers",page).html(html).hide();var i,length,plugin;for(html+='

'+Globalize.translate("LabelMetadataDownloaders")+"

",html+='
',i=0,length=plugins.length;i',html+='",html+='
',html+='

',html+=plugin.Name,html+="

",html+="
",html+='',html+='',html+="
"}html+="",html+='
'+Globalize.translate("LabelMetadataDownloadersHelp")+"
";var elem=$(".metadataFetchers",page).html(html).show();$(".btnDown",elem).on("click",function(){var elemToMove=$(this).parents(".metadataFetcherItem")[0],insertAfter=$(elemToMove).next(".metadataFetcherItem")[0];insertAfter&&(elemToMove.parentNode.removeChild(elemToMove),$(elemToMove).insertAfter(insertAfter))}),$(".btnUp",elem).on("click",function(){var elemToMove=$(this).parents(".metadataFetcherItem")[0],insertBefore=$(elemToMove).prev(".metadataFetcherItem")[0];insertBefore&&(elemToMove.parentNode.removeChild(elemToMove),$(elemToMove).insertBefore(insertBefore))})}function renderMetadataLocals(page,type,config,metadataInfo){var plugins=metadataInfo.Plugins.filter(function(p){return"LocalMetadataProvider"==p.Type}),html="";if(plugins.length<2)return void $(".metadataReaders",page).html(html).hide();html+='

'+Globalize.translate("LabelMetadataReaders")+"

",html+='
';for(var i=0,length=plugins.length;i',html+='live_tv',html+='
',html+='

',html+=plugin.Name,html+="

",html+="
",i>0?html+='':plugins.length>1&&(html+=''),html+="
"}html+="",html+='
'+Globalize.translate("LabelMetadataReadersHelp")+"
",$(".metadataReaders",page).html(html).show()}function loadPage(page){var promises=[ApiClient.getServerConfiguration(),populateLanguages(page.querySelector("#selectLanguage")),populateCountries(page.querySelector("#selectCountry"))];Promise.all(promises).then(function(responses){var config=responses[0];page.querySelector("#selectLanguage").value=config.PreferredMetadataLanguage||"",page.querySelector("#selectCountry").value=config.MetadataCountryCode||""}),loadTabs(page,[{name:"OptionMovies",type:"Movie"},{name:"OptionCollections",type:"BoxSet"},{name:"OptionSeries",type:"Series"},{name:"OptionSeasons",type:"Season"},{name:"OptionEpisodes",type:"Episode"},{name:"OptionGames",type:"Game"},{name:"OptionGameSystems",type:"GameSystem"},{name:"OptionMusicArtists",type:"MusicArtist"},{name:"OptionMusicAlbums",type:"MusicAlbum"},{name:"OptionMusicVideos",type:"MusicVideo"},{name:"OptionSongs",type:"Audio"},{name:"OptionHomeVideos",type:"Video"},{name:"OptionBooks",type:"Book"},{name:"OptionPeople",type:"Person"}])}function saveSettingsIntoConfig(form,config){config.DisabledMetadataSavers=$(".chkMetadataSaver",form).get().filter(function(c){return!c.checked}).map(function(c){return c.getAttribute("data-pluginname")}),config.LocalMetadataReaderOrder=$(".localReaderOption",form).get().map(function(c){return c.getAttribute("data-pluginname")}),config.DisabledMetadataFetchers=$(".chkMetadataFetcher",form).get().filter(function(c){return!c.checked}).map(function(c){return c.getAttribute("data-pluginname")}),config.MetadataFetcherOrder=$(".chkMetadataFetcher",form).get().map(function(c){return c.getAttribute("data-pluginname")}),config.DisabledImageFetchers=$(".chkImageFetcher",form).get().filter(function(c){return!c.checked}).map(function(c){return c.getAttribute("data-pluginname")}),config.ImageFetcherOrder=$(".chkImageFetcher",form).get().map(function(c){return c.getAttribute("data-pluginname")}),config.ImageOptions=$(".imageType:not(.hide)",form).get().map(function(c){return{Type:c.getAttribute("data-imagetype"),Limit:c.checked?1:0,MinWidth:0}}),config.ImageOptions.push({Type:"Backdrop",Limit:$("#txtMaxBackdrops",form).val(),MinWidth:$("#txtMinBackdropDownloadWidth",form).val()}),config.ImageOptions.push({Type:"Screenshot",Limit:$("#txtMaxScreenshots",form).val(),MinWidth:$("#txtMinScreenshotDownloadWidth",form).val()})}function onSubmit(){var form=this;return Dashboard.showLoadingMsg(),ApiClient.getServerConfiguration().then(function(config){var type=currentType,metadataOptions=config.MetadataOptions.filter(function(c){return c.ItemType==type})[0];metadataOptions?(config.PreferredMetadataLanguage=form.querySelector("#selectLanguage").value,config.MetadataCountryCode=form.querySelector("#selectCountry").value,saveSettingsIntoConfig(form,metadataOptions),ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult)):ApiClient.getJSON(ApiClient.getUrl("System/Configuration/MetadataOptions/Default")).then(function(defaultOptions){defaultOptions.ItemType=type,config.MetadataOptions.push(defaultOptions),saveSettingsIntoConfig(form,defaultOptions),ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult)})}),!1}function getTabs(){return[{href:"library.html",name:Globalize.translate("HeaderLibraries")},{href:"librarydisplay.html",name:Globalize.translate("TabDisplay")},{href:"metadataimages.html",name:Globalize.translate("TabMetadata")},{href:"metadatanfo.html",name:Globalize.translate("TabNfoSettings")},{href:"librarysettings.html",name:Globalize.translate("TabAdvanced")}]}var currentType;$(document).on("pageinit","#metadataImagesConfigurationPage",function(){var page=this;$(".metadataReaders",page).on("click",".btnLocalReaderMove",function(){var li=$(this).parents(".localReaderOption"),list=li.parents(".paperList");if($(this).hasClass("btnLocalReaderDown")){var next=li.next();li.remove().insertAfter(next)}else{var prev=li.prev();li.remove().insertBefore(prev)}$(".localReaderOption",list).each(function(){$(this).prev(".localReaderOption").length?$(".btnLocalReaderMove",this).addClass("btnLocalReaderUp").removeClass("btnLocalReaderDown").attr("icon","keyboard-arrow-up"):$(".btnLocalReaderMove",this).addClass("btnLocalReaderDown").removeClass("btnLocalReaderUp").attr("icon","keyboard-arrow-down")})}),$("#selectItemType",page).on("change",function(){loadType(page,this.value)}),$(".metadataImagesConfigurationForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#metadataImagesConfigurationPage",function(){LibraryMenu.setTabs("metadata",2,getTabs),Dashboard.showLoadingMsg();var page=this;loadPage(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/metadatanfo.js b/dashboard-ui/scripts/metadatanfo.js index ed740b06f7..40eca1ee09 100644 --- a/dashboard-ui/scripts/metadatanfo.js +++ b/dashboard-ui/scripts/metadatanfo.js @@ -1,106 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - var metadataKey = "xbmcmetadata"; - - function loadPage(page, config, users) { - - var html = ''; - - html += users.map(function (user) { - return ''; - }).join(''); - - $('#selectUser', page).html(html).val(config.UserId || ''); - $('#selectReleaseDateFormat', page).val(config.ReleaseDateFormat); - - page.querySelector('#chkSaveImagePaths').checked = config.SaveImagePathsInNfo; - page.querySelector('#chkEnablePathSubstitution').checked = config.EnablePathSubstitution; - page.querySelector('#chkEnableExtraThumbs').checked = config.EnableExtraThumbsDuplication; - - Dashboard.hideLoadingMsg(); - } - - function onSubmit() { - Dashboard.showLoadingMsg(); - - var form = this; - - ApiClient.getNamedConfiguration(metadataKey).then(function (config) { - - config.UserId = $('#selectUser', form).val() || null; - config.ReleaseDateFormat = $('#selectReleaseDateFormat', form).val(); - - config.SaveImagePathsInNfo = form.querySelector('#chkSaveImagePaths').checked; - config.EnablePathSubstitution = form.querySelector('#chkEnablePathSubstitution').checked; - config.EnableExtraThumbsDuplication = form.querySelector('#chkEnableExtraThumbs').checked; - - ApiClient.updateNamedConfiguration(metadataKey, config).then(function () { - Dashboard.processServerConfigurationUpdateResult(); - - showConfirmMessage(config); - }); - }); - - // Disable default form submission - return false; - } - - function showConfirmMessage(config) { - - var msg = []; - - msg.push(Globalize.translate('MetadataSettingChangeHelp')); - - require(['alert'], function (alert) { - alert({ - text: msg.join('

') - }); - }); - } - - function getTabs() { - return [ - { - href: 'library.html', - name: Globalize.translate('HeaderLibraries') - }, - { - href: 'librarydisplay.html', - name: Globalize.translate('TabDisplay') - }, - { - href: 'metadataimages.html', - name: Globalize.translate('TabMetadata') - }, - { - href: 'metadatanfo.html', - name: Globalize.translate('TabNfoSettings') - }, - { - href: 'librarysettings.html', - name: Globalize.translate('TabAdvanced') - }]; - } - - $(document).on('pageinit', "#metadataNfoPage", function () { - - $('.metadataNfoForm').off('submit', onSubmit).on('submit', onSubmit); - - }).on('pageshow', "#metadataNfoPage", function () { - - LibraryMenu.setTabs('metadata', 3, getTabs); - Dashboard.showLoadingMsg(); - - var page = this; - - var promise1 = ApiClient.getUsers(); - var promise2 = ApiClient.getNamedConfiguration(metadataKey); - - Promise.all([promise1, promise2]).then(function (responses) { - - loadPage(page, responses[1], responses[0]); - }); - }); - -}); +define(["jQuery"],function($){"use strict";function loadPage(page,config,users){var html='";html+=users.map(function(user){return'"}).join(""),$("#selectUser",page).html(html).val(config.UserId||""),$("#selectReleaseDateFormat",page).val(config.ReleaseDateFormat),page.querySelector("#chkSaveImagePaths").checked=config.SaveImagePathsInNfo,page.querySelector("#chkEnablePathSubstitution").checked=config.EnablePathSubstitution,page.querySelector("#chkEnableExtraThumbs").checked=config.EnableExtraThumbsDuplication,Dashboard.hideLoadingMsg()}function onSubmit(){Dashboard.showLoadingMsg();var form=this;return ApiClient.getNamedConfiguration(metadataKey).then(function(config){config.UserId=$("#selectUser",form).val()||null,config.ReleaseDateFormat=$("#selectReleaseDateFormat",form).val(),config.SaveImagePathsInNfo=form.querySelector("#chkSaveImagePaths").checked,config.EnablePathSubstitution=form.querySelector("#chkEnablePathSubstitution").checked,config.EnableExtraThumbsDuplication=form.querySelector("#chkEnableExtraThumbs").checked,ApiClient.updateNamedConfiguration(metadataKey,config).then(function(){Dashboard.processServerConfigurationUpdateResult(),showConfirmMessage(config)})}),!1}function showConfirmMessage(config){var msg=[];msg.push(Globalize.translate("MetadataSettingChangeHelp")),require(["alert"],function(alert){alert({text:msg.join("

")})})}function getTabs(){return[{href:"library.html",name:Globalize.translate("HeaderLibraries")},{href:"librarydisplay.html",name:Globalize.translate("TabDisplay")},{href:"metadataimages.html",name:Globalize.translate("TabMetadata")},{href:"metadatanfo.html",name:Globalize.translate("TabNfoSettings")},{href:"librarysettings.html",name:Globalize.translate("TabAdvanced")}]}var metadataKey="xbmcmetadata";$(document).on("pageinit","#metadataNfoPage",function(){$(".metadataNfoForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#metadataNfoPage",function(){LibraryMenu.setTabs("metadata",3,getTabs),Dashboard.showLoadingMsg();var page=this,promise1=ApiClient.getUsers(),promise2=ApiClient.getNamedConfiguration(metadataKey);Promise.all([promise1,promise2]).then(function(responses){loadPage(page,responses[1],responses[0])})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/metadatasubtitles.js b/dashboard-ui/scripts/metadatasubtitles.js index 473f8954b3..2eb0c25a95 100644 --- a/dashboard-ui/scripts/metadatasubtitles.js +++ b/dashboard-ui/scripts/metadatasubtitles.js @@ -1,103 +1 @@ -define(['jQuery', 'fnchecked'], function ($) { - 'use strict'; - - function loadPage(page, config, languages) { - - $('#chkSubtitlesMovies', page).checked(config.DownloadMovieSubtitles); - $('#chkSubtitlesEpisodes', page).checked(config.DownloadEpisodeSubtitles); - - $('#chkSkipIfGraphicalSubsPresent', page).checked(config.SkipIfEmbeddedSubtitlesPresent); - $('#chkSkipIfAudioTrackPresent', page).checked(config.SkipIfAudioTrackMatches); - $('#chkRequirePerfectMatch', page).checked(config.RequirePerfectMatch); - - $('#txtOpenSubtitleUsername', page).val(config.OpenSubtitlesUsername); - $('#txtOpenSubtitlePassword', page).val(''); - - populateLanguages(page, config, languages); - - Dashboard.hideLoadingMsg(); - } - - function populateLanguages(page, config, languages) { - - var html = ''; - - for (var i = 0, length = languages.length; i < length; i++) { - - var culture = languages[i]; - - html += ''; - } - - $('.downloadLanguages', page).html(html); - - var langs = config.DownloadLanguages || []; - - $('.chkLang', page).each(function () { - - this.checked = langs.indexOf(this.getAttribute('data-lang')) != -1; - - }); - } - - function onSubmit() { - Dashboard.showLoadingMsg(); - - var form = this; - - ApiClient.getNamedConfiguration("subtitles").then(function (config) { - - config.DownloadMovieSubtitles = $('#chkSubtitlesMovies', form).checked(); - config.DownloadEpisodeSubtitles = $('#chkSubtitlesEpisodes', form).checked(); - - config.SkipIfEmbeddedSubtitlesPresent = $('#chkSkipIfGraphicalSubsPresent', form).checked(); - config.SkipIfAudioTrackMatches = $('#chkSkipIfAudioTrackPresent', form).checked(); - config.RequirePerfectMatch = $('#chkRequirePerfectMatch', form).checked(); - - config.OpenSubtitlesUsername = $('#txtOpenSubtitleUsername', form).val(); - - var newPassword = $('#txtOpenSubtitlePassword', form).val(); - - if (newPassword) { - config.OpenSubtitlesPasswordHash = newPassword; - } - - config.DownloadLanguages = $('.chkLang', form).get().filter(function (c) { - - return c.checked; - - }).map(function (c) { - - return c.getAttribute('data-lang'); - - }); - - ApiClient.updateNamedConfiguration("subtitles", config).then(Dashboard.processServerConfigurationUpdateResult); - }); - - // Disable default form submission - return false; - } - - $(document).on('pageinit', "#metadataSubtitlesPage", function () { - - $('.metadataSubtitlesForm').off('submit', onSubmit).on('submit', onSubmit); - - }).on('pageshow', "#metadataSubtitlesPage", function () { - - Dashboard.showLoadingMsg(); - - var page = this; - - var promise1 = ApiClient.getNamedConfiguration("subtitles"); - var promise2 = ApiClient.getCultures(); - - Promise.all([promise1, promise2]).then(function (responses) { - - loadPage(page, responses[0], responses[1]); - - }); - - }); - -}); +define(["jQuery","fnchecked"],function($){"use strict";function loadPage(page,config,languages){$("#chkSubtitlesMovies",page).checked(config.DownloadMovieSubtitles),$("#chkSubtitlesEpisodes",page).checked(config.DownloadEpisodeSubtitles),$("#chkSkipIfGraphicalSubsPresent",page).checked(config.SkipIfEmbeddedSubtitlesPresent),$("#chkSkipIfAudioTrackPresent",page).checked(config.SkipIfAudioTrackMatches),$("#chkRequirePerfectMatch",page).checked(config.RequirePerfectMatch),$("#txtOpenSubtitleUsername",page).val(config.OpenSubtitlesUsername),$("#txtOpenSubtitlePassword",page).val(""),populateLanguages(page,config,languages),Dashboard.hideLoadingMsg()}function populateLanguages(page,config,languages){for(var html="",i=0,length=languages.length;i'+culture.DisplayName+""}$(".downloadLanguages",page).html(html);var langs=config.DownloadLanguages||[];$(".chkLang",page).each(function(){this.checked=langs.indexOf(this.getAttribute("data-lang"))!=-1})}function onSubmit(){Dashboard.showLoadingMsg();var form=this;return ApiClient.getNamedConfiguration("subtitles").then(function(config){config.DownloadMovieSubtitles=$("#chkSubtitlesMovies",form).checked(),config.DownloadEpisodeSubtitles=$("#chkSubtitlesEpisodes",form).checked(),config.SkipIfEmbeddedSubtitlesPresent=$("#chkSkipIfGraphicalSubsPresent",form).checked(),config.SkipIfAudioTrackMatches=$("#chkSkipIfAudioTrackPresent",form).checked(),config.RequirePerfectMatch=$("#chkRequirePerfectMatch",form).checked(),config.OpenSubtitlesUsername=$("#txtOpenSubtitleUsername",form).val();var newPassword=$("#txtOpenSubtitlePassword",form).val();newPassword&&(config.OpenSubtitlesPasswordHash=newPassword),config.DownloadLanguages=$(".chkLang",form).get().filter(function(c){return c.checked}).map(function(c){return c.getAttribute("data-lang")}),ApiClient.updateNamedConfiguration("subtitles",config).then(Dashboard.processServerConfigurationUpdateResult)}),!1}$(document).on("pageinit","#metadataSubtitlesPage",function(){$(".metadataSubtitlesForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#metadataSubtitlesPage",function(){Dashboard.showLoadingMsg();var page=this,promise1=ApiClient.getNamedConfiguration("subtitles"),promise2=ApiClient.getCultures();Promise.all([promise1,promise2]).then(function(responses){loadPage(page,responses[0],responses[1])})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/moviecollections.js b/dashboard-ui/scripts/moviecollections.js index f0c439624b..63a09f1511 100644 --- a/dashboard-ui/scripts/moviecollections.js +++ b/dashboard-ui/scripts/moviecollections.js @@ -1,291 +1 @@ -define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'apphost', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, cardBuilder, appHost) { - 'use strict'; - - return function (view, params, tabContent) { - - var self = this; - var pageSize = libraryBrowser.getDefaultPageSize(); - - var data = {}; - - function getPageData(context) { - var key = getSavedQueryKey(context); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "BoxSet", - Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - StartIndex: 0, - Limit: pageSize - }, - view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster') - }; - - libraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData; - } - - function getQuery(context) { - - return getPageData(context).query; - } - - function getSavedQueryKey(context) { - - if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('moviecollections'); - } - return context.savedQueryKey; - } - - function onViewStyleChange() { - - var viewStyle = self.getCurrentViewStyle(); - - var itemsContainer = tabContent.querySelector('.itemsContainer'); - - if (viewStyle == "List") { - - itemsContainer.classList.add('vertical-list'); - itemsContainer.classList.remove('vertical-wrap'); - } - else { - - itemsContainer.classList.remove('vertical-list'); - itemsContainer.classList.add('vertical-wrap'); - } - itemsContainer.innerHTML = ''; - } - - function reloadItems(page) { - - Dashboard.showLoadingMsg(); - - var query = getQuery(page); - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - updateFilterControls(page); - - var pagingHtml = LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false, - addLayoutButton: false, - sortButton: false, - filterButton: false - }); - - var html; - var viewStyle = self.getCurrentViewStyle(); - - if (viewStyle == "Thumb") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "backdrop", - preferThumb: true, - context: 'movies', - lazy: true, - overlayPlayButton: true, - showTitle: true - }); - } - else if (viewStyle == "ThumbCard") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "backdrop", - preferThumb: true, - context: 'movies', - lazy: true, - cardLayout: true, - showTitle: true, - showItemCounts: true, - vibrant: true - }); - } - else if (viewStyle == "Banner") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "banner", - preferBanner: true, - context: 'movies', - lazy: true - }); - } - else if (viewStyle == "List") { - - html = listView.getListViewHtml({ - items: result.Items, - context: 'movies', - sortBy: query.SortBy - }); - } - else if (viewStyle == "PosterCard") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "auto", - context: 'movies', - showTitle: true, - centerText: false, - cardLayout: true, - showItemCounts: true, - vibrant: true - }); - } - else { - - // Poster - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "auto", - context: 'movies', - centerText: true, - lazy: true, - overlayPlayButton: true, - showTitle: true - }); - } - - var i, length; - var elems = tabContent.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].innerHTML = pagingHtml; - } - - function onNextPageClick() { - query.StartIndex += query.Limit; - reloadItems(tabContent); - } - - function onPreviousPageClick() { - query.StartIndex -= query.Limit; - reloadItems(tabContent); - } - - elems = tabContent.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); - } - - elems = tabContent.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); - } - - if (!result.Items.length) { - html = '

' + Globalize.translate('MessageNoCollectionsAvailable') + '

'; - } - - var itemsContainer = tabContent.querySelector('.itemsContainer'); - itemsContainer.innerHTML = html; - imageLoader.lazyChildren(itemsContainer); - - libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); - - Dashboard.hideLoadingMsg(); - }); - } - - function updateFilterControls(tabContent) { - - } - - function initPage(tabContent) { - - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { - libraryBrowser.showSortMenu({ - items: [{ - name: Globalize.translate('OptionNameSort'), - id: 'SortName' - }, - { - name: Globalize.translate('OptionImdbRating'), - id: 'CommunityRating,SortName' - }, - { - name: Globalize.translate('OptionDateAdded'), - id: 'DateCreated,SortName' - }, - { - name: Globalize.translate('OptionParentalRating'), - id: 'OfficialRating,SortName' - }, - { - name: Globalize.translate('OptionReleaseDate'), - id: 'PremiereDate,SortName' - }], - callback: function () { - getQuery(tabContent).StartIndex = 0; - reloadItems(tabContent); - }, - query: getQuery(tabContent), - button: e.target - }); - }); - - var btnSelectView = tabContent.querySelector('.btnSelectView'); - btnSelectView.addEventListener('click', function (e) { - - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); - }); - - btnSelectView.addEventListener('layoutchange', function (e) { - - var viewStyle = e.detail.viewStyle; - - getPageData(tabContent).view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); - getQuery(tabContent).StartIndex = 0; - onViewStyleChange(); - reloadItems(tabContent); - }); - - // The button is created dynamically - tabContent.querySelector('.btnNewCollection').addEventListener('click', function () { - - require(['collectionEditor'], function (collectionEditor) { - - var serverId = ApiClient.serverInfo().Id; - new collectionEditor().show({ - items: [], - serverId: serverId - }); - - }); - }); - } - - self.getCurrentViewStyle = function () { - return getPageData(tabContent).view; - }; - - initPage(tabContent); - onViewStyleChange(); - - self.renderTab = function () { - - reloadItems(tabContent); - updateFilterControls(tabContent); - }; - - self.destroy = function () { - }; - }; -}); \ No newline at end of file +define(["events","libraryBrowser","imageLoader","listView","cardBuilder","apphost","emby-itemscontainer"],function(events,libraryBrowser,imageLoader,listView,cardBuilder,appHost){"use strict";return function(view,params,tabContent){function getPageData(context){var key=getSavedQueryKey(context),pageData=data[key];return pageData||(pageData=data[key]={query:{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"BoxSet",Recursive:!0,Fields:"PrimaryImageAspectRatio,SortName",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",StartIndex:0,Limit:pageSize},view:libraryBrowser.getSavedView(key)||(appHost.preferVisualCards?"PosterCard":"Poster")},libraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(context){return getPageData(context).query}function getSavedQueryKey(context){return context.savedQueryKey||(context.savedQueryKey=libraryBrowser.getSavedQueryKey("moviecollections")),context.savedQueryKey}function onViewStyleChange(){var viewStyle=self.getCurrentViewStyle(),itemsContainer=tabContent.querySelector(".itemsContainer");"List"==viewStyle?(itemsContainer.classList.add("vertical-list"),itemsContainer.classList.remove("vertical-wrap")):(itemsContainer.classList.remove("vertical-list"),itemsContainer.classList.add("vertical-wrap")),itemsContainer.innerHTML=""}function reloadItems(page){Dashboard.showLoadingMsg();var query=getQuery(page);ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){function onNextPageClick(){query.StartIndex+=query.Limit,reloadItems(tabContent)}function onPreviousPageClick(){query.StartIndex-=query.Limit,reloadItems(tabContent)}window.scrollTo(0,0),updateFilterControls(page);var html,pagingHtml=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1,addLayoutButton:!1,sortButton:!1,filterButton:!1}),viewStyle=self.getCurrentViewStyle();html="Thumb"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",preferThumb:!0,context:"movies",lazy:!0,overlayPlayButton:!0,showTitle:!0}):"ThumbCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",preferThumb:!0,context:"movies",lazy:!0,cardLayout:!0,showTitle:!0,showItemCounts:!0,vibrant:!0}):"Banner"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"banner",preferBanner:!0,context:"movies",lazy:!0}):"List"==viewStyle?listView.getListViewHtml({items:result.Items,context:"movies",sortBy:query.SortBy}):"PosterCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"auto",context:"movies",showTitle:!0,centerText:!1,cardLayout:!0,showItemCounts:!0,vibrant:!0}):cardBuilder.getCardsHtml({items:result.Items,shape:"auto",context:"movies",centerText:!0,lazy:!0,overlayPlayButton:!0,showTitle:!0});var i,length,elems=tabContent.querySelectorAll(".paging");for(i=0,length=elems.length;i'+Globalize.translate("MessageNoCollectionsAvailable")+"

");var itemsContainer=tabContent.querySelector(".itemsContainer");itemsContainer.innerHTML=html,imageLoader.lazyChildren(itemsContainer),libraryBrowser.saveQueryValues(getSavedQueryKey(page),query),Dashboard.hideLoadingMsg()})}function updateFilterControls(tabContent){}function initPage(tabContent){tabContent.querySelector(".btnSort").addEventListener("click",function(e){libraryBrowser.showSortMenu({items:[{name:Globalize.translate("OptionNameSort"),id:"SortName"},{name:Globalize.translate("OptionImdbRating"),id:"CommunityRating,SortName"},{name:Globalize.translate("OptionDateAdded"),id:"DateCreated,SortName"},{name:Globalize.translate("OptionParentalRating"),id:"OfficialRating,SortName"},{name:Globalize.translate("OptionReleaseDate"),id:"PremiereDate,SortName"}],callback:function(){getQuery(tabContent).StartIndex=0,reloadItems(tabContent)},query:getQuery(tabContent),button:e.target})});var btnSelectView=tabContent.querySelector(".btnSelectView");btnSelectView.addEventListener("click",function(e){libraryBrowser.showLayoutMenu(e.target,self.getCurrentViewStyle(),"List,Poster,PosterCard,Thumb,ThumbCard".split(","))}),btnSelectView.addEventListener("layoutchange",function(e){var viewStyle=e.detail.viewStyle;getPageData(tabContent).view=viewStyle,libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent),viewStyle),getQuery(tabContent).StartIndex=0,onViewStyleChange(),reloadItems(tabContent)}),tabContent.querySelector(".btnNewCollection").addEventListener("click",function(){require(["collectionEditor"],function(collectionEditor){var serverId=ApiClient.serverInfo().Id;(new collectionEditor).show({items:[],serverId:serverId})})})}var self=this,pageSize=libraryBrowser.getDefaultPageSize(),data={};self.getCurrentViewStyle=function(){return getPageData(tabContent).view},initPage(tabContent),onViewStyleChange(),self.renderTab=function(){reloadItems(tabContent),updateFilterControls(tabContent)},self.destroy=function(){}}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/moviegenres.js b/dashboard-ui/scripts/moviegenres.js index 5bec443c7a..9ee1ab6b0b 100644 --- a/dashboard-ui/scripts/moviegenres.js +++ b/dashboard-ui/scripts/moviegenres.js @@ -1,246 +1 @@ -define(['libraryBrowser', 'cardBuilder', 'lazyLoader', 'apphost', 'globalize', 'dom'], function (libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, dom) { - 'use strict'; - - return function (view, params, tabContent) { - - var self = this; - - var data = {}; - function getPageData() { - var key = getSavedQueryKey(); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Movie", - Recursive: true, - EnableTotalRecordCount: false - }, - view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster') - }; - - pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData; - } - - function getQuery() { - - return getPageData().query; - } - - function getSavedQueryKey() { - - return libraryBrowser.getSavedQueryKey('moviegenres'); - } - - function getPromise() { - - Dashboard.showLoadingMsg(); - var query = getQuery(); - - return ApiClient.getGenres(Dashboard.getCurrentUserId(), query); - } - - function enableScrollX() { - return browserInfo.mobile; - } - - function getThumbShape() { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - } - - function getPortraitShape() { - return enableScrollX() ? 'overflowPortrait' : 'portrait'; - } - - function getMoreItemsHref(itemId, type) { - - return 'secondaryitems.html?type=' + type + '&genreId=' + itemId + '&parentId=' + params.topParentId; - } - - dom.addEventListener(tabContent, 'click', function (e) { - - var btnMoreFromGenre = dom.parentWithClass(e.target, 'btnMoreFromGenre'); - if (btnMoreFromGenre) { - var id = btnMoreFromGenre.getAttribute('data-id'); - Dashboard.navigate(getMoreItemsHref(id, 'Movie')); - } - - }, { - passive: true - }); - - function fillItemsContainer(elem) { - - var id = elem.getAttribute('data-id'); - - var viewStyle = self.getCurrentViewStyle(); - - var limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? - 5 : - 8; - - if (enableScrollX()) { - limit = 10; - } - - var enableImageTypes = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? - "Primary,Backdrop,Thumb" : - "Primary"; - - var query = { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Movie", - Recursive: true, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", - ImageTypeLimit: 1, - EnableImageTypes: enableImageTypes, - Limit: limit, - GenreIds: id, - EnableTotalRecordCount: false, - ParentId: params.topParentId - }; - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - if (viewStyle == "Thumb") { - cardBuilder.buildCards(result.Items, { - itemsContainer: elem, - shape: getThumbShape(), - preferThumb: true, - showTitle: true, - scalable: true, - centerText: true, - overlayMoreButton: true, - allowBottomPadding: false - }); - } - else if (viewStyle == "ThumbCard") { - - cardBuilder.buildCards(result.Items, { - itemsContainer: elem, - shape: getThumbShape(), - preferThumb: true, - showTitle: true, - scalable: true, - centerText: false, - cardLayout: true, - vibrant: supportsImageAnalysis, - showYear: true - }); - } - else if (viewStyle == "PosterCard") { - cardBuilder.buildCards(result.Items, { - itemsContainer: elem, - shape: getPortraitShape(), - showTitle: true, - scalable: true, - centerText: false, - cardLayout: true, - vibrant: supportsImageAnalysis, - showYear: true - }); - } - else if (viewStyle == "Poster") { - cardBuilder.buildCards(result.Items, { - itemsContainer: elem, - shape: getPortraitShape(), - showTitle: true, - scalable: true, - centerText: true, - overlayMoreButton: true, - allowBottomPadding: false - }); - } - - if (result.Items.length >= query.Limit) { - tabContent.querySelector('.btnMoreFromGenre' + id).classList.remove('hide'); - } - }); - } - - function reloadItems(context, promise) { - - var query = getQuery(); - - promise.then(function (result) { - - var elem = context.querySelector('#items'); - var html = ''; - - var items = result.Items; - - for (var i = 0, length = items.length; i < length; i++) { - - var item = items[i]; - - html += '
'; - - html += '
'; - html += '

'; - html += item.Name; - html += '

'; - html += ''; - html += '
'; - - if (enableScrollX()) { - html += '
'; - } else { - html += '
'; - } - html += '
'; - - html += '
'; - } - - elem.innerHTML = html; - - lazyLoader.lazyChildren(elem, fillItemsContainer); - - libraryBrowser.saveQueryValues(getSavedQueryKey(), query); - - Dashboard.hideLoadingMsg(); - }); - } - self.getViewStyles = function () { - return 'Poster,PosterCard,Thumb,ThumbCard'.split(','); - }; - - self.getCurrentViewStyle = function () { - return getPageData(tabContent).view; - }; - - self.setCurrentViewStyle = function (viewStyle) { - getPageData(tabContent).view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); - fullyReload(); - }; - - self.enableViewSelection = true; - var promise; - - self.preRender = function () { - promise = getPromise(); - }; - - self.renderTab = function () { - - reloadItems(tabContent, promise); - }; - - function fullyReload() { - self.preRender(); - self.renderTab(); - } - }; -}); \ No newline at end of file +define(["libraryBrowser","cardBuilder","lazyLoader","apphost","globalize","dom"],function(libraryBrowser,cardBuilder,lazyLoader,appHost,globalize,dom){"use strict";return function(view,params,tabContent){function getPageData(){var key=getSavedQueryKey(),pageData=data[key];return pageData||(pageData=data[key]={query:{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"Movie",Recursive:!0,EnableTotalRecordCount:!1},view:libraryBrowser.getSavedView(key)||(appHost.preferVisualCards?"PosterCard":"Poster")},pageData.query.ParentId=params.topParentId,libraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(){return getPageData().query}function getSavedQueryKey(){return libraryBrowser.getSavedQueryKey("moviegenres")}function getPromise(){Dashboard.showLoadingMsg();var query=getQuery();return ApiClient.getGenres(Dashboard.getCurrentUserId(),query)}function enableScrollX(){return browserInfo.mobile}function getThumbShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function getPortraitShape(){return enableScrollX()?"overflowPortrait":"portrait"}function getMoreItemsHref(itemId,type){return"secondaryitems.html?type="+type+"&genreId="+itemId+"&parentId="+params.topParentId}function fillItemsContainer(elem){var id=elem.getAttribute("data-id"),viewStyle=self.getCurrentViewStyle(),limit="Thumb"==viewStyle||"ThumbCard"==viewStyle?5:8;enableScrollX()&&(limit=10);var enableImageTypes="Thumb"==viewStyle||"ThumbCard"==viewStyle?"Primary,Backdrop,Thumb":"Primary",query={SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"Movie",Recursive:!0,Fields:"PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",ImageTypeLimit:1,EnableImageTypes:enableImageTypes,Limit:limit,GenreIds:id,EnableTotalRecordCount:!1,ParentId:params.topParentId};ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){var supportsImageAnalysis=appHost.supports("imageanalysis");"Thumb"==viewStyle?cardBuilder.buildCards(result.Items,{itemsContainer:elem,shape:getThumbShape(),preferThumb:!0,showTitle:!0,scalable:!0,centerText:!0,overlayMoreButton:!0,allowBottomPadding:!1}):"ThumbCard"==viewStyle?cardBuilder.buildCards(result.Items,{itemsContainer:elem,shape:getThumbShape(),preferThumb:!0,showTitle:!0,scalable:!0,centerText:!1,cardLayout:!0,vibrant:supportsImageAnalysis,showYear:!0}):"PosterCard"==viewStyle?cardBuilder.buildCards(result.Items,{itemsContainer:elem,shape:getPortraitShape(),showTitle:!0,scalable:!0,centerText:!1,cardLayout:!0,vibrant:supportsImageAnalysis,showYear:!0}):"Poster"==viewStyle&&cardBuilder.buildCards(result.Items,{itemsContainer:elem,shape:getPortraitShape(),showTitle:!0,scalable:!0,centerText:!0,overlayMoreButton:!0,allowBottomPadding:!1}),result.Items.length>=query.Limit&&tabContent.querySelector(".btnMoreFromGenre"+id).classList.remove("hide")})}function reloadItems(context,promise){var query=getQuery();promise.then(function(result){for(var elem=context.querySelector("#items"),html="",items=result.Items,i=0,length=items.length;i',html+='
',html+='

',html+=item.Name,html+="

",html+='",html+="
",html+=enableScrollX()?'
':'
',html+="
",html+="
"}elem.innerHTML=html,lazyLoader.lazyChildren(elem,fillItemsContainer),libraryBrowser.saveQueryValues(getSavedQueryKey(),query),Dashboard.hideLoadingMsg()})}function fullyReload(){self.preRender(),self.renderTab()}var self=this,data={};dom.addEventListener(tabContent,"click",function(e){var btnMoreFromGenre=dom.parentWithClass(e.target,"btnMoreFromGenre");if(btnMoreFromGenre){var id=btnMoreFromGenre.getAttribute("data-id");Dashboard.navigate(getMoreItemsHref(id,"Movie"))}},{passive:!0}),self.getViewStyles=function(){return"Poster,PosterCard,Thumb,ThumbCard".split(",")},self.getCurrentViewStyle=function(){return getPageData(tabContent).view},self.setCurrentViewStyle=function(viewStyle){getPageData(tabContent).view=viewStyle,libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent),viewStyle),fullyReload()},self.enableViewSelection=!0;var promise;self.preRender=function(){promise=getPromise()},self.renderTab=function(){reloadItems(tabContent,promise)}}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/movies.js b/dashboard-ui/scripts/movies.js index ab66afd8ad..f9219a6cdd 100644 --- a/dashboard-ui/scripts/movies.js +++ b/dashboard-ui/scripts/movies.js @@ -1,340 +1 @@ -define(['events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) { - 'use strict'; - - return function (view, params, tabContent) { - - var self = this; - var pageSize = libraryBrowser.getDefaultPageSize(); - - var data = {}; - - function getPageData(context) { - var key = getSavedQueryKey(context); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Movie", - Recursive: true, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - StartIndex: 0, - Limit: pageSize - }, - view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster') - }; - - pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData; - } - - function getQuery(context) { - - return getPageData(context).query; - } - - function getSavedQueryKey(context) { - - if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('movies'); - } - return context.savedQueryKey; - } - - function onViewStyleChange() { - - var viewStyle = self.getCurrentViewStyle(); - - var itemsContainer = tabContent.querySelector('.itemsContainer'); - - if (viewStyle == "List") { - - itemsContainer.classList.add('vertical-list'); - itemsContainer.classList.remove('vertical-wrap'); - } - else { - - itemsContainer.classList.remove('vertical-list'); - itemsContainer.classList.add('vertical-wrap'); - } - itemsContainer.innerHTML = ''; - } - - function reloadItems(page) { - - Dashboard.showLoadingMsg(); - - var query = getQuery(page); - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - updateFilterControls(page); - - var pagingHtml = LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false, - addLayoutButton: false, - sortButton: false, - filterButton: false - }); - - var html; - var viewStyle = self.getCurrentViewStyle(); - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - if (viewStyle == "Thumb") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "backdrop", - preferThumb: true, - context: 'movies', - lazy: true, - overlayPlayButton: true - }); - } - else if (viewStyle == "ThumbCard") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "backdrop", - preferThumb: true, - context: 'movies', - lazy: true, - cardLayout: true, - showTitle: true, - showYear: true, - vibrant: supportsImageAnalysis - }); - } - else if (viewStyle == "Banner") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "banner", - preferBanner: true, - context: 'movies', - lazy: true - }); - } - else if (viewStyle == "List") { - - html = listView.getListViewHtml({ - items: result.Items, - context: 'movies', - sortBy: query.SortBy - }); - } - else if (viewStyle == "PosterCard") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "portrait", - context: 'movies', - showTitle: true, - showYear: true, - lazy: true, - cardLayout: true, - vibrant: supportsImageAnalysis - }); - } - else { - - // Poster - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "portrait", - context: 'movies', - centerText: true, - lazy: true, - overlayPlayButton: true - }); - } - - var i, length; - var elems = tabContent.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].innerHTML = pagingHtml; - } - - function onNextPageClick() { - query.StartIndex += query.Limit; - reloadItems(tabContent); - } - - function onPreviousPageClick() { - query.StartIndex -= query.Limit; - reloadItems(tabContent); - } - - elems = tabContent.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); - } - - elems = tabContent.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); - } - - var itemsContainer = tabContent.querySelector('.itemsContainer'); - itemsContainer.innerHTML = html; - imageLoader.lazyChildren(itemsContainer); - - libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); - - Dashboard.hideLoadingMsg(); - }); - } - - self.showFilterMenu = function () { - - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { - - var filterDialog = new filterDialogFactory({ - query: getQuery(tabContent), - mode: 'movies' - }); - - Events.on(filterDialog, 'filterchange', function () { - getQuery(tabContent).StartIndex = 0; - reloadItems(tabContent); - }); - - filterDialog.show(); - }); - } - - function updateFilterControls(tabContent) { - - var query = getQuery(tabContent); - self.alphaPicker.value(query.NameStartsWithOrGreater); - } - - function initPage(tabContent) { - - var alphaPickerElement = tabContent.querySelector('.alphaPicker'); - alphaPickerElement.addEventListener('alphavaluechanged', function (e) { - var newValue = e.detail.value; - var query = getQuery(tabContent); - query.NameStartsWithOrGreater = newValue; - query.StartIndex = 0; - reloadItems(tabContent); - }); - - self.alphaPicker = new alphaPicker({ - element: alphaPickerElement, - valueChangeEvent: 'click' - }); - - tabContent.querySelector('.btnFilter').addEventListener('click', function () { - self.showFilterMenu(); - }); - - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { - libraryBrowser.showSortMenu({ - items: [{ - name: Globalize.translate('OptionNameSort'), - id: 'SortName' - }, - { - name: Globalize.translate('OptionBudget'), - id: 'Budget,SortName' - }, - { - name: Globalize.translate('OptionImdbRating'), - id: 'CommunityRating,SortName' - }, - { - name: Globalize.translate('OptionCriticRating'), - id: 'CriticRating,SortName' - }, - { - name: Globalize.translate('OptionDateAdded'), - id: 'DateCreated,SortName' - }, - { - name: Globalize.translate('OptionDatePlayed'), - id: 'DatePlayed,SortName' - }, - { - name: Globalize.translate('OptionMetascore'), - id: 'Metascore,SortName' - }, - { - name: Globalize.translate('OptionParentalRating'), - id: 'OfficialRating,SortName' - }, - { - name: Globalize.translate('OptionPlayCount'), - id: 'PlayCount,SortName' - }, - { - name: Globalize.translate('OptionReleaseDate'), - id: 'PremiereDate,SortName' - }, - { - name: Globalize.translate('OptionRevenue'), - id: 'Revenue,SortName' - }, - { - name: Globalize.translate('OptionRuntime'), - id: 'Runtime,SortName' - }], - callback: function () { - getQuery(tabContent).StartIndex = 0; - reloadItems(tabContent); - }, - query: getQuery(tabContent), - button: e.target - }); - }); - - var btnSelectView = tabContent.querySelector('.btnSelectView'); - btnSelectView.addEventListener('click', function (e) { - - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'Banner,List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); - }); - - btnSelectView.addEventListener('layoutchange', function (e) { - - var viewStyle = e.detail.viewStyle; - - getPageData(tabContent).view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); - getQuery(tabContent).StartIndex = 0; - onViewStyleChange(); - reloadItems(tabContent); - }); - } - - self.getCurrentViewStyle = function () { - return getPageData(tabContent).view; - }; - - initPage(tabContent); - onViewStyleChange(); - - self.renderTab = function () { - - reloadItems(tabContent); - updateFilterControls(tabContent); - }; - - self.destroy = function () { - }; - }; -}); \ No newline at end of file +define(["events","libraryBrowser","imageLoader","alphaPicker","listView","cardBuilder","apphost","emby-itemscontainer"],function(events,libraryBrowser,imageLoader,alphaPicker,listView,cardBuilder,appHost){"use strict";return function(view,params,tabContent){function getPageData(context){var key=getSavedQueryKey(context),pageData=data[key];return pageData||(pageData=data[key]={query:{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"Movie",Recursive:!0,Fields:"PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",StartIndex:0,Limit:pageSize},view:libraryBrowser.getSavedView(key)||(appHost.preferVisualCards?"PosterCard":"Poster")},pageData.query.ParentId=params.topParentId,libraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(context){return getPageData(context).query}function getSavedQueryKey(context){return context.savedQueryKey||(context.savedQueryKey=libraryBrowser.getSavedQueryKey("movies")),context.savedQueryKey}function onViewStyleChange(){var viewStyle=self.getCurrentViewStyle(),itemsContainer=tabContent.querySelector(".itemsContainer");"List"==viewStyle?(itemsContainer.classList.add("vertical-list"),itemsContainer.classList.remove("vertical-wrap")):(itemsContainer.classList.remove("vertical-list"),itemsContainer.classList.add("vertical-wrap")),itemsContainer.innerHTML=""}function reloadItems(page){Dashboard.showLoadingMsg();var query=getQuery(page);ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){function onNextPageClick(){query.StartIndex+=query.Limit,reloadItems(tabContent)}function onPreviousPageClick(){query.StartIndex-=query.Limit,reloadItems(tabContent)}window.scrollTo(0,0),updateFilterControls(page);var html,pagingHtml=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1,addLayoutButton:!1,sortButton:!1,filterButton:!1}),viewStyle=self.getCurrentViewStyle(),supportsImageAnalysis=appHost.supports("imageanalysis");html="Thumb"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",preferThumb:!0,context:"movies",lazy:!0,overlayPlayButton:!0}):"ThumbCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",preferThumb:!0,context:"movies",lazy:!0,cardLayout:!0,showTitle:!0,showYear:!0,vibrant:supportsImageAnalysis}):"Banner"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"banner",preferBanner:!0,context:"movies",lazy:!0}):"List"==viewStyle?listView.getListViewHtml({items:result.Items,context:"movies",sortBy:query.SortBy}):"PosterCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"portrait",context:"movies",showTitle:!0,showYear:!0,lazy:!0,cardLayout:!0,vibrant:supportsImageAnalysis}):cardBuilder.getCardsHtml({items:result.Items,shape:"portrait",context:"movies",centerText:!0,lazy:!0,overlayPlayButton:!0});var i,length,elems=tabContent.querySelectorAll(".paging");for(i=0,length=elems.length;i= 1920 ? 5 : (screenWidth >= 1600 ? 5 : 3), - Recursive: true, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", - CollapseBoxSetItems: false, - ParentId: parentId, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - EnableTotalRecordCount: false - }; - - ApiClient.getItems(userId, options).then(function (result) { - - if (result.Items.length) { - page.querySelector('#resumableSection').classList.remove('hide'); - } else { - page.querySelector('#resumableSection').classList.add('hide'); - } - - var allowBottomPadding = !enableScrollX(); - - var container = page.querySelector('#resumableItems'); - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = appHost.preferVisualCards; - - cardBuilder.buildCards(result.Items, { - itemsContainer: container, - preferThumb: true, - shape: getThumbShape(), - scalable: true, - overlayPlayButton: true, - allowBottomPadding: allowBottomPadding, - cardLayout: cardLayout, - vibrant: cardLayout && supportsImageAnalysis, - showTitle: cardLayout, - showYear: cardLayout - }); - - }); - } - - function getRecommendationHtml(recommendation) { - - var html = ''; - - var title = ''; - - switch (recommendation.RecommendationType) { - - case 'SimilarToRecentlyPlayed': - title = Globalize.translate('RecommendationBecauseYouWatched').replace("{0}", recommendation.BaselineItemName); - break; - case 'SimilarToLikedItem': - title = Globalize.translate('RecommendationBecauseYouLike').replace("{0}", recommendation.BaselineItemName); - break; - case 'HasDirectorFromRecentlyPlayed': - case 'HasLikedDirector': - title = Globalize.translate('RecommendationDirectedBy').replace("{0}", recommendation.BaselineItemName); - break; - case 'HasActorFromRecentlyPlayed': - case 'HasLikedActor': - title = Globalize.translate('RecommendationStarring').replace("{0}", recommendation.BaselineItemName); - break; - } - - html += '
'; - html += '

' + title + '

'; - - var allowBottomPadding = true; - - if (enableScrollX()) { - allowBottomPadding = false; - html += '
'; - } else { - html += '
'; - } - - html += cardBuilder.getCardsHtml(recommendation.Items, { - shape: getPortraitShape(), - scalable: true, - overlayPlayButton: true, - allowBottomPadding: allowBottomPadding - }); - - html += '
'; - html += '
'; - - return html; - } - - function loadSuggestions(page, userId, parentId) { - - var screenWidth = dom.getWindowSize().innerWidth; - - var url = ApiClient.getUrl("Movies/Recommendations", { - - userId: userId, - categoryLimit: 6, - ItemLimit: screenWidth >= 1920 ? 8 : (screenWidth >= 1600 ? 8 : (screenWidth >= 1200 ? 6 : 5)), - Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb" - }); - - ApiClient.getJSON(url).then(function (recommendations) { - - if (!recommendations.length) { - - page.querySelector('.noItemsMessage').classList.remove('hide'); - page.querySelector('.recommendations').innerHTML = ''; - return; - } - - var html = recommendations.map(getRecommendationHtml).join(''); - - page.querySelector('.noItemsMessage').classList.add('hide'); - - var recs = page.querySelector('.recommendations'); - recs.innerHTML = html; - imageLoader.lazyChildren(recs); - }); - } - - function initSuggestedTab(page, tabContent) { - - var containers = tabContent.querySelectorAll('.itemsContainer'); - for (var i = 0, length = containers.length; i < length; i++) { - if (enableScrollX()) { - containers[i].classList.add('hiddenScrollX'); - containers[i].classList.remove('vertical-wrap'); - } else { - containers[i].classList.remove('hiddenScrollX'); - containers[i].classList.add('vertical-wrap'); - } - } - } - - function loadSuggestionsTab(view, params, tabContent) { - - var parentId = params.topParentId; - - var userId = Dashboard.getCurrentUserId(); - - console.log('loadSuggestionsTab'); - loadResume(tabContent, userId, parentId); - loadLatest(tabContent, userId, parentId); - - loadSuggestions(tabContent, userId, parentId); - } - - return function (view, params) { - - var self = this; - - self.initTab = function () { - - var tabContent = view.querySelector('.pageTabContent[data-index=\'' + 0 + '\']'); - categorysyncbuttons.init(tabContent); - initSuggestedTab(view, tabContent); - }; - - self.renderTab = function () { - var tabContent = view.querySelector('.pageTabContent[data-index=\'' + 0 + '\']'); - loadSuggestionsTab(view, params, tabContent); - }; - - var viewTabs = view.querySelector('.libraryViewNav'); - - libraryBrowser.configurePaperLibraryTabs(view, viewTabs, view.querySelectorAll('.pageTabContent'), [0, 3, 4, 5]); - - var tabControllers = []; - var renderedTabs = []; - - function getTabController(page, index, callback) { - - var depends = []; - - switch (index) { - - case 0: - break; - case 1: - depends.push('scripts/movies'); - break; - case 2: - depends.push('scripts/movietrailers'); - break; - case 3: - depends.push('scripts/moviecollections'); - break; - case 4: - depends.push('scripts/moviegenres'); - break; - case 5: - depends.push('scripts/moviestudios'); - break; - default: - break; - } - - require(depends, function (controllerFactory) { - var tabContent; - if (index == 0) { - tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); - self.tabContent = tabContent; - } - var controller = tabControllers[index]; - if (!controller) { - tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); - controller = index ? new controllerFactory(view, params, tabContent) : self; - tabControllers[index] = controller; - - if (controller.initTab) { - controller.initTab(); - } - } - - callback(controller); - }); - } - - function preLoadTab(page, index) { - - getTabController(page, index, function (controller) { - if (renderedTabs.indexOf(index) == -1) { - if (controller.preRender) { - controller.preRender(); - } - } - }); - } - - function loadTab(page, index) { - - getTabController(page, index, function (controller) { - if (renderedTabs.indexOf(index) == -1) { - renderedTabs.push(index); - controller.renderTab(); - } - }); - } - - viewTabs.addEventListener('beforetabchange', function (e) { - preLoadTab(view, parseInt(e.detail.selectedTabIndex)); - }); - viewTabs.addEventListener('tabchange', function (e) { - loadTab(view, parseInt(e.detail.selectedTabIndex)); - }); - - view.addEventListener('viewbeforeshow', function (e) { - - if (!view.getAttribute('data-title')) { - - var parentId = params.topParentId; - - if (parentId) { - - ApiClient.getItem(Dashboard.getCurrentUserId(), parentId).then(function (item) { - - view.setAttribute('data-title', item.Name); - LibraryMenu.setTitle(item.Name); - }); - - - } else { - view.setAttribute('data-title', Globalize.translate('TabMovies')); - LibraryMenu.setTitle(Globalize.translate('TabMovies')); - } - } - }); - - function onPlaybackStop(e, state) { - - if (state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') { - - renderedTabs = []; - viewTabs.triggerTabChange(); - } - } - - view.addEventListener('viewshow', function (e) { - Events.on(playbackManager, 'playbackstop', onPlaybackStop); - }); - - view.addEventListener('viewbeforehide', function (e) { - Events.off(playbackManager, 'playbackstop', onPlaybackStop); - }); - - require(["headroom-window"], function (headroom) { - headroom.add(viewTabs); - self.headroom = headroom; - }); - - view.addEventListener('viewdestroy', function (e) { - if (self.headroom) { - self.headroom.remove(viewTabs); - } - }); - }; - -}); \ No newline at end of file +define(["libraryBrowser","components/categorysyncbuttons","cardBuilder","dom","apphost","imageLoader","playbackManager","scrollStyles","emby-itemscontainer","emby-tabs","emby-button"],function(libraryBrowser,categorysyncbuttons,cardBuilder,dom,appHost,imageLoader,playbackManager){"use strict";function enableScrollX(){return browserInfo.mobile}function getPortraitShape(){return enableScrollX()?"overflowPortrait":"portrait"}function getThumbShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function loadLatest(page,userId,parentId){var options={IncludeItemTypes:"Movie",Limit:18,Fields:"PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",ParentId:parentId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",EnableTotalRecordCount:!1};ApiClient.getJSON(ApiClient.getUrl("Users/"+userId+"/Items/Latest",options)).then(function(items){var allowBottomPadding=!enableScrollX(),container=page.querySelector("#recentlyAddedItems");cardBuilder.buildCards(items,{itemsContainer:container,shape:getPortraitShape(),scalable:!0,overlayPlayButton:!0,allowBottomPadding:allowBottomPadding})})}function loadResume(page,userId,parentId){var screenWidth=dom.getWindowSize().innerWidth,options={SortBy:"DatePlayed",SortOrder:"Descending",IncludeItemTypes:"Movie",Filters:"IsResumable",Limit:screenWidth>=1920?5:screenWidth>=1600?5:3,Recursive:!0,Fields:"PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",CollapseBoxSetItems:!1,ParentId:parentId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",EnableTotalRecordCount:!1};ApiClient.getItems(userId,options).then(function(result){result.Items.length?page.querySelector("#resumableSection").classList.remove("hide"):page.querySelector("#resumableSection").classList.add("hide");var allowBottomPadding=!enableScrollX(),container=page.querySelector("#resumableItems"),supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=appHost.preferVisualCards;cardBuilder.buildCards(result.Items,{itemsContainer:container,preferThumb:!0,shape:getThumbShape(),scalable:!0,overlayPlayButton:!0,allowBottomPadding:allowBottomPadding,cardLayout:cardLayout,vibrant:cardLayout&&supportsImageAnalysis,showTitle:cardLayout,showYear:cardLayout})})}function getRecommendationHtml(recommendation){var html="",title="";switch(recommendation.RecommendationType){case"SimilarToRecentlyPlayed":title=Globalize.translate("RecommendationBecauseYouWatched").replace("{0}",recommendation.BaselineItemName);break;case"SimilarToLikedItem":title=Globalize.translate("RecommendationBecauseYouLike").replace("{0}",recommendation.BaselineItemName);break;case"HasDirectorFromRecentlyPlayed":case"HasLikedDirector":title=Globalize.translate("RecommendationDirectedBy").replace("{0}",recommendation.BaselineItemName);break;case"HasActorFromRecentlyPlayed":case"HasLikedActor":title=Globalize.translate("RecommendationStarring").replace("{0}",recommendation.BaselineItemName)}html+='
',html+='

'+title+"

";var allowBottomPadding=!0;return enableScrollX()?(allowBottomPadding=!1,html+='
'):html+='
',html+=cardBuilder.getCardsHtml(recommendation.Items,{shape:getPortraitShape(),scalable:!0,overlayPlayButton:!0,allowBottomPadding:allowBottomPadding}),html+="
",html+="
"}function loadSuggestions(page,userId,parentId){var screenWidth=dom.getWindowSize().innerWidth,url=ApiClient.getUrl("Movies/Recommendations",{userId:userId,categoryLimit:6,ItemLimit:screenWidth>=1920?8:screenWidth>=1600?8:screenWidth>=1200?6:5,Fields:"PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb"});ApiClient.getJSON(url).then(function(recommendations){if(!recommendations.length)return page.querySelector(".noItemsMessage").classList.remove("hide"),void(page.querySelector(".recommendations").innerHTML="");var html=recommendations.map(getRecommendationHtml).join("");page.querySelector(".noItemsMessage").classList.add("hide");var recs=page.querySelector(".recommendations");recs.innerHTML=html,imageLoader.lazyChildren(recs)})}function initSuggestedTab(page,tabContent){for(var containers=tabContent.querySelectorAll(".itemsContainer"),i=0,length=containers.length;i'; - } - - var itemsContainer = tabContent.querySelector('.itemsContainer'); - itemsContainer.innerHTML = html; - imageLoader.lazyChildren(itemsContainer); - - libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query); - - Dashboard.hideLoadingMsg(); - }); - } - - self.showFilterMenu = function () { - - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { - - var filterDialog = new filterDialogFactory({ - query: getQuery(tabContent), - mode: 'movies' - }); - - Events.on(filterDialog, 'filterchange', function () { - getQuery(tabContent).StartIndex = 0; - reloadItems(); - }); - - filterDialog.show(); - }); - } - - function updateFilterControls(tabContent) { - - var query = getQuery(tabContent); - self.alphaPicker.value(query.NameStartsWithOrGreater); - } - - function initPage(tabContent) { - - var alphaPickerElement = tabContent.querySelector('.alphaPicker'); - alphaPickerElement.addEventListener('alphavaluechanged', function (e) { - var newValue = e.detail.value; - var query = getQuery(tabContent); - query.NameStartsWithOrGreater = newValue; - query.StartIndex = 0; - reloadItems(); - }); - - self.alphaPicker = new alphaPicker({ - element: alphaPickerElement, - valueChangeEvent: 'click' - }); - - tabContent.querySelector('.btnFilter').addEventListener('click', function () { - self.showFilterMenu(); - }); - - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { - libraryBrowser.showSortMenu({ - items: [{ - name: Globalize.translate('OptionNameSort'), - id: 'SortName' - }, - { - name: Globalize.translate('OptionImdbRating'), - id: 'CommunityRating,SortName' - }, - { - name: Globalize.translate('OptionDateAdded'), - id: 'DateCreated,SortName' - }, - { - name: Globalize.translate('OptionDatePlayed'), - id: 'DatePlayed,SortName' - }, - { - name: Globalize.translate('OptionParentalRating'), - id: 'OfficialRating,SortName' - }, - { - name: Globalize.translate('OptionPlayCount'), - id: 'PlayCount,SortName' - }, - { - name: Globalize.translate('OptionReleaseDate'), - id: 'PremiereDate,SortName' - }], - callback: function () { - getQuery(tabContent).StartIndex = 0; - reloadItems(); - }, - query: getQuery(tabContent), - button: e.target - }); - }); - } - - self.getCurrentViewStyle = function () { - return getPageData(tabContent).view; - }; - - initPage(tabContent); - - self.renderTab = function () { - - reloadItems(); - updateFilterControls(tabContent); - }; - - self.destroy = function () { - }; - }; -}); \ No newline at end of file +define(["events","libraryBrowser","imageLoader","alphaPicker","listView","cardBuilder","apphost","emby-itemscontainer"],function(events,libraryBrowser,imageLoader,alphaPicker,listView,cardBuilder,appHost){"use strict";return function(view,params,tabContent){function getPageData(context){var key=getSavedQueryKey(context),pageData=data[key];return pageData||(pageData=data[key]={query:{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"Trailer",Recursive:!0,Fields:"PrimaryImageAspectRatio,SortName,BasicSyncInfo",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",StartIndex:0,Limit:pageSize},view:libraryBrowser.getSavedView(key)||(appHost.preferVisualCards?"PosterCard":"Poster")},libraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(context){return getPageData(context).query}function getSavedQueryKey(context){return context.savedQueryKey||(context.savedQueryKey=libraryBrowser.getSavedQueryKey("trailers")),context.savedQueryKey}function reloadItems(){Dashboard.showLoadingMsg();var query=getQuery(tabContent);ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){function onNextPageClick(){query.StartIndex+=query.Limit,reloadItems()}function onPreviousPageClick(){query.StartIndex-=query.Limit,reloadItems()}window.scrollTo(0,0),updateFilterControls(tabContent);var html,pagingHtml=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1,addLayoutButton:!1,sortButton:!1,filterButton:!1}),viewStyle=self.getCurrentViewStyle();html="Thumb"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",preferThumb:!0,context:"movies",overlayPlayButton:!0}):"ThumbCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",preferThumb:!0,context:"movies",cardLayout:!0,showTitle:!0,showYear:!0,vibrant:!0}):"Banner"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"banner",preferBanner:!0,context:"movies"}):"List"==viewStyle?listView.getListViewHtml({items:result.Items,context:"movies",sortBy:query.SortBy}):"PosterCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"portrait",context:"movies",showTitle:!0,showYear:!0,cardLayout:!0,vibrant:!0}):cardBuilder.getCardsHtml({items:result.Items,shape:"portrait",context:"movies",centerText:!0,overlayPlayButton:!0,showTitle:!0,showYear:!0});var i,length,elems=tabContent.querySelectorAll(".paging");for(i=0,length=elems.length;i'+Globalize.translate("MessageNoTrailersFound")+"

");var itemsContainer=tabContent.querySelector(".itemsContainer");itemsContainer.innerHTML=html,imageLoader.lazyChildren(itemsContainer),libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent),query),Dashboard.hideLoadingMsg()})}function updateFilterControls(tabContent){var query=getQuery(tabContent);self.alphaPicker.value(query.NameStartsWithOrGreater)}function initPage(tabContent){var alphaPickerElement=tabContent.querySelector(".alphaPicker");alphaPickerElement.addEventListener("alphavaluechanged",function(e){var newValue=e.detail.value,query=getQuery(tabContent);query.NameStartsWithOrGreater=newValue,query.StartIndex=0,reloadItems()}),self.alphaPicker=new alphaPicker({element:alphaPickerElement,valueChangeEvent:"click"}),tabContent.querySelector(".btnFilter").addEventListener("click",function(){self.showFilterMenu()}),tabContent.querySelector(".btnSort").addEventListener("click",function(e){libraryBrowser.showSortMenu({items:[{name:Globalize.translate("OptionNameSort"),id:"SortName"},{name:Globalize.translate("OptionImdbRating"),id:"CommunityRating,SortName"},{name:Globalize.translate("OptionDateAdded"),id:"DateCreated,SortName"},{name:Globalize.translate("OptionDatePlayed"),id:"DatePlayed,SortName"},{name:Globalize.translate("OptionParentalRating"),id:"OfficialRating,SortName"},{name:Globalize.translate("OptionPlayCount"),id:"PlayCount,SortName"},{name:Globalize.translate("OptionReleaseDate"),id:"PremiereDate,SortName"}],callback:function(){getQuery(tabContent).StartIndex=0,reloadItems()},query:getQuery(tabContent),button:e.target})})}var self=this,pageSize=libraryBrowser.getDefaultPageSize(),data={};self.showFilterMenu=function(){require(["components/filterdialog/filterdialog"],function(filterDialogFactory){var filterDialog=new filterDialogFactory({query:getQuery(tabContent),mode:"movies"});Events.on(filterDialog,"filterchange",function(){getQuery(tabContent).StartIndex=0,reloadItems()}),filterDialog.show()})},self.getCurrentViewStyle=function(){return getPageData(tabContent).view},initPage(tabContent),self.renderTab=function(){reloadItems(),updateFilterControls(tabContent)},self.destroy=function(){}}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/musicalbums.js b/dashboard-ui/scripts/musicalbums.js index 40fa8b82e4..b3e14c21af 100644 --- a/dashboard-ui/scripts/musicalbums.js +++ b/dashboard-ui/scripts/musicalbums.js @@ -1,283 +1 @@ -define(['events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) { - 'use strict'; - - return function (view, params, tabContent) { - - var self = this; - var pageSize = libraryBrowser.getDefaultPageSize(); - - var data = {}; - - function getPageData(context) { - var key = getSavedQueryKey(context); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "MusicAlbum", - Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - StartIndex: 0, - Limit: pageSize - }, - view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster') - }; - - pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData; - } - - function getQuery(context) { - - return getPageData(context).query; - } - - function getSavedQueryKey(context) { - - if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('musicalbums'); - } - return context.savedQueryKey; - } - - function onViewStyleChange() { - - var viewStyle = self.getCurrentViewStyle(); - - var itemsContainer = tabContent.querySelector('.itemsContainer'); - - if (viewStyle == "List") { - - itemsContainer.classList.add('vertical-list'); - itemsContainer.classList.remove('vertical-wrap'); - } - else { - - itemsContainer.classList.remove('vertical-list'); - itemsContainer.classList.add('vertical-wrap'); - } - itemsContainer.innerHTML = ''; - } - - function reloadItems(page) { - - Dashboard.showLoadingMsg(); - - var query = getQuery(page); - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - updateFilterControls(page); - - var pagingHtml = LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false, - addLayoutButton: false, - sortButton: false, - filterButton: false - }); - - var html; - var viewStyle = self.getCurrentViewStyle(); - - if (viewStyle == "List") { - - html = listView.getListViewHtml({ - items: result.Items, - context: 'music', - sortBy: query.SortBy, - addToListButton: true - }); - } - else if (viewStyle == "PosterCard") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "square", - context: 'music', - showTitle: true, - coverImage: true, - showParentTitle: true, - lazy: true, - cardLayout: true, - vibrant: true - }); - } - else { - - // Poster - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "square", - context: 'music', - showTitle: true, - showParentTitle: true, - lazy: true, - centerText: true, - overlayPlayButton: true - }); - } - - var i, length; - var elems = tabContent.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].innerHTML = pagingHtml; - } - - function onNextPageClick() { - query.StartIndex += query.Limit; - reloadItems(tabContent); - } - - function onPreviousPageClick() { - query.StartIndex -= query.Limit; - reloadItems(tabContent); - } - - elems = tabContent.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); - } - - elems = tabContent.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); - } - - var itemsContainer = tabContent.querySelector('.itemsContainer'); - itemsContainer.innerHTML = html; - imageLoader.lazyChildren(itemsContainer); - - libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); - - Dashboard.hideLoadingMsg(); - }); - } - - self.showFilterMenu = function () { - - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { - - var filterDialog = new filterDialogFactory({ - query: getQuery(tabContent), - mode: 'albums' - }); - - Events.on(filterDialog, 'filterchange', function () { - getQuery(tabContent).StartIndex = 0; - reloadItems(tabContent); - }); - - filterDialog.show(); - }); - } - - function updateFilterControls(tabContent) { - - var query = getQuery(tabContent); - self.alphaPicker.value(query.NameStartsWithOrGreater); - } - - function initPage(tabContent) { - - var alphaPickerElement = tabContent.querySelector('.alphaPicker'); - alphaPickerElement.addEventListener('alphavaluechanged', function (e) { - var newValue = e.detail.value; - var query = getQuery(tabContent); - query.NameStartsWithOrGreater = newValue; - query.StartIndex = 0; - reloadItems(tabContent); - }); - - self.alphaPicker = new alphaPicker({ - element: alphaPickerElement, - valueChangeEvent: 'click' - }); - - tabContent.querySelector('.btnFilter').addEventListener('click', function () { - self.showFilterMenu(); - }); - - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { - libraryBrowser.showSortMenu({ - items: [{ - name: Globalize.translate('OptionNameSort'), - id: 'SortName' - }, - { - name: Globalize.translate('OptionAlbumArtist'), - id: 'AlbumArtist,SortName' - }, - { - name: Globalize.translate('OptionCommunityRating'), - id: 'CommunityRating,SortName' - }, - { - name: Globalize.translate('OptionCriticRating'), - id: 'CriticRating,SortName' - }, - { - name: Globalize.translate('OptionDateAdded'), - id: 'DateCreated,SortName' - }, - { - name: Globalize.translate('OptionReleaseDate'), - id: 'ProductionYear,PremiereDate,SortName' - }], - callback: function () { - getQuery(tabContent).StartIndex = 0; - reloadItems(tabContent); - }, - query: getQuery(tabContent), - button: e.target - }); - }); - - var btnSelectView = tabContent.querySelector('.btnSelectView'); - btnSelectView.addEventListener('click', function (e) { - - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); - }); - - btnSelectView.addEventListener('layoutchange', function (e) { - - var viewStyle = e.detail.viewStyle; - - getPageData(tabContent).view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); - getQuery(tabContent).StartIndex = 0; - onViewStyleChange(); - reloadItems(tabContent); - }); - } - - self.getCurrentViewStyle = function () { - return getPageData(tabContent).view; - }; - - initPage(tabContent); - onViewStyleChange(); - - self.renderTab = function () { - - reloadItems(tabContent); - updateFilterControls(tabContent); - }; - - self.destroy = function () { - }; - }; -}); \ No newline at end of file +define(["events","libraryBrowser","imageLoader","alphaPicker","listView","cardBuilder","apphost","emby-itemscontainer"],function(events,libraryBrowser,imageLoader,alphaPicker,listView,cardBuilder,appHost){"use strict";return function(view,params,tabContent){function getPageData(context){var key=getSavedQueryKey(context),pageData=data[key];return pageData||(pageData=data[key]={query:{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"MusicAlbum",Recursive:!0,Fields:"PrimaryImageAspectRatio,SortName,BasicSyncInfo",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",StartIndex:0,Limit:pageSize},view:libraryBrowser.getSavedView(key)||(appHost.preferVisualCards?"PosterCard":"Poster")},pageData.query.ParentId=params.topParentId,libraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(context){return getPageData(context).query}function getSavedQueryKey(context){return context.savedQueryKey||(context.savedQueryKey=libraryBrowser.getSavedQueryKey("musicalbums")),context.savedQueryKey}function onViewStyleChange(){var viewStyle=self.getCurrentViewStyle(),itemsContainer=tabContent.querySelector(".itemsContainer");"List"==viewStyle?(itemsContainer.classList.add("vertical-list"),itemsContainer.classList.remove("vertical-wrap")):(itemsContainer.classList.remove("vertical-list"),itemsContainer.classList.add("vertical-wrap")),itemsContainer.innerHTML=""}function reloadItems(page){Dashboard.showLoadingMsg();var query=getQuery(page);ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){function onNextPageClick(){query.StartIndex+=query.Limit,reloadItems(tabContent)}function onPreviousPageClick(){query.StartIndex-=query.Limit,reloadItems(tabContent)}window.scrollTo(0,0),updateFilterControls(page);var html,pagingHtml=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1,addLayoutButton:!1,sortButton:!1,filterButton:!1}),viewStyle=self.getCurrentViewStyle();html="List"==viewStyle?listView.getListViewHtml({items:result.Items,context:"music",sortBy:query.SortBy,addToListButton:!0}):"PosterCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"square",context:"music",showTitle:!0,coverImage:!0,showParentTitle:!0,lazy:!0,cardLayout:!0,vibrant:!0}):cardBuilder.getCardsHtml({items:result.Items,shape:"square",context:"music",showTitle:!0,showParentTitle:!0,lazy:!0,centerText:!0,overlayPlayButton:!0});var i,length,elems=tabContent.querySelectorAll(".paging");for(i=0,length=elems.length;i= 1920 ? 9 : (screenWidth >= 1200 ? 12 : (screenWidth >= 1000 ? 10 : 8)); - } - - function enableScrollX() { - return browserInfo.mobile; - } - - function getSquareShape() { - return enableScrollX() ? 'overflowSquare' : 'square'; - } - - function loadLatest(page, parentId) { - - Dashboard.showLoadingMsg(); - - var userId = Dashboard.getCurrentUserId(); - - var options = { - IncludeItemTypes: "Audio", - Limit: itemsPerRow(), - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", - ParentId: parentId, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - EnableTotalRecordCount: false - }; - - ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { - - var elem = page.querySelector('#recentlyAddedSongs'); - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - elem.innerHTML = cardBuilder.getCardsHtml({ - items: items, - showUnplayedIndicator: false, - showLatestItemsPopup: false, - shape: getSquareShape(), - showTitle: true, - showParentTitle: true, - lazy: true, - centerText: !supportsImageAnalysis, - overlayPlayButton: !supportsImageAnalysis, - allowBottomPadding: !enableScrollX(), - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - - }); - imageLoader.lazyChildren(elem); - - Dashboard.hideLoadingMsg(); - }); - } - - function loadRecentlyPlayed(page, parentId) { - - var options = { - - SortBy: "DatePlayed", - SortOrder: "Descending", - IncludeItemTypes: "Audio", - Limit: itemsPerRow(), - Recursive: true, - Fields: "PrimaryImageAspectRatio,AudioInfo", - Filters: "IsPlayed", - ParentId: parentId, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - EnableTotalRecordCount: false - }; - - ApiClient.getItems(Dashboard.getCurrentUserId(), options).then(function (result) { - - var elem = page.querySelector('#recentlyPlayed'); - - if (result.Items.length) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - - var itemsContainer = elem.querySelector('.itemsContainer'); - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - itemsContainer.innerHTML = cardBuilder.getCardsHtml({ - items: result.Items, - showUnplayedIndicator: false, - shape: getSquareShape(), - showTitle: true, - showParentTitle: true, - action: 'instantmix', - lazy: true, - centerText: !supportsImageAnalysis, - overlayMoreButton: !supportsImageAnalysis, - allowBottomPadding: !enableScrollX(), - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - - }); - imageLoader.lazyChildren(itemsContainer); - - }); - - } - - function loadFrequentlyPlayed(page, parentId) { - - var options = { - - SortBy: "PlayCount", - SortOrder: "Descending", - IncludeItemTypes: "Audio", - Limit: itemsPerRow(), - Recursive: true, - Fields: "PrimaryImageAspectRatio,AudioInfo", - Filters: "IsPlayed", - ParentId: parentId, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - EnableTotalRecordCount: false - }; - - ApiClient.getItems(Dashboard.getCurrentUserId(), options).then(function (result) { - - var elem = page.querySelector('#topPlayed'); - - if (result.Items.length) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - - var itemsContainer = elem.querySelector('.itemsContainer'); - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - itemsContainer.innerHTML = cardBuilder.getCardsHtml({ - items: result.Items, - showUnplayedIndicator: false, - shape: getSquareShape(), - showTitle: true, - showParentTitle: true, - action: 'instantmix', - lazy: true, - centerText: !supportsImageAnalysis, - overlayMoreButton: !supportsImageAnalysis, - allowBottomPadding: !enableScrollX(), - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - - }); - imageLoader.lazyChildren(itemsContainer); - - }); - - } - - function loadPlaylists(page, parentId) { - - var options = { - - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Playlist", - Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete", - StartIndex: 0, - Limit: itemsPerRow(), - EnableTotalRecordCount: false - }; - - ApiClient.getItems(Dashboard.getCurrentUserId(), options).then(function (result) { - - var elem = page.querySelector('#playlists'); - - if (result.Items.length) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - - var itemsContainer = elem.querySelector('.itemsContainer'); - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - itemsContainer.innerHTML = cardBuilder.getCardsHtml({ - items: result.Items, - shape: getSquareShape(), - showTitle: true, - lazy: true, - coverImage: true, - showItemCounts: true, - centerText: !supportsImageAnalysis, - overlayPlayButton: !supportsImageAnalysis, - allowBottomPadding: !enableScrollX(), - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - - }); - imageLoader.lazyChildren(itemsContainer); - - }); - } - - function loadSuggestionsTab(page, tabContent, parentId) { - - console.log('loadSuggestionsTab'); - loadLatest(tabContent, parentId); - loadPlaylists(tabContent, parentId); - loadRecentlyPlayed(tabContent, parentId); - loadFrequentlyPlayed(tabContent, parentId); - - require(['components/favoriteitems'], function (favoriteItems) { - - favoriteItems.render(tabContent, Dashboard.getCurrentUserId(), parentId, ['favoriteArtists', 'favoriteAlbums', 'favoriteSongs']); - - }); - } - - return function (view, params) { - - var self = this; - - function reload() { - - Dashboard.showLoadingMsg(); - - var tabContent = view.querySelector('.pageTabContent[data-index=\'' + 0 + '\']'); - loadSuggestionsTab(view, tabContent, params.topParentId); - } - - function enableScrollX() { - return browserInfo.mobile; - } - - self.initTab = function () { - - var tabContent = view.querySelector('.pageTabContent[data-index=\'' + 0 + '\']'); - - var containers = tabContent.querySelectorAll('.itemsContainer'); - for (var i = 0, length = containers.length; i < length; i++) { - if (enableScrollX()) { - containers[i].classList.add('hiddenScrollX'); - containers[i].classList.remove('vertical-wrap'); - } else { - containers[i].classList.remove('hiddenScrollX'); - containers[i].classList.add('vertical-wrap'); - } - } - }; - - self.renderTab = function () { - reload(); - }; - - var tabControllers = []; - var renderedTabs = []; - - function getTabController(page, index, callback) { - - var depends = []; - - switch (index) { - - case 0: - break; - case 1: - depends.push('scripts/musicalbums'); - break; - case 2: - depends.push('scripts/musicartists'); - break; - case 3: - depends.push('scripts/musicartists'); - break; - case 4: - depends.push('scripts/songs'); - break; - case 5: - depends.push('scripts/musicgenres'); - break; - case 6: - depends.push('scripts/musicfolders'); - break; - default: - break; - } - - require(depends, function (controllerFactory) { - var tabContent; - if (index == 0) { - tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); - self.tabContent = tabContent; - } - var controller = tabControllers[index]; - if (!controller) { - tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); - controller = index ? new controllerFactory(view, params, tabContent) : self; - - if (index == 2) { - controller.mode = 'albumartists'; - } else if (index == 3) { - controller.mode = 'artists'; - } - - tabControllers[index] = controller; - - if (controller.initTab) { - controller.initTab(); - } - } - - callback(controller); - }); - } - - function preLoadTab(page, index) { - - getTabController(page, index, function (controller) { - if (renderedTabs.indexOf(index) == -1) { - if (controller.preRender) { - controller.preRender(); - } - } - }); - } - - function loadTab(page, index) { - - getTabController(page, index, function (controller) { - if (renderedTabs.indexOf(index) == -1) { - renderedTabs.push(index); - controller.renderTab(); - } - }); - } - - var viewTabs = view.querySelector('.libraryViewNav'); - - libraryBrowser.configurePaperLibraryTabs(view, viewTabs, view.querySelectorAll('.pageTabContent'), [0, 4, 5, 6]); - - viewTabs.addEventListener('beforetabchange', function (e) { - preLoadTab(view, parseInt(e.detail.selectedTabIndex)); - }); - viewTabs.addEventListener('tabchange', function (e) { - loadTab(view, parseInt(e.detail.selectedTabIndex)); - }); - - view.addEventListener('viewbeforeshow', function (e) { - - if (!view.getAttribute('data-title')) { - - var parentId = params.topParentId; - - if (parentId) { - - ApiClient.getItem(Dashboard.getCurrentUserId(), parentId).then(function (item) { - - view.setAttribute('data-title', item.Name); - libraryMenu.setTitle(item.Name); - }); - - - } else { - view.setAttribute('data-title', Globalize.translate('TabMusic')); - libraryMenu.setTitle(Globalize.translate('TabMusic')); - } - } - }); - - require(["headroom-window"], function (headroom) { - headroom.add(viewTabs); - self.headroom = headroom; - }); - - view.addEventListener('viewdestroy', function (e) { - - if (self.headroom) { - self.headroom.remove(viewTabs); - } - tabControllers.forEach(function (t) { - if (t.destroy) { - t.destroy(); - } - }); - }); - }; - -}); \ No newline at end of file +define(["libraryBrowser","cardBuilder","dom","apphost","imageLoader","libraryMenu","scrollStyles","emby-itemscontainer","emby-tabs","emby-button"],function(libraryBrowser,cardBuilder,dom,appHost,imageLoader,libraryMenu){"use strict";function itemsPerRow(){var screenWidth=dom.getWindowSize().innerWidth;return screenWidth>=1920?9:screenWidth>=1200?12:screenWidth>=1e3?10:8}function enableScrollX(){return browserInfo.mobile}function getSquareShape(){return enableScrollX()?"overflowSquare":"square"}function loadLatest(page,parentId){Dashboard.showLoadingMsg();var userId=Dashboard.getCurrentUserId(),options={IncludeItemTypes:"Audio",Limit:itemsPerRow(),Fields:"PrimaryImageAspectRatio,BasicSyncInfo",ParentId:parentId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",EnableTotalRecordCount:!1};ApiClient.getJSON(ApiClient.getUrl("Users/"+userId+"/Items/Latest",options)).then(function(items){var elem=page.querySelector("#recentlyAddedSongs"),supportsImageAnalysis=appHost.supports("imageanalysis");elem.innerHTML=cardBuilder.getCardsHtml({items:items,showUnplayedIndicator:!1,showLatestItemsPopup:!1,shape:getSquareShape(),showTitle:!0,showParentTitle:!0,lazy:!0,centerText:!supportsImageAnalysis,overlayPlayButton:!supportsImageAnalysis,allowBottomPadding:!enableScrollX(),cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),imageLoader.lazyChildren(elem),Dashboard.hideLoadingMsg()})}function loadRecentlyPlayed(page,parentId){var options={SortBy:"DatePlayed",SortOrder:"Descending",IncludeItemTypes:"Audio",Limit:itemsPerRow(),Recursive:!0,Fields:"PrimaryImageAspectRatio,AudioInfo",Filters:"IsPlayed",ParentId:parentId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",EnableTotalRecordCount:!1};ApiClient.getItems(Dashboard.getCurrentUserId(),options).then(function(result){var elem=page.querySelector("#recentlyPlayed");result.Items.length?elem.classList.remove("hide"):elem.classList.add("hide");var itemsContainer=elem.querySelector(".itemsContainer"),supportsImageAnalysis=appHost.supports("imageanalysis");itemsContainer.innerHTML=cardBuilder.getCardsHtml({items:result.Items,showUnplayedIndicator:!1,shape:getSquareShape(),showTitle:!0,showParentTitle:!0,action:"instantmix",lazy:!0,centerText:!supportsImageAnalysis,overlayMoreButton:!supportsImageAnalysis,allowBottomPadding:!enableScrollX(),cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),imageLoader.lazyChildren(itemsContainer)})}function loadFrequentlyPlayed(page,parentId){var options={SortBy:"PlayCount",SortOrder:"Descending",IncludeItemTypes:"Audio",Limit:itemsPerRow(),Recursive:!0,Fields:"PrimaryImageAspectRatio,AudioInfo",Filters:"IsPlayed",ParentId:parentId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",EnableTotalRecordCount:!1};ApiClient.getItems(Dashboard.getCurrentUserId(),options).then(function(result){var elem=page.querySelector("#topPlayed");result.Items.length?elem.classList.remove("hide"):elem.classList.add("hide");var itemsContainer=elem.querySelector(".itemsContainer"),supportsImageAnalysis=appHost.supports("imageanalysis");itemsContainer.innerHTML=cardBuilder.getCardsHtml({items:result.Items,showUnplayedIndicator:!1,shape:getSquareShape(),showTitle:!0,showParentTitle:!0,action:"instantmix",lazy:!0,centerText:!supportsImageAnalysis,overlayMoreButton:!supportsImageAnalysis,allowBottomPadding:!enableScrollX(),cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),imageLoader.lazyChildren(itemsContainer)})}function loadPlaylists(page,parentId){var options={SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"Playlist",Recursive:!0,Fields:"PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete",StartIndex:0,Limit:itemsPerRow(),EnableTotalRecordCount:!1};ApiClient.getItems(Dashboard.getCurrentUserId(),options).then(function(result){var elem=page.querySelector("#playlists");result.Items.length?elem.classList.remove("hide"):elem.classList.add("hide");var itemsContainer=elem.querySelector(".itemsContainer"),supportsImageAnalysis=appHost.supports("imageanalysis");itemsContainer.innerHTML=cardBuilder.getCardsHtml({items:result.Items,shape:getSquareShape(),showTitle:!0,lazy:!0,coverImage:!0,showItemCounts:!0,centerText:!supportsImageAnalysis,overlayPlayButton:!supportsImageAnalysis,allowBottomPadding:!enableScrollX(),cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),imageLoader.lazyChildren(itemsContainer)})}function loadSuggestionsTab(page,tabContent,parentId){console.log("loadSuggestionsTab"),loadLatest(tabContent,parentId),loadPlaylists(tabContent,parentId),loadRecentlyPlayed(tabContent,parentId),loadFrequentlyPlayed(tabContent,parentId),require(["components/favoriteitems"],function(favoriteItems){favoriteItems.render(tabContent,Dashboard.getCurrentUserId(),parentId,["favoriteArtists","favoriteAlbums","favoriteSongs"])})}return function(view,params){function reload(){Dashboard.showLoadingMsg();var tabContent=view.querySelector(".pageTabContent[data-index='0']");loadSuggestionsTab(view,tabContent,params.topParentId)}function enableScrollX(){return browserInfo.mobile}function getTabController(page,index,callback){var depends=[];switch(index){case 0:break;case 1:depends.push("scripts/musicalbums");break;case 2:depends.push("scripts/musicartists");break;case 3:depends.push("scripts/musicartists");break;case 4:depends.push("scripts/songs");break;case 5:depends.push("scripts/musicgenres");break;case 6:depends.push("scripts/musicfolders")}require(depends,function(controllerFactory){var tabContent;0==index&&(tabContent=view.querySelector(".pageTabContent[data-index='"+index+"']"),self.tabContent=tabContent);var controller=tabControllers[index];controller||(tabContent=view.querySelector(".pageTabContent[data-index='"+index+"']"),controller=index?new controllerFactory(view,params,tabContent):self,2==index?controller.mode="albumartists":3==index&&(controller.mode="artists"),tabControllers[index]=controller,controller.initTab&&controller.initTab()),callback(controller)})}function preLoadTab(page,index){getTabController(page,index,function(controller){renderedTabs.indexOf(index)==-1&&controller.preRender&&controller.preRender()})}function loadTab(page,index){getTabController(page,index,function(controller){renderedTabs.indexOf(index)==-1&&(renderedTabs.push(index),controller.renderTab())})}var self=this;self.initTab=function(){for(var tabContent=view.querySelector(".pageTabContent[data-index='0']"),containers=tabContent.querySelectorAll(".itemsContainer"),i=0,length=containers.length;i'; - currentHtml += '' + i.Name + ''; - currentHtml += ''; - - return currentHtml; - - }).join(''); - - folderHtml += '
'; - - page.querySelector('.folderGroupList').innerHTML = folderHtml; - } - - function renderLatestItems(page, user, result) { - - var folderHtml = ''; - - folderHtml += '
'; - var excludeViewTypes = ['playlists', 'livetv', 'boxsets', 'channels']; - var excludeItemTypes = ['Channel']; - - folderHtml += result.Items.map(function (i) { - - if (excludeViewTypes.indexOf(i.CollectionType || []) !== -1) { - return ''; - } - - // not implemented yet - if (excludeItemTypes.indexOf(i.Type) !== -1) { - return ''; - } - - var currentHtml = ''; - - var id = 'chkIncludeInLatest' + i.Id; - - var isChecked = user.Configuration.LatestItemsExcludes.indexOf(i.Id) == -1; - var checkedHtml = isChecked ? ' checked="checked"' : ''; - - currentHtml += ''; - - return currentHtml; - - }).join(''); - - folderHtml += '
'; - - page.querySelector('.latestItemsList').innerHTML = folderHtml; - } - - function renderViewOrder(page, user, result) { - - var html = ''; - - var index = 0; - - html += result.Items.map(function (view) { - - var currentHtml = ''; - - currentHtml += '
'; - - currentHtml += ''; - - currentHtml += '
'; - - currentHtml += '
'; - currentHtml += view.Name; - currentHtml += '
'; - - currentHtml += '
'; - - if (index > 0) { - - currentHtml += ''; - } - else if (result.Items.length > 1) { - - currentHtml += ''; - } - - - currentHtml += '
'; - - index++; - return currentHtml; - - }).join(''); - - page.querySelector('.viewOrderList').innerHTML = html; - } - - function loadForm(page, user, userSettings) { - - page.querySelector('.chkHidePlayedFromLatest').checked = user.Configuration.HidePlayedInLatest || false; - - page.querySelector('#selectHomeSection1').value = userSettings.get('homesection0') || ''; - page.querySelector('#selectHomeSection2').value = userSettings.get('homesection1') || ''; - page.querySelector('#selectHomeSection3').value = userSettings.get('homesection2') || ''; - page.querySelector('#selectHomeSection4').value = userSettings.get('homesection3') || ''; - - var promise1 = ApiClient.getUserViews({}, user.Id); - var promise2 = ApiClient.getJSON(ApiClient.getUrl("Users/" + user.Id + "/GroupingOptions")); - - Promise.all([promise1, promise2]).then(function (responses) { - - renderViews(page, user, responses[1]); - renderLatestItems(page, user, responses[0]); - renderViewOrder(page, user, responses[0]); - - Dashboard.hideLoadingMsg(); - }); - } - - function getCheckboxItems(selector, page, isChecked) { - - var inputs = page.querySelectorAll(selector); - var list = []; - - for (var i = 0, length = inputs.length; i < length; i++) { - - if (inputs[i].checked == isChecked) { - list.push(inputs[i]); - } - - } - - return list; - } - - function refreshGlobalUserSettings(userSettingsInstance) { - require(['userSettings'], function (userSettings) { - userSettings.importFrom(userSettingsInstance); - }); - } - - function saveUser(page, user, userSettingsInstance) { - - user.Configuration.HidePlayedInLatest = page.querySelector('.chkHidePlayedFromLatest').checked; - - user.Configuration.LatestItemsExcludes = getCheckboxItems(".chkIncludeInLatest", page, false).map(function (i) { - - return i.getAttribute('data-folderid'); - }); - - user.Configuration.GroupedFolders = getCheckboxItems(".chkGroupFolder", page, true).map(function (i) { - - return i.getAttribute('data-folderid'); - }); - - var viewItems = page.querySelectorAll('.viewItem'); - var orderedViews = []; - for (var i = 0, length = viewItems.length; i < length; i++) { - orderedViews.push(viewItems[i].getAttribute('data-viewid')); - } - - user.Configuration.OrderedViews = orderedViews; - - userSettingsInstance.set('homesection0', page.querySelector('#selectHomeSection1').value); - userSettingsInstance.set('homesection1', page.querySelector('#selectHomeSection2').value); - userSettingsInstance.set('homesection2', page.querySelector('#selectHomeSection3').value); - userSettingsInstance.set('homesection3', page.querySelector('#selectHomeSection4').value); - - if (user.Id === Dashboard.getCurrentUserId()) { - refreshGlobalUserSettings(userSettingsInstance); - } - - return ApiClient.updateUserConfiguration(user.Id, user.Configuration); - } - - function save(page, userId, userSettings) { - - Dashboard.showLoadingMsg(); - - if (!AppInfo.enableAutoSave) { - Dashboard.showLoadingMsg(); - } - - ApiClient.getUser(userId).then(function (user) { - - saveUser(page, user, userSettings).then(function () { - - Dashboard.hideLoadingMsg(); - if (!AppInfo.enableAutoSave) { - require(['toast'], function (toast) { - toast(Globalize.translate('SettingsSaved')); - }); - } - - }, function () { - Dashboard.hideLoadingMsg(); - }); - }); - } - - function parentWithClass(elem, className) { - - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - - if (!elem) { - return null; - } - } - - return elem; - } - - function getSibling(elem, type, className) { - - var sibling = elem[type]; - - while (sibling != null) { - if (sibling.classList.contains(className)) { - break; - } - } - - if (sibling != null) { - if (!sibling.classList.contains(className)) { - sibling = null; - } - } - - return sibling; - } - - return function (view, params) { - - var userId = params.userId || Dashboard.getCurrentUserId(); - var userSettings = new userSettingsBuilder(); - var userSettingsLoaded; - - function onSubmit(e) { - - userSettings.setUserInfo(userId, ApiClient).then(function () { - - save(view, userId, userSettings); - }); - - // Disable default form submission - if (e) { - e.preventDefault(); - } - return false; - } - - view.querySelector('.viewOrderList').addEventListener('click', function (e) { - - var target = parentWithClass(e.target, 'btnViewItemMove'); - - var li = parentWithClass(target, 'viewItem'); - var ul = parentWithClass(li, 'paperList'); - - if (target.classList.contains('btnViewItemDown')) { - - var next = li.nextSibling; - - li.parentNode.removeChild(li); - next.parentNode.insertBefore(li, next.nextSibling); - - } else { - - var prev = li.previousSibling; - - li.parentNode.removeChild(li); - prev.parentNode.insertBefore(li, prev); - } - - var viewItems = ul.querySelectorAll('.viewItem'); - for (var i = 0, length = viewItems.length; i < length; i++) { - var viewItem = viewItems[i]; - - var btn = viewItem.querySelector('.btnViewItemMove'); - - var prevViewItem = getSibling(viewItem, 'previousSibling', 'viewItem'); - - if (prevViewItem) { - - btn.classList.add('btnViewItemUp'); - btn.classList.remove('btnViewItemDown'); - btn.icon = 'keyboard-arrow-up'; - } else { - - btn.classList.remove('btnViewItemUp'); - btn.classList.add('btnViewItemDown'); - btn.icon = 'keyboard-arrow-down'; - } - } - }); - - view.querySelector('.homeScreenPreferencesForm').addEventListener('submit', onSubmit); - - if (AppInfo.enableAutoSave) { - view.querySelector('.btnSave').classList.add('hide'); - } else { - view.querySelector('.btnSave').classList.remove('hide'); - } - - view.addEventListener('viewshow', function () { - var page = this; - - Dashboard.showLoadingMsg(); - - var userId = params.userId || Dashboard.getCurrentUserId(); - - ApiClient.getUser(userId).then(function (user) { - - userSettings.setUserInfo(userId, ApiClient).then(function () { - - userSettingsLoaded = true; - - loadForm(page, user, userSettings); - }); - }); - }); - - view.addEventListener('viewbeforehide', function () { - if (AppInfo.enableAutoSave) { - onSubmit(); - } - }); - }; -}); \ No newline at end of file +define(["userSettingsBuilder","listViewStyle"],function(userSettingsBuilder){"use strict";function renderViews(page,user,result){var folderHtml="";folderHtml+='
',folderHtml+=result.map(function(i){var currentHtml="",id="chkGroupFolder"+i.Id,isChecked=user.Configuration.GroupedFolders.indexOf(i.Id)!=-1,checkedHtml=isChecked?' checked="checked"':"";return currentHtml+=""}).join(""),folderHtml+="
",page.querySelector(".folderGroupList").innerHTML=folderHtml}function renderLatestItems(page,user,result){var folderHtml="";folderHtml+='
';var excludeViewTypes=["playlists","livetv","boxsets","channels"],excludeItemTypes=["Channel"];folderHtml+=result.Items.map(function(i){if(excludeViewTypes.indexOf(i.CollectionType||[])!==-1)return"";if(excludeItemTypes.indexOf(i.Type)!==-1)return"";var currentHtml="",id="chkIncludeInLatest"+i.Id,isChecked=user.Configuration.LatestItemsExcludes.indexOf(i.Id)==-1,checkedHtml=isChecked?' checked="checked"':"";return currentHtml+=""}).join(""),folderHtml+="
",page.querySelector(".latestItemsList").innerHTML=folderHtml}function renderViewOrder(page,user,result){var html="",index=0;html+=result.Items.map(function(view){var currentHtml="";return currentHtml+='
',currentHtml+='',currentHtml+='
',currentHtml+="
",currentHtml+=view.Name,currentHtml+="
",currentHtml+="
",index>0?currentHtml+='':result.Items.length>1&&(currentHtml+=''),currentHtml+="
",index++,currentHtml}).join(""),page.querySelector(".viewOrderList").innerHTML=html}function loadForm(page,user,userSettings){page.querySelector(".chkHidePlayedFromLatest").checked=user.Configuration.HidePlayedInLatest||!1,page.querySelector("#selectHomeSection1").value=userSettings.get("homesection0")||"",page.querySelector("#selectHomeSection2").value=userSettings.get("homesection1")||"",page.querySelector("#selectHomeSection3").value=userSettings.get("homesection2")||"",page.querySelector("#selectHomeSection4").value=userSettings.get("homesection3")||"";var promise1=ApiClient.getUserViews({},user.Id),promise2=ApiClient.getJSON(ApiClient.getUrl("Users/"+user.Id+"/GroupingOptions"));Promise.all([promise1,promise2]).then(function(responses){renderViews(page,user,responses[1]),renderLatestItems(page,user,responses[0]),renderViewOrder(page,user,responses[0]),Dashboard.hideLoadingMsg()})}function getCheckboxItems(selector,page,isChecked){for(var inputs=page.querySelectorAll(selector),list=[],i=0,length=inputs.length;i" + culture.DisplayName + ""; - } - - select.innerHTML = html; - } - - return function (view, params) { - - var userId = params.userId || Dashboard.getCurrentUserId(); - var userSettingsInstance = new userSettingsBuilder(); - var userSettingsLoaded; - - function loadForm(page, user, loggedInUser, allCulturesPromise) { - - userSettingsInstance.setUserInfo(userId, ApiClient).then(function () { - userSettingsLoaded = true; - allCulturesPromise.then(function (allCultures) { - - populateLanguages(page.querySelector('#selectAudioLanguage'), allCultures); - populateLanguages(page.querySelector('#selectSubtitleLanguage'), allCultures); - - page.querySelector('#selectAudioLanguage', page).value = user.Configuration.AudioLanguagePreference || ""; - page.querySelector('#selectSubtitleLanguage', page).value = user.Configuration.SubtitleLanguagePreference || ""; - page.querySelector('.chkEpisodeAutoPlay').checked = user.Configuration.EnableNextEpisodeAutoPlay || false; - }); - - page.querySelector('#selectSubtitlePlaybackMode').value = user.Configuration.SubtitleMode || ""; - - page.querySelector('.chkPlayDefaultAudioTrack').checked = user.Configuration.PlayDefaultAudioTrack || false; - page.querySelector('.chkEnableCinemaMode').checked = userSettingsInstance.enableCinemaMode(); - page.querySelector('.chkExternalVideoPlayer').checked = appSettings.enableExternalPlayers(); - - require(['qualityoptions'], function (qualityoptions) { - - var bitrateOptions = qualityoptions.getVideoQualityOptions(appSettings.maxStreamingBitrate()).map(function (i) { - - return ''; - - }).join(''); - - bitrateOptions = '' + bitrateOptions; - - page.querySelector('#selectMaxBitrate').innerHTML = bitrateOptions; - page.querySelector('#selectMaxChromecastBitrate').innerHTML = bitrateOptions; - - if (appSettings.enableAutomaticBitrateDetection()) { - page.querySelector('#selectMaxBitrate').value = ''; - } else { - page.querySelector('#selectMaxBitrate').value = appSettings.maxStreamingBitrate(); - } - - page.querySelector('#selectMaxChromecastBitrate').value = appSettings.maxChromecastBitrate() || ''; - - Dashboard.hideLoadingMsg(); - }); - }); - } - - function loadPage(page) { - - Dashboard.showLoadingMsg(); - - var promise1 = ApiClient.getUser(userId); - - var promise2 = Dashboard.getCurrentUser(); - - var allCulturesPromise = ApiClient.getCultures(); - - Promise.all([promise1, promise2]).then(function (responses) { - - loadForm(page, responses[1], responses[0], allCulturesPromise); - - }); - - ApiClient.getNamedConfiguration("cinemamode").then(function (cinemaConfig) { - - if (cinemaConfig.EnableIntrosForMovies || cinemaConfig.EnableIntrosForEpisodes) { - page.querySelector('.cinemaModeOptions').classList.remove('hide'); - } else { - page.querySelector('.cinemaModeOptions').classList.add('hide'); - } - }); - } - - function refreshGlobalUserSettings() { - require(['userSettings'], function (userSettings) { - userSettings.importFrom(userSettingsInstance); - }); - } - - function saveUser(page, user) { - - user.Configuration.AudioLanguagePreference = page.querySelector('#selectAudioLanguage').value; - user.Configuration.SubtitleLanguagePreference = page.querySelector('#selectSubtitleLanguage').value; - - user.Configuration.SubtitleMode = page.querySelector('#selectSubtitlePlaybackMode').value; - user.Configuration.PlayDefaultAudioTrack = page.querySelector('.chkPlayDefaultAudioTrack').checked; - user.Configuration.EnableNextEpisodeAutoPlay = page.querySelector('.chkEpisodeAutoPlay').checked; - if (userSettingsLoaded) { - userSettingsInstance.enableCinemaMode(page.querySelector('.chkEnableCinemaMode').checked); - - if (userId === Dashboard.getCurrentUserId()) { - refreshGlobalUserSettings(); - } - } - - return ApiClient.updateUserConfiguration(user.Id, user.Configuration); - } - - function save(page) { - - appSettings.enableExternalPlayers(page.querySelector('.chkExternalVideoPlayer').checked); - - if (page.querySelector('#selectMaxBitrate').value) { - appSettings.maxStreamingBitrate(page.querySelector('#selectMaxBitrate').value); - appSettings.enableAutomaticBitrateDetection(false); - } else { - appSettings.enableAutomaticBitrateDetection(true); - } - - appSettings.maxChromecastBitrate(page.querySelector('#selectMaxChromecastBitrate').value); - - if (!AppInfo.enableAutoSave) { - Dashboard.showLoadingMsg(); - } - - ApiClient.getUser(userId).then(function (result) { - - saveUser(page, result).then(function () { - - Dashboard.hideLoadingMsg(); - if (!AppInfo.enableAutoSave) { - require(['toast'], function (toast) { - toast(Globalize.translate('SettingsSaved')); - }); - } - - }, function () { - Dashboard.hideLoadingMsg(); - }); - - }); - } - - view.querySelector('#selectSubtitlePlaybackMode').addEventListener('change', function () { - - var subtitlesHelp = view.querySelectorAll('.subtitlesHelp'); - for (var i = 0, length = subtitlesHelp.length; i < length; i++) { - subtitlesHelp[i].classList.add('hide'); - } - view.querySelector('.subtitles' + this.value + 'Help').classList.remove('hide'); - }); - - view.querySelector('.languagePreferencesForm').addEventListener('submit', function (e) { - save(view); - - // Disable default form submission - e.preventDefault(); - return false; - }); - - if (AppInfo.enableAutoSave) { - view.querySelector('.btnSave').classList.add('hide'); - } else { - view.querySelector('.btnSave').classList.remove('hide'); - } - - view.addEventListener('viewshow', function () { - - if (AppInfo.supportsExternalPlayers) { - view.querySelector('.fldExternalPlayer').classList.remove('hide'); - } else { - view.querySelector('.fldExternalPlayer').classList.add('hide'); - } - - loadPage(view); - }); - - view.addEventListener('viewbeforehide', function () { - var page = this; - - if (AppInfo.enableAutoSave) { - save(page); - } - }); - }; - -}); \ No newline at end of file +define(["appSettings","userSettingsBuilder"],function(appSettings,userSettingsBuilder){"use strict";function populateLanguages(select,languages){var html="";html+="";for(var i=0,length=languages.length;i"+culture.DisplayName+""}select.innerHTML=html}return function(view,params){function loadForm(page,user,loggedInUser,allCulturesPromise){userSettingsInstance.setUserInfo(userId,ApiClient).then(function(){userSettingsLoaded=!0,allCulturesPromise.then(function(allCultures){populateLanguages(page.querySelector("#selectAudioLanguage"),allCultures),populateLanguages(page.querySelector("#selectSubtitleLanguage"),allCultures),page.querySelector("#selectAudioLanguage",page).value=user.Configuration.AudioLanguagePreference||"",page.querySelector("#selectSubtitleLanguage",page).value=user.Configuration.SubtitleLanguagePreference||"",page.querySelector(".chkEpisodeAutoPlay").checked=user.Configuration.EnableNextEpisodeAutoPlay||!1}),page.querySelector("#selectSubtitlePlaybackMode").value=user.Configuration.SubtitleMode||"",page.querySelector(".chkPlayDefaultAudioTrack").checked=user.Configuration.PlayDefaultAudioTrack||!1,page.querySelector(".chkEnableCinemaMode").checked=userSettingsInstance.enableCinemaMode(),page.querySelector(".chkExternalVideoPlayer").checked=appSettings.enableExternalPlayers(),require(["qualityoptions"],function(qualityoptions){var bitrateOptions=qualityoptions.getVideoQualityOptions(appSettings.maxStreamingBitrate()).map(function(i){return'"}).join("");bitrateOptions='"+bitrateOptions,page.querySelector("#selectMaxBitrate").innerHTML=bitrateOptions,page.querySelector("#selectMaxChromecastBitrate").innerHTML=bitrateOptions,appSettings.enableAutomaticBitrateDetection()?page.querySelector("#selectMaxBitrate").value="":page.querySelector("#selectMaxBitrate").value=appSettings.maxStreamingBitrate(),page.querySelector("#selectMaxChromecastBitrate").value=appSettings.maxChromecastBitrate()||"",Dashboard.hideLoadingMsg()})})}function loadPage(page){Dashboard.showLoadingMsg();var promise1=ApiClient.getUser(userId),promise2=Dashboard.getCurrentUser(),allCulturesPromise=ApiClient.getCultures();Promise.all([promise1,promise2]).then(function(responses){loadForm(page,responses[1],responses[0],allCulturesPromise)}),ApiClient.getNamedConfiguration("cinemamode").then(function(cinemaConfig){cinemaConfig.EnableIntrosForMovies||cinemaConfig.EnableIntrosForEpisodes?page.querySelector(".cinemaModeOptions").classList.remove("hide"):page.querySelector(".cinemaModeOptions").classList.add("hide")})}function refreshGlobalUserSettings(){require(["userSettings"],function(userSettings){userSettings.importFrom(userSettingsInstance)})}function saveUser(page,user){return user.Configuration.AudioLanguagePreference=page.querySelector("#selectAudioLanguage").value,user.Configuration.SubtitleLanguagePreference=page.querySelector("#selectSubtitleLanguage").value,user.Configuration.SubtitleMode=page.querySelector("#selectSubtitlePlaybackMode").value,user.Configuration.PlayDefaultAudioTrack=page.querySelector(".chkPlayDefaultAudioTrack").checked,user.Configuration.EnableNextEpisodeAutoPlay=page.querySelector(".chkEpisodeAutoPlay").checked,userSettingsLoaded&&(userSettingsInstance.enableCinemaMode(page.querySelector(".chkEnableCinemaMode").checked),userId===Dashboard.getCurrentUserId()&&refreshGlobalUserSettings()),ApiClient.updateUserConfiguration(user.Id,user.Configuration)}function save(page){appSettings.enableExternalPlayers(page.querySelector(".chkExternalVideoPlayer").checked),page.querySelector("#selectMaxBitrate").value?(appSettings.maxStreamingBitrate(page.querySelector("#selectMaxBitrate").value),appSettings.enableAutomaticBitrateDetection(!1)):appSettings.enableAutomaticBitrateDetection(!0),appSettings.maxChromecastBitrate(page.querySelector("#selectMaxChromecastBitrate").value),AppInfo.enableAutoSave||Dashboard.showLoadingMsg(),ApiClient.getUser(userId).then(function(result){saveUser(page,result).then(function(){Dashboard.hideLoadingMsg(),AppInfo.enableAutoSave||require(["toast"],function(toast){toast(Globalize.translate("SettingsSaved"))})},function(){Dashboard.hideLoadingMsg()})})}var userSettingsLoaded,userId=params.userId||Dashboard.getCurrentUserId(),userSettingsInstance=new userSettingsBuilder;view.querySelector("#selectSubtitlePlaybackMode").addEventListener("change",function(){for(var subtitlesHelp=view.querySelectorAll(".subtitlesHelp"),i=0,length=subtitlesHelp.length;i"; - - var showImageEditing = false; - - if (user.ConnectLinkType == 'Guest') { - - page.querySelector('.connectMessage').classList.remove('hide'); - } - else if (user.PrimaryImageTag) { - - showImageEditing = true; - page.querySelector('.connectMessage').classList.add('hide'); - - } else { - showImageEditing = true; - page.querySelector('.connectMessage').classList.add('hide'); - } - - Dashboard.getCurrentUser().then(function (loggedInUser) { - - if (showImageEditing && AppInfo.supportsFileInput && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector('.newImageForm').classList.remove('hide'); - page.querySelector('#btnDeleteImage').classList.remove('hide'); - } else { - page.querySelector('.newImageForm').classList.add('hide'); - page.querySelector('#btnDeleteImage').classList.add('hide'); - } - }); - - Dashboard.hideLoadingMsg(); - }); - - } - - function onFileReaderError(evt) { - - Dashboard.hideLoadingMsg(); - - switch (evt.target.error.code) { - case evt.target.error.NOT_FOUND_ERR: - require(['toast'], function (toast) { - toast(Globalize.translate('FileNotFound')); - }); - break; - case evt.target.error.NOT_READABLE_ERR: - require(['toast'], function (toast) { - toast(Globalize.translate('FileReadError')); - }); - break; - case evt.target.error.ABORT_ERR: - break; // noop - default: - { - require(['toast'], function (toast) { - toast(Globalize.translate('FileReadError')); - }); - break; - } - }; - } - - function onFileReaderAbort(evt) { - - Dashboard.hideLoadingMsg(); - require(['toast'], function (toast) { - toast(Globalize.translate('FileReadCancelled')); - }); - } - - function setFiles(page, files) { - - var file = files[0]; - - if (!file || !file.type.match('image.*')) { - page.querySelector('#userImageOutput').innerHTML = ''; - page.querySelector('#fldUpload').classList.add('hide'); - currentFile = null; - return; - } - - currentFile = file; - - var reader = new FileReader(); - - reader.onerror = onFileReaderError; - reader.onloadstart = function () { - page.querySelector('#fldUpload').classList.add('hide'); - }; - reader.onabort = onFileReaderAbort; - - // Closure to capture the file information. - reader.onload = function (e) { - - // Render thumbnail. - var html = [''].join(''); - - page.querySelector('#userImageOutput').innerHTML = html; - page.querySelector('#fldUpload').classList.remove('hide'); - }; - - // Read in the image file as a data URL. - reader.readAsDataURL(file); - } - - function onImageDragOver(e) { - - e.preventDefault(); - - e.originalEvent.dataTransfer.dropEffect = 'Copy'; - - return false; - } - - return function (view, params) { - - reloadUser(view); - - var userpasswordpage = new Userpasswordpage(view, params); - - var userImageDropZone = view.querySelector('#userImageDropZone'); - userImageDropZone.addEventListener('dragOver', onImageDragOver); - userImageDropZone.addEventListener('drop', function (e) { - - e.preventDefault(); - - setFiles(view, e.originalEvent.dataTransfer.files); - - return false; - }); - - view.querySelector('#btnDeleteImage').addEventListener('click', function () { - - require(['confirm'], function (confirm) { - - confirm(Globalize.translate('DeleteImageConfirmation'), Globalize.translate('DeleteImage')).then(function () { - - Dashboard.showLoadingMsg(); - - var userId = getParameterByName("userId"); - - ApiClient.deleteUserImage(userId, "primary").then(function () { - - Dashboard.hideLoadingMsg(); - - reloadUser(view); - }); - }); - }); - }); - - view.querySelector('.newImageForm').addEventListener('submit', function (e) { - - var file = currentFile; - - if (!file) { - return false; - } - - if (file.type != "image/png" && file.type != "image/jpeg" && file.type != "image/jpeg") { - return false; - } - - Dashboard.showLoadingMsg(); - - var userId = getParameterByName("userId"); - - ApiClient.uploadUserImage(userId, 'Primary', file).then(function () { - - Dashboard.hideLoadingMsg(); - - reloadUser(view); - }); - - e.preventDefault(); - return false; - }); - - view.querySelector('#uploadUserImage').addEventListener('change', function (e) { - setFiles(view, e.target.files); - }); - }; -}); \ No newline at end of file +define(["scripts/userpasswordpage"],function(Userpasswordpage){"use strict";function reloadUser(page){var userId=getParameterByName("userId");Dashboard.showLoadingMsg(),ApiClient.getUser(userId).then(function(user){page.querySelector(".username").innerHTML=user.Name;var uploadUserImage=page.querySelector("#uploadUserImage");uploadUserImage.value="",uploadUserImage.dispatchEvent(new CustomEvent("change",{})),LibraryMenu.setTitle(user.Name);var imageUrl,fldImage=page.querySelector("#fldImage");imageUrl=user.PrimaryImageTag?ApiClient.getUserImageUrl(user.Id,{height:200,tag:user.PrimaryImageTag,type:"Primary"}):"css/images/logindefault.png",fldImage.classList.remove("hide"),fldImage.innerHTML="";var showImageEditing=!1;"Guest"==user.ConnectLinkType?page.querySelector(".connectMessage").classList.remove("hide"):user.PrimaryImageTag?(showImageEditing=!0,page.querySelector(".connectMessage").classList.add("hide")):(showImageEditing=!0,page.querySelector(".connectMessage").classList.add("hide")),Dashboard.getCurrentUser().then(function(loggedInUser){showImageEditing&&AppInfo.supportsFileInput&&(loggedInUser.Policy.IsAdministrator||user.Policy.EnableUserPreferenceAccess)?(page.querySelector(".newImageForm").classList.remove("hide"),page.querySelector("#btnDeleteImage").classList.remove("hide")):(page.querySelector(".newImageForm").classList.add("hide"),page.querySelector("#btnDeleteImage").classList.add("hide"))}),Dashboard.hideLoadingMsg()})}function onFileReaderError(evt){switch(Dashboard.hideLoadingMsg(),evt.target.error.code){case evt.target.error.NOT_FOUND_ERR:require(["toast"],function(toast){toast(Globalize.translate("FileNotFound"))});break;case evt.target.error.NOT_READABLE_ERR:require(["toast"],function(toast){toast(Globalize.translate("FileReadError"))});break;case evt.target.error.ABORT_ERR:break;default:require(["toast"],function(toast){toast(Globalize.translate("FileReadError"))})}}function onFileReaderAbort(evt){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("FileReadCancelled"))})}function setFiles(page,files){var file=files[0];if(!file||!file.type.match("image.*"))return page.querySelector("#userImageOutput").innerHTML="",page.querySelector("#fldUpload").classList.add("hide"),void(currentFile=null);currentFile=file;var reader=new FileReader;reader.onerror=onFileReaderError,reader.onloadstart=function(){page.querySelector("#fldUpload").classList.add("hide")},reader.onabort=onFileReaderAbort,reader.onload=function(e){var html=[''].join("");page.querySelector("#userImageOutput").innerHTML=html,page.querySelector("#fldUpload").classList.remove("hide")},reader.readAsDataURL(file)}function onImageDragOver(e){return e.preventDefault(),e.originalEvent.dataTransfer.dropEffect="Copy",!1}var currentFile;return function(view,params){reloadUser(view);var userImageDropZone=(new Userpasswordpage(view,params),view.querySelector("#userImageDropZone"));userImageDropZone.addEventListener("dragOver",onImageDragOver),userImageDropZone.addEventListener("drop",function(e){return e.preventDefault(),setFiles(view,e.originalEvent.dataTransfer.files),!1}),view.querySelector("#btnDeleteImage").addEventListener("click",function(){require(["confirm"],function(confirm){confirm(Globalize.translate("DeleteImageConfirmation"),Globalize.translate("DeleteImage")).then(function(){Dashboard.showLoadingMsg();var userId=getParameterByName("userId");ApiClient.deleteUserImage(userId,"primary").then(function(){Dashboard.hideLoadingMsg(),reloadUser(view)})})})}),view.querySelector(".newImageForm").addEventListener("submit",function(e){var file=currentFile;if(!file)return!1;if("image/png"!=file.type&&"image/jpeg"!=file.type&&"image/jpeg"!=file.type)return!1;Dashboard.showLoadingMsg();var userId=getParameterByName("userId");return ApiClient.uploadUserImage(userId,"Primary",file).then(function(){Dashboard.hideLoadingMsg(),reloadUser(view)}),e.preventDefault(),!1}),view.querySelector("#uploadUserImage").addEventListener("change",function(e){setFiles(view,e.target.files)})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/mysync.js b/dashboard-ui/scripts/mysync.js index 4d154d3dbf..e737bfff52 100644 --- a/dashboard-ui/scripts/mysync.js +++ b/dashboard-ui/scripts/mysync.js @@ -1,80 +1 @@ -define(['apphost', 'globalize', 'syncJobList', 'events', 'localsync', 'emby-button', 'paper-icon-button-light'], function (appHost, globalize, syncJobList, events, localSync) { - 'use strict'; - - return function (view, params) { - - var interval; - - function isLocalSyncManagement() { - return appHost.supports('sync') && params.mode == 'offline'; - } - - function refreshSyncStatus(page) { - - if (isLocalSyncManagement()) { - - var status = localSync.getSyncStatus(); - - if (status == "Active") { - page.querySelector('.btnSyncNow').classList.add('hide'); - } - else { - page.querySelector('.btnSyncNow').classList.remove('hide'); - } - } - } - - function syncNow(page) { - - localSync.sync(); - require(['toast'], function (toast) { - toast(Globalize.translate('MessageSyncStarted')); - }); - refreshSyncStatus(page); - } - - view.querySelector('.btnSyncNow').addEventListener('click', function () { - syncNow(view); - }); - - if (isLocalSyncManagement()) { - - view.querySelector('.localSyncStatus').classList.remove('hide'); - - } else { - view.querySelector('.localSyncStatus').classList.add('hide'); - } - - var mySyncJobList = new syncJobList({ - isLocalSync: params.mode === 'offline', - serverId: ApiClient.serverId(), - userId: params.mode === 'offline' ? null : ApiClient.getCurrentUserId(), - element: view.querySelector('.syncActivity'), - mode: params.mode - }); - - view.addEventListener('viewbeforeshow', function () { - - refreshSyncStatus(view); - - if (appHost.supports('sync')) { - interval = setInterval(function () { - refreshSyncStatus(view); - }, 5000); - } - }); - - view.addEventListener('viewbeforehide', function () { - - if (interval) { - clearInterval(interval); - interval = null; - } - }); - - view.addEventListener('viewdestroy', function () { - - mySyncJobList.destroy(); - }); - }; -}); \ No newline at end of file +define(["apphost","globalize","syncJobList","events","localsync","emby-button","paper-icon-button-light"],function(appHost,globalize,syncJobList,events,localSync){"use strict";return function(view,params){function isLocalSyncManagement(){return appHost.supports("sync")&&"offline"==params.mode}function refreshSyncStatus(page){if(isLocalSyncManagement()){var status=localSync.getSyncStatus();"Active"==status?page.querySelector(".btnSyncNow").classList.add("hide"):page.querySelector(".btnSyncNow").classList.remove("hide")}}function syncNow(page){localSync.sync(),require(["toast"],function(toast){toast(Globalize.translate("MessageSyncStarted"))}),refreshSyncStatus(page)}var interval;view.querySelector(".btnSyncNow").addEventListener("click",function(){syncNow(view)}),isLocalSyncManagement()?view.querySelector(".localSyncStatus").classList.remove("hide"):view.querySelector(".localSyncStatus").classList.add("hide");var mySyncJobList=new syncJobList({isLocalSync:"offline"===params.mode,serverId:ApiClient.serverId(),userId:"offline"===params.mode?null:ApiClient.getCurrentUserId(),element:view.querySelector(".syncActivity"),mode:params.mode});view.addEventListener("viewbeforeshow",function(){refreshSyncStatus(view),appHost.supports("sync")&&(interval=setInterval(function(){refreshSyncStatus(view)},5e3))}),view.addEventListener("viewbeforehide",function(){interval&&(clearInterval(interval),interval=null)}),view.addEventListener("viewdestroy",function(){mySyncJobList.destroy()})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/mysyncsettings.js b/dashboard-ui/scripts/mysyncsettings.js index 161eef5cf5..e06eef8e76 100644 --- a/dashboard-ui/scripts/mysyncsettings.js +++ b/dashboard-ui/scripts/mysyncsettings.js @@ -1,66 +1 @@ -define(['appSettings', 'apphost', 'emby-checkbox', 'emby-select', 'emby-input'], function (appSettings, appHost) { - 'use strict'; - - function loadForm(page, user) { - - page.querySelector('#txtSyncPath').value = appSettings.syncPath() || ''; - page.querySelector('#chkWifi').checked = appSettings.syncOnlyOnWifi(); - page.querySelector('.selectAudioBitrate').value = appSettings.maxStaticMusicBitrate() || ''; - } - - function saveUser(page) { - - var syncPath = page.querySelector('#txtSyncPath').value; - - appSettings.syncPath(syncPath); - appSettings.syncOnlyOnWifi(page.querySelector('#chkWifi').checked); - appSettings.maxStaticMusicBitrate(page.querySelector('.selectAudioBitrate').value || null); - } - - return function (view, params) { - - view.querySelector('form').addEventListener('submit', function (e) { - - saveUser(view); - - // Disable default form submission - e.preventDefault(); - return false; - }); - - view.querySelector('#btnSelectSyncPath').addEventListener('click', function () { - - require(['nativedirectorychooser'], function () { - NativeDirectoryChooser.chooseDirectory().then(function (path) { - - if (path) { - view.querySelector('#txtSyncPath').value = path; - } - }); - }); - }); - - view.addEventListener('viewshow', function () { - var page = this; - - var userId = getParameterByName('userId') || Dashboard.getCurrentUserId(); - - ApiClient.getUser(userId).then(function (user) { - - loadForm(page, user); - }); - - if (appHost.supports('customsyncpath')) { - page.querySelector('.fldSyncPath').classList.remove('hide'); - } else { - page.querySelector('.fldSyncPath').classList.add('hide'); - } - }); - - view.addEventListener('viewbeforehide', function () { - - saveUser(this); - }); - }; - -}); \ No newline at end of file +define(["appSettings","apphost","emby-checkbox","emby-select","emby-input"],function(appSettings,appHost){"use strict";function loadForm(page,user){page.querySelector("#txtSyncPath").value=appSettings.syncPath()||"",page.querySelector("#chkWifi").checked=appSettings.syncOnlyOnWifi(),page.querySelector(".selectAudioBitrate").value=appSettings.maxStaticMusicBitrate()||""}function saveUser(page){var syncPath=page.querySelector("#txtSyncPath").value;appSettings.syncPath(syncPath),appSettings.syncOnlyOnWifi(page.querySelector("#chkWifi").checked),appSettings.maxStaticMusicBitrate(page.querySelector(".selectAudioBitrate").value||null)}return function(view,params){view.querySelector("form").addEventListener("submit",function(e){return saveUser(view),e.preventDefault(),!1}),view.querySelector("#btnSelectSyncPath").addEventListener("click",function(){require(["nativedirectorychooser"],function(){NativeDirectoryChooser.chooseDirectory().then(function(path){path&&(view.querySelector("#txtSyncPath").value=path)})})}),view.addEventListener("viewshow",function(){var page=this,userId=getParameterByName("userId")||Dashboard.getCurrentUserId();ApiClient.getUser(userId).then(function(user){loadForm(page,user)}),appHost.supports("customsyncpath")?page.querySelector(".fldSyncPath").classList.remove("hide"):page.querySelector(".fldSyncPath").classList.add("hide")}),view.addEventListener("viewbeforehide",function(){saveUser(this)})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/notificationlist.js b/dashboard-ui/scripts/notificationlist.js index cf7c88b7d9..cfd90d44c3 100644 --- a/dashboard-ui/scripts/notificationlist.js +++ b/dashboard-ui/scripts/notificationlist.js @@ -1,39 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - $(document).on("pageshow", "#notificationsPage", function () { - - // If there is no user logged in there can be no notifications - if (!Dashboard.getCurrentUserId()) return; - - var elem = $(".notificationsList"); - var startIndex = 0; - var limit = 10; - - Notifications.showNotificationsList(startIndex, limit, elem); - - elem.on("click", ".btnPreviousPage", function (e) { - - e.preventDefault(); - - startIndex = startIndex - limit; - - if (startIndex < 0) startIndex = 0; - - Notifications.showNotificationsList(startIndex, limit, elem); - - }).on("click", ".btnNextPage", function (e) { - - e.preventDefault(); - - startIndex = startIndex + limit; - - Notifications.showNotificationsList(startIndex, limit, elem); - - }); - - Notifications.markNotificationsRead([]); - - }); - -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";$(document).on("pageshow","#notificationsPage",function(){if(Dashboard.getCurrentUserId()){var elem=$(".notificationsList"),startIndex=0,limit=10;Notifications.showNotificationsList(startIndex,limit,elem),elem.on("click",".btnPreviousPage",function(e){e.preventDefault(),startIndex-=limit,startIndex<0&&(startIndex=0),Notifications.showNotificationsList(startIndex,limit,elem)}).on("click",".btnNextPage",function(e){e.preventDefault(),startIndex+=limit,Notifications.showNotificationsList(startIndex,limit,elem)}),Notifications.markNotificationsRead([])}})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/notifications.js b/dashboard-ui/scripts/notifications.js index c316a0dd83..d82fb90c2a 100644 --- a/dashboard-ui/scripts/notifications.js +++ b/dashboard-ui/scripts/notifications.js @@ -1,216 +1 @@ -define(['libraryBrowser', 'listViewStyle'], function (libraryBrowser) { - 'use strict'; - - function notifications() { - - var self = this; - - self.getNotificationsSummaryPromise = null; - - self.total = 0; - - self.getNotificationsSummary = function () { - - var apiClient = window.ApiClient; - - if (!apiClient) { - return; - } - - self.getNotificationsSummaryPromise = self.getNotificationsSummaryPromise || apiClient.getNotificationSummary(Dashboard.getCurrentUserId()); - - return self.getNotificationsSummaryPromise; - }; - - self.updateNotificationCount = function () { - - if (!Dashboard.getCurrentUserId()) { - return; - } - - if (!window.ApiClient) { - return; - } - - var promise = self.getNotificationsSummary(); - - if (!promise) { - return; - } - - promise.then(function (summary) { - - var btnNotificationsInner = document.querySelector('.btnNotificationsInner'); - if (btnNotificationsInner) { - - btnNotificationsInner.classList.remove('levelNormal'); - btnNotificationsInner.classList.remove('levelWarning'); - btnNotificationsInner.classList.remove('levelError'); - btnNotificationsInner.innerHTML = summary.UnreadCount; - - if (summary.UnreadCount) { - btnNotificationsInner.classList.add('level' + summary.MaxUnreadNotificationLevel); - } - } - }); - }; - - self.markNotificationsRead = function (ids, callback) { - - ApiClient.markNotificationsRead(Dashboard.getCurrentUserId(), ids, true).then(function () { - - self.getNotificationsSummaryPromise = null; - - self.updateNotificationCount(); - - if (callback) { - callback(); - } - - }); - - }; - - self.showNotificationsList = function (startIndex, limit, elem) { - - refreshNotifications(startIndex, limit, elem, true); - - }; - } - - function refreshNotifications(startIndex, limit, elem, showPaging) { - - var apiClient = window.ApiClient; - - if (apiClient) { - return apiClient.getNotifications(Dashboard.getCurrentUserId(), { StartIndex: startIndex, Limit: limit }).then(function (result) { - - listUnreadNotifications(result.Notifications, result.TotalRecordCount, startIndex, limit, elem, showPaging); - - }); - } - } - - function listUnreadNotifications(list, totalRecordCount, startIndex, limit, elem, showPaging) { - - if (!totalRecordCount) { - elem.html('

' + Globalize.translate('LabelNoUnreadNotifications') + '

'); - - return; - } - - Notifications.total = totalRecordCount; - - var html = ''; - - if (totalRecordCount > limit && showPaging === true) { - - var query = { StartIndex: startIndex, Limit: limit }; - - html += libraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: totalRecordCount, - showLimit: false, - updatePageSizeSetting: false - }); - } - - require(['humanedate'], function () { - for (var i = 0, length = list.length; i < length; i++) { - - var notification = list[i]; - - html += getNotificationHtml(notification); - - } - - elem.html(html).trigger('create'); - }); - } - - function getNotificationHtml(notification) { - - var itemHtml = ''; - - if (notification.Url) { - itemHtml += ''; - } - - itemHtml += '
'; - - if (notification.Level == "Error") { - itemHtml += 'error'; - } else { - itemHtml += 'dvr'; - } - - itemHtml += '
'; - - itemHtml += '

'; - itemHtml += notification.Name; - itemHtml += '

'; - - itemHtml += '
'; - itemHtml += humane_date(notification.Date); - itemHtml += '
'; - - if (notification.Description) { - itemHtml += '
'; - itemHtml += notification.Description; - itemHtml += '
'; - } - - itemHtml += '
'; - - itemHtml += '
'; - - if (notification.Url) { - itemHtml += '
'; - } - - return itemHtml; - } - - window.Notifications = new notifications(); - var needsRefresh = true; - - function onWebSocketMessage(e, msg) { - if (msg.MessageType === "NotificationUpdated" || msg.MessageType === "NotificationAdded" || msg.MessageType === "NotificationsMarkedRead") { - - Notifications.getNotificationsSummaryPromise = null; - - Notifications.updateNotificationCount(); - } - } - - function initializeApiClient(apiClient) { - Events.off(apiClient, "websocketmessage", onWebSocketMessage); - Events.on(apiClient, "websocketmessage", onWebSocketMessage); - } - - if (window.ApiClient) { - initializeApiClient(window.ApiClient); - } - - Events.on(ConnectionManager, 'apiclientcreated', function (e, apiClient) { - initializeApiClient(apiClient); - }); - - Events.on(ConnectionManager, 'localusersignedin', function () { - needsRefresh = true; - }); - - Events.on(ConnectionManager, 'localusersignedout', function () { - needsRefresh = true; - }); - - pageClassOn('pageshow', "type-interior", function () { - - if (needsRefresh) { - Notifications.updateNotificationCount(); - } - - }); - -}); \ No newline at end of file +define(["libraryBrowser","listViewStyle"],function(libraryBrowser){"use strict";function notifications(){var self=this;self.getNotificationsSummaryPromise=null,self.total=0,self.getNotificationsSummary=function(){var apiClient=window.ApiClient;if(apiClient)return self.getNotificationsSummaryPromise=self.getNotificationsSummaryPromise||apiClient.getNotificationSummary(Dashboard.getCurrentUserId()),self.getNotificationsSummaryPromise},self.updateNotificationCount=function(){if(Dashboard.getCurrentUserId()&&window.ApiClient){var promise=self.getNotificationsSummary();promise&&promise.then(function(summary){var btnNotificationsInner=document.querySelector(".btnNotificationsInner");btnNotificationsInner&&(btnNotificationsInner.classList.remove("levelNormal"),btnNotificationsInner.classList.remove("levelWarning"),btnNotificationsInner.classList.remove("levelError"),btnNotificationsInner.innerHTML=summary.UnreadCount,summary.UnreadCount&&btnNotificationsInner.classList.add("level"+summary.MaxUnreadNotificationLevel))})}},self.markNotificationsRead=function(ids,callback){ApiClient.markNotificationsRead(Dashboard.getCurrentUserId(),ids,!0).then(function(){self.getNotificationsSummaryPromise=null,self.updateNotificationCount(),callback&&callback()})},self.showNotificationsList=function(startIndex,limit,elem){refreshNotifications(startIndex,limit,elem,!0)}}function refreshNotifications(startIndex,limit,elem,showPaging){var apiClient=window.ApiClient;if(apiClient)return apiClient.getNotifications(Dashboard.getCurrentUserId(),{StartIndex:startIndex,Limit:limit}).then(function(result){listUnreadNotifications(result.Notifications,result.TotalRecordCount,startIndex,limit,elem,showPaging)})}function listUnreadNotifications(list,totalRecordCount,startIndex,limit,elem,showPaging){if(!totalRecordCount)return void elem.html('

'+Globalize.translate("LabelNoUnreadNotifications")+"

");Notifications.total=totalRecordCount;var html="";if(totalRecordCount>limit&&showPaging===!0){var query={StartIndex:startIndex,Limit:limit};html+=libraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:totalRecordCount,showLimit:!1,updatePageSizeSetting:!1})}require(["humanedate"],function(){for(var i=0,length=list.length;i'),itemHtml+='
',itemHtml+="Error"==notification.Level?'error':'dvr',itemHtml+='
',itemHtml+='

',itemHtml+=notification.Name,itemHtml+="

",itemHtml+='
',itemHtml+=humane_date(notification.Date),itemHtml+="
",notification.Description&&(itemHtml+='
',itemHtml+=notification.Description,itemHtml+="
"),itemHtml+="
",itemHtml+="
",notification.Url&&(itemHtml+=""),itemHtml}function onWebSocketMessage(e,msg){"NotificationUpdated"!==msg.MessageType&&"NotificationAdded"!==msg.MessageType&&"NotificationsMarkedRead"!==msg.MessageType||(Notifications.getNotificationsSummaryPromise=null,Notifications.updateNotificationCount())}function initializeApiClient(apiClient){Events.off(apiClient,"websocketmessage",onWebSocketMessage),Events.on(apiClient,"websocketmessage",onWebSocketMessage)}window.Notifications=new notifications;var needsRefresh=!0;window.ApiClient&&initializeApiClient(window.ApiClient),Events.on(ConnectionManager,"apiclientcreated",function(e,apiClient){initializeApiClient(apiClient)}),Events.on(ConnectionManager,"localusersignedin",function(){needsRefresh=!0}),Events.on(ConnectionManager,"localusersignedout",function(){needsRefresh=!0}),pageClassOn("pageshow","type-interior",function(){needsRefresh&&Notifications.updateNotificationCount()})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/notificationsetting.js b/dashboard-ui/scripts/notificationsetting.js index 0c49b3545f..8dbc8d5e87 100644 --- a/dashboard-ui/scripts/notificationsetting.js +++ b/dashboard-ui/scripts/notificationsetting.js @@ -1,193 +1 @@ -define(['jQuery', 'emby-checkbox', 'fnchecked'], function ($) { - 'use strict'; - - var notificationsConfigurationKey = "notifications"; - - function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) { - - var html = '
'; - - html += items.map(function (u) { - - var isChecked = isEnabledList ? currentList.indexOf(u.Id) != -1 : currentList.indexOf(u.Id) == -1; - - var checkedHtml = isChecked ? ' checked="checked"' : ''; - - return ''; - - }).join(''); - - html += '
'; - - elem.html(html).trigger('create'); - } - - function reload(page) { - - var type = getParameterByName('type'); - - var promise1 = ApiClient.getUsers(); - var promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey); - var promise3 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")); - var promise4 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Services")); - - Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) { - - var users = responses[0]; - var notificationOptions = responses[1]; - var types = responses[2]; - var services = responses[3]; - - var notificationConfig = notificationOptions.Options.filter(function (n) { - - return n.Type == type; - - })[0]; - - var typeInfo = types.filter(function (n) { - - return n.Type == type; - - })[0] || {}; - - if (typeInfo.IsBasedOnUserEvent) { - $('.monitorUsers', page).show(); - } else { - $('.monitorUsers', page).hide(); - } - - if (typeInfo.Variables.length) { - $('.tokenHelp', page).show(); - - $('.tokenList', page).html(typeInfo.Variables.map(function (v) { - - return '{' + v + '}'; - - }).join(', ')); - - } else { - $('.tokenHelp', page).hide(); - } - - $('.notificationType', page).html(typeInfo.Name || 'Unknown Notification'); - - if (!notificationConfig) { - - notificationConfig = { - DisabledMonitorUsers: [], - SendToUsers: [], - DisabledServices: [], - SendToUserMode: 'Admins' - }; - } - - fillItems($('.monitorUsersList', page), users, 'chkMonitor', 'chkMonitor', notificationConfig.DisabledMonitorUsers); - fillItems($('.sendToUsersList', page), users, 'chkSendTo', 'chkSendTo', notificationConfig.SendToUsers, true); - fillItems($('.servicesList', page), services, 'chkService', 'chkService', notificationConfig.DisabledServices); - - $('#chkEnabled', page).checked(notificationConfig.Enabled || false); - - $('#txtTitle', page).val(notificationConfig.Title || typeInfo.DefaultTitle); - - $('#selectUsers', page).val(notificationConfig.SendToUserMode).trigger('change'); - - }); - } - - function save(page) { - - var type = getParameterByName('type'); - - var promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey); - var promise2 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")); - - Promise.all([promise1, promise2]).then(function (responses) { - - var notificationOptions = responses[0]; - var types = responses[1]; - - var notificationConfig = notificationOptions.Options.filter(function (n) { - - return n.Type == type; - - })[0]; - - if (!notificationConfig) { - notificationConfig = { - Type: type - }; - notificationOptions.Options.push(notificationConfig); - } - - var typeInfo = types.filter(function (n) { - - return n.Type == type; - - })[0] || {}; - - notificationConfig.Enabled = $('#chkEnabled', page).checked(); - notificationConfig.Title = $('#txtTitle', page).val(); - notificationConfig.SendToUserMode = $('#selectUsers', page).val(); - - // Don't persist if it's just the default - if (notificationConfig.Title == typeInfo.DefaultTitle) { - notificationConfig.Title = null; - } - - notificationConfig.DisabledMonitorUsers = $('.chkMonitor', page).get().filter(function (c) { - return !c.checked; - }).map(function (c) { - return c.getAttribute('data-itemid'); - }); - - notificationConfig.SendToUsers = $('.chkSendTo', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-itemid'); - }); - - notificationConfig.DisabledServices = $('.chkService', page).get().filter(function (c) { - return !c.checked; - }).map(function (c) { - return c.getAttribute('data-itemid'); - }); - - ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function (r) { - - Dashboard.processServerConfigurationUpdateResult(); - Dashboard.navigate('notificationsettings.html'); - }); - - }); - } - - function onSubmit() { - var page = $(this).parents('.page'); - save(page); - return false; - } - - $(document).on('pageinit', "#notificationSettingPage", function () { - - var page = this; - - $('#selectUsers', page).on('change', function () { - - if (this.value == 'Custom') { - $('.selectCustomUsers', page).show(); - } else { - $('.selectCustomUsers', page).hide(); - } - - }); - - $('.notificationSettingForm').off('submit', onSubmit).on('submit', onSubmit); - - }).on('pageshow', "#notificationSettingPage", function () { - - var page = this; - - reload(page); - }); - -}); \ No newline at end of file +define(["jQuery","emby-checkbox","fnchecked"],function($){"use strict";function fillItems(elem,items,cssClass,idPrefix,currentList,isEnabledList){var html='
';html+=items.map(function(u){var isChecked=isEnabledList?currentList.indexOf(u.Id)!=-1:currentList.indexOf(u.Id)==-1,checkedHtml=isChecked?' checked="checked"':"";return'"}).join(""),html+="
",elem.html(html).trigger("create")}function reload(page){var type=getParameterByName("type"),promise1=ApiClient.getUsers(),promise2=ApiClient.getNamedConfiguration(notificationsConfigurationKey),promise3=ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")),promise4=ApiClient.getJSON(ApiClient.getUrl("Notifications/Services"));Promise.all([promise1,promise2,promise3,promise4]).then(function(responses){var users=responses[0],notificationOptions=responses[1],types=responses[2],services=responses[3],notificationConfig=notificationOptions.Options.filter(function(n){return n.Type==type})[0],typeInfo=types.filter(function(n){return n.Type==type})[0]||{};typeInfo.IsBasedOnUserEvent?$(".monitorUsers",page).show():$(".monitorUsers",page).hide(),typeInfo.Variables.length?($(".tokenHelp",page).show(),$(".tokenList",page).html(typeInfo.Variables.map(function(v){return"{"+v+"}"}).join(", "))):$(".tokenHelp",page).hide(),$(".notificationType",page).html(typeInfo.Name||"Unknown Notification"),notificationConfig||(notificationConfig={DisabledMonitorUsers:[],SendToUsers:[],DisabledServices:[],SendToUserMode:"Admins"}),fillItems($(".monitorUsersList",page),users,"chkMonitor","chkMonitor",notificationConfig.DisabledMonitorUsers),fillItems($(".sendToUsersList",page),users,"chkSendTo","chkSendTo",notificationConfig.SendToUsers,!0),fillItems($(".servicesList",page),services,"chkService","chkService",notificationConfig.DisabledServices),$("#chkEnabled",page).checked(notificationConfig.Enabled||!1),$("#txtTitle",page).val(notificationConfig.Title||typeInfo.DefaultTitle),$("#selectUsers",page).val(notificationConfig.SendToUserMode).trigger("change")})}function save(page){var type=getParameterByName("type"),promise1=ApiClient.getNamedConfiguration(notificationsConfigurationKey),promise2=ApiClient.getJSON(ApiClient.getUrl("Notifications/Types"));Promise.all([promise1,promise2]).then(function(responses){var notificationOptions=responses[0],types=responses[1],notificationConfig=notificationOptions.Options.filter(function(n){return n.Type==type})[0];notificationConfig||(notificationConfig={Type:type},notificationOptions.Options.push(notificationConfig));var typeInfo=types.filter(function(n){return n.Type==type})[0]||{};notificationConfig.Enabled=$("#chkEnabled",page).checked(),notificationConfig.Title=$("#txtTitle",page).val(),notificationConfig.SendToUserMode=$("#selectUsers",page).val(),notificationConfig.Title==typeInfo.DefaultTitle&&(notificationConfig.Title=null),notificationConfig.DisabledMonitorUsers=$(".chkMonitor",page).get().filter(function(c){return!c.checked}).map(function(c){return c.getAttribute("data-itemid")}),notificationConfig.SendToUsers=$(".chkSendTo",page).get().filter(function(c){return c.checked}).map(function(c){return c.getAttribute("data-itemid")}),notificationConfig.DisabledServices=$(".chkService",page).get().filter(function(c){return!c.checked}).map(function(c){return c.getAttribute("data-itemid")}),ApiClient.updateNamedConfiguration(notificationsConfigurationKey,notificationOptions).then(function(r){Dashboard.processServerConfigurationUpdateResult(),Dashboard.navigate("notificationsettings.html")})})}function onSubmit(){var page=$(this).parents(".page");return save(page),!1}var notificationsConfigurationKey="notifications";$(document).on("pageinit","#notificationSettingPage",function(){var page=this;$("#selectUsers",page).on("change",function(){"Custom"==this.value?$(".selectCustomUsers",page).show():$(".selectCustomUsers",page).hide()}),$(".notificationSettingForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#notificationSettingPage",function(){var page=this;reload(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/notificationsettings.js b/dashboard-ui/scripts/notificationsettings.js index b5da527208..b3897bd360 100644 --- a/dashboard-ui/scripts/notificationsettings.js +++ b/dashboard-ui/scripts/notificationsettings.js @@ -1,87 +1 @@ -define(['jQuery', 'listViewStyle'], function ($) { - 'use strict'; - - function reload(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")).then(function (list) { - - var html = ''; - - var lastCategory = ""; - - html += list.map(function (i) { - - var itemHtml = ''; - - if (i.Category != lastCategory) { - lastCategory = i.Category; - - if (lastCategory) { - itemHtml += '
'; - - } - itemHtml += '

'; - itemHtml += i.Category; - itemHtml += '

'; - - itemHtml += ''; - } - - $('.notificationList', page).html(html).trigger('create'); - - Dashboard.hideLoadingMsg(); - }); - } - - function getTabs() { - return [ - { - href: 'notificationsettings.html', - name: Globalize.translate('TabNotifications') - }, - { - href: 'appservices.html?context=notifications', - name: Globalize.translate('TabServices') - }]; - } - - return function (view, params) { - - view.addEventListener('viewshow', function () { - - LibraryMenu.setTabs('notifications', 0, getTabs); - - reload(view); - }); - }; -}); \ No newline at end of file +define(["jQuery","listViewStyle"],function($){"use strict";function reload(page){Dashboard.showLoadingMsg(),ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")).then(function(list){var html="",lastCategory="";html+=list.map(function(i){var itemHtml="";return i.Category!=lastCategory&&(lastCategory=i.Category,lastCategory&&(itemHtml+="
"),itemHtml+="

",itemHtml+=i.Category,itemHtml+="

",itemHtml+='"),$(".notificationList",page).html(html).trigger("create"),Dashboard.hideLoadingMsg()})}function getTabs(){return[{href:"notificationsettings.html",name:Globalize.translate("TabNotifications")},{href:"appservices.html?context=notifications",name:Globalize.translate("TabServices")}]}return function(view,params){view.addEventListener("viewshow",function(){LibraryMenu.setTabs("notifications",0,getTabs),reload(view)})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/nowplayingbar.js b/dashboard-ui/scripts/nowplayingbar.js index 0edbe2bf50..4c00f8c7a2 100644 --- a/dashboard-ui/scripts/nowplayingbar.js +++ b/dashboard-ui/scripts/nowplayingbar.js @@ -1,753 +1 @@ -define(['datetime', 'userdataButtons', 'itemHelper', 'events', 'browser', 'imageLoader', 'playbackManager', 'nowPlayingHelper', 'apphost', 'dom', 'connectionManager', 'paper-icon-button-light'], function (datetime, userdataButtons, itemHelper, events, browser, imageLoader, playbackManager, nowPlayingHelper, appHost, dom, connectionManager) { - 'use strict'; - - var currentPlayer; - var currentPlayerSupportedCommands = []; - - var currentTimeElement; - var nowPlayingImageElement; - var nowPlayingTextElement; - var nowPlayingUserData; - var muteButton; - var volumeSlider; - var volumeSliderContainer; - var playPauseButtons; - var positionSlider; - var toggleRepeatButton; - var toggleRepeatButtonIcon; - - var lastUpdateTime = 0; - var lastPlayerState = {}; - var isEnabled; - var currentRuntimeTicks = 0; - - function getNowPlayingBarHtml() { - - var html = ''; - - html += '
'; - - html += '
'; - html += '
'; - html += ''; - html += '
'; - - html += '
'; - html += '
'; - html += '
'; - html += '
'; - - // The onclicks are needed due to the return false above - html += '
'; - - html += ''; - - html += ''; - - html += ''; - html += ''; - - html += '
'; - html += '
'; - - html += '
'; - - html += ''; - - html += '
'; - html += ''; - html += '
'; - - html += ''; - - html += '
'; - html += '
'; - - html += ''; - html += ''; - - html += '
'; - html += '
'; - - html += '
'; - - return html; - } - - function onSlideDownComplete() { - this.classList.add('hide'); - } - - function slideDown(elem) { - - requestAnimationFrame(function () { - - // trigger reflow - void elem.offsetWidth; - - elem.classList.add('nowPlayingBar-hidden'); - - dom.addEventListener(elem, dom.whichTransitionEvent(), onSlideDownComplete, { - once: true - }); - }); - } - - function slideUp(elem) { - - elem.classList.remove('hide'); - - dom.removeEventListener(elem, dom.whichTransitionEvent(), onSlideDownComplete, { - once: true - }); - - requestAnimationFrame(function () { - - // trigger reflow - void elem.offsetWidth; - - elem.classList.remove('nowPlayingBar-hidden'); - }); - } - - function slideUpToFullScreen(elem) { - - if (!elem.classList.contains('hide')) { - return; - } - - elem.classList.remove('hide'); - - if (!browser.animate || browser.slow) { - return; - } - - requestAnimationFrame(function () { - - var keyframes = [ - { transform: 'none', offset: 0 }, - { transform: 'translateY(-100%)', offset: 1 }]; - var timing = { duration: 200, iterations: 1, fill: 'both', easing: 'ease-out' }; - elem.animate(keyframes, timing); - }); - } - - function onPlayPauseClick() { - playbackManager.playPause(currentPlayer); - } - - function bindEvents(elem) { - - currentTimeElement = elem.querySelector('.nowPlayingBarCurrentTime'); - nowPlayingImageElement = elem.querySelector('.nowPlayingImage'); - nowPlayingTextElement = elem.querySelector('.nowPlayingBarText'); - nowPlayingUserData = elem.querySelector('.nowPlayingBarUserDataButtons'); - - muteButton = elem.querySelector('.muteButton'); - muteButton.addEventListener('click', function () { - - if (currentPlayer) { - playbackManager.toggleMute(currentPlayer); - } - - }); - - elem.querySelector('.stopButton').addEventListener('click', function () { - - if (currentPlayer) { - playbackManager.stop(currentPlayer); - } - }); - - var i, length; - playPauseButtons = elem.querySelectorAll('.playPauseButton'); - for (i = 0, length = playPauseButtons.length; i < length; i++) { - playPauseButtons[i].addEventListener('click', onPlayPauseClick); - } - - elem.querySelector('.nextTrackButton').addEventListener('click', function () { - - if (currentPlayer) { - playbackManager.nextTrack(currentPlayer); - } - }); - - elem.querySelector('.previousTrackButton').addEventListener('click', function () { - - if (currentPlayer) { - playbackManager.previousTrack(currentPlayer); - } - }); - - elem.querySelector('.remoteControlButton').addEventListener('click', function () { - - showRemoteControl(); - }); - - toggleRepeatButton = elem.querySelector('.toggleRepeatButton'); - toggleRepeatButton.addEventListener('click', function () { - - if (currentPlayer) { - - switch (playbackManager.getRepeatMode(currentPlayer)) { - case 'RepeatAll': - playbackManager.setRepeatMode('RepeatOne', currentPlayer); - break; - case 'RepeatOne': - playbackManager.setRepeatMode('RepeatNone', currentPlayer); - break; - default: - playbackManager.setRepeatMode('RepeatAll', currentPlayer); - break; - } - } - }); - - toggleRepeatButtonIcon = toggleRepeatButton.querySelector('i'); - - volumeSlider = elem.querySelector('.nowPlayingBarVolumeSlider'); - volumeSliderContainer = elem.querySelector('.nowPlayingBarVolumeSliderContainer'); - - if (appHost.supports('physicalvolumecontrol')) { - volumeSliderContainer.classList.add('hide'); - } else { - volumeSliderContainer.classList.remove('hide'); - } - - volumeSlider.addEventListener('change', function () { - - if (currentPlayer) { - currentPlayer.setVolume(this.value); - } - - }); - - positionSlider = elem.querySelector('.nowPlayingBarPositionSlider'); - positionSlider.addEventListener('change', function () { - - if (currentPlayer) { - - var newPercent = parseFloat(this.value); - - playbackManager.seekPercent(newPercent, currentPlayer); - } - - }); - - positionSlider.getBubbleText = function (value) { - - var state = lastPlayerState; - - if (!state || !state.NowPlayingItem || !currentRuntimeTicks) { - return '--:--'; - } - - var ticks = currentRuntimeTicks; - ticks /= 100; - ticks *= value; - - return datetime.getDisplayRunningTime(ticks); - }; - } - - function showRemoteControl(tabIndex) { - - if (tabIndex) { - Dashboard.navigate('nowplaying.html?tab=' + tabIndex); - } else { - Dashboard.navigate('nowplaying.html'); - } - } - - var nowPlayingBarElement; - function getNowPlayingBar() { - - if (nowPlayingBarElement) { - return Promise.resolve(nowPlayingBarElement); - } - - return new Promise(function (resolve, reject) { - - require(['appfooter-shared', 'itemShortcuts', 'css!css/nowplayingbar.css', 'emby-slider'], function (appfooter, itemShortcuts) { - - var parentContainer = appfooter.element; - nowPlayingBarElement = parentContainer.querySelector('.nowPlayingBar'); - - if (nowPlayingBarElement) { - resolve(nowPlayingBarElement); - return; - } - - parentContainer.insertAdjacentHTML('afterbegin', getNowPlayingBarHtml()); - nowPlayingBarElement = parentContainer.querySelector('.nowPlayingBar'); - - if (browser.safari && browser.slow) { - // Not handled well here. The wrong elements receive events, bar doesn't update quickly enough, etc. - nowPlayingBarElement.classList.add('noMediaProgress'); - } - - itemShortcuts.on(nowPlayingBarElement); - - bindEvents(nowPlayingBarElement); - resolve(nowPlayingBarElement); - }); - }); - } - - function showButton(button) { - button.classList.remove('hide'); - } - - function hideButton(button) { - button.classList.add('hide'); - } - - function updatePlayPauseState(isPaused) { - - var i, length; - - if (playPauseButtons) { - if (isPaused) { - - for (i = 0, length = playPauseButtons.length; i < length; i++) { - playPauseButtons[i].querySelector('i').innerHTML = 'play_arrow'; - } - - } else { - - for (i = 0, length = playPauseButtons.length; i < length; i++) { - playPauseButtons[i].querySelector('i').innerHTML = 'pause'; - } - } - } - } - - function updatePlayerStateInternal(event, state) { - - showNowPlayingBar(); - - lastPlayerState = state; - - var playerInfo = playbackManager.getPlayerInfo(); - - var playState = state.PlayState || {}; - - updatePlayPauseState(playState.IsPaused); - - var supportedCommands = playerInfo.supportedCommands; - currentPlayerSupportedCommands = supportedCommands; - - if (supportedCommands.indexOf('SetRepeatMode') == -1) { - toggleRepeatButton.classList.add('hide'); - } else { - toggleRepeatButton.classList.remove('hide'); - } - - updateRepeatModeDisplay(playState.RepeatMode); - - updatePlayerVolumeState(playState.IsMuted, playState.VolumeLevel); - - if (positionSlider && !positionSlider.dragging) { - positionSlider.disabled = !playState.CanSeek; - } - - var nowPlayingItem = state.NowPlayingItem || {}; - updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks); - - updateNowPlayingInfo(state); - } - - function updateRepeatModeDisplay(repeatMode) { - - if (repeatMode == 'RepeatAll') { - toggleRepeatButtonIcon.innerHTML = "repeat"; - toggleRepeatButton.classList.add('repeatActive'); - } - else if (repeatMode == 'RepeatOne') { - toggleRepeatButtonIcon.innerHTML = "repeat_one"; - toggleRepeatButton.classList.add('repeatActive'); - } else { - toggleRepeatButtonIcon.innerHTML = "repeat"; - toggleRepeatButton.classList.remove('repeatActive'); - } - } - - function updateTimeDisplay(positionTicks, runtimeTicks) { - - // See bindEvents for why this is necessary - if (positionSlider && !positionSlider.dragging) { - if (runtimeTicks) { - - var pct = positionTicks / runtimeTicks; - pct *= 100; - - positionSlider.value = pct; - - } else { - - positionSlider.value = 0; - } - } - - if (currentTimeElement) { - - var timeText = positionTicks == null ? '--:--' : datetime.getDisplayRunningTime(positionTicks); - - if (runtimeTicks) { - timeText += " / " + datetime.getDisplayRunningTime(runtimeTicks); - } - - currentTimeElement.innerHTML = timeText; - } - } - - function updatePlayerVolumeState(isMuted, volumeLevel) { - - var supportedCommands = currentPlayerSupportedCommands; - - var showMuteButton = true; - var showVolumeSlider = true; - - if (supportedCommands.indexOf('ToggleMute') == -1) { - showMuteButton = false; - } - - if (isMuted) { - muteButton.querySelector('i').innerHTML = ''; - } else { - muteButton.querySelector('i').innerHTML = ''; - } - - if (supportedCommands.indexOf('SetVolume') == -1) { - showVolumeSlider = false; - } - - if (currentPlayer.isLocalPlayer && appHost.supports('physicalvolumecontrol')) { - showMuteButton = false; - showVolumeSlider = false; - } - - if (showMuteButton) { - showButton(muteButton); - } else { - hideButton(muteButton); - } - - // See bindEvents for why this is necessary - if (volumeSlider) { - - if (showVolumeSlider) { - volumeSliderContainer.classList.remove('hide'); - } else { - volumeSliderContainer.classList.add('hide'); - } - - if (!volumeSlider.dragging) { - volumeSlider.value = volumeLevel || 0; - } - } - } - - function getTextActionButton(item, text) { - - if (!text) { - text = itemHelper.getDisplayName(item); - } - - var html = ''; - - return html; - } - - function seriesImageUrl(item, options) { - - if (!item) { - throw new Error('item cannot be null!'); - } - - if (item.Type !== 'Episode') { - return null; - } - - options = options || {}; - options.type = options.type || "Primary"; - - if (options.type === 'Primary') { - - if (item.SeriesPrimaryImageTag) { - - options.tag = item.SeriesPrimaryImageTag; - - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); - } - } - - if (options.type === 'Thumb') { - - if (item.SeriesThumbImageTag) { - - options.tag = item.SeriesThumbImageTag; - - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); - } - if (item.ParentThumbImageTag) { - - options.tag = item.ParentThumbImageTag; - - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options); - } - } - - return null; - } - - function imageUrl(item, options) { - - if (!item) { - throw new Error('item cannot be null!'); - } - - options = options || {}; - options.type = options.type || "Primary"; - - if (item.ImageTags && item.ImageTags[options.type]) { - - options.tag = item.ImageTags[options.type]; - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options); - } - - if (item.AlbumId && item.AlbumPrimaryImageTag) { - - options.tag = item.AlbumPrimaryImageTag; - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); - } - - return null; - } - - var currentImgUrl; - function updateNowPlayingInfo(state) { - - var nowPlayingItem = state.NowPlayingItem; - - nowPlayingTextElement.innerHTML = nowPlayingItem ? nowPlayingHelper.getNowPlayingNames(nowPlayingItem).map(function (nowPlayingName) { - - if (nowPlayingName.item) { - return '
' + getTextActionButton(nowPlayingName.item, nowPlayingName.text) + '
'; - } - - return '
' + nowPlayingName.text + '
'; - - }).join('') : ''; - - var imgHeight = 70; - - var url = nowPlayingItem ? (seriesImageUrl(nowPlayingItem, { - height: imgHeight - }) || imageUrl(nowPlayingItem, { - height: imgHeight - })) : null; - - if (url !== currentImgUrl) { - currentImgUrl = url; - - imageLoader.lazyImage(nowPlayingImageElement, url); - } - - if (nowPlayingItem.Id) { - ApiClient.getItem(Dashboard.getCurrentUserId(), nowPlayingItem.Id).then(function(item) { - userdataButtons.fill({ - item: item, - includePlayed: false, - element: nowPlayingUserData - }); - }); - } else { - userdataButtons.destroy({ - element: nowPlayingUserData - }); - } - } - - function onPlaybackStart(e, state) { - - console.log('nowplaying event: ' + e.type); - - var player = this; - - onStateChanged.call(player, e, state); - } - - function onRepeatModeChange(e) { - - var player = this; - - updateRepeatModeDisplay(playbackManager.getRepeatMode(player)); - } - - function showNowPlayingBar() { - - getNowPlayingBar().then(slideUp); - } - - function hideNowPlayingBar() { - - isEnabled = false; - - // Use a timeout to prevent the bar from hiding and showing quickly - // in the event of a stop->play command - - // Don't call getNowPlayingBar here because we don't want to end up creating it just to hide it - var elem = document.getElementsByClassName('nowPlayingBar')[0]; - if (elem) { - - // If it's not currently visible, don't bother with the animation - // transitionend events not firing in mobile chrome/safari when hidden - if (document.body.classList.contains('hiddenNowPlayingBar')) { - - dom.removeEventListener(elem, dom.whichTransitionEvent(), onSlideDownComplete, { - once: true - }); - elem.classList.add('hide'); - elem.classList.add('nowPlayingBar-hidden'); - - } else { - slideDown(elem); - } - } - } - - function onPlaybackStopped(e, stopInfo) { - - console.log('nowplaying event: ' + e.type); - var player = this; - - if (stopInfo.nextMediaType !== 'Audio') { - hideNowPlayingBar(); - } - } - - function onPlayPauseStateChanged(e) { - - if (!isEnabled) { - return; - } - - var player = this; - updatePlayPauseState(player.paused()); - } - - function onStateChanged(event, state) { - - //console.log('nowplaying event: ' + e.type); - var player = this; - - if (!state.NowPlayingItem) { - hideNowPlayingBar(); - return; - } - - if (player.isLocalPlayer && state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') { - hideNowPlayingBar(); - return; - } - - isEnabled = true; - - if (nowPlayingBarElement) { - updatePlayerStateInternal(event, state); - return; - } - - getNowPlayingBar().then(function () { - updatePlayerStateInternal(event, state); - }); - } - - function onTimeUpdate(e) { - - if (!isEnabled) { - return; - } - - // Try to avoid hammering the document with changes - var now = new Date().getTime(); - if ((now - lastUpdateTime) < 700) { - - return; - } - lastUpdateTime = now; - - var player = this; - currentRuntimeTicks = playbackManager.duration(player); - updateTimeDisplay(playbackManager.currentTime(player), currentRuntimeTicks); - } - - function releaseCurrentPlayer() { - - var player = currentPlayer; - - if (player) { - events.off(player, 'playbackstart', onPlaybackStart); - events.off(player, 'statechange', onPlaybackStart); - events.off(player, 'repeatmodechange', onRepeatModeChange); - events.off(player, 'playbackstop', onPlaybackStopped); - events.off(player, 'volumechange', onVolumeChanged); - events.off(player, 'pause', onPlayPauseStateChanged); - events.off(player, 'playing', onPlayPauseStateChanged); - events.off(player, 'timeupdate', onTimeUpdate); - - currentPlayer = null; - hideNowPlayingBar(); - } - } - - function onVolumeChanged(e) { - - if (!isEnabled) { - return; - } - - var player = this; - - updatePlayerVolumeState(player.isMuted(), player.getVolume()); - } - - function bindToPlayer(player) { - - if (player === currentPlayer) { - return; - } - - releaseCurrentPlayer(); - - currentPlayer = player; - - if (!player) { - return; - } - - playbackManager.getPlayerState(player).then(function (state) { - - onStateChanged.call(player, { type: 'init' }, state); - }); - - events.on(player, 'playbackstart', onPlaybackStart); - events.on(player, 'statechange', onPlaybackStart); - events.on(player, 'repeatmodechange', onRepeatModeChange); - events.on(player, 'playbackstop', onPlaybackStopped); - events.on(player, 'volumechange', onVolumeChanged); - events.on(player, 'pause', onPlayPauseStateChanged); - events.on(player, 'playing', onPlayPauseStateChanged); - events.on(player, 'timeupdate', onTimeUpdate); - } - - events.on(playbackManager, 'playerchange', function () { - bindToPlayer(playbackManager.getCurrentPlayer()); - }); - - bindToPlayer(playbackManager.getCurrentPlayer()); - -}); \ No newline at end of file +define(["datetime","userdataButtons","itemHelper","events","browser","imageLoader","playbackManager","nowPlayingHelper","apphost","dom","connectionManager","paper-icon-button-light"],function(datetime,userdataButtons,itemHelper,events,browser,imageLoader,playbackManager,nowPlayingHelper,appHost,dom,connectionManager){"use strict";function getNowPlayingBarHtml(){var html="";return html+='
',html+='
',html+='
',html+='',html+="
",html+='
',html+='
',html+='
',html+="
",html+='
',html+='',html+='',html+='',html+='',html+='
',html+="
",html+='
',html+='',html+='
',html+='',html+="
",html+='',html+='
',html+="
",html+='',html+='',html+="
",html+="
",html+="
"}function onSlideDownComplete(){this.classList.add("hide")}function slideDown(elem){requestAnimationFrame(function(){void elem.offsetWidth,elem.classList.add("nowPlayingBar-hidden"),dom.addEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0})})}function slideUp(elem){elem.classList.remove("hide"),dom.removeEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0}),requestAnimationFrame(function(){void elem.offsetWidth,elem.classList.remove("nowPlayingBar-hidden")})}function onPlayPauseClick(){playbackManager.playPause(currentPlayer)}function bindEvents(elem){currentTimeElement=elem.querySelector(".nowPlayingBarCurrentTime"),nowPlayingImageElement=elem.querySelector(".nowPlayingImage"),nowPlayingTextElement=elem.querySelector(".nowPlayingBarText"),nowPlayingUserData=elem.querySelector(".nowPlayingBarUserDataButtons"),muteButton=elem.querySelector(".muteButton"),muteButton.addEventListener("click",function(){currentPlayer&&playbackManager.toggleMute(currentPlayer)}),elem.querySelector(".stopButton").addEventListener("click",function(){currentPlayer&&playbackManager.stop(currentPlayer)});var i,length;for(playPauseButtons=elem.querySelectorAll(".playPauseButton"),i=0,length=playPauseButtons.length;i';return html+=text,html+=""}function seriesImageUrl(item,options){if(!item)throw new Error("item cannot be null!");if("Episode"!==item.Type)return null;if(options=options||{},options.type=options.type||"Primary","Primary"===options.type&&item.SeriesPrimaryImageTag)return options.tag=item.SeriesPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if("Thumb"===options.type){if(item.SeriesThumbImageTag)return options.tag=item.SeriesThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if(item.ParentThumbImageTag)return options.tag=item.ParentThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId,options)}return null}function imageUrl(item,options){if(!item)throw new Error("item cannot be null!");return options=options||{},options.type=options.type||"Primary",item.ImageTags&&item.ImageTags[options.type]?(options.tag=item.ImageTags[options.type],connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId||item.Id,options)):item.AlbumId&&item.AlbumPrimaryImageTag?(options.tag=item.AlbumPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId,options)):null}function updateNowPlayingInfo(state){var nowPlayingItem=state.NowPlayingItem;nowPlayingTextElement.innerHTML=nowPlayingItem?nowPlayingHelper.getNowPlayingNames(nowPlayingItem).map(function(nowPlayingName){return nowPlayingName.item?"
"+getTextActionButton(nowPlayingName.item,nowPlayingName.text)+"
":"
"+nowPlayingName.text+"
"}).join(""):"";var imgHeight=70,url=nowPlayingItem?seriesImageUrl(nowPlayingItem,{height:imgHeight})||imageUrl(nowPlayingItem,{height:imgHeight}):null;url!==currentImgUrl&&(currentImgUrl=url,imageLoader.lazyImage(nowPlayingImageElement,url)),nowPlayingItem.Id?ApiClient.getItem(Dashboard.getCurrentUserId(),nowPlayingItem.Id).then(function(item){userdataButtons.fill({item:item,includePlayed:!1,element:nowPlayingUserData})}):userdataButtons.destroy({element:nowPlayingUserData})}function onPlaybackStart(e,state){console.log("nowplaying event: "+e.type);var player=this;onStateChanged.call(player,e,state)}function onRepeatModeChange(e){var player=this;updateRepeatModeDisplay(playbackManager.getRepeatMode(player))}function showNowPlayingBar(){getNowPlayingBar().then(slideUp)}function hideNowPlayingBar(){isEnabled=!1;var elem=document.getElementsByClassName("nowPlayingBar")[0];elem&&(document.body.classList.contains("hiddenNowPlayingBar")?(dom.removeEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0}),elem.classList.add("hide"),elem.classList.add("nowPlayingBar-hidden")):slideDown(elem))}function onPlaybackStopped(e,stopInfo){console.log("nowplaying event: "+e.type);"Audio"!==stopInfo.nextMediaType&&hideNowPlayingBar()}function onPlayPauseStateChanged(e){if(isEnabled){var player=this;updatePlayPauseState(player.paused())}}function onStateChanged(event,state){var player=this;return state.NowPlayingItem?player.isLocalPlayer&&state.NowPlayingItem&&"Video"==state.NowPlayingItem.MediaType?void hideNowPlayingBar():(isEnabled=!0,nowPlayingBarElement?void updatePlayerStateInternal(event,state):void getNowPlayingBar().then(function(){updatePlayerStateInternal(event,state)})):void hideNowPlayingBar()}function onTimeUpdate(e){if(isEnabled){var now=(new Date).getTime();if(!(now-lastUpdateTime<700)){lastUpdateTime=now;var player=this;currentRuntimeTicks=playbackManager.duration(player),updateTimeDisplay(playbackManager.currentTime(player),currentRuntimeTicks)}}}function releaseCurrentPlayer(){var player=currentPlayer;player&&(events.off(player,"playbackstart",onPlaybackStart),events.off(player,"statechange",onPlaybackStart),events.off(player,"repeatmodechange",onRepeatModeChange),events.off(player,"playbackstop",onPlaybackStopped),events.off(player,"volumechange",onVolumeChanged),events.off(player,"pause",onPlayPauseStateChanged),events.off(player,"playing",onPlayPauseStateChanged),events.off(player,"timeupdate",onTimeUpdate),currentPlayer=null,hideNowPlayingBar())}function onVolumeChanged(e){if(isEnabled){var player=this;updatePlayerVolumeState(player.isMuted(),player.getVolume())}}function bindToPlayer(player){player!==currentPlayer&&(releaseCurrentPlayer(),currentPlayer=player,player&&(playbackManager.getPlayerState(player).then(function(state){onStateChanged.call(player,{type:"init"},state)}),events.on(player,"playbackstart",onPlaybackStart),events.on(player,"statechange",onPlaybackStart),events.on(player,"repeatmodechange",onRepeatModeChange),events.on(player,"playbackstop",onPlaybackStopped),events.on(player,"volumechange",onVolumeChanged),events.on(player,"pause",onPlayPauseStateChanged),events.on(player,"playing",onPlayPauseStateChanged),events.on(player,"timeupdate",onTimeUpdate)))}var currentPlayer,currentTimeElement,nowPlayingImageElement,nowPlayingTextElement,nowPlayingUserData,muteButton,volumeSlider,volumeSliderContainer,playPauseButtons,positionSlider,toggleRepeatButton,toggleRepeatButtonIcon,isEnabled,nowPlayingBarElement,currentImgUrl,currentPlayerSupportedCommands=[],lastUpdateTime=0,lastPlayerState={},currentRuntimeTicks=0;events.on(playbackManager,"playerchange",function(){bindToPlayer(playbackManager.getCurrentPlayer())}),bindToPlayer(playbackManager.getCurrentPlayer())}); \ No newline at end of file diff --git a/dashboard-ui/scripts/nowplayingpage.js b/dashboard-ui/scripts/nowplayingpage.js index 1ae2364f40..caea403b42 100644 --- a/dashboard-ui/scripts/nowplayingpage.js +++ b/dashboard-ui/scripts/nowplayingpage.js @@ -1,31 +1 @@ -define(['components/remotecontrol', 'emby-button'], function (remotecontrolFactory) { - 'use strict'; - - return function (view, params) { - - var self = this; - - var remoteControl = new remotecontrolFactory(); - remoteControl.init(view, view.querySelector('.remoteControlContent')); - - view.addEventListener('viewbeforeshow', function (e) { - document.body.classList.add('hiddenViewMenuBar'); - document.body.classList.add('hiddenNowPlayingBar'); - - if (remoteControl) { - remoteControl.onShow(); - } - }); - - view.addEventListener('viewbeforehide', function (e) { - - if (remoteControl) { - remoteControl.destroy(); - } - - document.body.classList.remove('hiddenViewMenuBar'); - document.body.classList.remove('hiddenNowPlayingBar'); - }); - }; - -}); \ No newline at end of file +define(["components/remotecontrol","emby-button"],function(remotecontrolFactory){"use strict";return function(view,params){var remoteControl=new remotecontrolFactory;remoteControl.init(view,view.querySelector(".remoteControlContent")),view.addEventListener("viewbeforeshow",function(e){document.body.classList.add("hiddenViewMenuBar"),document.body.classList.add("hiddenNowPlayingBar"),remoteControl&&remoteControl.onShow()}),view.addEventListener("viewbeforehide",function(e){remoteControl&&remoteControl.destroy(),document.body.classList.remove("hiddenViewMenuBar"),document.body.classList.remove("hiddenNowPlayingBar")})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/photos.js b/dashboard-ui/scripts/photos.js index 57f823ef17..f504f53f71 100644 --- a/dashboard-ui/scripts/photos.js +++ b/dashboard-ui/scripts/photos.js @@ -1,164 +1 @@ -define(['jQuery', 'cardBuilder', 'imageLoader', 'emby-itemscontainer'], function ($, cardBuilder, imageLoader) { - 'use strict'; - - var view = 'Poster'; - - var data = {}; - function getQuery() { - - var key = getSavedQueryKey(); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - SortBy: "IsFolder,SortName", - SortOrder: "Ascending", - Fields: "PrimaryImageAspectRatio,SortName", - ImageTypeLimit: 1, - EnableImageTypes: "Primary", - StartIndex: 0, - Limit: LibraryBrowser.getDefaultPageSize() - } - }; - - pageData.query.Recursive = false; - pageData.query.MediaTypes = null; - pageData.query.ParentId = getParameterByName('parentId') || LibraryMenu.getTopParentId(); - - LibraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData.query; - } - - function getSavedQueryKey() { - - return LibraryBrowser.getSavedQueryKey('v1'); - } - - function reloadItems(page) { - - Dashboard.showLoadingMsg(); - - var query = getQuery(); - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - var html = ''; - var pagingHtml = LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - viewButton: false, - showLimit: false - }); - - page.querySelector('.listTopPaging').innerHTML = pagingHtml; - - if (view == "Poster") { - // Poster - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "square", - context: getParameterByName('context') || 'photos', - overlayText: true, - lazy: true, - coverImage: true, - showTitle: false, - centerText: true - }); - } - - var elem = page.querySelector('.itemsContainer'); - elem.innerHTML = html + pagingHtml; - imageLoader.lazyChildren(elem); - - $('.btnNextPage', page).on('click', function () { - query.StartIndex += query.Limit; - reloadItems(page); - }); - - $('.btnPreviousPage', page).on('click', function () { - query.StartIndex -= query.Limit; - reloadItems(page); - }); - - LibraryBrowser.saveQueryValues(getSavedQueryKey(), query); - - Dashboard.hideLoadingMsg(); - }); - } - - function startSlideshow(page, itemQuery, startItemId) { - - var userId = Dashboard.getCurrentUserId(); - - var localQuery = $.extend({}, itemQuery); - localQuery.StartIndex = 0; - localQuery.Limit = null; - localQuery.MediaTypes = "Photo"; - localQuery.Recursive = true; - localQuery.Filters = "IsNotFolder"; - - ApiClient.getItems(userId, localQuery).then(function (result) { - - showSlideshow(page, result.Items, startItemId); - }); - } - - function showSlideshow(page, items, startItemId) { - - var index = items.map(function (i) { - return i.Id; - - }).indexOf(startItemId); - - if (index == -1) { - index = 0; - } - - require(['slideshow'], function (slideshow) { - - var newSlideShow = new slideshow({ - showTitle: false, - cover: false, - items: items, - startIndex: index, - interval: 7000, - interactive: true - }); - - newSlideShow.show(); - }); - } - - function onListItemClick(e) { - - var page = $(this).parents('.page')[0]; - var info = LibraryBrowser.getListItemInfo(this); - - if (info.mediaType == 'Photo') { - var query = getQuery(); - - Photos.startSlideshow(page, query, info.id); - return false; - } - } - - pageIdOn('pageinit', "photosPage", function () { - - var page = this; - - reloadItems(page, 0); - - $(page).on('click', '.mediaItem', onListItemClick); - - }); - - window.Photos = { - startSlideshow: startSlideshow - }; - -}); \ No newline at end of file +define(["jQuery","cardBuilder","imageLoader","emby-itemscontainer"],function($,cardBuilder,imageLoader){"use strict";function getQuery(){var key=getSavedQueryKey(),pageData=data[key];return pageData||(pageData=data[key]={query:{SortBy:"IsFolder,SortName",SortOrder:"Ascending",Fields:"PrimaryImageAspectRatio,SortName",ImageTypeLimit:1,EnableImageTypes:"Primary",StartIndex:0,Limit:LibraryBrowser.getDefaultPageSize()}},pageData.query.Recursive=!1,pageData.query.MediaTypes=null,pageData.query.ParentId=getParameterByName("parentId")||LibraryMenu.getTopParentId(),LibraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData.query}function getSavedQueryKey(){return LibraryBrowser.getSavedQueryKey("v1")}function reloadItems(page){Dashboard.showLoadingMsg();var query=getQuery();ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){window.scrollTo(0,0);var html="",pagingHtml=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,viewButton:!1,showLimit:!1});page.querySelector(".listTopPaging").innerHTML=pagingHtml,"Poster"==view&&(html=cardBuilder.getCardsHtml({items:result.Items,shape:"square",context:getParameterByName("context")||"photos",overlayText:!0,lazy:!0,coverImage:!0,showTitle:!1,centerText:!0}));var elem=page.querySelector(".itemsContainer");elem.innerHTML=html+pagingHtml,imageLoader.lazyChildren(elem),$(".btnNextPage",page).on("click",function(){query.StartIndex+=query.Limit,reloadItems(page)}),$(".btnPreviousPage",page).on("click",function(){query.StartIndex-=query.Limit,reloadItems(page)}),LibraryBrowser.saveQueryValues(getSavedQueryKey(),query),Dashboard.hideLoadingMsg()})}function startSlideshow(page,itemQuery,startItemId){var userId=Dashboard.getCurrentUserId(),localQuery=$.extend({},itemQuery);localQuery.StartIndex=0,localQuery.Limit=null,localQuery.MediaTypes="Photo",localQuery.Recursive=!0,localQuery.Filters="IsNotFolder",ApiClient.getItems(userId,localQuery).then(function(result){showSlideshow(page,result.Items,startItemId)})}function showSlideshow(page,items,startItemId){var index=items.map(function(i){return i.Id}).indexOf(startItemId);index==-1&&(index=0),require(["slideshow"],function(slideshow){var newSlideShow=new slideshow({showTitle:!1,cover:!1,items:items,startIndex:index,interval:7e3,interactive:!0});newSlideShow.show()})}function onListItemClick(e){var page=$(this).parents(".page")[0],info=LibraryBrowser.getListItemInfo(this);if("Photo"==info.mediaType){var query=getQuery();return Photos.startSlideshow(page,query,info.id),!1}}var view="Poster",data={};pageIdOn("pageinit","photosPage",function(){var page=this;reloadItems(page,0),$(page).on("click",".mediaItem",onListItemClick)}),window.Photos={startSlideshow:startSlideshow}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/playbackconfiguration.js b/dashboard-ui/scripts/playbackconfiguration.js index 3c0443b74d..d568442a28 100644 --- a/dashboard-ui/scripts/playbackconfiguration.js +++ b/dashboard-ui/scripts/playbackconfiguration.js @@ -1,66 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - function loadPage(page, config) { - - $('#txtMinResumePct', page).val(config.MinResumePct); - $('#txtMaxResumePct', page).val(config.MaxResumePct); - $('#txtMinResumeDuration', page).val(config.MinResumeDurationSeconds); - - Dashboard.hideLoadingMsg(); - } - - function onSubmit() { - Dashboard.showLoadingMsg(); - - var form = this; - - ApiClient.getServerConfiguration().then(function (config) { - - config.MinResumePct = $('#txtMinResumePct', form).val(); - config.MaxResumePct = $('#txtMaxResumePct', form).val(); - config.MinResumeDurationSeconds = $('#txtMinResumeDuration', form).val(); - - ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); - }); - - // Disable default form submission - return false; - } - - function getTabs() { - return [ - { - href: 'cinemamodeconfiguration.html', - name: Globalize.translate('TabCinemaMode') - }, - { - href: 'playbackconfiguration.html', - name: Globalize.translate('TabResumeSettings') - }, - { - href: 'streamingsettings.html', - name: Globalize.translate('TabStreaming') - }]; - } - - $(document).on('pageinit', "#playbackConfigurationPage", function () { - - $('.playbackConfigurationForm').off('submit', onSubmit).on('submit', onSubmit); - - }).on('pageshow', "#playbackConfigurationPage", function () { - - LibraryMenu.setTabs('playback', 1, getTabs); - Dashboard.showLoadingMsg(); - - var page = this; - - ApiClient.getServerConfiguration().then(function (config) { - - loadPage(page, config); - - }); - - }); - -}); +define(["jQuery"],function($){"use strict";function loadPage(page,config){$("#txtMinResumePct",page).val(config.MinResumePct),$("#txtMaxResumePct",page).val(config.MaxResumePct),$("#txtMinResumeDuration",page).val(config.MinResumeDurationSeconds),Dashboard.hideLoadingMsg()}function onSubmit(){Dashboard.showLoadingMsg();var form=this;return ApiClient.getServerConfiguration().then(function(config){config.MinResumePct=$("#txtMinResumePct",form).val(),config.MaxResumePct=$("#txtMaxResumePct",form).val(),config.MinResumeDurationSeconds=$("#txtMinResumeDuration",form).val(),ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult)}),!1}function getTabs(){return[{href:"cinemamodeconfiguration.html",name:Globalize.translate("TabCinemaMode")},{href:"playbackconfiguration.html",name:Globalize.translate("TabResumeSettings")},{href:"streamingsettings.html",name:Globalize.translate("TabStreaming")}]}$(document).on("pageinit","#playbackConfigurationPage",function(){$(".playbackConfigurationForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#playbackConfigurationPage",function(){LibraryMenu.setTabs("playback",1,getTabs),Dashboard.showLoadingMsg();var page=this;ApiClient.getServerConfiguration().then(function(config){loadPage(page,config)})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/playlistedit.js b/dashboard-ui/scripts/playlistedit.js index 67524f392a..e9a721700c 100644 --- a/dashboard-ui/scripts/playlistedit.js +++ b/dashboard-ui/scripts/playlistedit.js @@ -1,117 +1 @@ -define(['jQuery', 'listView', 'imageLoader'], function ($, listView, imageLoader) { - 'use strict'; - - var data = {}; - function getPageData() { - var key = getSavedQueryKey(); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - Fields: "PrimaryImageAspectRatio", - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - StartIndex: 0, - Limit: 200 - }, - view: LibraryBrowser.getSavedView(key) || 'List' - }; - - pageData.query.ParentId = LibraryMenu.getTopParentId(); - LibraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData; - } - - function getQuery() { - - return getPageData().query; - } - - function getSavedQueryKey() { - - return LibraryBrowser.getSavedQueryKey(); - } - - function reloadItems(page, item) { - - Dashboard.showLoadingMsg(); - - var query = getQuery(); - - query.UserId = Dashboard.getCurrentUserId(); - - ApiClient.getJSON(ApiClient.getUrl('Playlists/' + item.Id + '/Items', query)).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - var html = ''; - - html += LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false - - }); - - html += listView.getListViewHtml({ - items: result.Items, - sortBy: query.SortBy, - showIndex: false, - showRemoveFromPlaylist: true, - playFromHere: true, - action: 'playallfromhere', - smallIcon: true, - dragHandle: true, - playlistId: item.Id - }); - - var elem = page.querySelector('#childrenContent .itemsContainer'); - elem.classList.add('vertical-list'); - elem.classList.remove('vertical-wrap'); - elem.innerHTML = html; - - imageLoader.lazyChildren(elem); - - $('.btnNextPage', elem).on('click', function () { - query.StartIndex += query.Limit; - reloadItems(page, item); - }); - - $('.btnPreviousPage', elem).on('click', function () { - query.StartIndex -= query.Limit; - reloadItems(page, item); - }); - - Dashboard.hideLoadingMsg(); - }); - } - - function init(page, item) { - - var elem = page.querySelector('#childrenContent .itemsContainer'); - - elem.enableDragReordering(true); - - elem.addEventListener('needsrefresh', function () { - - reloadItems(page, item); - }); - } - - window.PlaylistViewer = { - render: function (page, item) { - - if (!page.playlistInit) { - page.playlistInit = true; - init(page, item); - } - - reloadItems(page, item); - } - }; - -}); \ No newline at end of file +define(["jQuery","listView","imageLoader"],function($,listView,imageLoader){"use strict";function getPageData(){var key=getSavedQueryKey(),pageData=data[key];return pageData||(pageData=data[key]={query:{Fields:"PrimaryImageAspectRatio",EnableImageTypes:"Primary,Backdrop,Banner,Thumb",StartIndex:0,Limit:200},view:LibraryBrowser.getSavedView(key)||"List"},pageData.query.ParentId=LibraryMenu.getTopParentId(),LibraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(){return getPageData().query}function getSavedQueryKey(){return LibraryBrowser.getSavedQueryKey()}function reloadItems(page,item){Dashboard.showLoadingMsg();var query=getQuery();query.UserId=Dashboard.getCurrentUserId(),ApiClient.getJSON(ApiClient.getUrl("Playlists/"+item.Id+"/Items",query)).then(function(result){window.scrollTo(0,0);var html="";html+=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1}),html+=listView.getListViewHtml({items:result.Items,sortBy:query.SortBy,showIndex:!1,showRemoveFromPlaylist:!0,playFromHere:!0,action:"playallfromhere",smallIcon:!0,dragHandle:!0,playlistId:item.Id});var elem=page.querySelector("#childrenContent .itemsContainer");elem.classList.add("vertical-list"),elem.classList.remove("vertical-wrap"),elem.innerHTML=html,imageLoader.lazyChildren(elem),$(".btnNextPage",elem).on("click",function(){query.StartIndex+=query.Limit,reloadItems(page,item)}),$(".btnPreviousPage",elem).on("click",function(){query.StartIndex-=query.Limit,reloadItems(page,item)}),Dashboard.hideLoadingMsg()})}function init(page,item){var elem=page.querySelector("#childrenContent .itemsContainer");elem.enableDragReordering(!0),elem.addEventListener("needsrefresh",function(){reloadItems(page,item)})}var data={};window.PlaylistViewer={render:function(page,item){page.playlistInit||(page.playlistInit=!0,init(page,item)),reloadItems(page,item)}}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/playlists.js b/dashboard-ui/scripts/playlists.js index e6452132a6..34430895fd 100644 --- a/dashboard-ui/scripts/playlists.js +++ b/dashboard-ui/scripts/playlists.js @@ -1,225 +1 @@ -define(['listView', 'cardBuilder', 'libraryBrowser', 'apphost', 'imageLoader', 'emby-itemscontainer'], function (listView, cardBuilder, libraryBrowser, appHost, imageLoader) { - 'use strict'; - - return function (view, params) { - - var data = {}; - function getPageData(context) { - var key = getSavedQueryKey(context); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Playlist", - Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete", - StartIndex: 0, - Limit: LibraryBrowser.getDefaultPageSize() - }, - view: LibraryBrowser.getSavedView(key) || appHost.preferVisualCards ? 'PosterCard' : 'Poster' - }; - - pageData.query.ParentId = LibraryMenu.getTopParentId(); - LibraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData; - } - - function getQuery(context) { - - return getPageData(context).query; - } - - function getSavedQueryKey(context) { - - if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey(); - } - return context.savedQueryKey; - } - - function showLoadingMessage() { - - Dashboard.showLoadingMsg(); - } - - function hideLoadingMessage() { - Dashboard.hideLoadingMsg(); - } - - function onViewStyleChange() { - - var viewStyle = getPageData(view).view; - - var itemsContainer = view.querySelector('.itemsContainer'); - - if (viewStyle == "List") { - - itemsContainer.classList.add('vertical-list'); - itemsContainer.classList.remove('vertical-wrap'); - } - else { - - itemsContainer.classList.remove('vertical-list'); - itemsContainer.classList.add('vertical-wrap'); - } - itemsContainer.innerHTML = ''; - } - - function reloadItems() { - - showLoadingMessage(); - - var query = getQuery(view); - var promise1 = ApiClient.getItems(Dashboard.getCurrentUserId(), query); - var promise2 = Dashboard.getCurrentUser(); - - Promise.all([promise1, promise2]).then(function (responses) { - - var result = responses[0]; - var user = responses[1]; - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - var html = ''; - var viewStyle = getPageData(view).view; - - view.querySelector('.listTopPaging').innerHTML = LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - viewButton: false, - showLimit: false, - updatePageSizeSetting: false, - addLayoutButton: true, - layouts: 'List,Poster,PosterCard,Thumb,ThumbCard', - currentLayout: viewStyle - - }); - - if (result.TotalRecordCount) { - - if (viewStyle == "List") { - - html = listView.getListViewHtml({ - items: result.Items, - sortBy: query.SortBy - }); - } - else if (viewStyle == "PosterCard") { - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "square", - showTitle: true, - lazy: true, - coverImage: true, - showItemCounts: true, - cardLayout: true, - vibrant: true - }); - } - else if (viewStyle == "Thumb") { - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "backdrop", - showTitle: true, - centerText: true, - lazy: true, - preferThumb: true, - overlayPlayButton: true - }); - } - else if (viewStyle == "ThumbCard") { - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "backdrop", - showTitle: true, - lazy: true, - preferThumb: true, - cardLayout: true, - showItemCounts: true, - vibrant: true - }); - } - else { - // Poster - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "square", - showTitle: true, - lazy: true, - coverImage: true, - showItemCounts: true, - centerText: true, - overlayPlayButton: true - }); - } - - view.querySelector('.noItemsMessage').classList.add('hide'); - - } else { - - view.querySelector('.noItemsMessage').classList.remove('hide'); - } - - var elem = view.querySelector('.itemsContainer'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - - var btnNextPage = view.querySelector('.btnNextPage'); - if (btnNextPage) { - btnNextPage.addEventListener('click', function () { - query.StartIndex += query.Limit; - reloadItems(); - }); - } - - var btnPreviousPage = view.querySelector('.btnPreviousPage'); - if (btnPreviousPage) { - btnPreviousPage.addEventListener('click', function () { - query.StartIndex -= query.Limit; - reloadItems(); - }); - } - - var btnChangeLayout = view.querySelector('.btnChangeLayout'); - if (btnChangeLayout) { - btnChangeLayout.addEventListener('layoutchange', function (e) { - var layout = e.detail.viewStyle; - getPageData(view).view = layout; - LibraryBrowser.saveViewSetting(getSavedQueryKey(view), layout); - onViewStyleChange(); - reloadItems(); - }); - } - - LibraryBrowser.saveQueryValues(getSavedQueryKey(view), query); - - hideLoadingMessage(); - }); - } - - view.addEventListener('viewbeforeshow', function() { - reloadItems(); - }); - - view.querySelector('.btnNewPlaylist').addEventListener('click', function () { - - require(['playlistEditor'], function (playlistEditor) { - - var serverId = ApiClient.serverInfo().Id; - new playlistEditor().show({ - items: [], - serverId: serverId - }); - }); - }); - - onViewStyleChange(); - - }; -}); \ No newline at end of file +define(["listView","cardBuilder","libraryBrowser","apphost","imageLoader","emby-itemscontainer"],function(listView,cardBuilder,libraryBrowser,appHost,imageLoader){"use strict";return function(view,params){function getPageData(context){var key=getSavedQueryKey(context),pageData=data[key];return pageData||(pageData=data[key]={query:{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"Playlist",Recursive:!0,Fields:"PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete",StartIndex:0,Limit:LibraryBrowser.getDefaultPageSize()},view:LibraryBrowser.getSavedView(key)||appHost.preferVisualCards?"PosterCard":"Poster"},pageData.query.ParentId=LibraryMenu.getTopParentId(),LibraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(context){return getPageData(context).query}function getSavedQueryKey(context){return context.savedQueryKey||(context.savedQueryKey=libraryBrowser.getSavedQueryKey()),context.savedQueryKey}function showLoadingMessage(){Dashboard.showLoadingMsg()}function hideLoadingMessage(){Dashboard.hideLoadingMsg()}function onViewStyleChange(){var viewStyle=getPageData(view).view,itemsContainer=view.querySelector(".itemsContainer");"List"==viewStyle?(itemsContainer.classList.add("vertical-list"),itemsContainer.classList.remove("vertical-wrap")):(itemsContainer.classList.remove("vertical-list"),itemsContainer.classList.add("vertical-wrap")),itemsContainer.innerHTML=""}function reloadItems(){showLoadingMessage();var query=getQuery(view),promise1=ApiClient.getItems(Dashboard.getCurrentUserId(),query),promise2=Dashboard.getCurrentUser();Promise.all([promise1,promise2]).then(function(responses){var result=responses[0];responses[1];window.scrollTo(0,0);var html="",viewStyle=getPageData(view).view;view.querySelector(".listTopPaging").innerHTML=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,viewButton:!1,showLimit:!1,updatePageSizeSetting:!1,addLayoutButton:!0,layouts:"List,Poster,PosterCard,Thumb,ThumbCard",currentLayout:viewStyle}),result.TotalRecordCount?(html="List"==viewStyle?listView.getListViewHtml({items:result.Items,sortBy:query.SortBy}):"PosterCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"square",showTitle:!0,lazy:!0,coverImage:!0,showItemCounts:!0,cardLayout:!0,vibrant:!0}):"Thumb"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",showTitle:!0,centerText:!0,lazy:!0,preferThumb:!0,overlayPlayButton:!0}):"ThumbCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",showTitle:!0,lazy:!0,preferThumb:!0,cardLayout:!0,showItemCounts:!0,vibrant:!0}):cardBuilder.getCardsHtml({items:result.Items,shape:"square",showTitle:!0,lazy:!0,coverImage:!0,showItemCounts:!0,centerText:!0,overlayPlayButton:!0}),view.querySelector(".noItemsMessage").classList.add("hide")):view.querySelector(".noItemsMessage").classList.remove("hide");var elem=view.querySelector(".itemsContainer");elem.innerHTML=html,imageLoader.lazyChildren(elem);var btnNextPage=view.querySelector(".btnNextPage");btnNextPage&&btnNextPage.addEventListener("click",function(){query.StartIndex+=query.Limit,reloadItems()});var btnPreviousPage=view.querySelector(".btnPreviousPage");btnPreviousPage&&btnPreviousPage.addEventListener("click",function(){query.StartIndex-=query.Limit,reloadItems()});var btnChangeLayout=view.querySelector(".btnChangeLayout");btnChangeLayout&&btnChangeLayout.addEventListener("layoutchange",function(e){var layout=e.detail.viewStyle;getPageData(view).view=layout,LibraryBrowser.saveViewSetting(getSavedQueryKey(view),layout),onViewStyleChange(),reloadItems()}),LibraryBrowser.saveQueryValues(getSavedQueryKey(view),query),hideLoadingMessage()})}var data={};view.addEventListener("viewbeforeshow",function(){reloadItems()}),view.querySelector(".btnNewPlaylist").addEventListener("click",function(){require(["playlistEditor"],function(playlistEditor){var serverId=ApiClient.serverInfo().Id;(new playlistEditor).show({items:[],serverId:serverId})})}),onViewStyleChange()}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/plugincatalogpage.js b/dashboard-ui/scripts/plugincatalogpage.js index ee9360290b..56775490e7 100644 --- a/dashboard-ui/scripts/plugincatalogpage.js +++ b/dashboard-ui/scripts/plugincatalogpage.js @@ -1,307 +1 @@ -define(['jQuery', 'cardStyle'], function ($) { - 'use strict'; - - // The base query options - var query = { - TargetSystems: 'Server', - IsAdult: false - }; - - function reloadList(page) { - - Dashboard.showLoadingMsg(); - - if (AppInfo.enableAppStorePolicy) { - $('.optionAdultContainer', page).hide(); - } else { - $('.optionAdultContainer', page).show(); - } - - query.IsAppStoreSafe = true; - - var promise1 = ApiClient.getAvailablePlugins(query); - - var promise2 = ApiClient.getInstalledPlugins(); - - Promise.all([promise1, promise2]).then(function (responses) { - - populateList({ - - catalogElement: $('#pluginTiles', page), - noItemsElement: $("#noPlugins", page), - availablePlugins: responses[0], - installedPlugins: responses[1] - - }); - }); - } - function populateList(options) { - populateListInternal(options); - } - - function populateListInternal(options) { - - var availablePlugins = options.availablePlugins; - var installedPlugins = options.installedPlugins; - - var allPlugins = availablePlugins.filter(function (p) { - - p.category = p.category || "General"; - p.categoryDisplayName = Globalize.translate('PluginCategory' + p.category.replace(' ', '')); - - if (options.categories) { - if (options.categories.indexOf(p.category) == -1) { - return false; - } - } - - if (options.targetSystem) { - if (p.targetSystem != options.targetSystem) { - return false; - } - } - - return p.type == "UserInstalled"; - - }); - - availablePlugins = allPlugins.sort(function (a, b) { - - var aName = (a.category); - var bName = (b.category); - - if (aName > bName) { - return 1; - } - if (bName > aName) { - return -1; - } - - aName = (a.name); - bName = (b.name); - - if (aName > bName) { - return 1; - } - if (bName > aName) { - return -1; - } - - return 0; - }); - - var html = ''; - var i, length, plugin; - - var currentCategory; - - if (!options.categories) { - currentCategory = Globalize.translate('HeaderTopPlugins'); - html += '

' + currentCategory + '

'; - var topPlugins = allPlugins.slice(0).sort(function (a, b) { - - if (a.installs > b.installs) { - return -1; - } - if (b.installs > a.installs) { - return 1; - } - - var aName = (a.name); - var bName = (b.name); - - if (aName > bName) { - return 1; - } - if (bName > aName) { - return -1; - } - - return 0; - }); - - html += '
'; - var limit = screen.availWidth >= 1920 ? 15 : 12; - for (i = 0, length = Math.min(topPlugins.length, limit) ; i < length; i++) { - html += getPluginHtml(topPlugins[i], options, installedPlugins); - } - html += '
'; - html += '
'; - html += '
'; - } - - var hasOpenTag = false; - currentCategory = null; - - if (options.showCategory === false) { - html += '
'; - hasOpenTag = true; - } - - for (i = 0, length = availablePlugins.length; i < length; i++) { - - plugin = availablePlugins[i]; - - var category = plugin.categoryDisplayName; - - if (category != currentCategory) { - - if (options.showCategory !== false) { - if (currentCategory) { - hasOpenTag = false; - html += '
'; - html += '
'; - html += '
'; - } - - html += '

' + category + '

'; - html += '
'; - hasOpenTag = true; - } - - currentCategory = category; - } - - html += getPluginHtml(plugin, options, installedPlugins); - - } - - if (hasOpenTag) { - html += '
'; - } - - if (!availablePlugins.length && options.noItemsElement) { - $(options.noItemsElement).hide(); - } - - $(options.catalogElement).html(html); - - Dashboard.hideLoadingMsg(); - } - - function getPluginHtml(plugin, options, installedPlugins) { - - var html = ''; - - var href = plugin.externalUrl ? plugin.externalUrl : "addplugin.html?name=" + encodeURIComponent(plugin.name) + "&guid=" + plugin.guid; - if (options.context) { - href += "&context=" + options.context; - } - var target = plugin.externalUrl ? ' target="_blank"' : ''; - - html += "
"; - - html += '
'; - html += '
'; - - html += '
'; - - html += ''; - if (plugin.thumbImage) { - html += '"; - - html += '
'; - - html += "
"; - html += plugin.name; - html += "
"; - - // html += "
"; - - // if (plugin.avgRating) { - // html += 'star'; - // html += plugin.avgRating.toFixed(1); - // } - - // if (plugin.totalRatings) { - // html += "
"; - // html += " " + Globalize.translate('LabelNumberReviews').replace("{0}", plugin.totalRatings); - // } - // html += "
"; - - // html += "
"; - - var installedPlugin = plugin.isApp ? null : installedPlugins.filter(function (ip) { - return ip.Id == plugin.guid; - })[0]; - - html += "
"; - - if (installedPlugin) { - html += Globalize.translate('LabelVersionInstalled').replace("{0}", installedPlugin.Version); - } else { - html += ' '; - } - html += "
"; - - // cardFooter - html += "
"; - - // cardBox - html += "
"; - - // card - html += "
"; - - return html; - } - - function getTabs() { - return [ - { - href: 'plugins.html', - name: Globalize.translate('TabMyPlugins') - }, - { - href: 'plugincatalog.html', - name: Globalize.translate('TabCatalog') - }]; - } - - $(document).on('pageinit', "#pluginCatalogPage", function () { - - var page = this; - - $('#selectSystem', page).on('change', function () { - - query.TargetSystems = this.value; - reloadList(page); - }); - - $('#chkAdult', page).on('change', function () { - - query.IsAdult = this.checked ? null : false; - reloadList(page); - }); - - }).on('pageshow', "#pluginCatalogPage", function () { - - LibraryMenu.setTabs('plugins', 1, getTabs); - var page = this; - - reloadList(page); - }); - - window.PluginCatalog = { - renderCatalog: populateList - }; - -}); \ No newline at end of file +define(["jQuery","cardStyle"],function($){"use strict";function reloadList(page){Dashboard.showLoadingMsg(),AppInfo.enableAppStorePolicy?$(".optionAdultContainer",page).hide():$(".optionAdultContainer",page).show(),query.IsAppStoreSafe=!0;var promise1=ApiClient.getAvailablePlugins(query),promise2=ApiClient.getInstalledPlugins();Promise.all([promise1,promise2]).then(function(responses){populateList({catalogElement:$("#pluginTiles",page),noItemsElement:$("#noPlugins",page),availablePlugins:responses[0],installedPlugins:responses[1]})})}function populateList(options){populateListInternal(options)}function populateListInternal(options){var availablePlugins=options.availablePlugins,installedPlugins=options.installedPlugins,allPlugins=availablePlugins.filter(function(p){return p.category=p.category||"General",p.categoryDisplayName=Globalize.translate("PluginCategory"+p.category.replace(" ","")),(!options.categories||options.categories.indexOf(p.category)!=-1)&&((!options.targetSystem||p.targetSystem==options.targetSystem)&&"UserInstalled"==p.type)});availablePlugins=allPlugins.sort(function(a,b){var aName=a.category,bName=b.category;return aName>bName?1:bName>aName?-1:(aName=a.name,bName=b.name,aName>bName?1:bName>aName?-1:0)});var i,length,plugin,currentCategory,html="";if(!options.categories){currentCategory=Globalize.translate("HeaderTopPlugins"),html+='

'+currentCategory+"

";var topPlugins=allPlugins.slice(0).sort(function(a,b){if(a.installs>b.installs)return-1;if(b.installs>a.installs)return 1;var aName=a.name,bName=b.name;return aName>bName?1:bName>aName?-1:0});html+='
';var limit=screen.availWidth>=1920?15:12;for(i=0,length=Math.min(topPlugins.length,limit);i",html+="
",html+="
"}var hasOpenTag=!1;for(currentCategory=null,options.showCategory===!1&&(html+='
',hasOpenTag=!0),i=0,length=availablePlugins.length;i",html+="
",html+="
"),html+='

'+category+"

",html+='
',hasOpenTag=!0),currentCategory=category),html+=getPluginHtml(plugin,options,installedPlugins)}hasOpenTag&&(html+="
"),!availablePlugins.length&&options.noItemsElement&&$(options.noItemsElement).hide(),$(options.catalogElement).html(html),Dashboard.hideLoadingMsg()}function getPluginHtml(plugin,options,installedPlugins){var html="",href=plugin.externalUrl?plugin.externalUrl:"addplugin.html?name="+encodeURIComponent(plugin.name)+"&guid="+plugin.guid;options.context&&(href+="&context="+options.context);var target=plugin.externalUrl?' target="_blank"':"";html+="
",html+='
',html+='
',html+='
',html+='",html+=plugin.thumbImage?'",html+='
',html+="
",html+=plugin.name,html+="
";var installedPlugin=plugin.isApp?null:installedPlugins.filter(function(ip){return ip.Id==plugin.guid})[0];return html+="
",html+=installedPlugin?Globalize.translate("LabelVersionInstalled").replace("{0}",installedPlugin.Version):" ",html+="
",html+="
",html+="
",html+="
"}function getTabs(){return[{href:"plugins.html",name:Globalize.translate("TabMyPlugins")},{href:"plugincatalog.html",name:Globalize.translate("TabCatalog")}]}var query={TargetSystems:"Server",IsAdult:!1};$(document).on("pageinit","#pluginCatalogPage",function(){var page=this;$("#selectSystem",page).on("change",function(){query.TargetSystems=this.value,reloadList(page)}),$("#chkAdult",page).on("change",function(){query.IsAdult=!!this.checked&&null,reloadList(page)})}).on("pageshow","#pluginCatalogPage",function(){LibraryMenu.setTabs("plugins",1,getTabs);var page=this;reloadList(page)}),window.PluginCatalog={renderCatalog:populateList}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/pluginspage.js b/dashboard-ui/scripts/pluginspage.js index 55b54601aa..028ed56013 100644 --- a/dashboard-ui/scripts/pluginspage.js +++ b/dashboard-ui/scripts/pluginspage.js @@ -1,250 +1 @@ -define(['jQuery', 'cardStyle'], function ($) { - 'use strict'; - - function deletePlugin(page, uniqueid, name) { - - var msg = Globalize.translate('UninstallPluginConfirmation').replace("{0}", name); - - require(['confirm'], function (confirm) { - confirm(msg, Globalize.translate('UninstallPluginHeader')).then(function () { - Dashboard.showLoadingMsg(); - - ApiClient.uninstallPlugin(uniqueid).then(function () { - - reloadList(page); - }); - }); - }); - } - - function showNoConfigurationMessage() { - Dashboard.alert({ - message: Globalize.translate('NoPluginConfigurationMessage') - }); - } - - function showConnectMessage() { - Dashboard.alert({ - message: Globalize.translate('MessagePluginConfigurationRequiresLocalAccess') - }); - } - - function getPluginCardHtml(plugin, pluginConfigurationPages) { - - var configPage = $.grep(pluginConfigurationPages, function (pluginConfigurationPage) { - return pluginConfigurationPage.PluginId == plugin.Id; - })[0]; - - var html = ''; - - var isConnectMode = Dashboard.isConnectMode(); - var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null; - - var href = configPage && !isConnectMode ? - configPageUrl : - null; - - html += "
"; - - html += '
'; - html += '
'; - - html += '
'; - - if (href) { - html += ''; - } - else if (!configPageUrl) { - html += '
'; - } - else if (isConnectMode) { - html += '
'; - } - else { - html += '"; - - html += '
'; - - html += '
'; - html += ''; - html += "
"; - - html += "
"; - html += plugin.Name; - html += "
"; - - html += "
"; - html += plugin.Version; - html += "
"; - - // cardFooter - html += "
"; - - // cardBox - html += "
"; - - // card - html += "
"; - - return html; - } - - function renderPlugins(page, plugins, showNoPluginsMessage) { - - ApiClient.getJSON(ApiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration").then(function (configPages) { - - populateList(page, plugins, configPages, showNoPluginsMessage); - - }); - } - - function populateList(page, plugins, pluginConfigurationPages, showNoPluginsMessage) { - - plugins = plugins.sort(function (plugin1, plugin2) { - - return (plugin1.Name) > (plugin2.Name) ? 1 : -1; - - }); - - var html = plugins.map(function (p) { - return getPluginCardHtml(p, pluginConfigurationPages); - - }).join(''); - - if (!plugins.length) { - - if (showNoPluginsMessage) { - html += '
'; - - if (AppInfo.enableAppStorePolicy) { - html += '

' + Globalize.translate('MessageNoPluginsDueToAppStore') + '

'; - } else { - html += '

' + Globalize.translate('MessageNoPluginsInstalled') + '

'; - - html += '

'; - html += Globalize.translate('BrowsePluginCatalogMessage'); - html += '

'; - } - html += '
'; - } - - $('.installedPlugins', page).html(html); - } else { - - var elem = $('.installedPlugins', page).addClass('itemsContainer').addClass('vertical-wrap').html(html); - - $('.noConfigPluginCard', elem).on('click', function () { - showNoConfigurationMessage(); - }); - - $('.connectModePluginCard', elem).on('click', function () { - showConnectMessage(); - }); - - $('.btnCardMenu', elem).on('click', function () { - showPluginMenu(page, this); - }); - } - - Dashboard.hideLoadingMsg(); - } - - function showPluginMenu(page, elem) { - - var card = $(elem).parents('.card'); - var id = card.attr('data-id'); - var name = card.attr('data-name'); - var configHref = $('.cardContent', card).attr('href'); - - var menuItems = []; - - if (configHref) { - menuItems.push({ - name: Globalize.translate('ButtonSettings'), - id: 'open', - ironIcon: 'mode-edit' - }); - } - - menuItems.push({ - name: Globalize.translate('ButtonUninstall'), - id: 'delete', - ironIcon: 'delete' - }); - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - items: menuItems, - positionTo: elem, - callback: function (resultId) { - - switch (resultId) { - - case 'open': - Dashboard.navigate(configHref); - break; - case 'delete': - deletePlugin(page, id, name); - break; - default: - break; - } - } - }); - - }); - } - - function reloadList(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getInstalledPlugins().then(function (plugins) { - - renderPlugins(page, plugins, true); - }); - } - - function getTabs() { - return [ - { - href: 'plugins.html', - name: Globalize.translate('TabMyPlugins') - }, - { - href: 'plugincatalog.html', - name: Globalize.translate('TabCatalog') - }]; - } - - $(document).on('pageshow', "#pluginsPage", function () { - - LibraryMenu.setTabs('plugins', 0, getTabs); - reloadList(this); - }); - - window.PluginsPage = { - renderPlugins: renderPlugins - }; - -}); \ No newline at end of file +define(["jQuery","cardStyle"],function($){"use strict";function deletePlugin(page,uniqueid,name){var msg=Globalize.translate("UninstallPluginConfirmation").replace("{0}",name);require(["confirm"],function(confirm){confirm(msg,Globalize.translate("UninstallPluginHeader")).then(function(){Dashboard.showLoadingMsg(),ApiClient.uninstallPlugin(uniqueid).then(function(){reloadList(page)})})})}function showNoConfigurationMessage(){Dashboard.alert({message:Globalize.translate("NoPluginConfigurationMessage")})}function showConnectMessage(){Dashboard.alert({message:Globalize.translate("MessagePluginConfigurationRequiresLocalAccess")})}function getPluginCardHtml(plugin,pluginConfigurationPages){var configPage=$.grep(pluginConfigurationPages,function(pluginConfigurationPage){return pluginConfigurationPage.PluginId==plugin.Id})[0],html="",isConnectMode=Dashboard.isConnectMode(),configPageUrl=configPage?Dashboard.getConfigurationPageUrl(configPage.Name):null,href=configPage&&!isConnectMode?configPageUrl:null;return html+="
",html+='
',html+='
',html+='
',html+=href?'':configPageUrl?isConnectMode?'
':'
':'",html+='
',html+='
',html+='',html+="
",html+="
",html+=plugin.Name,html+="
",html+="
",html+=plugin.Version,html+="
",html+="
",html+="
",html+="
"}function renderPlugins(page,plugins,showNoPluginsMessage){ApiClient.getJSON(ApiClient.getUrl("web/configurationpages")+"?pageType=PluginConfiguration").then(function(configPages){populateList(page,plugins,configPages,showNoPluginsMessage)})}function populateList(page,plugins,pluginConfigurationPages,showNoPluginsMessage){plugins=plugins.sort(function(plugin1,plugin2){return plugin1.Name>plugin2.Name?1:-1});var html=plugins.map(function(p){return getPluginCardHtml(p,pluginConfigurationPages)}).join("");if(plugins.length){var elem=$(".installedPlugins",page).addClass("itemsContainer").addClass("vertical-wrap").html(html);$(".noConfigPluginCard",elem).on("click",function(){showNoConfigurationMessage()}),$(".connectModePluginCard",elem).on("click",function(){showConnectMessage()}),$(".btnCardMenu",elem).on("click",function(){showPluginMenu(page,this)})}else showNoPluginsMessage&&(html+='
',AppInfo.enableAppStorePolicy?html+="

"+Globalize.translate("MessageNoPluginsDueToAppStore")+"

":(html+="

"+Globalize.translate("MessageNoPluginsInstalled")+"

",html+='

',html+=Globalize.translate("BrowsePluginCatalogMessage"),html+="

"),html+="
"),$(".installedPlugins",page).html(html);Dashboard.hideLoadingMsg()}function showPluginMenu(page,elem){var card=$(elem).parents(".card"),id=card.attr("data-id"),name=card.attr("data-name"),configHref=$(".cardContent",card).attr("href"),menuItems=[];configHref&&menuItems.push({name:Globalize.translate("ButtonSettings"),id:"open",ironIcon:"mode-edit"}),menuItems.push({name:Globalize.translate("ButtonUninstall"),id:"delete",ironIcon:"delete"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:elem,callback:function(resultId){switch(resultId){case"open":Dashboard.navigate(configHref);break;case"delete":deletePlugin(page,id,name)}}})})}function reloadList(page){Dashboard.showLoadingMsg(),ApiClient.getInstalledPlugins().then(function(plugins){renderPlugins(page,plugins,!0)})}function getTabs(){return[{href:"plugins.html",name:Globalize.translate("TabMyPlugins")},{href:"plugincatalog.html",name:Globalize.translate("TabCatalog")}]}$(document).on("pageshow","#pluginsPage",function(){LibraryMenu.setTabs("plugins",0,getTabs),reloadList(this)}),window.PluginsPage={renderPlugins:renderPlugins}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/reports.js b/dashboard-ui/scripts/reports.js index a69c623bf9..a5b94bdb08 100644 --- a/dashboard-ui/scripts/reports.js +++ b/dashboard-ui/scripts/reports.js @@ -1,1054 +1 @@ -define(['jQuery', 'libraryBrowser', 'fnchecked'], function ($, libraryBrowser) { - 'use strict'; - - var defaultSortBy = "SortName"; - var topItems = 5; - - var query = { - StartIndex: 0, - Limit: 100, - IncludeItemTypes: "Movie", - HasQueryLimit: true, - GroupBy: "None", - ReportView: "ReportData", - DisplayType: "Screen", - }; - - function getTable(result) { - var html = ''; - //Report table - html += ''; - html += ''; - - //Report headers - result.Headers.map(function (header) { - var cellHtml = ''; - html += cellHtml; - }); - - html += ''; - //Report body - html += ''; - if (result.IsGrouped === false) { - - result.Rows.map(function (row) { - html += getRow(result.Headers, row); - }); - } - else { - - result.Groups.map(function (group) { - html += ''; - html += ''; - html += ''; - group.Rows.map(function (row) { - html += getRow(result.Headers, row); - }); - html += ''; - html += ''; - html += ''; - }); - } - - html += ''; - html += '
'; - - if (header.ShowHeaderLabel) { - if (header.SortField) { - cellHtml += ''; - } - - cellHtml += (header.Name || ' '); - if (header.SortField) { - cellHtml += ''; - if (header.SortField === defaultSortBy) { - - if (query.SortOrder === "Descending") { - cellHtml += ''; - } else { - cellHtml += ''; - } - } - } - } - cellHtml += '
' + (group.Name || ' ') + '
' + ' ' + '
'; - return html; - } - - function getRow(rHeaders, rRow) { - var html = ''; - html += ''; - - for (var j = 0; j < rHeaders.length; j++) { - var rHeader = rHeaders[j]; - var rItem = rRow.Columns[j]; - html += getItem(rHeader, rRow, rItem); - } - html += ''; - return html; - } - - function getItem(rHeader, rRow, rItem) { - var html = ''; - html += ''; - switch (rHeader.ItemViewType) { - case "None": - html += rItem.Name; - break; - case "Detail": - var id = rRow.Id; - if (rItem.Id) - id = rItem.Id; - html += '' + rItem.Name + ''; - break; - case "Edit": - html += '' + rItem.Name + ''; - break; - case "List": - html += '' + rItem.Name + ''; - break; - case "ItemByNameDetails": - html += '' + rItem.Name + ''; - break; - case "EmbeddedImage": - if (rRow.HasEmbeddedImage) { - html += '
'; - } - break; - case "SubtitleImage": - if (rRow.HasSubtitles) { - html += '
'; - } - break; - case "TrailersImage": - if (rRow.HasLocalTrailer) { - html += '
'; - } - break; - case "SpecialsImage": - if (rRow.HasSpecials) { - html += '
'; - } - break; - case "LockDataImage": - if (rRow.HasLockData) { - html += 'lock'; - } - break; - case "TagsPrimaryImage": - if (!rRow.HasImageTagsPrimary) { - html += ''; - } - break; - case "TagsBackdropImage": - if (!rRow.HasImageTagsBackdrop) { - if (rRow.RowType !== "Episode" && rRow.RowType !== "Season" && rRow.MediaType !== "Audio" && rRow.RowType !== "TvChannel" && rRow.RowType !== "MusicAlbum") { - html += ''; - } - } - break; - case "TagsLogoImage": - if (!rRow.HasImageTagsLogo) { - if (rRow.RowType === "Movie" || rRow.RowType === "Trailer" || rRow.RowType === "Series" || rRow.RowType === "MusicArtist" || rRow.RowType === "BoxSet") { - html += ''; - } - } - break; - case "UserPrimaryImage": - if (rRow.UserId) { - var userImage = ApiClient.getUserImageUrl(rRow.UserId, { - height: 24, - type: 'Primary' - - }); - if (userImage) { - html += ''; - } else { - html += ''; - } - } - break; - case "StatusImage": - if (rRow.HasLockData) { - html += 'lock'; - } - - if (!rRow.HasLocalTrailer && rRow.RowType === "Movie") { - html += 'videocam'; - } - - if (!rRow.HasImageTagsPrimary) { - html += ''; - } - - if (!rRow.HasImageTagsBackdrop) { - if (rRow.RowType !== "Episode" && rRow.RowType !== "Season" && rRow.MediaType !== "Audio" && rRow.RowType !== "TvChannel" && rRow.RowType !== "MusicAlbum") { - html += ''; - } - } - - if (!rRow.HasImageTagsLogo) { - if (rRow.RowType === "Movie" || rRow.RowType === "Trailer" || rRow.RowType === "Series" || rRow.RowType === "MusicArtist" || rRow.RowType === "BoxSet") { - html += ''; - } - } - break; - default: - html += rItem.Name; - } - html += ''; - return html; - } - - function ExportReport(page, e) { - - query.UserId = Dashboard.getCurrentUserId(); - query.HasQueryLimit = false; - var url = ApiClient.getUrl("Reports/Items/Download", query); - - if (url) { - window.location.href = url; - } - } - - function loadGroupByFilters(page) { - - query.UserId = Dashboard.getCurrentUserId(); - var url = ""; - - url = ApiClient.getUrl("Reports/Headers", query); - ApiClient.getJSON(url).then(function (result) { - var selected = "None"; - - $('#selectReportGroup', page).find('option').remove().end(); - $('#selectReportGroup', page).append(''); - - result.map(function (header) { - if ((header.DisplayType === "Screen" || header.DisplayType === "ScreenExport") && header.CanGroup) { - if (header.FieldName.length > 0) { - var option = ''; - $('#selectReportGroup', page).append(option); - if (query.GroupBy === header.FieldName) - selected = header.FieldName; - } - } - }); - $('#selectPageSize', page).val(selected); - - }); - } - - function renderItems(page, result) { - - window.scrollTo(0, 0); - var html = ''; - - if (query.ReportView === "ReportData") { - $('#selectIncludeItemTypesBox', page).show(); - $('#tabFilter', page).show(); - } - else { - $('#selectIncludeItemTypesBox', page).hide(); - $('#tabFilterBox', page).hide(); - $('#tabFilter', page).hide(); - } - - var pagingHtml = libraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - updatePageSizeSetting: false, - viewButton: true, - showLimit: false - }); - - if (query.ReportView === "ReportData" || query.ReportView === "ReportActivities") { - - - $('.listTopPaging', page).html(pagingHtml).trigger('create'); - // page.querySelector('.listTopPaging').innerHTML = pagingHtml; - $('.listTopPaging', page).show(); - - $('.listBottomPaging', page).html(pagingHtml).trigger('create'); - $('.listBottomPaging', page).show(); - - $('.btnNextPage', page).on('click', function () { - query.StartIndex += query.Limit; - reloadItems(page); - }); - $('.btnNextPage', page).show(); - - $('.btnPreviousPage', page).on('click', function () { - query.StartIndex -= query.Limit; - reloadItems(page); - }); - $('.btnPreviousPage', page).show(); - - $('#btnReportExport', page).show(); - $('#selectPageSizeBox', page).show(); - $('#selectReportGroupingBox', page).show(); - $('#grpReportsColumns', page).show(); - - html += getTable(result); - - $('.reporContainer', page).html(html).trigger('create'); - - $('.lnkColumnSort', page).on('click', function () { - - var order = this.getAttribute('data-sortfield'); - - if (query.SortBy === order) { - - if (query.SortOrder === "Descending") { - - query.SortOrder = "Ascending"; - query.SortBy = defaultSortBy; - - } else { - - query.SortOrder = "Descending"; - query.SortBy = order; - } - - } else { - - query.SortOrder = "Ascending"; - query.SortBy = order; - } - - query.StartIndex = 0; - - reloadItems(page); - }); - } - - $('#GroupStatus', page).hide(); - $('#GroupAirDays', page).hide(); - $('#GroupEpisodes', page).hide(); - switch (query.IncludeItemTypes) { - case "Series": - case "Season": - $('#GroupStatus', page).show(); - $('#GroupAirDays', page).show(); - break; - case "Episode": - $('#GroupStatus', page).show(); - $('#GroupAirDays', page).show(); - $('#GroupEpisodes', page).show(); - break; - } - $('.viewPanel', page).refresh; - } - - function reloadItems(page) { - Dashboard.showLoadingMsg(); - - query.UserId = Dashboard.getCurrentUserId(); - var url = ""; - - switch (query.ReportView) { - case "ReportData": - query.HasQueryLimit = true; - url = ApiClient.getUrl("Reports/Items", query); - break; - case "ReportActivities": - query.HasQueryLimit = true; - url = ApiClient.getUrl("Reports/Activities", query); - break; - } - - ApiClient.getJSON(url).then(function (result) { - updateFilterControls(page); - renderItems(page, result); - }); - - - Dashboard.hideLoadingMsg(); - } - - function updateFilterControls(page) { - $('.chkStandardFilter', page).each(function () { - - var filters = "," + (query.Filters || ""); - var filterName = this.getAttribute('data-filter'); - - this.checked = filters.indexOf(',' + filterName) != -1; - - }); - - - $('.chkVideoTypeFilter', page).each(function () { - - var filters = "," + (query.VideoTypes || ""); - var filterName = this.getAttribute('data-filter'); - - this.checked = filters.indexOf(',' + filterName) != -1; - - }); - - $('.chkStatus', page).each(function () { - - var filters = "," + (query.SeriesStatus || ""); - var filterName = this.getAttribute('data-filter'); - - this.checked = filters.indexOf(',' + filterName) != -1; - - }); - - $('.chkAirDays', page).each(function () { - - var filters = "," + (query.AirDays || ""); - var filterName = this.getAttribute('data-filter'); - - this.checked = filters.indexOf(',' + filterName) != -1; - - }); - - $('#chk3D', page).checked(query.Is3D == true); - $('#chkHD', page).checked(query.IsHD == true); - $('#chkSD', page).checked(query.IsHD == false); - - $('#chkSubtitle', page).checked(query.HasSubtitles == true); - $('#chkTrailer', page).checked(query.HasTrailer == true); - $('#chkMissingTrailer', page).checked(query.HasTrailer == false); - $('#chkSpecialFeature', page).checked(query.HasSpecialFeature == true); - $('#chkThemeSong', page).checked(query.HasThemeSong == true); - $('#chkThemeVideo', page).checked(query.HasThemeVideo == true); - - $('#selectPageSize', page).val(query.Limit); - - //Management - $('#chkMissingRating', page).checked(query.HasOfficialRating == false); - $('#chkMissingOverview', page).checked(query.HasOverview == false); - $('#chkIsLocked', page).checked(query.IsLocked == true); - $('#chkMissingImdbId', page).checked(query.HasImdbId == false); - $('#chkMissingTmdbId', page).checked(query.HasTmdbId == false); - $('#chkMissingTvdbId', page).checked(query.HasTvdbId == false); - - //Episodes - $('#chkSpecialEpisode', page).checked(query.ParentIndexNumber == 0); - $('#chkMissingEpisode', page).checked(query.IsMissing == true); - $('#chkFutureEpisode', page).checked(query.IsUnaired == true); - - $('#selectIncludeItemTypes').val(query.IncludeItemTypes); - - // isfavorite - if (query.IsFavorite == true) { - $('#isFavorite').val("true"); - } - else if (query.IsFavorite == false) { - $('#isFavorite').val("false"); - } - else { - $('#isFavorite').val("-"); - } - - - } - - var filtersLoaded; - function reloadFiltersIfNeeded(page) { - if (!filtersLoaded) { - - filtersLoaded = true; - - QueryReportFilters.loadFilters(page, Dashboard.getCurrentUserId(), query, function () { - - reloadItems(page); - }); - - QueryReportColumns.loadColumns(page, Dashboard.getCurrentUserId(), query, function () { - - reloadItems(page); - }); - } - } - - $(document).on('pageinit', "#libraryReportManagerPage", function () { - - var page = this; - - $('#selectIncludeItemTypes', page).on('change', function () { - - query.StartIndex = 0; - query.ReportView = $('#selectViewType', page).val(); - query.IncludeItemTypes = this.value; - query.SortOrder = "Ascending"; - query.ReportColumns = null; - $('.btnReportExport', page).hide(); - filtersLoaded = false; - loadGroupByFilters(page); - reloadFiltersIfNeeded(page); - reloadItems(page); - }); - - $('#selectViewType', page).on('change', function () { - - query.StartIndex = 0; - query.ReportView = this.value; - query.IncludeItemTypes = $('#selectIncludeItemTypes', page).val(); - query.SortOrder = "Ascending"; - filtersLoaded = false; - query.ReportColumns = null; - loadGroupByFilters(page); - reloadFiltersIfNeeded(page); - reloadItems(page); - }); - - $('#selectReportGroup', page).on('change', function () { - query.GroupBy = this.value; - query.StartIndex = 0; - reloadItems(page); - }); - - $('#btnReportExportCsv', page).on('click', function (e) { - - query.ExportType = "CSV"; - ExportReport(page, e); - }); - - $('#btnReportExportExcel', page).on('click', function (e) { - - query.ExportType = "Excel"; - ExportReport(page, e); - }); - - $('#btnResetReportColumns', page).on('click', function (e) { - - query.ReportColumns = null; - query.StartIndex = 0; - filtersLoaded = false; - reloadFiltersIfNeeded(page); - reloadItems(page); - }); - - $('.viewPanel', page).on('panelopen', function () { - reloadFiltersIfNeeded(page); - }); - - $('#selectPageSize', page).on('change', function () { - query.Limit = parseInt(this.value); - query.StartIndex = 0; - reloadItems(page); - }); - - $('#isFavorite', page).on('change', function () { - - if (this.value == "true") { - query.IsFavorite = true; - } - else if (this.value == "false") { - query.IsFavorite = false; - } - else { - query.IsFavorite = null; - } - query.StartIndex = 0; - reloadItems(page); - }); - - $('.chkStandardFilter', this).on('change', function () { - - var filterName = this.getAttribute('data-filter'); - var filters = query.Filters || ""; - - filters = (',' + filters).replace(',' + filterName, '').substring(1); - - if (this.checked) { - filters = filters ? (filters + ',' + filterName) : filterName; - } - - query.StartIndex = 0; - query.Filters = filters; - - reloadItems(page); - }); - - $('.chkVideoTypeFilter', this).on('change', function () { - - var filterName = this.getAttribute('data-filter'); - var filters = query.VideoTypes || ""; - - filters = (',' + filters).replace(',' + filterName, '').substring(1); - - if (this.checked) { - filters = filters ? (filters + ',' + filterName) : filterName; - } - - query.StartIndex = 0; - query.VideoTypes = filters; - - reloadItems(page); - }); - - $('#chk3D', this).on('change', function () { - - query.StartIndex = 0; - query.Is3D = this.checked ? true : null; - - reloadItems(page); - }); - - $('#chkHD', this).on('change', function () { - - query.StartIndex = 0; - query.IsHD = this.checked ? true : null; - - reloadItems(page); - }); - - $('#chkSD', this).on('change', function () { - - query.StartIndex = 0; - query.IsHD = this.checked ? false : null; - - reloadItems(page); - }); - - $('#chkSubtitle', this).on('change', function () { - - query.StartIndex = 0; - query.HasSubtitles = this.checked ? true : null; - - reloadItems(page); - }); - - $('#chkTrailer', this).on('change', function () { - - query.StartIndex = 0; - query.HasTrailer = this.checked ? true : null; - - reloadItems(page); - }); - - $('#chkMissingTrailer', this).on('change', function () { - - query.StartIndex = 0; - query.HasTrailer = this.checked ? false : null; - - reloadItems(page); - }); - - $('#chkSpecialFeature', this).on('change', function () { - - query.StartIndex = 0; - query.HasSpecialFeature = this.checked ? true : null; - - reloadItems(page); - }); - - $('#chkThemeSong', this).on('change', function () { - - query.StartIndex = 0; - query.HasThemeSong = this.checked ? true : null; - - reloadItems(page); - }); - - $('#chkThemeVideo', this).on('change', function () { - - query.StartIndex = 0; - query.HasThemeVideo = this.checked ? true : null; - - reloadItems(page); - }); - - $('#radioBasicFilters', this).on('change', function () { - - if (this.checked) { - $('.basicFilters', page).show(); - $('.advancedFilters', page).hide(); - } else { - $('.basicFilters', page).hide(); - } - }); - - $('#radioAdvancedFilters', this).on('change', function () { - - if (this.checked) { - $('.advancedFilters', page).show(); - $('.basicFilters', page).hide(); - } else { - $('.advancedFilters', page).hide(); - } - }); - - //Management - $('#chkIsLocked', page).on('change', function () { - - query.StartIndex = 0; - query.IsLocked = this.checked ? true : null; - - reloadItems(page); - }); - - $('#chkMissingOverview', page).on('change', function () { - - query.StartIndex = 0; - query.HasOverview = this.checked ? false : null; - - reloadItems(page); - }); - - $('#chkMissingEpisode', page).on('change', function () { - - query.StartIndex = 0; - query.IsMissing = this.checked ? true : false; - - reloadItems(page); - }); - - $('#chkMissingRating', page).on('change', function () { - - query.StartIndex = 0; - query.HasOfficialRating = this.checked ? false : null; - - reloadItems(page); - }); - - $('#chkMissingImdbId', page).on('change', function () { - - query.StartIndex = 0; - query.HasImdbId = this.checked ? false : null; - - reloadItems(page); - }); - - $('#chkMissingTmdbId', page).on('change', function () { - - query.StartIndex = 0; - query.HasTmdbId = this.checked ? false : null; - - reloadItems(page); - }); - - $('#chkMissingTvdbId', page).on('change', function () { - - query.StartIndex = 0; - query.HasTvdbId = this.checked ? false : null; - - reloadItems(page); - }); - - //Episodes - $('#chkMissingEpisode', page).on('change', function () { - - query.StartIndex = 0; - query.IsMissing = this.checked ? true : false; - - reloadItems(page); - }); - - $('#chkFutureEpisode', page).on('change', function () { - - query.StartIndex = 0; - - if (this.checked) { - query.IsUnaired = true; - query.IsVirtualUnaired = null; - } else { - query.IsUnaired = null; - query.IsVirtualUnaired = false; - } - - - reloadItems(page); - }); - - $('#chkSpecialEpisode', page).on('change', function () { - - query.ParentIndexNumber = this.checked ? 0 : null; - - reloadItems(page); - }); - - $('.chkAirDays', this).on('change', function () { - - var filterName = this.getAttribute('data-filter'); - var filters = query.AirDays || ""; - - filters = (',' + filters).replace(',' + filterName, '').substring(1); - - if (this.checked) { - filters = filters ? (filters + ',' + filterName) : filterName; - } - - query.AirDays = filters; - query.StartIndex = 0; - reloadItems(page); - }); - - $('.chkStatus', this).on('change', function () { - - var filterName = this.getAttribute('data-filter'); - var filters = query.SeriesStatus || ""; - - filters = (',' + filters).replace(',' + filterName, '').substring(1); - - if (this.checked) { - filters = filters ? (filters + ',' + filterName) : filterName; - } - - query.SeriesStatus = filters; - query.StartIndex = 0; - reloadItems(page); - }); - - $(page.getElementsByClassName('viewTabButton')).on('click', function () { - - var parent = $(this).parents('.viewPanel'); - $('.viewTabButton', parent).removeClass('ui-btn-active'); - this.classList.add('ui-btn-active'); - - $('.viewTab', parent).addClass('hide'); - $('.' + this.getAttribute('data-tab'), parent).removeClass('hide'); - }); - }) - .on('pageshow', "#libraryReportManagerPage", function () { - - query.UserId = Dashboard.getCurrentUserId(); - var page = this; - query.SortOrder = "Ascending"; - - QueryReportFilters.onPageShow(page, query); - QueryReportColumns.onPageShow(page, query); - $('#selectIncludeItemTypes', page).val(query.IncludeItemTypes).trigger('change'); - - updateFilterControls(page); - - filtersLoaded = false; - updateFilterControls(this); - }); - - function renderOptions(page, selector, cssClass, items) { - - var elem; - - if (items.length) { - - elem = $(selector, page).show(); - - } else { - elem = $(selector, page).hide(); - } - - var html = ''; - - // style="margin: -.2em -.8em;" - html += '
'; - - var index = 0; - var idPrefix = 'chk' + selector.substring(1); - - html += items.map(function (filter) { - - var itemHtml = ''; - - var id = idPrefix + index; - var label = filter; - var value = filter; - var checked = false; - if (filter.FieldName) { - label = filter.Name; - value = filter.FieldName; - checked = filter.Visible; - } - itemHtml += ''; - itemHtml += ''),cellHtml+=header.Name||" ",header.SortField&&(cellHtml+="",header.SortField===defaultSortBy&&(cellHtml+="Descending"===query.SortOrder?'':''))),cellHtml+="",html+=cellHtml}),html+="",html+="",result.IsGrouped===!1?result.Rows.map(function(row){html+=getRow(result.Headers,row)}):result.Groups.map(function(group){html+='',html+=''+(group.Name||" ")+"",html+="",group.Rows.map(function(row){html+=getRow(result.Headers,row)}),html+="",html+=' ',html+=""}),html+="",html+=""}function getRow(rHeaders,rRow){var html="";html+="";for(var j=0;j'+rItem.Name+"";break;case"Edit":html+=''+rItem.Name+"";break;case"List":html+=''+rItem.Name+"";break;case"ItemByNameDetails":html+=''+rItem.Name+"";break;case"EmbeddedImage":rRow.HasEmbeddedImage&&(html+='
');break;case"SubtitleImage":rRow.HasSubtitles&&(html+='
');break;case"TrailersImage":rRow.HasLocalTrailer&&(html+='
');break;case"SpecialsImage":rRow.HasSpecials&&(html+='
');break;case"LockDataImage":rRow.HasLockData&&(html+='lock');break;case"TagsPrimaryImage":rRow.HasImageTagsPrimary||(html+='');break;case"TagsBackdropImage":rRow.HasImageTagsBackdrop||"Episode"!==rRow.RowType&&"Season"!==rRow.RowType&&"Audio"!==rRow.MediaType&&"TvChannel"!==rRow.RowType&&"MusicAlbum"!==rRow.RowType&&(html+='');break;case"TagsLogoImage":rRow.HasImageTagsLogo||"Movie"!==rRow.RowType&&"Trailer"!==rRow.RowType&&"Series"!==rRow.RowType&&"MusicArtist"!==rRow.RowType&&"BoxSet"!==rRow.RowType||(html+='');break;case"UserPrimaryImage":if(rRow.UserId){var userImage=ApiClient.getUserImageUrl(rRow.UserId,{height:24,type:"Primary"});html+=userImage?'':""}break;case"StatusImage":rRow.HasLockData&&(html+='lock'),rRow.HasLocalTrailer||"Movie"!==rRow.RowType||(html+='videocam'),rRow.HasImageTagsPrimary||(html+=''),rRow.HasImageTagsBackdrop||"Episode"!==rRow.RowType&&"Season"!==rRow.RowType&&"Audio"!==rRow.MediaType&&"TvChannel"!==rRow.RowType&&"MusicAlbum"!==rRow.RowType&&(html+=''),rRow.HasImageTagsLogo||"Movie"!==rRow.RowType&&"Trailer"!==rRow.RowType&&"Series"!==rRow.RowType&&"MusicArtist"!==rRow.RowType&&"BoxSet"!==rRow.RowType||(html+='');break;default:html+=rItem.Name}return html+=""}function ExportReport(page,e){query.UserId=Dashboard.getCurrentUserId(),query.HasQueryLimit=!1;var url=ApiClient.getUrl("Reports/Items/Download",query);url&&(window.location.href=url)}function loadGroupByFilters(page){query.UserId=Dashboard.getCurrentUserId();var url="";url=ApiClient.getUrl("Reports/Headers",query),ApiClient.getJSON(url).then(function(result){var selected="None";$("#selectReportGroup",page).find("option").remove().end(),$("#selectReportGroup",page).append(''),result.map(function(header){if(("Screen"===header.DisplayType||"ScreenExport"===header.DisplayType)&&header.CanGroup&&header.FieldName.length>0){var option='";$("#selectReportGroup",page).append(option),query.GroupBy===header.FieldName&&(selected=header.FieldName)}}),$("#selectPageSize",page).val(selected)})}function renderItems(page,result){window.scrollTo(0,0);var html="";"ReportData"===query.ReportView?($("#selectIncludeItemTypesBox",page).show(),$("#tabFilter",page).show()):($("#selectIncludeItemTypesBox",page).hide(),$("#tabFilterBox",page).hide(),$("#tabFilter",page).hide());var pagingHtml=libraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,updatePageSizeSetting:!1,viewButton:!0,showLimit:!1});switch("ReportData"!==query.ReportView&&"ReportActivities"!==query.ReportView||($(".listTopPaging",page).html(pagingHtml).trigger("create"),$(".listTopPaging",page).show(),$(".listBottomPaging",page).html(pagingHtml).trigger("create"),$(".listBottomPaging",page).show(),$(".btnNextPage",page).on("click",function(){query.StartIndex+=query.Limit,reloadItems(page)}),$(".btnNextPage",page).show(),$(".btnPreviousPage",page).on("click",function(){query.StartIndex-=query.Limit,reloadItems(page)}),$(".btnPreviousPage",page).show(),$("#btnReportExport",page).show(),$("#selectPageSizeBox",page).show(),$("#selectReportGroupingBox",page).show(),$("#grpReportsColumns",page).show(),html+=getTable(result),$(".reporContainer",page).html(html).trigger("create"),$(".lnkColumnSort",page).on("click",function(){var order=this.getAttribute("data-sortfield");query.SortBy===order?"Descending"===query.SortOrder?(query.SortOrder="Ascending",query.SortBy=defaultSortBy):(query.SortOrder="Descending",query.SortBy=order):(query.SortOrder="Ascending",query.SortBy=order),query.StartIndex=0,reloadItems(page)})),$("#GroupStatus",page).hide(),$("#GroupAirDays",page).hide(),$("#GroupEpisodes",page).hide(),query.IncludeItemTypes){case"Series":case"Season":$("#GroupStatus",page).show(),$("#GroupAirDays",page).show();break;case"Episode":$("#GroupStatus",page).show(),$("#GroupAirDays",page).show(),$("#GroupEpisodes",page).show()}$(".viewPanel",page).refresh}function reloadItems(page){Dashboard.showLoadingMsg(),query.UserId=Dashboard.getCurrentUserId();var url="";switch(query.ReportView){case"ReportData":query.HasQueryLimit=!0,url=ApiClient.getUrl("Reports/Items",query);break;case"ReportActivities":query.HasQueryLimit=!0,url=ApiClient.getUrl("Reports/Activities",query)}ApiClient.getJSON(url).then(function(result){updateFilterControls(page),renderItems(page,result)}),Dashboard.hideLoadingMsg()}function updateFilterControls(page){$(".chkStandardFilter",page).each(function(){var filters=","+(query.Filters||""),filterName=this.getAttribute("data-filter");this.checked=filters.indexOf(","+filterName)!=-1}),$(".chkVideoTypeFilter",page).each(function(){var filters=","+(query.VideoTypes||""),filterName=this.getAttribute("data-filter");this.checked=filters.indexOf(","+filterName)!=-1}),$(".chkStatus",page).each(function(){var filters=","+(query.SeriesStatus||""),filterName=this.getAttribute("data-filter");this.checked=filters.indexOf(","+filterName)!=-1}),$(".chkAirDays",page).each(function(){var filters=","+(query.AirDays||""),filterName=this.getAttribute("data-filter");this.checked=filters.indexOf(","+filterName)!=-1}),$("#chk3D",page).checked(1==query.Is3D),$("#chkHD",page).checked(1==query.IsHD),$("#chkSD",page).checked(0==query.IsHD),$("#chkSubtitle",page).checked(1==query.HasSubtitles),$("#chkTrailer",page).checked(1==query.HasTrailer),$("#chkMissingTrailer",page).checked(0==query.HasTrailer),$("#chkSpecialFeature",page).checked(1==query.HasSpecialFeature),$("#chkThemeSong",page).checked(1==query.HasThemeSong),$("#chkThemeVideo",page).checked(1==query.HasThemeVideo),$("#selectPageSize",page).val(query.Limit),$("#chkMissingRating",page).checked(0==query.HasOfficialRating),$("#chkMissingOverview",page).checked(0==query.HasOverview),$("#chkIsLocked",page).checked(1==query.IsLocked),$("#chkMissingImdbId",page).checked(0==query.HasImdbId),$("#chkMissingTmdbId",page).checked(0==query.HasTmdbId),$("#chkMissingTvdbId",page).checked(0==query.HasTvdbId),$("#chkSpecialEpisode",page).checked(0==query.ParentIndexNumber),$("#chkMissingEpisode",page).checked(1==query.IsMissing),$("#chkFutureEpisode",page).checked(1==query.IsUnaired),$("#selectIncludeItemTypes").val(query.IncludeItemTypes),1==query.IsFavorite?$("#isFavorite").val("true"):0==query.IsFavorite?$("#isFavorite").val("false"):$("#isFavorite").val("-")}function reloadFiltersIfNeeded(page){filtersLoaded||(filtersLoaded=!0,QueryReportFilters.loadFilters(page,Dashboard.getCurrentUserId(),query,function(){reloadItems(page)}),QueryReportColumns.loadColumns(page,Dashboard.getCurrentUserId(),query,function(){reloadItems(page)}))}function renderOptions(page,selector,cssClass,items){var elem;elem=items.length?$(selector,page).show():$(selector,page).hide();var html="";html+='
';var index=0,idPrefix="chk"+selector.substring(1);html+=items.map(function(filter){var itemHtml="",id=idPrefix+index,label=filter,value=filter,checked=!1;return filter.FieldName&&(label=filter.Name,value=filter.FieldName,checked=filter.Visible),itemHtml+='",itemHtml+='"; - - if (trigger.MaxRuntimeMs) { - html += '
'; - - var hours = trigger.MaxRuntimeMs / 3600000; - - if (hours == 1) { - html += Globalize.translate('ValueTimeLimitSingleHour'); - } else { - html += Globalize.translate('ValueTimeLimitMultiHour', hours); - } - html += '
'; - } - - html += '
'; - - html += ''; - - html += '
'; - } - - html += '
'; - - context.querySelector('.taskTriggers').innerHTML = html; - }, - - getTriggerFriendlyName: function (trigger) { - - if (trigger.Type == 'DailyTrigger') { - return 'Daily at ' + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks); - } - - if (trigger.Type == 'WeeklyTrigger') { - - return trigger.DayOfWeek + 's at ' + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks); - } - - if (trigger.Type == 'SystemEventTrigger') { - - if (trigger.SystemEvent == 'WakeFromSleep') { - return 'On wake from sleep'; - } - } - - if (trigger.Type == 'IntervalTrigger') { - - var hours = trigger.IntervalTicks / 36000000000; - - if (hours == .25) { - return "Every 15 minutes"; - } - if (hours == .5) { - return "Every 30 minutes"; - } - if (hours == .75) { - return "Every 45 minutes"; - } - if (hours == 1) { - return "Every hour"; - } - - return 'Every ' + hours + ' hours'; - } - - if (trigger.Type == 'StartupTrigger') { - return 'On application startup'; - } - - return trigger.Type; - }, - - getDisplayTime: function (ticks) { - - var hours = ticks / 36000000000; - - if (hours < 1) { - hours = 0; - } - - hours = Math.floor(hours); - - ticks -= (hours * 36000000000); - - var minutes = Math.floor((ticks / 600000000)); - - var suffix = "am"; - - if (hours > 11) { - suffix = "pm"; - } - - hours = hours % 12; - - if (hours == 0) { - hours = 12; - } - - if (minutes < 10) { - minutes = '0' + minutes; - } - - return hours + ':' + minutes + ' ' + suffix; - }, - - showAddTriggerPopup: function () { - - var page = $.mobile.activePage; - - $('#selectTriggerType', page).val('DailyTrigger').trigger('change'); - - $('#popupAddTrigger', page).on("popupafteropen", function () { - $('#addTriggerForm input:first', this).focus(); - }).popup("open").on("popupafterclose", function () { - - $('#addTriggerForm', page).off("submit"); - $(this).off("popupafterclose"); - }); - }, - - confirmDeleteTrigger: function (index) { - - require(['confirm'], function (confirm) { - confirm(Globalize.translate('MessageDeleteTaskTrigger'), Globalize.translate('HeaderDeleteTaskTrigger')).then(function () { - ScheduledTaskPage.deleteTrigger(index); - }); - }); - }, - - deleteTrigger: function (index) { - - Dashboard.showLoadingMsg(); - - var id = getParameterByName('id'); - - - ApiClient.getScheduledTask(id).then(function (task) { - - task.Triggers.remove(index); - - ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () { - - ScheduledTaskPage.refreshScheduledTask(); - - }); - - }); - }, - - refreshTriggerFields: function (triggerType) { - - var page = $.mobile.activePage; - - if (triggerType == 'DailyTrigger') { - - $('#fldTimeOfDay', page).show(); - $('#fldDayOfWeek', page).hide(); - $('#fldSelectSystemEvent', page).hide(); - $('#fldSelectInterval', page).hide(); - $('#txtTimeOfDay', page).attr('required', 'required'); - } - - else if (triggerType == 'WeeklyTrigger') { - $('#fldTimeOfDay', page).show(); - $('#fldDayOfWeek', page).show(); - $('#fldSelectSystemEvent', page).hide(); - $('#fldSelectInterval', page).hide(); - $('#txtTimeOfDay', page).attr('required', 'required'); - } - - else if (triggerType == 'SystemEventTrigger') { - $('#fldTimeOfDay', page).hide(); - $('#fldDayOfWeek', page).hide(); - $('#fldSelectSystemEvent', page).show(); - $('#fldSelectInterval', page).hide(); - $('#txtTimeOfDay', page).removeAttr('required'); - } - - else if (triggerType == 'IntervalTrigger') { - $('#fldTimeOfDay', page).hide(); - $('#fldDayOfWeek', page).hide(); - $('#fldSelectSystemEvent', page).hide(); - $('#fldSelectInterval', page).show(); - $('#txtTimeOfDay', page).removeAttr('required'); - } - - else if (triggerType == 'StartupTrigger') { - $('#fldTimeOfDay', page).hide(); - $('#fldDayOfWeek', page).hide(); - $('#fldSelectSystemEvent', page).hide(); - $('#fldSelectInterval', page).hide(); - $('#txtTimeOfDay', page).removeAttr('required'); - } - }, - - getTriggerToAdd: function () { - - var page = $.mobile.activePage; - - var trigger = { - Type: $('#selectTriggerType', page).val() - }; - - if (trigger.Type == 'DailyTrigger') { - trigger.TimeOfDayTicks = ScheduledTaskPage.getTimeOfDayTicks($('#txtTimeOfDay', page).val()); - } - - else if (trigger.Type == 'WeeklyTrigger') { - trigger.DayOfWeek = $('#selectDayOfWeek', page).val(); - trigger.TimeOfDayTicks = ScheduledTaskPage.getTimeOfDayTicks($('#txtTimeOfDay', page).val()); - } - - else if (trigger.Type == 'SystemEventTrigger') { - trigger.SystemEvent = $('#selectSystemEvent', page).val(); - } - - else if (trigger.Type == 'IntervalTrigger') { - trigger.IntervalTicks = $('#selectInterval', page).val(); - } - - var timeLimit = $('#txtTimeLimit', page).val() || '0'; - timeLimit = parseFloat(timeLimit) * 3600000; - - trigger.MaxRuntimeMs = timeLimit || null; - - return trigger; - }, - - getTimeOfDayTicks: function (val) { - - var vals = val.split(':'); - - var hours = vals[0]; - var minutes = vals[1].split(' ')[0]; - - // Add hours - var ticks = hours * 60 * 60 * 1000 * 10000; - - ticks += minutes * 60 * 1000 * 10000; - - return ticks; - } - }; - - (function () { - - function onSubmit() { - - Dashboard.showLoadingMsg(); - - var id = getParameterByName('id'); - - ApiClient.getScheduledTask(id).then(function (task) { - - task.Triggers.push(ScheduledTaskPage.getTriggerToAdd()); - - ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () { - - $('#popupAddTrigger').popup('close'); - - ScheduledTaskPage.refreshScheduledTask(); - - }); - - }); - - return false; - } - - $(document).on('pageinit', "#scheduledTaskPage", function () { - - var page = this; - - $('.addTriggerForm').off('submit', onSubmit).on('submit', onSubmit); - - page.querySelector('.timeFieldExample').innerHTML = Globalize.translate('ValueExample', '1:00 PM'); - - }).on('pageshow', "#scheduledTaskPage", function () { - - ScheduledTaskPage.refreshScheduledTask(); - }); - - })(); - -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";Array.prototype.remove=function(from,to){var rest=this.slice((to||from)+1||this.length);return this.length=from<0?this.length+from:from,this.push.apply(this,rest)},window.ScheduledTaskPage={refreshScheduledTask:function(){Dashboard.showLoadingMsg();var id=getParameterByName("id");ApiClient.getScheduledTask(id).then(ScheduledTaskPage.loadScheduledTask)},loadScheduledTask:function(task){var page=$($.mobile.activePage)[0];$(".taskName",page).html(task.Name),$("#pTaskDescription",page).html(task.Description),require(["listViewStyle"],function(){ScheduledTaskPage.loadTaskTriggers(page,task)}),Dashboard.hideLoadingMsg()},loadTaskTriggers:function(context,task){var html="";html+='
';for(var i=0,length=task.Triggers.length;i',html+='schedule',html+=trigger.MaxRuntimeMs?'
':'
',html+="
"+ScheduledTaskPage.getTriggerFriendlyName(trigger)+"
",trigger.MaxRuntimeMs){html+='
';var hours=trigger.MaxRuntimeMs/36e5;html+=1==hours?Globalize.translate("ValueTimeLimitSingleHour"):Globalize.translate("ValueTimeLimitMultiHour",hours),html+="
"}html+="
",html+='',html+="
"}html+="
",context.querySelector(".taskTriggers").innerHTML=html},getTriggerFriendlyName:function(trigger){if("DailyTrigger"==trigger.Type)return"Daily at "+ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);if("WeeklyTrigger"==trigger.Type)return trigger.DayOfWeek+"s at "+ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);if("SystemEventTrigger"==trigger.Type&&"WakeFromSleep"==trigger.SystemEvent)return"On wake from sleep";if("IntervalTrigger"==trigger.Type){var hours=trigger.IntervalTicks/36e9;return.25==hours?"Every 15 minutes":.5==hours?"Every 30 minutes":.75==hours?"Every 45 minutes":1==hours?"Every hour":"Every "+hours+" hours"}return"StartupTrigger"==trigger.Type?"On application startup":trigger.Type},getDisplayTime:function(ticks){var hours=ticks/36e9;hours<1&&(hours=0),hours=Math.floor(hours),ticks-=36e9*hours;var minutes=Math.floor(ticks/6e8),suffix="am";return hours>11&&(suffix="pm"),hours%=12,0==hours&&(hours=12),minutes<10&&(minutes="0"+minutes),hours+":"+minutes+" "+suffix},showAddTriggerPopup:function(){var page=$.mobile.activePage;$("#selectTriggerType",page).val("DailyTrigger").trigger("change"),$("#popupAddTrigger",page).on("popupafteropen",function(){$("#addTriggerForm input:first",this).focus()}).popup("open").on("popupafterclose",function(){$("#addTriggerForm",page).off("submit"),$(this).off("popupafterclose")})},confirmDeleteTrigger:function(index){require(["confirm"],function(confirm){confirm(Globalize.translate("MessageDeleteTaskTrigger"),Globalize.translate("HeaderDeleteTaskTrigger")).then(function(){ScheduledTaskPage.deleteTrigger(index)})})},deleteTrigger:function(index){Dashboard.showLoadingMsg();var id=getParameterByName("id");ApiClient.getScheduledTask(id).then(function(task){task.Triggers.remove(index),ApiClient.updateScheduledTaskTriggers(task.Id,task.Triggers).then(function(){ScheduledTaskPage.refreshScheduledTask()})})},refreshTriggerFields:function(triggerType){var page=$.mobile.activePage;"DailyTrigger"==triggerType?($("#fldTimeOfDay",page).show(),$("#fldDayOfWeek",page).hide(),$("#fldSelectSystemEvent",page).hide(),$("#fldSelectInterval",page).hide(),$("#txtTimeOfDay",page).attr("required","required")):"WeeklyTrigger"==triggerType?($("#fldTimeOfDay",page).show(),$("#fldDayOfWeek",page).show(),$("#fldSelectSystemEvent",page).hide(),$("#fldSelectInterval",page).hide(),$("#txtTimeOfDay",page).attr("required","required")):"SystemEventTrigger"==triggerType?($("#fldTimeOfDay",page).hide(),$("#fldDayOfWeek",page).hide(),$("#fldSelectSystemEvent",page).show(),$("#fldSelectInterval",page).hide(),$("#txtTimeOfDay",page).removeAttr("required")):"IntervalTrigger"==triggerType?($("#fldTimeOfDay",page).hide(),$("#fldDayOfWeek",page).hide(),$("#fldSelectSystemEvent",page).hide(),$("#fldSelectInterval",page).show(),$("#txtTimeOfDay",page).removeAttr("required")):"StartupTrigger"==triggerType&&($("#fldTimeOfDay",page).hide(),$("#fldDayOfWeek",page).hide(),$("#fldSelectSystemEvent",page).hide(),$("#fldSelectInterval",page).hide(),$("#txtTimeOfDay",page).removeAttr("required"))},getTriggerToAdd:function(){var page=$.mobile.activePage,trigger={Type:$("#selectTriggerType",page).val()};"DailyTrigger"==trigger.Type?trigger.TimeOfDayTicks=ScheduledTaskPage.getTimeOfDayTicks($("#txtTimeOfDay",page).val()):"WeeklyTrigger"==trigger.Type?(trigger.DayOfWeek=$("#selectDayOfWeek",page).val(),trigger.TimeOfDayTicks=ScheduledTaskPage.getTimeOfDayTicks($("#txtTimeOfDay",page).val())):"SystemEventTrigger"==trigger.Type?trigger.SystemEvent=$("#selectSystemEvent",page).val():"IntervalTrigger"==trigger.Type&&(trigger.IntervalTicks=$("#selectInterval",page).val());var timeLimit=$("#txtTimeLimit",page).val()||"0";return timeLimit=36e5*parseFloat(timeLimit),trigger.MaxRuntimeMs=timeLimit||null,trigger},getTimeOfDayTicks:function(val){var vals=val.split(":"),hours=vals[0],minutes=vals[1].split(" ")[0],ticks=60*hours*60*1e3*1e4;return ticks+=60*minutes*1e3*1e4}},function(){function onSubmit(){Dashboard.showLoadingMsg();var id=getParameterByName("id");return ApiClient.getScheduledTask(id).then(function(task){task.Triggers.push(ScheduledTaskPage.getTriggerToAdd()),ApiClient.updateScheduledTaskTriggers(task.Id,task.Triggers).then(function(){$("#popupAddTrigger").popup("close"),ScheduledTaskPage.refreshScheduledTask()})}),!1}$(document).on("pageinit","#scheduledTaskPage",function(){var page=this;$(".addTriggerForm").off("submit",onSubmit).on("submit",onSubmit),page.querySelector(".timeFieldExample").innerHTML=Globalize.translate("ValueExample","1:00 PM")}).on("pageshow","#scheduledTaskPage",function(){ScheduledTaskPage.refreshScheduledTask()})}()}); \ No newline at end of file diff --git a/dashboard-ui/scripts/scheduledtaskspage.js b/dashboard-ui/scripts/scheduledtaskspage.js index fb581fe95d..632058698b 100644 --- a/dashboard-ui/scripts/scheduledtaskspage.js +++ b/dashboard-ui/scripts/scheduledtaskspage.js @@ -1,301 +1 @@ -define(['jQuery', 'humanedate', 'listViewStyle'], function ($) { - 'use strict'; - - function reloadList(page) { - - ApiClient.getScheduledTasks({ isHidden: false }).then(function (tasks) { - - populateList(page, tasks); - - Dashboard.hideLoadingMsg(); - }); - } - - function populateList(page, tasks) { - tasks = tasks.sort(function (a, b) { - - a = a.Category + " " + a.Name; - b = b.Category + " " + b.Name; - - if (a == b) { - return 0; - } - - if (a < b) { - return -1; - } - - return 1; - }); - - var html = ""; - - var currentCategory; - - for (var i = 0, length = tasks.length; i < length; i++) { - - var task = tasks[i]; - - if (task.Category != currentCategory) { - currentCategory = task.Category; - - if (currentCategory) { - html += '
'; - html += '
'; - } - html += '
'; - html += '

'; - html += currentCategory; - html += '

'; - - html += '
'; - } - - html += '
'; - - html += ""; - html += 'schedule'; - html += ""; - - html += ''; - - if (task.State == "Idle") { - - html += ''; - } - else if (task.State == "Running") { - - html += ''; - - } else { - - html += ''; - } - - html += '
'; - } - - if (tasks.length) { - html += '
'; - html += '
'; - } - - var divScheduledTasks = page.querySelector('.divScheduledTasks'); - divScheduledTasks.innerHTML = html; - } - - function humane_elapsed(firstDateStr, secondDateStr) { - var dt1 = new Date(firstDateStr); - var dt2 = new Date(secondDateStr); - var seconds = (dt2.getTime() - dt1.getTime()) / 1000; - var numdays = Math.floor((seconds % 31536000) / 86400); - var numhours = Math.floor(((seconds % 31536000) % 86400) / 3600); - var numminutes = Math.floor((((seconds % 31536000) % 86400) % 3600) / 60); - var numseconds = Math.round((((seconds % 31536000) % 86400) % 3600) % 60); - - var elapsedStr = ''; - elapsedStr += numdays == 1 ? numdays + ' day ' : ''; - elapsedStr += numdays > 1 ? numdays + ' days ' : ''; - elapsedStr += numhours == 1 ? numhours + ' hour ' : ''; - elapsedStr += numhours > 1 ? numhours + ' hours ' : ''; - elapsedStr += numminutes == 1 ? numminutes + ' minute ' : ''; - elapsedStr += numminutes > 1 ? numminutes + ' minutes ' : ''; - elapsedStr += elapsedStr.length > 0 ? 'and ' : ''; - elapsedStr += numseconds == 1 ? numseconds + ' second' : ''; - elapsedStr += numseconds == 0 || numseconds > 1 ? numseconds + ' seconds' : ''; - - return elapsedStr; - - } - - function getTaskProgressHtml(task) { - var html = ''; - - if (task.State == "Idle") { - - if (task.LastExecutionResult) { - - html += Globalize.translate('LabelScheduledTaskLastRan').replace("{0}", humane_date(task.LastExecutionResult.EndTimeUtc)) - .replace("{1}", humane_elapsed(task.LastExecutionResult.StartTimeUtc, task.LastExecutionResult.EndTimeUtc)); - - if (task.LastExecutionResult.Status == "Failed") { - html += " (" + Globalize.translate('LabelFailed') + ")"; - } - else if (task.LastExecutionResult.Status == "Cancelled") { - html += " (" + Globalize.translate('LabelCancelled') + ")"; - } - else if (task.LastExecutionResult.Status == "Aborted") { - html += " " + Globalize.translate('LabelAbortedByServerShutdown') + ""; - } - } - } - else if (task.State == "Running") { - - var progress = (task.CurrentProgressPercentage || 0).toFixed(1); - - html += '
'; - html += '
'; - html += '
'; - html += '
'; - html += '
'; - - html += "" + progress + "%"; - html += '
'; - - } else { - - html += "" + Globalize.translate('LabelStopping') + ""; - } - - return html; - } - - function onWebSocketMessage(e, msg) { - if (msg.MessageType == "ScheduledTasksInfo") { - - var tasks = msg.Data; - - var page = $($.mobile.activePage)[0]; - - updateTasks(page, tasks); - } - } - - function updateTasks(page, tasks) { - for (var i = 0, length = tasks.length; i < length; i++) { - - var task = tasks[i]; - - page.querySelector('#taskProgress' + task.Id).innerHTML = getTaskProgressHtml(task); - - var btnTask = page.querySelector('#btnTask' + task.Id); - - updateTaskButton(btnTask, task.State); - } - } - - function updateTaskButton(elem, state) { - - if (state == "Idle") { - - elem.classList.add('btnStartTask'); - elem.classList.remove('btnStopTask'); - elem.classList.remove('hide'); - elem.querySelector('i').innerHTML = 'play_arrow'; - elem.title = Globalize.translate('ButtonStart'); - } - else if (state == "Running") { - - elem.classList.remove('btnStartTask'); - elem.classList.add('btnStopTask'); - elem.classList.remove('hide'); - elem.querySelector('i').innerHTML = 'stop'; - elem.title = Globalize.translate('ButtonStop'); - - } else { - - elem.classList.add('btnStartTask'); - elem.classList.remove('btnStopTask'); - elem.classList.add('hide'); - elem.querySelector('i').innerHTML = 'play_arrow'; - elem.title = Globalize.translate('ButtonStart'); - } - - var item = $(elem).parents('.listItem')[0]; - item.setAttribute('data-status', state); - } - - function onWebSocketConnectionOpen() { - - var page = $($.mobile.activePage)[0]; - - startInterval(); - reloadList(page); - } - - var pollInterval; - function onPollIntervalFired() { - - var page = $($.mobile.activePage)[0]; - - if (!ApiClient.isWebSocketOpen()) { - reloadList(page); - } - } - - function startInterval() { - if (ApiClient.isWebSocketOpen()) { - ApiClient.sendWebSocketMessage("ScheduledTasksInfoStart", "1000,1000"); - } - if (pollInterval) { - clearInterval(pollInterval); - } - pollInterval = setInterval(onPollIntervalFired, 5000); - } - - function stopInterval() { - if (ApiClient.isWebSocketOpen()) { - ApiClient.sendWebSocketMessage("ScheduledTasksInfoStop"); - } - if (pollInterval) { - clearInterval(pollInterval); - } - } - - $(document).on('pageinit', "#scheduledTasksPage", function () { - - var page = this; - - $('.divScheduledTasks', page).on('click', '.btnStartTask', function () { - - var button = this; - var id = button.getAttribute('data-taskid'); - ApiClient.startScheduledTask(id).then(function () { - - updateTaskButton(button, "Running"); - reloadList(page); - }); - - }).on('click', '.btnStopTask', function () { - - var button = this; - var id = button.getAttribute('data-taskid'); - ApiClient.stopScheduledTask(id).then(function () { - - updateTaskButton(button, ""); - reloadList(page); - }); - }); - - }).on('pageshow', "#scheduledTasksPage", function () { - - var page = this; - - Dashboard.showLoadingMsg(); - - startInterval(); - - reloadList(page); - - Events.on(ApiClient, "websocketmessage", onWebSocketMessage); - Events.on(ApiClient, "websocketopen", onWebSocketConnectionOpen); - - }).on('pagebeforehide', "#scheduledTasksPage", function () { - - var page = this; - - Events.off(ApiClient, "websocketmessage", onWebSocketMessage); - Events.off(ApiClient, "websocketopen", onWebSocketConnectionOpen); - stopInterval(); - }); - -}); \ No newline at end of file +define(["jQuery","humanedate","listViewStyle"],function($){"use strict";function reloadList(page){ApiClient.getScheduledTasks({isHidden:!1}).then(function(tasks){populateList(page,tasks),Dashboard.hideLoadingMsg()})}function populateList(page,tasks){tasks=tasks.sort(function(a,b){return a=a.Category+" "+a.Name,b=b.Category+" "+b.Name,a==b?0:a",html+="
"),html+='
',html+="

",html+=currentCategory,html+="

",html+='
'),html+='
',html+="",html+='schedule',html+="",html+='",html+="Idle"==task.State?'':"Running"==task.State?'':'',html+="
"}tasks.length&&(html+="
",html+="
");var divScheduledTasks=page.querySelector(".divScheduledTasks");divScheduledTasks.innerHTML=html}function humane_elapsed(firstDateStr,secondDateStr){var dt1=new Date(firstDateStr),dt2=new Date(secondDateStr),seconds=(dt2.getTime()-dt1.getTime())/1e3,numdays=Math.floor(seconds%31536e3/86400),numhours=Math.floor(seconds%31536e3%86400/3600),numminutes=Math.floor(seconds%31536e3%86400%3600/60),numseconds=Math.round(seconds%31536e3%86400%3600%60),elapsedStr="";return elapsedStr+=1==numdays?numdays+" day ":"",elapsedStr+=numdays>1?numdays+" days ":"",elapsedStr+=1==numhours?numhours+" hour ":"",elapsedStr+=numhours>1?numhours+" hours ":"",elapsedStr+=1==numminutes?numminutes+" minute ":"",elapsedStr+=numminutes>1?numminutes+" minutes ":"",elapsedStr+=elapsedStr.length>0?"and ":"",elapsedStr+=1==numseconds?numseconds+" second":"",elapsedStr+=0==numseconds||numseconds>1?numseconds+" seconds":""}function getTaskProgressHtml(task){var html="";if("Idle"==task.State)task.LastExecutionResult&&(html+=Globalize.translate("LabelScheduledTaskLastRan").replace("{0}",humane_date(task.LastExecutionResult.EndTimeUtc)).replace("{1}",humane_elapsed(task.LastExecutionResult.StartTimeUtc,task.LastExecutionResult.EndTimeUtc)),"Failed"==task.LastExecutionResult.Status?html+=" ("+Globalize.translate("LabelFailed")+")":"Cancelled"==task.LastExecutionResult.Status?html+=" ("+Globalize.translate("LabelCancelled")+")":"Aborted"==task.LastExecutionResult.Status&&(html+=" "+Globalize.translate("LabelAbortedByServerShutdown")+""));else if("Running"==task.State){var progress=(task.CurrentProgressPercentage||0).toFixed(1);html+='
',html+='
',html+='
',html+="
",html+="
",html+=""+progress+"%",html+="
"}else html+=""+Globalize.translate("LabelStopping")+"";return html}function onWebSocketMessage(e,msg){if("ScheduledTasksInfo"==msg.MessageType){var tasks=msg.Data,page=$($.mobile.activePage)[0];updateTasks(page,tasks)}}function updateTasks(page,tasks){for(var i=0,length=tasks.length;i'; - itemHtml += i.Name; - itemHtml += '
'; - return itemHtml; - - }).join(''); - - page.querySelector('.searchSuggestions').innerHTML = html; - }); - } - - return function (view, params) { - - var textSuggestions = view.querySelector('.textSuggestions'); - var searchResults = view.querySelector('.searchResults'); - var searchHintTimeout; - - function clearSearchHintTimeout() { - - if (searchHintTimeout) { - - clearTimeout(searchHintTimeout); - searchHintTimeout = null; - } - } - - function showTextSuggestions() { - textSuggestions.classList.remove('hide'); - } - - function getAdditionalTextLines(hint) { - - if (hint.Type == "Audio") { - - return [[hint.AlbumArtist, hint.Album].join(" - ")]; - - } - else if (hint.Type == "MusicAlbum") { - - return [hint.AlbumArtist]; - - } - else if (hint.Type == "MusicArtist") { - - return [Globalize.translate('LabelArtist')]; - - } - else if (hint.Type == "Movie") { - - return [Globalize.translate('LabelMovie')]; - - } - else if (hint.Type == "MusicVideo") { - - return [Globalize.translate('LabelMusicVideo')]; - } - else if (hint.Type == "Episode") { - - return [Globalize.translate('LabelEpisode')]; - - } - else if (hint.Type == "Series") { - - return [Globalize.translate('Series')]; - } - else if (hint.Type == "BoxSet") { - - return [Globalize.translate('LabelCollection')]; - } - else if (hint.ChannelName) { - - return [hint.ChannelName]; - } - - return [hint.Type]; - } - - function renderSearchResultsInOverlay(hints) { - - // Massage the objects to look like regular items - hints = hints.map(function (i) { - - i.Id = i.ItemId; - i.ImageTags = {}; - i.UserData = {}; - - if (i.PrimaryImageTag) { - i.ImageTags.Primary = i.PrimaryImageTag; - } - return i; - }); - - var html = cardBuilder.getCardsHtml({ - items: hints, - shape: "auto", - overlayText: false, - showTitle: true, - centerImage: true, - centerText: true, - textLines: getAdditionalTextLines, - overlayMoreButton: true, - serverId: ApiClient.serverInfo().Id - }); - - if (!hints.length) { - html = '

' + Globalize.translate('NoResultsFound') + '

'; - } - - var itemsContainer = searchResults; - itemsContainer.innerHTML = html; - searchResults.classList.remove('hide'); - textSuggestions.classList.add('hide'); - imageLoader.lazyChildren(itemsContainer); - } - - function requestSearchHintsForOverlay(searchTerm) { - - var currentTimeout = searchHintTimeout; - Dashboard.showLoadingMsg(); - - ApiClient.getSearchHints({ - - userId: Dashboard.getCurrentUserId(), - searchTerm: (searchTerm || '').trim(), - limit: 30 - - }).then(function (result) { - - if (currentTimeout == searchHintTimeout) { - renderSearchResultsInOverlay(result.SearchHints); - } - - Dashboard.hideLoadingMsg(); - }, function () { - Dashboard.hideLoadingMsg(); - }); - } - - function onSearchChange(val) { - - if (!val) { - clearSearchHintTimeout(); - searchResults.classList.add('hide'); - searchResults.innerHTML = ''; - showTextSuggestions(); - return; - } - - clearSearchHintTimeout(); - - searchHintTimeout = setTimeout(function () { - requestSearchHintsForOverlay(val); - }, 300); - } - - showTextSuggestions(); - loadSuggestions(view); - - view.querySelector('.txtSearch').addEventListener('input', function () { - onSearchChange(this.value); - }); - - view.querySelector('.btnBack').addEventListener('click', function () { - embyRouter.back(); - }); - - view.addEventListener('viewbeforeshow', function (e) { - document.body.classList.add('hiddenViewMenuBar'); - }); - - view.addEventListener('viewbeforehide', function (e) { - - document.body.classList.remove('hiddenViewMenuBar'); - }); - - }; -}); \ No newline at end of file +define(["libraryBrowser","focusManager","embyRouter","cardBuilder","imageLoader","emby-input","paper-icon-button-light","material-icons","emby-itemscontainer"],function(libraryBrowser,focusManager,embyRouter,cardBuilder,imageLoader){"use strict";function loadSuggestions(page){var options={SortBy:"IsFavoriteOrLiked,Random",IncludeItemTypes:"Movie,Series,MusicArtist",Limit:20,Recursive:!0,ImageTypeLimit:0,EnableImages:!1};ApiClient.getItems(Dashboard.getCurrentUserId(),options).then(function(result){var html=result.Items.map(function(i){var href=LibraryBrowser.getHref(i),itemHtml='"}).join("");page.querySelector(".searchSuggestions").innerHTML=html})}return function(view,params){function clearSearchHintTimeout(){searchHintTimeout&&(clearTimeout(searchHintTimeout),searchHintTimeout=null)}function showTextSuggestions(){textSuggestions.classList.remove("hide")}function getAdditionalTextLines(hint){return"Audio"==hint.Type?[[hint.AlbumArtist,hint.Album].join(" - ")]:"MusicAlbum"==hint.Type?[hint.AlbumArtist]:"MusicArtist"==hint.Type?[Globalize.translate("LabelArtist")]:"Movie"==hint.Type?[Globalize.translate("LabelMovie")]:"MusicVideo"==hint.Type?[Globalize.translate("LabelMusicVideo")]:"Episode"==hint.Type?[Globalize.translate("LabelEpisode")]:"Series"==hint.Type?[Globalize.translate("Series")]:"BoxSet"==hint.Type?[Globalize.translate("LabelCollection")]:hint.ChannelName?[hint.ChannelName]:[hint.Type]}function renderSearchResultsInOverlay(hints){hints=hints.map(function(i){return i.Id=i.ItemId,i.ImageTags={},i.UserData={},i.PrimaryImageTag&&(i.ImageTags.Primary=i.PrimaryImageTag),i});var html=cardBuilder.getCardsHtml({items:hints,shape:"auto",overlayText:!1,showTitle:!0,centerImage:!0,centerText:!0,textLines:getAdditionalTextLines,overlayMoreButton:!0,serverId:ApiClient.serverInfo().Id});hints.length||(html='

'+Globalize.translate("NoResultsFound")+"

");var itemsContainer=searchResults;itemsContainer.innerHTML=html,searchResults.classList.remove("hide"),textSuggestions.classList.add("hide"),imageLoader.lazyChildren(itemsContainer)}function requestSearchHintsForOverlay(searchTerm){var currentTimeout=searchHintTimeout;Dashboard.showLoadingMsg(),ApiClient.getSearchHints({userId:Dashboard.getCurrentUserId(),searchTerm:(searchTerm||"").trim(),limit:30}).then(function(result){currentTimeout==searchHintTimeout&&renderSearchResultsInOverlay(result.SearchHints),Dashboard.hideLoadingMsg()},function(){Dashboard.hideLoadingMsg()})}function onSearchChange(val){return val?(clearSearchHintTimeout(),void(searchHintTimeout=setTimeout(function(){requestSearchHintsForOverlay(val)},300))):(clearSearchHintTimeout(),searchResults.classList.add("hide"),searchResults.innerHTML="",void showTextSuggestions())}var searchHintTimeout,textSuggestions=view.querySelector(".textSuggestions"),searchResults=view.querySelector(".searchResults");showTextSuggestions(),loadSuggestions(view),view.querySelector(".txtSearch").addEventListener("input",function(){onSearchChange(this.value)}),view.querySelector(".btnBack").addEventListener("click",function(){embyRouter.back()}),view.addEventListener("viewbeforeshow",function(e){document.body.classList.add("hiddenViewMenuBar")}),view.addEventListener("viewbeforehide",function(e){document.body.classList.remove("hiddenViewMenuBar")})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/secondaryitems.js b/dashboard-ui/scripts/secondaryitems.js index ce844b8929..c46e9d9e95 100644 --- a/dashboard-ui/scripts/secondaryitems.js +++ b/dashboard-ui/scripts/secondaryitems.js @@ -1,277 +1 @@ -define(['libraryBrowser', 'listView', 'cardBuilder', 'imageLoader', 'emby-itemscontainer'], function (libraryBrowser, listView, cardBuilder, imageLoader) { - 'use strict'; - - return function (view, params) { - - var data = {}; - - function addCurrentItemToQuery(query, item) { - - if (params.parentId) { - query.ParentId = params.parentId; - } - - if (item.Type == "Person") { - query.PersonIds = item.Id; - } - else if (item.Type == "Genre") { - query.Genres = item.Name; - } - else if (item.Type == "MusicGenre") { - query.Genres = item.Name; - } - else if (item.Type == "GameGenre") { - query.Genres = item.Name; - } - else if (item.Type == "Studio") { - query.StudioIds = item.Id; - } - else if (item.Type == "MusicArtist") { - query.ArtistIds = item.Id; - } else { - query.ParentId = item.Id; - } - } - - function getQuery(parentItem) { - - var key = getSavedQueryKey(); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - SortBy: "SortName", - SortOrder: "Ascending", - Recursive: params.recursive !== 'false', - Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - StartIndex: 0, - Limit: libraryBrowser.getDefaultPageSize() - } - }; - - var type = params.type; - if (type) { - pageData.query.IncludeItemTypes = type; - - if (type == 'Audio') { - pageData.query.SortBy = 'Album,SortName'; - } - } - - var filters = params.filters; - if (type) { - pageData.query.Filters = filters; - } - - if (parentItem) { - addCurrentItemToQuery(pageData.query, parentItem); - } - - libraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData.query; - } - - function getSavedQueryKey() { - - return libraryBrowser.getSavedQueryKey(); - } - - function parentWithClass(elem, className) { - - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - - if (!elem) { - return null; - } - } - - return elem; - } - function onListItemClick(e) { - - var mediaItem = parentWithClass(e.target, 'mediaItem'); - if (mediaItem) { - var info = libraryBrowser.getListItemInfo(mediaItem); - - if (info.mediaType == 'Photo') { - var query = getQuery(); - - require(['scripts/photos'], function () { - Photos.startSlideshow(view, query, info.id); - }); - return false; - } - } - } - - function onViewStyleChange(parentItem) { - - var query = getQuery(parentItem); - - var itemsContainer = view.querySelector('#items'); - - if (query.IncludeItemTypes == "Audio") { - - itemsContainer.classList.add('vertical-list'); - itemsContainer.classList.remove('vertical-wrap'); - - } else { - - itemsContainer.classList.remove('vertical-list'); - itemsContainer.classList.add('vertical-wrap'); - } - } - - function reloadItems(parentItem) { - - Dashboard.showLoadingMsg(); - - var query = getQuery(parentItem); - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - var html = ''; - var pagingHtml = libraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false - }); - - var i, length; - var elems; - - elems = view.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].innerHTML = pagingHtml; - } - - var itemsContainer = view.querySelector('#items'); - - if (query.IncludeItemTypes == "Audio") { - - html = listView.getListViewHtml({ - items: result.Items, - playFromHere: true, - action: 'playallfromhere', - smallIcon: true - }); - - } else { - - var posterOptions = { - items: result.Items, - shape: "auto", - centerText: true, - lazy: true - }; - - if (query.IncludeItemTypes == "MusicAlbum") { - posterOptions.overlayText = false; - posterOptions.showParentTitle = true; - posterOptions.showTitle = true; - posterOptions.overlayPlayButton = true; - } - else if (query.IncludeItemTypes == "MusicArtist") { - posterOptions.overlayText = false; - posterOptions.overlayPlayButton = true; - } - else if (query.IncludeItemTypes == "Episode") { - posterOptions.overlayText = false; - posterOptions.showParentTitle = true; - posterOptions.showTitle = true; - posterOptions.overlayPlayButton = true; - } - - // Poster - html = cardBuilder.getCardsHtml(posterOptions); - } - - itemsContainer.innerHTML = html; - imageLoader.lazyChildren(itemsContainer); - - function onNextPageClick() { - query.StartIndex += query.Limit; - reloadItems(view); - } - - function onPreviousPageClick() { - query.StartIndex -= query.Limit; - reloadItems(view); - } - - elems = view.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); - } - - elems = view.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); - } - - Dashboard.hideLoadingMsg(); - }); - } - - view.addEventListener('click', onListItemClick); - - function getItemPromise() { - - var id = params.genreId || params.studioId || params.artistId || params.personId || params.parentId; - - if (id) { - return ApiClient.getItem(Dashboard.getCurrentUserId(), id); - } - - var name = params.genre; - - if (name) { - return ApiClient.getGenre(name, Dashboard.getCurrentUserId()); - } - - name = params.musicgenre; - - if (name) { - return ApiClient.getMusicGenre(name, Dashboard.getCurrentUserId()); - } - - name = params.gamegenre; - - if (name) { - return ApiClient.getGameGenre(name, Dashboard.getCurrentUserId()); - } - - return null; - } - - view.addEventListener('viewbeforeshow', function (e) { - - var parentPromise = getItemPromise(); - - if (parentPromise) { - parentPromise.then(function (parent) { - LibraryMenu.setTitle(parent.Name); - - onViewStyleChange(parent); - reloadItems(parent); - }); - } - - else { - onViewStyleChange(); - reloadItems(); - } - }); - }; - - -}); \ No newline at end of file +define(["libraryBrowser","listView","cardBuilder","imageLoader","emby-itemscontainer"],function(libraryBrowser,listView,cardBuilder,imageLoader){"use strict";return function(view,params){function addCurrentItemToQuery(query,item){params.parentId&&(query.ParentId=params.parentId),"Person"==item.Type?query.PersonIds=item.Id:"Genre"==item.Type?query.Genres=item.Name:"MusicGenre"==item.Type?query.Genres=item.Name:"GameGenre"==item.Type?query.Genres=item.Name:"Studio"==item.Type?query.StudioIds=item.Id:"MusicArtist"==item.Type?query.ArtistIds=item.Id:query.ParentId=item.Id}function getQuery(parentItem){var key=getSavedQueryKey(),pageData=data[key];if(!pageData){pageData=data[key]={query:{SortBy:"SortName",SortOrder:"Ascending",Recursive:"false"!==params.recursive,Fields:"PrimaryImageAspectRatio,SortName,BasicSyncInfo",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",StartIndex:0,Limit:libraryBrowser.getDefaultPageSize()}};var type=params.type;type&&(pageData.query.IncludeItemTypes=type,"Audio"==type&&(pageData.query.SortBy="Album,SortName"));var filters=params.filters;type&&(pageData.query.Filters=filters),parentItem&&addCurrentItemToQuery(pageData.query,parentItem),libraryBrowser.loadSavedQueryValues(key,pageData.query)}return pageData.query}function getSavedQueryKey(){return libraryBrowser.getSavedQueryKey()}function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}function onListItemClick(e){var mediaItem=parentWithClass(e.target,"mediaItem");if(mediaItem){var info=libraryBrowser.getListItemInfo(mediaItem);if("Photo"==info.mediaType){var query=getQuery();return require(["scripts/photos"],function(){Photos.startSlideshow(view,query,info.id)}),!1}}}function onViewStyleChange(parentItem){var query=getQuery(parentItem),itemsContainer=view.querySelector("#items");"Audio"==query.IncludeItemTypes?(itemsContainer.classList.add("vertical-list"),itemsContainer.classList.remove("vertical-wrap")):(itemsContainer.classList.remove("vertical-list"),itemsContainer.classList.add("vertical-wrap"))}function reloadItems(parentItem){Dashboard.showLoadingMsg();var query=getQuery(parentItem);ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){function onNextPageClick(){query.StartIndex+=query.Limit,reloadItems(view)}function onPreviousPageClick(){query.StartIndex-=query.Limit,reloadItems(view)}window.scrollTo(0,0);var i,length,elems,html="",pagingHtml=libraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1});for(elems=view.querySelectorAll(".paging"),i=0,length=elems.length;i'; - html += '
'; - - html += "
"; - html += '' + icon + ''; - html += '' + item.Name + ''; - html += "
"; - - html += "
"; - - html += ""; - } - - return html; - } - - function loadlibraryButtons(elem, userId, index) { - - return getUserViews(userId).then(function (items) { - - var html = '
'; - - if (index) { - html += '

' + Globalize.translate('HeaderMyMedia') + '

'; - } - html += '
'; - html += getLibraryButtonsHtml(items); - html += '
'; - - return getAppInfo().then(function (infoHtml) { - - elem.innerHTML = html + infoHtml; - }); - }); - } - - /** - * Returns a random integer between min (inclusive) and max (inclusive) - * Using Math.round() will give you a non-uniform distribution! - */ - function getRandomInt(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; - } - - function getAppInfo() { - - var frequency = 86400000; - - if (AppInfo.isNativeApp) { - frequency = 172800000; - } - - var cacheKey = 'lastappinfopresent5'; - var lastDatePresented = parseInt(appSettings.get(cacheKey) || '0'); - - // Don't show the first time, right after installation - if (!lastDatePresented) { - appSettings.set(cacheKey, new Date().getTime()); - return Promise.resolve(''); - } - - if ((new Date().getTime() - lastDatePresented) < frequency) { - return Promise.resolve(''); - } - - return Dashboard.getPluginSecurityInfo().then(function (pluginSecurityInfo) { - - appSettings.set(cacheKey, new Date().getTime()); - - if (pluginSecurityInfo.IsMBSupporter) { - return ''; - } - - var infos = [getPremiereInfo]; - - if (!browserInfo.safari || !AppInfo.isNativeApp) { - infos.push(getTheaterInfo); - } - - return infos[getRandomInt(0, infos.length - 1)](); - }); - } - - function getCard(img, target, shape) { - - shape = shape || 'backdropCard'; - var html = '
'; - - if (target) { - html += ''; - } else { - html += ''; - } - - html += '
'; - - return html; - } - - function getTheaterInfo() { - - var html = ''; - html += '
'; - html += '

Discover Emby Theater

'; - - var nameText = AppInfo.isNativeApp ? 'Emby Theater' : 'Emby Theater'; - html += '

A beautiful app for your TV and large screen tablet. ' + nameText + ' runs on Windows, Xbox One, Raspberry Pi, Samsung Smart TVs, Sony PS4, Web Browsers, and more.

'; - html += '
'; - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png', 'https://emby.media/download'); - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png', 'https://emby.media/download'); - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png', 'https://emby.media/download'); - html += '
'; - html += '
'; - html += '
'; - return html; - } - - function getPremiereInfo() { - - var html = ''; - html += '
'; - html += '

Discover Emby Premiere

'; - - var cardTarget = AppInfo.isNativeApp ? '' : 'https://emby.media/premiere'; - var learnMoreText = AppInfo.isNativeApp ? '' : 'Learn more'; - - html += '

Design beautiful Cover Art, enjoy free access to Emby apps, and more. ' + learnMoreText + '

'; - html += '
'; - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png', cardTarget); - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png', cardTarget); - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png', cardTarget); - html += '
'; - html += '
'; - html += '
'; - return html; - } - - function getUpgradeMobileLayoutsInfo() { - var html = ''; - html += '
'; - html += '

Unlock Improved Layouts with Emby Premiere

'; - - var cardTarget = AppInfo.isNativeApp ? '' : 'https://emby.media/premiere'; - var learnMoreText = AppInfo.isNativeApp ? '' : 'Learn more'; - - html += '

Combined horizontal and vertical swiping, better detail layouts, and more. ' + learnMoreText + '

'; - html += '
'; - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/ms1.png', cardTarget, 'portraitCard'); - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/ms2.png', cardTarget, 'portraitCard'); - html += '
'; - html += '
'; - html += '
'; - return html; - } - - function renderLatestSection(elem, user, parent) { - - var options = { - - Limit: 12, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", - ParentId: parent.Id - }; - - return ApiClient.getJSON(ApiClient.getUrl('Users/' + user.Id + '/Items/Latest', options)).then(function (items) { - - var html = ''; - - var scrollX = enableScrollX(); - - if (items.length) { - - html += '
'; - html += '

' + Globalize.translate('LatestFromLibrary', parent.Name) + '

'; - html += ''; - html += '
'; - - if (scrollX) { - html += '
'; - } else { - html += '
'; - } - - var viewType = parent.CollectionType; - - var shape = viewType === 'movies' ? - getPortraitShape() : - viewType === 'music' ? - getSquareShape() : - getThumbShape(); - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = supportsImageAnalysis && (viewType === 'music' || viewType === 'movies' || viewType === 'tvshows' || !viewType); - - html += cardBuilder.getCardsHtml({ - items: items, - shape: shape, - preferThumb: viewType !== 'movies' && viewType !== 'music', - showUnplayedIndicator: false, - showChildCountIndicator: true, - context: 'home', - overlayText: false, - centerText: !cardLayout, - overlayPlayButton: viewType !== 'photos', - allowBottomPadding: !enableScrollX() && !cardLayout, - cardLayout: cardLayout, - showTitle: viewType === 'music' || !viewType || (cardLayout && (viewType === 'movies' || viewType === 'tvshows')), - showYear: cardLayout && viewType === 'movies', - showSeriesYear: cardLayout && viewType === 'tvshows', - showParentTitle: viewType === 'music' || !viewType || (cardLayout && (viewType === 'tvshows')), - vibrant: supportsImageAnalysis && cardLayout, - lines: 2 - }); - html += '
'; - } - - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - }); - } - - function loadRecentlyAdded(elem, user) { - - elem.classList.remove('homePageSection'); - - return getUserViews(user.Id).then(function (items) { - - var excludeViewTypes = ['playlists', 'livetv', 'boxsets', 'channels']; - var excludeItemTypes = ['Channel']; - - for (var i = 0, length = items.length; i < length; i++) { - - var item = items[i]; - - if (user.Configuration.LatestItemsExcludes.indexOf(item.Id) !== -1) { - continue; - } - - if (excludeViewTypes.indexOf(item.CollectionType || []) !== -1) { - continue; - } - - // not implemented yet - if (excludeItemTypes.indexOf(item.Type) !== -1) { - continue; - } - - var frag = document.createElement('div'); - frag.classList.add('homePageSection'); - elem.appendChild(frag); - - renderLatestSection(frag, user, item); - } - }); - } - - function loadLatestChannelMedia(elem, userId) { - - var screenWidth = dom.getWindowSize().innerWidth; - - var options = { - - Limit: screenWidth >= 2400 ? 10 : (screenWidth >= 1600 ? 10 : (screenWidth >= 1440 ? 8 : (screenWidth >= 800 ? 7 : 6))), - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", - Filters: "IsUnplayed", - UserId: userId - }; - - return ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest", options)).then(function (result) { - - var html = ''; - - if (result.Items.length) { - html += '

' + Globalize.translate('HeaderLatestChannelMedia') + '

'; - html += '
'; - - html += cardBuilder.getCardsHtml({ - items: result.Items, - shape: 'auto', - showTitle: true, - centerText: true, - lazy: true, - showDetailsMenu: true, - overlayPlayButton: true - }); - html += '
'; - } - - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - }); - } - - function loadLibraryTiles(elem, user, shape) { - - return getUserViews(user.Id).then(function (items) { - - var html = ''; - - html += '
'; - - if (items.length) { - - html += '
'; - html += '

' + Globalize.translate('HeaderMyMedia') + '

'; - html += '
'; - - var scrollX = enableScrollX() && dom.getWindowSize().innerWidth >= 500; - - if (scrollX) { - html += '
'; - } else { - html += '
'; - } - - html += cardBuilder.getCardsHtml({ - items: items, - shape: scrollX ? 'overflowSmallBackdrop' : shape, - showTitle: true, - centerText: true, - overlayText: false, - lazy: true, - transition: false, - allowBottomPadding: !enableScrollX() - }); - html += '
'; - } - - html += '
'; - - return getAppInfo().then(function (infoHtml) { - - elem.innerHTML = html + infoHtml; - imageLoader.lazyChildren(elem); - }); - }); - } - - function loadResume(elem, userId) { - - var screenWidth = dom.getWindowSize().innerWidth; - - var limit; - - if (enableScrollX()) { - - limit = 12; - - } else { - - limit = screenWidth >= 1920 ? 8 : (screenWidth >= 1600 ? 8 : (screenWidth >= 1200 ? 9 : 6)); - limit = Math.min(limit, 5); - } - - var options = { - - SortBy: "DatePlayed", - SortOrder: "Descending", - Filters: "IsResumable", - Limit: limit, - Recursive: true, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", - CollapseBoxSetItems: false, - ExcludeLocationTypes: "Virtual", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - EnableTotalRecordCount: false - }; - - return ApiClient.getItems(userId, options).then(function (result) { - - var html = ''; - - if (result.Items.length) { - html += '

' + Globalize.translate('HeaderContinueWatching') + '

'; - if (enableScrollX()) { - html += '
'; - } else { - html += '
'; - } - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = supportsImageAnalysis; - - html += cardBuilder.getCardsHtml({ - items: result.Items, - preferThumb: true, - shape: getThumbShape(), - overlayText: false, - showTitle: true, - showParentTitle: true, - lazy: true, - showDetailsMenu: true, - overlayPlayButton: true, - context: 'home', - centerText: !cardLayout, - allowBottomPadding: false, - cardLayout: cardLayout, - showYear: true, - lines: 2, - vibrant: cardLayout && supportsImageAnalysis - }); - html += '
'; - } - - elem.innerHTML = html; - - imageLoader.lazyChildren(elem); - }); - } - - function loadNextUp(elem, userId) { - - var query = { - - Limit: enableScrollX() ? 20 : 10, - Fields: "PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo", - UserId: userId, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb" - }; - - ApiClient.getNextUpEpisodes(query).then(function (result) { - - var html = ''; - - if (result.Items.length) { - html += '

' + Globalize.translate('HeaderNextUp') + '

'; - if (enableScrollX()) { - html += '
'; - } else { - html += '
'; - } - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - html += cardBuilder.getCardsHtml({ - items: result.Items, - preferThumb: true, - shape: getThumbShape(), - overlayText: false, - showTitle: true, - showParentTitle: true, - lazy: true, - overlayPlayButton: true, - context: 'home', - centerText: !supportsImageAnalysis, - allowBottomPadding: !enableScrollX(), - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - }); - html += '
'; - } - - elem.innerHTML = html; - - imageLoader.lazyChildren(elem); - }); - } - - function loadLatestChannelItems(elem, userId, options) { - - options = Object.assign(options || {}, { - - UserId: userId, - SupportsLatestItems: true - }); - - return ApiClient.getJSON(ApiClient.getUrl("Channels", options)).then(function (result) { - - var channels = result.Items; - - var channelsHtml = channels.map(function (c) { - - return '
'; - - }).join(''); - - elem.innerHTML = channelsHtml; - - for (var i = 0, length = channels.length; i < length; i++) { - - var channel = channels[i]; - - loadLatestChannelItemsFromChannel(elem, channel, i); - } - - }); - } - - function loadLatestChannelItemsFromChannel(page, channel, index) { - - var screenWidth = dom.getWindowSize().innerWidth; - - var options = { - - Limit: screenWidth >= 1600 ? 10 : (screenWidth >= 1440 ? 5 : (screenWidth >= 800 ? 6 : 6)), - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", - Filters: "IsUnplayed", - UserId: Dashboard.getCurrentUserId(), - ChannelIds: channel.Id - }; - - ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest", options)).then(function (result) { - - var html = ''; - - if (result.Items.length) { - - html += '
'; - - html += '
'; - var text = Globalize.translate('HeaderLatestFromChannel').replace('{0}', channel.Name); - html += '

' + text + '

'; - html += ''; - html += '
'; - - html += '
'; - html += cardBuilder.getCardsHtml({ - items: result.Items, - shape: 'autohome', - defaultShape: 'square', - showTitle: true, - centerText: true, - lazy: true, - showDetailsMenu: true, - overlayPlayButton: true - }); - html += '
'; - html += '
'; - } - - var elem = page.querySelector('#channel' + channel.Id + ''); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - }); - } - - function loadLatestLiveTvRecordings(elem, userId) { - - return ApiClient.getLiveTvRecordings({ - - userId: userId, - limit: 5, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", - IsInProgress: false, - EnableTotalRecordCount: false, - IsLibraryItem: false - - }).then(function (result) { - - var html = ''; - - if (result.Items.length) { - - html += '
'; - html += '

' + Globalize.translate('HeaderLatestTvRecordings') + '

'; - html += ''; - html += '
'; - } - - if (enableScrollX()) { - html += '
'; - } else { - html += '
'; - } - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - html += cardBuilder.getCardsHtml({ - items: result.Items, - shape: enableScrollX() ? 'autooverflow' : 'auto', - showTitle: true, - showParentTitle: true, - coverImage: true, - lazy: true, - showDetailsMenu: true, - centerText: !supportsImageAnalysis, - overlayText: false, - overlayPlayButton: true, - allowBottomPadding: !enableScrollX(), - preferThumb: true, - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - - }); - html += '
'; - - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - }); - } - - window.Sections = { - loadRecentlyAdded: loadRecentlyAdded, - loadLatestChannelMedia: loadLatestChannelMedia, - loadLibraryTiles: loadLibraryTiles, - loadResume: loadResume, - loadNextUp: loadNextUp, - loadLatestChannelItems: loadLatestChannelItems, - loadLatestLiveTvRecordings: loadLatestLiveTvRecordings, - loadlibraryButtons: loadlibraryButtons - }; - - return window.Sections; -}); \ No newline at end of file +define(["libraryBrowser","cardBuilder","appSettings","components/groupedcards","dom","apphost","imageLoader","scrollStyles","emby-button","paper-icon-button-light","emby-itemscontainer"],function(libraryBrowser,cardBuilder,appSettings,groupedcards,dom,appHost,imageLoader){"use strict";function getUserViews(userId){return ApiClient.getUserViews({},userId).then(function(result){return result.Items})}function enableScrollX(){return browserInfo.mobile}function getSquareShape(){return enableScrollX()?"overflowSquare":"square"}function getThumbShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function getPortraitShape(){return enableScrollX()?"overflowPortrait":"portrait"}function getLibraryButtonsHtml(items){for(var html="",i=0,length=items.length;i',html+='
',html+="
",html+=''+icon+"",html+=''+item.Name+"",html+="
",html+="
",html+=""}return html}function loadlibraryButtons(elem,userId,index){return getUserViews(userId).then(function(items){var html="
";return index&&(html+='

'+Globalize.translate("HeaderMyMedia")+"

"),html+='
',html+=getLibraryButtonsHtml(items),html+="
",getAppInfo().then(function(infoHtml){elem.innerHTML=html+infoHtml})})}function getRandomInt(min,max){return Math.floor(Math.random()*(max-min+1))+min}function getAppInfo(){var frequency=864e5;AppInfo.isNativeApp&&(frequency=1728e5);var cacheKey="lastappinfopresent5",lastDatePresented=parseInt(appSettings.get(cacheKey)||"0");return lastDatePresented?(new Date).getTime()-lastDatePresented
';return html+=target?'':'",html+="
"}function getTheaterInfo(){var html="";html+="
",html+='

Discover Emby Theater

';var nameText=AppInfo.isNativeApp?"Emby Theater":'Emby Theater';return html+="

A beautiful app for your TV and large screen tablet. "+nameText+" runs on Windows, Xbox One, Raspberry Pi, Samsung Smart TVs, Sony PS4, Web Browsers, and more.

",html+='
',html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png","https://emby.media/download"),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png","https://emby.media/download"),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png","https://emby.media/download"),html+="
",html+="
",html+="
"}function getPremiereInfo(){var html="";html+="
",html+='

Discover Emby Premiere

';var cardTarget=AppInfo.isNativeApp?"":"https://emby.media/premiere",learnMoreText=AppInfo.isNativeApp?"":'Learn more';return html+="

Design beautiful Cover Art, enjoy free access to Emby apps, and more. "+learnMoreText+"

",html+='
',html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png",cardTarget),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png",cardTarget),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png",cardTarget),html+="
",html+="
",html+="
"}function renderLatestSection(elem,user,parent){var options={Limit:12,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb",ParentId:parent.Id};return ApiClient.getJSON(ApiClient.getUrl("Users/"+user.Id+"/Items/Latest",options)).then(function(items){var html="",scrollX=enableScrollX();if(items.length){html+="
",html+='

'+Globalize.translate("LatestFromLibrary",parent.Name)+"

",html+='",html+="
",html+=scrollX?'
':'
';var viewType=parent.CollectionType,shape="movies"===viewType?getPortraitShape():"music"===viewType?getSquareShape():getThumbShape(),supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis&&("music"===viewType||"movies"===viewType||"tvshows"===viewType||!viewType);html+=cardBuilder.getCardsHtml({items:items,shape:shape,preferThumb:"movies"!==viewType&&"music"!==viewType,showUnplayedIndicator:!1,showChildCountIndicator:!0,context:"home",overlayText:!1,centerText:!cardLayout,overlayPlayButton:"photos"!==viewType,allowBottomPadding:!enableScrollX()&&!cardLayout,cardLayout:cardLayout,showTitle:"music"===viewType||!viewType||cardLayout&&("movies"===viewType||"tvshows"===viewType),showYear:cardLayout&&"movies"===viewType,showSeriesYear:cardLayout&&"tvshows"===viewType,showParentTitle:"music"===viewType||!viewType||cardLayout&&"tvshows"===viewType,vibrant:supportsImageAnalysis&&cardLayout,lines:2}),html+="
"}elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadRecentlyAdded(elem,user){return elem.classList.remove("homePageSection"),getUserViews(user.Id).then(function(items){for(var excludeViewTypes=["playlists","livetv","boxsets","channels"],excludeItemTypes=["Channel"],i=0,length=items.length;i=2400?10:screenWidth>=1600?10:screenWidth>=1440?8:screenWidth>=800?7:6,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",Filters:"IsUnplayed",UserId:userId};return ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest",options)).then(function(result){var html="";result.Items.length&&(html+='

'+Globalize.translate("HeaderLatestChannelMedia")+"

",html+='
',html+=cardBuilder.getCardsHtml({items:result.Items,shape:"auto",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0}),html+="
"),elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadLibraryTiles(elem,user,shape){return getUserViews(user.Id).then(function(items){var html="";if(html+="
",items.length){html+="
",html+='

'+Globalize.translate("HeaderMyMedia")+"

",html+="
";var scrollX=enableScrollX()&&dom.getWindowSize().innerWidth>=500;html+=scrollX?'
':'
',html+=cardBuilder.getCardsHtml({items:items,shape:scrollX?"overflowSmallBackdrop":shape,showTitle:!0,centerText:!0,overlayText:!1,lazy:!0,transition:!1,allowBottomPadding:!enableScrollX()}),html+="
"}return html+="
",getAppInfo().then(function(infoHtml){elem.innerHTML=html+infoHtml,imageLoader.lazyChildren(elem)})})}function loadResume(elem,userId){var limit,screenWidth=dom.getWindowSize().innerWidth;enableScrollX()?limit=12:(limit=screenWidth>=1920?8:screenWidth>=1600?8:screenWidth>=1200?9:6,limit=Math.min(limit,5));var options={SortBy:"DatePlayed",SortOrder:"Descending",Filters:"IsResumable",Limit:limit,Recursive:!0,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",CollapseBoxSetItems:!1,ExcludeLocationTypes:"Virtual",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",EnableTotalRecordCount:!1};return ApiClient.getItems(userId,options).then(function(result){var html="";if(result.Items.length){html+='

'+Globalize.translate("HeaderContinueWatching")+"

",html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis;html+=cardBuilder.getCardsHtml({items:result.Items,preferThumb:!0,shape:getThumbShape(),overlayText:!1,showTitle:!0,showParentTitle:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0,context:"home",centerText:!cardLayout,allowBottomPadding:!1,cardLayout:cardLayout,showYear:!0,lines:2,vibrant:cardLayout&&supportsImageAnalysis}),html+="
"}elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadNextUp(elem,userId){var query={Limit:enableScrollX()?20:10,Fields:"PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo",UserId:userId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb"};ApiClient.getNextUpEpisodes(query).then(function(result){var html="";if(result.Items.length){html+='

'+Globalize.translate("HeaderNextUp")+"

",html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,preferThumb:!0,shape:getThumbShape(),overlayText:!1,showTitle:!0,showParentTitle:!0,lazy:!0,overlayPlayButton:!0,context:"home",centerText:!supportsImageAnalysis,allowBottomPadding:!enableScrollX(),cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
"}elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadLatestChannelItems(elem,userId,options){return options=Object.assign(options||{},{UserId:userId,SupportsLatestItems:!0}),ApiClient.getJSON(ApiClient.getUrl("Channels",options)).then(function(result){var channels=result.Items,channelsHtml=channels.map(function(c){return'
'}).join("");elem.innerHTML=channelsHtml;for(var i=0,length=channels.length;i=1600?10:screenWidth>=1440?5:6,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",Filters:"IsUnplayed",UserId:Dashboard.getCurrentUserId(),ChannelIds:channel.Id};ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest",options)).then(function(result){var html="";if(result.Items.length){html+='
',html+="
";var text=Globalize.translate("HeaderLatestFromChannel").replace("{0}",channel.Name);html+='

'+text+"

",html+='",html+="
",html+='
',html+=cardBuilder.getCardsHtml({items:result.Items,shape:"autohome",defaultShape:"square",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0}),html+="
",html+="
"}var elem=page.querySelector("#channel"+channel.Id);elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadLatestLiveTvRecordings(elem,userId){return ApiClient.getLiveTvRecordings({userId:userId,limit:5,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",IsInProgress:!1,EnableTotalRecordCount:!1,IsLibraryItem:!1}).then(function(result){var html="";result.Items.length&&(html+="
",html+='

'+Globalize.translate("HeaderLatestTvRecordings")+"

",html+='",html+="
"),html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,shape:enableScrollX()?"autooverflow":"auto",showTitle:!0,showParentTitle:!0,coverImage:!0,lazy:!0,showDetailsMenu:!0,centerText:!supportsImageAnalysis,overlayText:!1,overlayPlayButton:!0,allowBottomPadding:!enableScrollX(),preferThumb:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
",elem.innerHTML=html,imageLoader.lazyChildren(elem)})}return window.Sections={loadRecentlyAdded:loadRecentlyAdded,loadLatestChannelMedia:loadLatestChannelMedia,loadLibraryTiles:loadLibraryTiles,loadResume:loadResume,loadNextUp:loadNextUp,loadLatestChannelItems:loadLatestChannelItems,loadLatestLiveTvRecordings:loadLatestLiveTvRecordings,loadlibraryButtons:loadlibraryButtons},window.Sections}); \ No newline at end of file diff --git a/dashboard-ui/scripts/selectserver.js b/dashboard-ui/scripts/selectserver.js index 4418247d84..2dbbdeec01 100644 --- a/dashboard-ui/scripts/selectserver.js +++ b/dashboard-ui/scripts/selectserver.js @@ -1,388 +1 @@ -define(['appSettings', 'paper-icon-button-light'], function (appSettings) { - 'use strict'; - - function updatePageStyle(page) { - - if (getParameterByName('showuser') == '1') { - page.classList.add('libraryPage'); - page.classList.add('noSecondaryNavPage'); - page.classList.remove('standalonePage'); - } else { - page.classList.add('standalonePage'); - page.classList.remove('noSecondaryNavPage'); - page.classList.remove('libraryPage'); - } - } - - function showServerConnectionFailure() { - - alertText(Globalize.translate('MessageUnableToConnectToServer'), Globalize.translate("HeaderConnectionFailure")); - } - - function getServerHtml(server) { - - var html = ''; - - html += '
'; - - html += ''; - - html += ''; - - if (server.Id) { - html += ''; - } - - html += '
'; - - return html; - } - - function renderServers(page, servers) { - - if (servers.length) { - page.querySelector('.noServersMessage').classList.add('hide'); - page.querySelector('.serverList').classList.remove('hide'); - } else { - page.querySelector('.serverList').classList.add('hide'); - page.querySelector('.noServersMessage').classList.remove('hide'); - } - - var html = ''; - - html += servers.map(getServerHtml).join(''); - - page.querySelector('.serverList').innerHTML = html; - } - - function alertText(text, title) { - alertTextWithOptions({ - title: title, - text: text - }); - } - - function alertTextWithOptions(options) { - require(['alert'], function (alert) { - alert(options); - }); - } - - function showGeneralError() { - - Dashboard.hideLoadingMsg(); - alertText(Globalize.translate('DefaultErrorMessage')); - } - - function parentWithClass(elem, className) { - - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - - if (!elem) { - return null; - } - } - - return elem; - } - - return function (view, params) { - - var cachedServers; - - function connectToServer(page, server) { - - Dashboard.showLoadingMsg(); - - ConnectionManager.connectToServer(server, { - - enableAutoLogin: appSettings.enableAutoLogin() - - }).then(function (result) { - - Dashboard.hideLoadingMsg(); - - var apiClient = result.ApiClient; - - switch (result.State) { - - case MediaBrowser.ConnectionState.SignedIn: - { - Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient); - Dashboard.navigate('home.html'); - } - break; - case MediaBrowser.ConnectionState.ServerSignIn: - { - Dashboard.onServerChanged(null, null, apiClient); - Dashboard.navigate('login.html?serverid=' + result.Servers[0].Id); - } - break; - case MediaBrowser.ConnectionState.ServerUpdateNeeded: - { - alertTextWithOptions({ - text: Globalize.translate('core#ServerUpdateNeeded', 'https://emby.media'), - html: Globalize.translate('core#ServerUpdateNeeded', 'https://emby.media') - }); - } - break; - default: - showServerConnectionFailure(); - break; - } - - }); - } - - function acceptInvitation(page, id) { - - Dashboard.showLoadingMsg(); - - // Add/Update connect info - ConnectionManager.acceptServer(id).then(function () { - - Dashboard.hideLoadingMsg(); - loadPage(page); - - }, function () { - - showGeneralError(); - }); - } - - function deleteServer(page, serverId) { - - Dashboard.showLoadingMsg(); - - // Add/Update connect info - ConnectionManager.deleteServer(serverId).then(function () { - - Dashboard.hideLoadingMsg(); - - loadPage(page); - - }, function () { - - showGeneralError(); - - }); - } - - function rejectInvitation(page, id) { - - Dashboard.showLoadingMsg(); - - // Add/Update connect info - ConnectionManager.rejectServer(id).then(function () { - - Dashboard.hideLoadingMsg(); - - loadPage(page); - - }, function () { - - showGeneralError(); - - }); - } - - function showServerMenu(elem) { - - var card = parentWithClass(elem, 'serverItem'); - var page = parentWithClass(elem, 'page'); - var serverId = card.getAttribute('data-id'); - - var menuItems = []; - - menuItems.push({ - name: Globalize.translate('ButtonDelete'), - id: 'delete' - }); - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - items: menuItems, - positionTo: elem, - callback: function (id) { - - switch (id) { - - case 'delete': - deleteServer(page, serverId); - break; - default: - break; - } - } - }); - - }); - } - - function showPendingInviteMenu(elem) { - - var card = parentWithClass(elem, 'inviteItem'); - var page = parentWithClass(elem, 'page'); - var invitationId = card.getAttribute('data-id'); - - var menuItems = []; - - menuItems.push({ - name: Globalize.translate('ButtonAccept'), - id: 'accept' - }); - - menuItems.push({ - name: Globalize.translate('ButtonReject'), - id: 'reject' - }); - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - items: menuItems, - positionTo: elem, - callback: function (id) { - - switch (id) { - - case 'accept': - acceptInvitation(page, invitationId); - break; - case 'reject': - rejectInvitation(page, invitationId); - break; - default: - break; - } - } - }); - - }); - } - - function getPendingInviteHtml(invite) { - - var html = ''; - - html += '
'; - - html += ''; - - html += '
'; - - html += '
'; - html += invite.Name; - html += '
'; - - html += '
'; - - html += ''; - - html += '
'; - - return html; - } - - function renderInvitations(page, list) { - - if (list.length) { - page.querySelector('.invitationSection').classList.remove('hide'); - } else { - page.querySelector('.invitationSection').classList.add('hide'); - } - - var html = list.map(getPendingInviteHtml).join(''); - - page.querySelector('.invitationList').innerHTML = html; - } - - function loadInvitations(page) { - - if (ConnectionManager.isLoggedIntoConnect()) { - - ConnectionManager.getUserInvitations().then(function (list) { - - renderInvitations(page, list); - - }); - - } else { - - renderInvitations(page, []); - } - - } - - function loadPage(page) { - - Dashboard.showLoadingMsg(); - - ConnectionManager.getAvailableServers().then(function (servers) { - - servers = servers.slice(0); - cachedServers = servers; - - renderServers(page, servers); - - Dashboard.hideLoadingMsg(); - }); - - loadInvitations(page); - - if (ConnectionManager.isLoggedIntoConnect()) { - page.querySelector('.connectLogin').classList.add('hide'); - } else { - page.querySelector('.connectLogin').classList.remove('hide'); - } - } - - view.querySelector('.invitationList').addEventListener('click', function (e) { - - var btnInviteMenu = parentWithClass(e.target, 'btnInviteMenu'); - if (btnInviteMenu) { - showPendingInviteMenu(btnInviteMenu); - } - }); - view.querySelector('.serverList').addEventListener('click', function (e) { - - var lnkServer = parentWithClass(e.target, 'lnkServer'); - if (lnkServer) { - var item = parentWithClass(lnkServer, 'serverItem'); - var id = item.getAttribute('data-id'); - - var server = cachedServers.filter(function (s) { - return s.Id == id; - })[0]; - - connectToServer(view, server); - } - - var btnServerMenu = parentWithClass(e.target, 'btnServerMenu'); - if (btnServerMenu) { - showServerMenu(btnServerMenu); - } - }); - - view.addEventListener('viewbeforeshow', function () { - updatePageStyle(this); - }); - view.addEventListener('viewshow', function () { - loadPage(this); - }); - }; -}); \ No newline at end of file +define(["appSettings","paper-icon-button-light"],function(appSettings){"use strict";function updatePageStyle(page){"1"==getParameterByName("showuser")?(page.classList.add("libraryPage"),page.classList.add("noSecondaryNavPage"),page.classList.remove("standalonePage")):(page.classList.add("standalonePage"),page.classList.remove("noSecondaryNavPage"),page.classList.remove("libraryPage"))}function showServerConnectionFailure(){alertText(Globalize.translate("MessageUnableToConnectToServer"),Globalize.translate("HeaderConnectionFailure"))}function getServerHtml(server){var html="";return html+='
',html+='',html+='",server.Id&&(html+='"),html+="
"}function renderServers(page,servers){servers.length?(page.querySelector(".noServersMessage").classList.add("hide"),page.querySelector(".serverList").classList.remove("hide")):(page.querySelector(".serverList").classList.add("hide"),page.querySelector(".noServersMessage").classList.remove("hide"));var html="";html+=servers.map(getServerHtml).join(""),page.querySelector(".serverList").innerHTML=html}function alertText(text,title){alertTextWithOptions({title:title,text:text})}function alertTextWithOptions(options){require(["alert"],function(alert){alert(options)})}function showGeneralError(){Dashboard.hideLoadingMsg(),alertText(Globalize.translate("DefaultErrorMessage"))}function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}return function(view,params){function connectToServer(page,server){Dashboard.showLoadingMsg(),ConnectionManager.connectToServer(server,{enableAutoLogin:appSettings.enableAutoLogin()}).then(function(result){Dashboard.hideLoadingMsg();var apiClient=result.ApiClient;switch(result.State){case MediaBrowser.ConnectionState.SignedIn:Dashboard.onServerChanged(apiClient.getCurrentUserId(),apiClient.accessToken(),apiClient),Dashboard.navigate("home.html");break;case MediaBrowser.ConnectionState.ServerSignIn:Dashboard.onServerChanged(null,null,apiClient),Dashboard.navigate("login.html?serverid="+result.Servers[0].Id);break;case MediaBrowser.ConnectionState.ServerUpdateNeeded:alertTextWithOptions({text:Globalize.translate("core#ServerUpdateNeeded","https://emby.media"),html:Globalize.translate("core#ServerUpdateNeeded",'https://emby.media')});break;default:showServerConnectionFailure()}})}function acceptInvitation(page,id){Dashboard.showLoadingMsg(),ConnectionManager.acceptServer(id).then(function(){Dashboard.hideLoadingMsg(),loadPage(page)},function(){showGeneralError()})}function deleteServer(page,serverId){Dashboard.showLoadingMsg(),ConnectionManager.deleteServer(serverId).then(function(){Dashboard.hideLoadingMsg(),loadPage(page)},function(){showGeneralError()})}function rejectInvitation(page,id){Dashboard.showLoadingMsg(),ConnectionManager.rejectServer(id).then(function(){Dashboard.hideLoadingMsg(),loadPage(page)},function(){showGeneralError()})}function showServerMenu(elem){var card=parentWithClass(elem,"serverItem"),page=parentWithClass(elem,"page"),serverId=card.getAttribute("data-id"),menuItems=[];menuItems.push({name:Globalize.translate("ButtonDelete"),id:"delete"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:elem,callback:function(id){switch(id){case"delete":deleteServer(page,serverId)}}})})}function showPendingInviteMenu(elem){var card=parentWithClass(elem,"inviteItem"),page=parentWithClass(elem,"page"),invitationId=card.getAttribute("data-id"),menuItems=[];menuItems.push({name:Globalize.translate("ButtonAccept"),id:"accept"}),menuItems.push({name:Globalize.translate("ButtonReject"),id:"reject"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:elem,callback:function(id){switch(id){case"accept":acceptInvitation(page,invitationId);break;case"reject":rejectInvitation(page,invitationId)}}})})}function getPendingInviteHtml(invite){var html="";return html+='
',html+='',html+='
',html+="
",html+=invite.Name,html+="
",html+="
",html+='",html+="
"}function renderInvitations(page,list){list.length?page.querySelector(".invitationSection").classList.remove("hide"):page.querySelector(".invitationSection").classList.add("hide");var html=list.map(getPendingInviteHtml).join("");page.querySelector(".invitationList").innerHTML=html}function loadInvitations(page){ConnectionManager.isLoggedIntoConnect()?ConnectionManager.getUserInvitations().then(function(list){renderInvitations(page,list)}):renderInvitations(page,[])}function loadPage(page){Dashboard.showLoadingMsg(),ConnectionManager.getAvailableServers().then(function(servers){servers=servers.slice(0),cachedServers=servers,renderServers(page,servers),Dashboard.hideLoadingMsg()}),loadInvitations(page),ConnectionManager.isLoggedIntoConnect()?page.querySelector(".connectLogin").classList.add("hide"):page.querySelector(".connectLogin").classList.remove("hide")}var cachedServers;view.querySelector(".invitationList").addEventListener("click",function(e){var btnInviteMenu=parentWithClass(e.target,"btnInviteMenu");btnInviteMenu&&showPendingInviteMenu(btnInviteMenu)}),view.querySelector(".serverList").addEventListener("click",function(e){var lnkServer=parentWithClass(e.target,"lnkServer");if(lnkServer){var item=parentWithClass(lnkServer,"serverItem"),id=item.getAttribute("data-id"),server=cachedServers.filter(function(s){return s.Id==id})[0];connectToServer(view,server)}var btnServerMenu=parentWithClass(e.target,"btnServerMenu");btnServerMenu&&showServerMenu(btnServerMenu)}),view.addEventListener("viewbeforeshow",function(){updatePageStyle(this)}),view.addEventListener("viewshow",function(){loadPage(this)})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/serversecurity.js b/dashboard-ui/scripts/serversecurity.js index 44256a7a73..d0cc2a1ddc 100644 --- a/dashboard-ui/scripts/serversecurity.js +++ b/dashboard-ui/scripts/serversecurity.js @@ -1,158 +1 @@ -define(['datetime', 'jQuery'], function (datetime, $) { - 'use strict'; - - function revoke(page, key) { - - require(['confirm'], function (confirm) { - - confirm(Globalize.translate('MessageConfirmRevokeApiKey'), Globalize.translate('HeaderConfirmRevokeApiKey')).then(function () { - Dashboard.showLoadingMsg(); - - ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl('Auth/Keys/' + key) - - }).then(function () { - - loadData(page); - }); - }); - - }); - } - - function renderKeys(page, keys, users) { - - var rows = keys.map(function (item) { - - var html = ''; - - html += ''; - - html += ''; - html += ''; - html += ''; - - html += ''; - html += (item.AccessToken); - html += ''; - - html += ''; - html += (item.AppName || ''); - html += ''; - - html += ''; - html += (item.DeviceName || ''); - html += ''; - - html += ''; - - var user = users.filter(function (u) { - - return u.Id == item.UserId; - })[0]; - - if (user) { - html += user.Name; - } - - html += ''; - - html += ''; - - var date = datetime.parseISO8601Date(item.DateCreated, true); - - html += datetime.toLocaleDateString(date) + ' ' + datetime.getDisplayTime(date); - - html += ''; - - html += ''; - - return html; - - }).join(''); - - var elem = $('.resultBody', page).html(rows).parents('.tblApiKeys').table("refresh").trigger('create'); - - $('.btnRevoke', elem).on('click', function () { - - revoke(page, this.getAttribute('data-token')); - }); - - Dashboard.hideLoadingMsg(); - } - - function loadData(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getUsers().then(function (users) { - - ApiClient.getJSON(ApiClient.getUrl('Auth/Keys')).then(function (result) { - - renderKeys(page, result.Items, users); - }); - }); - } - - function showNewKeyPrompt(page) { - require(['prompt'], function (prompt) { - - // HeaderNewApiKeyHelp not used - - prompt({ - title: Globalize.translate('HeaderNewApiKey'), - label: Globalize.translate('LabelAppName'), - description: Globalize.translate('LabelAppNameExample') - - }).then(function (value) { - - ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl('Auth/Keys', { - - App: value - - }) - - }).then(function () { - - loadData(page); - }); - }); - - }); - } - - function getTabs() { - return [ - { - href: 'dashboardhosting.html', - name: Globalize.translate('TabHosting') - }, - { - href: 'serversecurity.html', - name: Globalize.translate('TabSecurity') - }]; - } - - pageIdOn('pageinit', "serverSecurityPage", function () { - - var page = this; - - $('.btnNewKey', page).on('click', function () { - - showNewKeyPrompt(page); - - }); - - }); - pageIdOn('pagebeforeshow', "serverSecurityPage", function () { - - LibraryMenu.setTabs('adminadvanced', 1, getTabs); - var page = this; - - loadData(page); - }); - -}); \ No newline at end of file +define(["datetime","jQuery"],function(datetime,$){"use strict";function revoke(page,key){require(["confirm"],function(confirm){confirm(Globalize.translate("MessageConfirmRevokeApiKey"),Globalize.translate("HeaderConfirmRevokeApiKey")).then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Auth/Keys/"+key)}).then(function(){loadData(page)})})})}function renderKeys(page,keys,users){var rows=keys.map(function(item){var html="";html+="",html+="",html+='",html+="",html+='',html+=item.AccessToken,html+="",html+='',html+=item.AppName||"",html+="",html+='',html+=item.DeviceName||"",html+="",html+='';var user=users.filter(function(u){return u.Id==item.UserId})[0];user&&(html+=user.Name),html+="",html+='';var date=datetime.parseISO8601Date(item.DateCreated,!0);return html+=datetime.toLocaleDateString(date)+" "+datetime.getDisplayTime(date),html+="",html+=""}).join(""),elem=$(".resultBody",page).html(rows).parents(".tblApiKeys").table("refresh").trigger("create");$(".btnRevoke",elem).on("click",function(){revoke(page,this.getAttribute("data-token"))}),Dashboard.hideLoadingMsg()}function loadData(page){Dashboard.showLoadingMsg(),ApiClient.getUsers().then(function(users){ApiClient.getJSON(ApiClient.getUrl("Auth/Keys")).then(function(result){renderKeys(page,result.Items,users)})})}function showNewKeyPrompt(page){require(["prompt"],function(prompt){prompt({title:Globalize.translate("HeaderNewApiKey"),label:Globalize.translate("LabelAppName"),description:Globalize.translate("LabelAppNameExample")}).then(function(value){ApiClient.ajax({type:"POST",url:ApiClient.getUrl("Auth/Keys",{App:value})}).then(function(){loadData(page)})})})}function getTabs(){return[{href:"dashboardhosting.html",name:Globalize.translate("TabHosting")},{href:"serversecurity.html",name:Globalize.translate("TabSecurity")}]}pageIdOn("pageinit","serverSecurityPage",function(){var page=this;$(".btnNewKey",page).on("click",function(){showNewKeyPrompt(page)})}),pageIdOn("pagebeforeshow","serverSecurityPage",function(){LibraryMenu.setTabs("adminadvanced",1,getTabs);var page=this;loadData(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/shared.js b/dashboard-ui/scripts/shared.js index c81e8c8bcb..e5e1afdce1 100644 --- a/dashboard-ui/scripts/shared.js +++ b/dashboard-ui/scripts/shared.js @@ -1,91 +1 @@ -define(['jQuery', 'libraryBrowser', 'imageLoader', 'indicators'], function ($, libraryBrowser, imageLoader, indicators) { - 'use strict'; - - var currentItem; - - function reload(page) { - - var id = getParameterByName('id'); - - Dashboard.showLoadingMsg(); - - ApiClient.getJSON(ApiClient.getUrl('Social/Shares/Public/' + id + '/Item')).then(function (item) { - - reloadFromItem(page, item); - }); - } - - function reloadFromItem(page, item) { - - currentItem = item; - - libraryBrowser.renderName(item, $('.itemName', page)[0], false); - libraryBrowser.renderParentName(item, $('.parentName', page)[0]); - libraryBrowser.renderDetailPageBackdrop(page, item, imageLoader); - - renderImage(page, item); - - setInitialCollapsibleState(page, item); - ItemDetailPage.renderDetails(page, item, null, true); - - Dashboard.hideLoadingMsg(); - } - - function setInitialCollapsibleState(page, item) { - - $('.collectionItems', page).empty(); - - if (item.MediaSources && item.MediaSources.length) { - ItemDetailPage.renderMediaSources(page, null, item); - } - - var chapters = item.Chapters || []; - - if (!chapters.length) { - $('#scenesCollapsible', page).hide(); - } else { - $('#scenesCollapsible', page).show(); - ItemDetailPage.renderScenes(page, item, null, 3, true); - } - - if (!item.People || !item.People.length) { - $('#castCollapsible', page).hide(); - } else { - $('#castCollapsible', page).show(); - ItemDetailPage.renderCast(page, item, null, 6, true); - } - - ItemDetailPage.renderCriticReviews(page, item, 1); - } - - function renderImage(page, item) { - libraryBrowser.renderDetailImage(page.querySelector('.detailImageContainer'), item, false, null, imageLoader, indicators); - } - - $(document).on('pageinit', "#publicSharedItemPage", function () { - - var page = this; - - $(page).on("click", ".moreScenes", function () { - - ItemDetailPage.renderScenes(page, currentItem, null, null, true); - - }).on("click", ".morePeople", function () { - - ItemDetailPage.renderCast(page, currentItem, null, null, true); - - }).on("click", ".moreCriticReviews", function () { - - ItemDetailPage.renderCriticReviews(page, currentItem); - - }); - - }).on('pageshow', "#publicSharedItemPage", function () { - - var page = this; - - reload(page); - - }); - -}); \ No newline at end of file +define(["jQuery","libraryBrowser","imageLoader","indicators"],function($,libraryBrowser,imageLoader,indicators){"use strict";function reload(page){var id=getParameterByName("id");Dashboard.showLoadingMsg(),ApiClient.getJSON(ApiClient.getUrl("Social/Shares/Public/"+id+"/Item")).then(function(item){reloadFromItem(page,item)})}function reloadFromItem(page,item){currentItem=item,libraryBrowser.renderName(item,$(".itemName",page)[0],!1),libraryBrowser.renderParentName(item,$(".parentName",page)[0]),libraryBrowser.renderDetailPageBackdrop(page,item,imageLoader),renderImage(page,item),setInitialCollapsibleState(page,item),ItemDetailPage.renderDetails(page,item,null,!0),Dashboard.hideLoadingMsg()}function setInitialCollapsibleState(page,item){$(".collectionItems",page).empty(),item.MediaSources&&item.MediaSources.length&&ItemDetailPage.renderMediaSources(page,null,item);var chapters=item.Chapters||[];chapters.length?($("#scenesCollapsible",page).show(),ItemDetailPage.renderScenes(page,item,null,3,!0)):$("#scenesCollapsible",page).hide(),item.People&&item.People.length?($("#castCollapsible",page).show(),ItemDetailPage.renderCast(page,item,null,6,!0)):$("#castCollapsible",page).hide(),ItemDetailPage.renderCriticReviews(page,item,1)}function renderImage(page,item){libraryBrowser.renderDetailImage(page.querySelector(".detailImageContainer"),item,!1,null,imageLoader,indicators)}var currentItem;$(document).on("pageinit","#publicSharedItemPage",function(){var page=this;$(page).on("click",".moreScenes",function(){ItemDetailPage.renderScenes(page,currentItem,null,null,!0)}).on("click",".morePeople",function(){ItemDetailPage.renderCast(page,currentItem,null,null,!0)}).on("click",".moreCriticReviews",function(){ItemDetailPage.renderCriticReviews(page,currentItem)})}).on("pageshow","#publicSharedItemPage",function(){var page=this;reload(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 755f2a7fe4..d7c076db63 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -1,2684 +1,2 @@ -function getWindowLocationSearch(win) { - 'use strict'; - - var search = (win || window).location.search; - - if (!search) { - - var index = window.location.href.indexOf('?'); - if (index != -1) { - search = window.location.href.substring(index); - } - } - - return search || ''; -} - -function getParameterByName(name, url) { - 'use strict'; - - name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); - var regexS = "[\\?&]" + name + "=([^&#]*)"; - var regex = new RegExp(regexS, "i"); - - var results = regex.exec(url || getWindowLocationSearch()); - if (results == null) - return ""; - else - return decodeURIComponent(results[1].replace(/\+/g, " ")); -} - -var Dashboard = { - - isConnectMode: function () { - - if (AppInfo.isNativeApp) { - return true; - } - - var url = window.location.href.toLowerCase(); - - return url.indexOf('mediabrowser.tv') != -1 || - url.indexOf('emby.media') != -1; - }, - - isRunningInCordova: function () { - - return window.appMode == 'cordova'; - }, - - onRequestFail: function (e, data) { - - if (data.status == 401) { - - if (data.errorCode == "ParentalControl") { - - var currentView = ViewManager.currentView(); - // Bounce to the login screen, but not if a password entry fails, obviously - if (currentView && !currentView.classList.contains('.standalonePage')) { - - Dashboard.alert({ - message: Globalize.translate('MessageLoggedOutParentalControl'), - callback: function () { - Dashboard.logout(false); - } - }); - } - - } - } - }, - - getCurrentUser: function () { - - return window.ApiClient.getCurrentUser(); - }, - - serverAddress: function () { - - if (Dashboard.isConnectMode()) { - var apiClient = window.ApiClient; - - if (apiClient) { - return apiClient.serverAddress(); - } - - return null; - } - - // Try to get the server address from the browser url - // This will preserve protocol, hostname, port and subdirectory - var urlLower = window.location.href.toLowerCase(); - var index = urlLower.lastIndexOf('/web'); - - if (index != -1) { - return urlLower.substring(0, index); - } - - // If the above failed, just piece it together manually - var loc = window.location; - - var address = loc.protocol + '//' + loc.hostname; - - if (loc.port) { - address += ':' + loc.port; - } - - return address; - }, - - getCurrentUserId: function () { - - var apiClient = window.ApiClient; - - if (apiClient) { - return apiClient.getCurrentUserId(); - } - - return null; - }, - - onServerChanged: function (userId, accessToken, apiClient) { - - apiClient = apiClient || window.ApiClient; - - window.ApiClient = apiClient; - }, - - logout: function (logoutWithServer) { - - function onLogoutDone() { - - var loginPage; - - if (Dashboard.isConnectMode()) { - loginPage = 'connectlogin.html'; - window.ApiClient = null; - } else { - loginPage = 'login.html'; - } - Dashboard.navigate(loginPage); - } - - if (logoutWithServer === false) { - onLogoutDone(); - } else { - ConnectionManager.logout().then(onLogoutDone); - } - }, - - getConfigurationPageUrl: function (name) { - return "configurationpage?name=" + encodeURIComponent(name); - }, - - navigate: function (url, preserveQueryString) { - - if (!url) { - throw new Error('url cannot be null or empty'); - } - - var queryString = getWindowLocationSearch(); - if (preserveQueryString && queryString) { - url += queryString; - } - - return Emby.Page.show(url); - }, - - showLoadingMsg: function () { - - Dashboard.loadingVisible = true; - - require(['loading'], function (loading) { - if (Dashboard.loadingVisible) { - loading.show(); - } else { - loading.hide(); - } - }); - }, - - hideLoadingMsg: function () { - - Dashboard.loadingVisible = false; - - require(['loading'], function (loading) { - if (Dashboard.loadingVisible) { - loading.show(); - } else { - loading.hide(); - } - }); - }, - - processPluginConfigurationUpdateResult: function () { - - Dashboard.hideLoadingMsg(); - - require(['toast'], function (toast) { - toast(Globalize.translate('MessageSettingsSaved')); - }); - }, - - processServerConfigurationUpdateResult: function (result) { - - Dashboard.hideLoadingMsg(); - - require(['toast'], function (toast) { - toast(Globalize.translate('MessageSettingsSaved')); - }); - }, - - processErrorResponse: function (response) { - - Dashboard.hideLoadingMsg(); - - var status = '' + response.status; - - if (response.statusText) { - status = response.statusText; - } - - Dashboard.alert({ - title: status, - message: response.headers ? response.headers.get('X-Application-Error-Code') : null - }); - }, - - alert: function (options) { - - if (typeof options == "string") { - - require(['toast'], function (toast) { - - toast({ - text: options - }); - - }); - - return; - } - - require(['alert'], function (alert) { - alert({ - title: options.title || Globalize.translate('HeaderAlert'), - text: options.message - }).then(options.callback || function () { }); - }); - }, - - restartServer: function () { - - var apiClient = window.ApiClient; - - if (!apiClient) { - return; - } - - Dashboard.suppressAjaxErrors = true; - Dashboard.showLoadingMsg(); - - apiClient.restartServer().then(function () { - - setTimeout(function () { - Dashboard.reloadPageWhenServerAvailable(); - }, 250); - - }, function () { - Dashboard.suppressAjaxErrors = false; - }); - }, - - reloadPageWhenServerAvailable: function (retryCount) { - - var apiClient = window.ApiClient; - - if (!apiClient) { - return; - } - - // Don't use apiclient method because we don't want it reporting authentication under the old version - apiClient.getJSON(apiClient.getUrl("System/Info")).then(function (info) { - - // If this is back to false, the restart completed - if (!info.HasPendingRestart) { - window.location.reload(true); - } else { - Dashboard.retryReload(retryCount); - } - - }, function () { - Dashboard.retryReload(retryCount); - }); - }, - - retryReload: function (retryCount) { - setTimeout(function () { - - retryCount = retryCount || 0; - retryCount++; - - if (retryCount < 10) { - Dashboard.reloadPageWhenServerAvailable(retryCount); - } else { - Dashboard.suppressAjaxErrors = false; - } - }, 500); - }, - - showUserFlyout: function () { - - Dashboard.navigate('mypreferencesmenu.html'); - }, - - getPluginSecurityInfo: function () { - - var apiClient = window.ApiClient; - - if (!apiClient) { - - return Promise.reject(); - } - - var cachedInfo = Dashboard.pluginSecurityInfo; - if (cachedInfo) { - return Promise.resolve(cachedInfo); - } - - return apiClient.ajax({ - type: "GET", - url: apiClient.getUrl("Plugins/SecurityInfo"), - dataType: 'json', - - error: function () { - // Don't show normal dashboard errors - } - - }).then(function (result) { - Dashboard.pluginSecurityInfo = result; - return result; - }); - }, - - resetPluginSecurityInfo: function () { - Dashboard.pluginSecurityInfo = null; - }, - - ensureHeader: function (page) { - - if (page.classList.contains('standalonePage') && !page.classList.contains('noHeaderPage')) { - - Dashboard.renderHeader(page); - } - }, - - renderHeader: function (page) { - - var header = page.querySelector('.header'); - - if (!header) { - var headerHtml = ''; - - headerHtml += ''; - page.insertAdjacentHTML('afterbegin', headerHtml); - } - }, - - getToolsLinkHtml: function (item) { - - var menuHtml = ''; - var pageIds = item.pageIds ? item.pageIds.join(',') : ''; - pageIds = pageIds ? (' data-pageids="' + pageIds + '"') : ''; - menuHtml += ''; - - menuHtml += ''; - menuHtml += item.name; - menuHtml += ''; - menuHtml += ''; - return menuHtml; - }, - - getToolsMenuHtml: function (page) { - - var items = Dashboard.getToolsMenuLinks(page); - - var i, length, item; - var menuHtml = ''; - menuHtml += '
'; - for (i = 0, length = items.length; i < length; i++) { - - item = items[i]; - - if (item.divider) { - menuHtml += "
"; - } - - if (item.href) { - - menuHtml += Dashboard.getToolsLinkHtml(item); - } else { - - menuHtml += '
'; - menuHtml += item.name; - menuHtml += '
'; - } - } - menuHtml += '
'; - - return menuHtml; - }, - - getToolsMenuLinks: function () { - - return [{ - name: Globalize.translate('TabServer') - }, { - name: Globalize.translate('TabDashboard'), - href: "dashboard.html", - pageIds: ['dashboardPage'], - icon: 'dashboard' - }, { - name: Globalize.translate('TabSettings'), - href: "dashboardgeneral.html", - pageIds: ['dashboardGeneralPage'], - icon: 'settings' - }, { - name: Globalize.translate('TabDevices'), - href: "devices.html", - pageIds: ['devicesPage', 'devicePage'], - icon: 'tablet' - }, { - name: Globalize.translate('TabUsers'), - href: "userprofiles.html", - pageIds: ['userProfilesPage', 'newUserPage', 'editUserPage', 'userLibraryAccessPage', 'userParentalControlPage', 'userPasswordPage'], - icon: 'people' - }, { - name: 'Emby Premiere', - href: "supporterkey.html", - pageIds: ['supporterKeyPage'], - icon: 'star' - }, { - divider: true, - name: Globalize.translate('TabLibrary'), - href: "library.html", - pageIds: ['mediaLibraryPage', 'librarySettingsPage', 'libraryDisplayPage', 'metadataImagesConfigurationPage', 'metadataNfoPage'], - icon: 'folder', - color: '#38c' - }, { - name: Globalize.translate('TabSubtitles'), - href: "metadatasubtitles.html", - pageIds: ['metadataSubtitlesPage'], - icon: 'closed_caption' - }, { - name: Globalize.translate('TabPlayback'), - icon: 'play_circle_filled', - color: '#E5342E', - href: "cinemamodeconfiguration.html", - pageIds: ['cinemaModeConfigurationPage', 'playbackConfigurationPage', 'streamingSettingsPage'] - }, { - name: Globalize.translate('TabSync'), - icon: 'sync', - href: "syncactivity.html", - pageIds: ['syncActivityPage', 'syncJobPage', 'devicesUploadPage', 'syncSettingsPage'], - color: '#009688' - }, { - name: Globalize.translate('TabTranscoding'), - icon: 'transform', - href: "encodingsettings.html", - pageIds: ['encodingSettingsPage'] - }, { - divider: true, - name: Globalize.translate('TabExtras') - }, { - name: Globalize.translate('TabAutoOrganize'), - color: '#01C0DD', - href: "autoorganizelog.html", - pageIds: ['libraryFileOrganizerPage', 'libraryFileOrganizerSmartMatchPage', 'libraryFileOrganizerLogPage'], - icon: 'folder' - }, { - name: Globalize.translate('DLNA'), - href: "dlnasettings.html", - pageIds: ['dlnaSettingsPage', 'dlnaProfilesPage', 'dlnaProfilePage'], - icon: 'settings' - }, { - name: Globalize.translate('TabLiveTV'), - href: "livetvstatus.html", - pageIds: ['liveTvStatusPage', 'liveTvSettingsPage', 'liveTvTunerProviderHdHomerunPage', 'liveTvTunerProviderM3UPage', 'liveTvTunerProviderSatPage'], - icon: 'dvr' - }, { - name: Globalize.translate('TabNotifications'), - icon: 'notifications', - color: 'brown', - href: "notificationsettings.html", - pageIds: ['notificationSettingsPage', 'notificationSettingPage'] - }, { - name: Globalize.translate('TabPlugins'), - icon: 'add_shopping_cart', - color: '#9D22B1', - href: "plugins.html", - pageIds: ['pluginsPage', 'pluginCatalogPage'] - }, { - divider: true, - name: Globalize.translate('TabExpert') - }, { - name: Globalize.translate('TabAdvanced'), - icon: 'settings', - href: "dashboardhosting.html", - color: '#F16834', - pageIds: ['dashboardHostingPage', 'serverSecurityPage'] - }, { - name: Globalize.translate('TabLogs'), - href: "log.html", - pageIds: ['logPage'], - icon: 'folder_open' - }, { - name: Globalize.translate('TabScheduledTasks'), - href: "scheduledtasks.html", - pageIds: ['scheduledTasksPage', 'scheduledTaskPage'], - icon: 'schedule' - }, { - name: Globalize.translate('MetadataManager'), - href: "edititemmetadata.html", - pageIds: [], - icon: 'mode_edit' - }, { - name: Globalize.translate('ButtonReports'), - href: "reports.html", - pageIds: [], - icon: 'insert_chart' - }]; - - }, - - getSupportedRemoteCommands: function () { - - // Full list - // https://github.com/MediaBrowser/MediaBrowser/blob/master/MediaBrowser.Model/Session/GeneralCommand.cs - return [ - "GoHome", - "GoToSettings", - "VolumeUp", - "VolumeDown", - "Mute", - "Unmute", - "ToggleMute", - "SetVolume", - "SetAudioStreamIndex", - "SetSubtitleStreamIndex", - "DisplayContent", - "GoToSearch", - "DisplayMessage", - "SetRepeatMode" - ]; - - }, - - capabilities: function () { - - var caps = { - PlayableMediaTypes: ['Audio', 'Video'], - - SupportedCommands: Dashboard.getSupportedRemoteCommands(), - - // Need to use this rather than AppInfo.isNativeApp because the property isn't set yet at the time we call this - SupportsPersistentIdentifier: Dashboard.isRunningInCordova(), - - SupportsMediaControl: true, - SupportedLiveMediaTypes: ['Audio', 'Video'] - }; - - if (Dashboard.isRunningInCordova() && !browserInfo.safari) { - caps.SupportsSync = true; - caps.SupportsContentUploading = true; - } - - return caps; - }, - - normalizeImageOptions: function (options) { - - if (AppInfo.hasLowImageBandwidth) { - - options.enableImageEnhancers = false; - } - - var setQuality; - if (options.maxWidth) { - setQuality = true; - } - - if (options.width) { - setQuality = true; - } - - if (options.maxHeight) { - setQuality = true; - } - - if (options.height) { - setQuality = true; - } - - if (setQuality) { - var quality = 90; - - var isBackdrop = (options.type || '').toLowerCase() == 'backdrop'; - if (isBackdrop) { - quality -= 10; - } - - if (browserInfo.slow) { - quality -= 40; - } - - if (AppInfo.hasLowImageBandwidth && !isBackdrop) { - - quality -= 10; - } - options.quality = quality; - } - } -}; - -var AppInfo = {}; - -(function () { - 'use strict'; - - function setAppInfo() { - - var isCordova = Dashboard.isRunningInCordova(); - - AppInfo.enableHomeTabs = true; - AppInfo.enableAutoSave = browserInfo.touch; - - AppInfo.enableAppStorePolicy = isCordova; - - var isIOS = browserInfo.ipad || browserInfo.iphone; - var isAndroid = browserInfo.android; - - if (isIOS) { - - AppInfo.hasLowImageBandwidth = true; - } - - if (isCordova) { - AppInfo.isNativeApp = true; - AppInfo.enableHomeTabs = false; - - if (isAndroid) { - AppInfo.supportsExternalPlayers = true; - } - } - else { - AppInfo.enableSupporterMembership = true; - } - - // This currently isn't working on android, unfortunately - AppInfo.supportsFileInput = !(AppInfo.isNativeApp && isAndroid); - - if (isCordova && isIOS) { - AppInfo.moreIcon = 'more-horiz'; - } else { - AppInfo.moreIcon = 'more-vert'; - } - - AppInfo.supportsUserDisplayLanguageSetting = Dashboard.isConnectMode(); - } - - function initializeApiClient(apiClient) { - - if (AppInfo.enableAppStorePolicy) { - apiClient.getAvailablePlugins = function () { - return Promise.resolve([]); - }; - apiClient.getInstalledPlugins = function () { - return Promise.resolve([]); - }; - } - - apiClient.normalizeImageOptions = Dashboard.normalizeImageOptions; - - Events.off(apiClient, 'requestfail', Dashboard.onRequestFail); - Events.on(apiClient, 'requestfail', Dashboard.onRequestFail); - } - - function onApiClientCreated(e, newApiClient) { - initializeApiClient(newApiClient); - - // This is not included in jQuery slim - if (window.$) { - $.ajax = newApiClient.ajax; - } - } - - function defineConnectionManager(connectionManager) { - - window.ConnectionManager = connectionManager; - - define('connectionManager', [], function () { - return connectionManager; - }); - } - - var localApiClient; - function bindConnectionManagerEvents(connectionManager, events, userSettings) { - - window.Events = events; - events.on(ConnectionManager, 'apiclientcreated', onApiClientCreated); - - connectionManager.currentApiClient = function () { - - if (!localApiClient) { - var server = connectionManager.getLastUsedServer(); - if (server) { - localApiClient = connectionManager.getApiClient(server.Id); - } - } - return localApiClient; - }; - - //events.on(connectionManager, 'apiclientcreated', function (e, newApiClient) { - - // //$(newApiClient).on("websocketmessage", Dashboard.onWebSocketMessageReceived).on('requestfail', Dashboard.onRequestFail); - // newApiClient.normalizeImageOptions = normalizeImageOptions; - //}); - - // Use this instead of the event because it will fire and wait for the promise before firing events to all listeners - connectionManager.onLocalUserSignedIn = function (user) { - localApiClient = connectionManager.getApiClient(user.ServerId); - window.ApiClient = localApiClient; - return userSettings.setUserInfo(user.Id, localApiClient); - }; - - events.on(connectionManager, 'localusersignedout', function () { - userSettings.setUserInfo(null, null); - }); - } - - //localStorage.clear(); - function createConnectionManager() { - - return new Promise(function (resolve, reject) { - - require(['connectionManagerFactory', 'apphost', 'credentialprovider', 'events', 'userSettings'], function (connectionManagerExports, apphost, credentialProvider, events, userSettings) { - - window.MediaBrowser = Object.assign(window.MediaBrowser || {}, connectionManagerExports); - - var credentialProviderInstance = new credentialProvider(); - - var promises = [apphost.getSyncProfile(), apphost.appInfo()]; - - Promise.all(promises).then(function (responses) { - - var deviceProfile = responses[0]; - var appInfo = responses[1]; - - var capabilities = Dashboard.capabilities(); - capabilities.DeviceProfile = deviceProfile; - - var connectionManager = new MediaBrowser.ConnectionManager(credentialProviderInstance, appInfo.appName, appInfo.appVersion, appInfo.deviceName, appInfo.deviceId, capabilities, window.devicePixelRatio); - - defineConnectionManager(connectionManager); - bindConnectionManagerEvents(connectionManager, events, userSettings); - - if (Dashboard.isConnectMode()) { - - resolve(); - - } else { - - console.log('loading ApiClient singleton'); - - return getRequirePromise(['apiclient']).then(function (apiClientFactory) { - - console.log('creating ApiClient singleton'); - - var apiClient = new apiClientFactory(Dashboard.serverAddress(), appInfo.appName, appInfo.appVersion, appInfo.deviceName, appInfo.deviceId, window.devicePixelRatio); - apiClient.enableAutomaticNetworking = false; - connectionManager.addApiClient(apiClient); - require(['css!' + apiClient.getUrl('Branding/Css')]); - window.ApiClient = apiClient; - localApiClient = apiClient; - console.log('loaded ApiClient singleton'); - resolve(); - }); - } - }); - }); - }); - } - - function setDocumentClasses(browser) { - - var elem = document.documentElement; - - if (!AppInfo.enableSupporterMembership) { - elem.classList.add('supporterMembershipDisabled'); - } - } - - function loadTheme() { - - var name = getParameterByName('theme'); - if (name) { - require(['themes/' + name + '/theme']); - return; - } - - if (AppInfo.isNativeApp) { - return; - } - - var date = new Date(); - var month = date.getMonth(); - var day = date.getDate(); - - if (month == 9 && day >= 30) { - require(['themes/halloween/theme']); - return; - } - - //if (month == 11 && day >= 20 && day <= 25) { - // require(['themes/holiday/theme']); - // return; - //} - } - - function returnFirstDependency(obj) { - return obj; - } - - function getBowerPath() { - - return "bower_components"; - } - - function getLayoutManager(layoutManager) { - - layoutManager.init(); - return layoutManager; - } - - function getAppStorage(basePath) { - - try { - localStorage.setItem('_test', '0'); - localStorage.removeItem('_test'); - return basePath + "/appstorage-localstorage"; - } catch (e) { - return basePath + "/appstorage-memory"; - } - } - - function createWindowHeadroom() { - // construct an instance of Headroom, passing the element - var headroom = new Headroom([], { - // or scroll tolerance per direction - tolerance: { - down: 0, - up: 0 - }, - classes: { - //pinned: 'appfooter--pinned', - //unpinned: 'appfooter--unpinned', - //initial: 'appfooter-headroom' - } - }); - // initialise - headroom.init(); - return headroom; - } - - function createMainContentHammer(Hammer) { - - var hammer = new Hammer(document.querySelector('.mainDrawerPanelContent'), null); - return hammer; - } - - function createSharedAppFooter(appFooter) { - var footer = new appFooter({}); - return footer; - } - - function initRequire() { - - var urlArgs = "v=" + (window.dashboardVersion || new Date().getDate()); - - var bowerPath = getBowerPath(); - - var apiClientBowerPath = bowerPath + "/emby-apiclient"; - var embyWebComponentsBowerPath = bowerPath + '/emby-webcomponents'; - - var paths = { - velocity: bowerPath + "/velocity/velocity.min", - vibrant: bowerPath + "/vibrant/dist/vibrant", - ironCardList: 'components/ironcardlist/ironcardlist', - scrollThreshold: 'components/scrollthreshold', - playlisteditor: 'components/playlisteditor/playlisteditor', - medialibrarycreator: 'components/medialibrarycreator/medialibrarycreator', - medialibraryeditor: 'components/medialibraryeditor/medialibraryeditor', - howler: bowerPath + '/howlerjs/howler.min', - sortable: bowerPath + '/Sortable/Sortable.min', - isMobile: bowerPath + '/isMobile/isMobile.min', - headroom: bowerPath + '/headroomjs/dist/headroom', - masonry: bowerPath + '/masonry/dist/masonry.pkgd.min', - humanedate: 'components/humanedate', - libraryBrowser: 'scripts/librarybrowser', - chromecasthelpers: 'components/chromecasthelpers', - events: apiClientBowerPath + '/events', - credentialprovider: apiClientBowerPath + '/credentials', - apiclient: apiClientBowerPath + '/apiclient', - connectionManagerFactory: bowerPath + '/emby-apiclient/connectionmanager', - visibleinviewport: embyWebComponentsBowerPath + "/visibleinviewport", - browserdeviceprofile: embyWebComponentsBowerPath + "/browserdeviceprofile", - browser: embyWebComponentsBowerPath + "/browser", - inputManager: embyWebComponentsBowerPath + "/inputmanager", - qualityoptions: embyWebComponentsBowerPath + "/qualityoptions", - hammer: bowerPath + "/hammerjs/hammer.min", - pageJs: embyWebComponentsBowerPath + '/pagejs/page', - focusManager: embyWebComponentsBowerPath + "/focusmanager", - datetime: embyWebComponentsBowerPath + "/datetime", - globalize: embyWebComponentsBowerPath + "/globalize", - itemHelper: embyWebComponentsBowerPath + '/itemhelper', - itemShortcuts: embyWebComponentsBowerPath + "/shortcuts", - serverNotifications: embyWebComponentsBowerPath + '/servernotifications', - playbackManager: embyWebComponentsBowerPath + '/playback/playbackmanager', - nowPlayingHelper: embyWebComponentsBowerPath + '/playback/nowplayinghelper', - pluginManager: embyWebComponentsBowerPath + '/pluginmanager', - packageManager: embyWebComponentsBowerPath + '/packagemanager', - webAnimations: bowerPath + '/web-animations-js/web-animations-next-lite.min' - }; - - paths.hlsjs = bowerPath + "/hlsjs/dist/hls.min"; - - define("webActionSheet", [embyWebComponentsBowerPath + "/actionsheet/actionsheet"], returnFirstDependency); - - if (Dashboard.isRunningInCordova()) { - paths.sharingMenu = "cordova/sharingwidget"; - } else { - - define("sharingMenu", [embyWebComponentsBowerPath + "/sharing/sharingmenu"], returnFirstDependency); - } - - paths.wakeonlan = apiClientBowerPath + "/wakeonlan"; - - define("libjass", [bowerPath + "/libjass/libjass.min", "css!" + bowerPath + "/libjass/libjass"], returnFirstDependency); - - if (window.IntersectionObserver) { - define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-intersectionobserver"], returnFirstDependency); - } else { - define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-scroll"], returnFirstDependency); - } - define("imageLoader", [embyWebComponentsBowerPath + "/images/imagehelper"], returnFirstDependency); - define("appfooter", ["components/appfooter/appfooter"], returnFirstDependency); - define("dockedtabs", ["components/dockedtabs/dockedtabs"], returnFirstDependency); - define("directorybrowser", ["components/directorybrowser/directorybrowser"], returnFirstDependency); - define("metadataEditor", [embyWebComponentsBowerPath + "/metadataeditor/metadataeditor"], returnFirstDependency); - define("personEditor", [embyWebComponentsBowerPath + "/metadataeditor/personeditor"], returnFirstDependency); - define("playerSelectionMenu", [embyWebComponentsBowerPath + "/playback/playerselection"], returnFirstDependency); - define("playerSettingsMenu", [embyWebComponentsBowerPath + "/playback/playersettingsmenu"], returnFirstDependency); - - define("libraryMenu", ["scripts/librarymenu"], returnFirstDependency); - - define("emby-collapse", [embyWebComponentsBowerPath + "/emby-collapse/emby-collapse"], returnFirstDependency); - define("emby-button", [embyWebComponentsBowerPath + "/emby-button/emby-button"], returnFirstDependency); - define("emby-itemscontainer", [embyWebComponentsBowerPath + "/emby-itemscontainer/emby-itemscontainer"], returnFirstDependency); - define("emby-tabs", [embyWebComponentsBowerPath + "/emby-tabs/emby-tabs"], returnFirstDependency); - define("itemHoverMenu", [embyWebComponentsBowerPath + "/itemhovermenu/itemhovermenu"], returnFirstDependency); - define("multiSelect", [embyWebComponentsBowerPath + "/multiselect/multiselect"], returnFirstDependency); - define("alphaPicker", [embyWebComponentsBowerPath + "/alphapicker/alphapicker"], returnFirstDependency); - define("paper-icon-button-light", [embyWebComponentsBowerPath + "/emby-button/paper-icon-button-light"]); - - define("connectHelper", [embyWebComponentsBowerPath + "/emby-connect/connecthelper"], returnFirstDependency); - - define("emby-input", [embyWebComponentsBowerPath + "/emby-input/emby-input"], returnFirstDependency); - define("emby-select", [embyWebComponentsBowerPath + "/emby-select/emby-select"], returnFirstDependency); - define("emby-slider", [embyWebComponentsBowerPath + "/emby-slider/emby-slider"], returnFirstDependency); - define("emby-checkbox", [embyWebComponentsBowerPath + "/emby-checkbox/emby-checkbox"], returnFirstDependency); - define("emby-toggle", [embyWebComponentsBowerPath + "/emby-toggle/emby-toggle"], returnFirstDependency); - define("emby-radio", [embyWebComponentsBowerPath + "/emby-radio/emby-radio"], returnFirstDependency); - define("emby-textarea", [embyWebComponentsBowerPath + "/emby-textarea/emby-textarea"], returnFirstDependency); - define("collectionEditor", [embyWebComponentsBowerPath + "/collectioneditor/collectioneditor"], returnFirstDependency); - define("playlistEditor", [embyWebComponentsBowerPath + "/playlisteditor/playlisteditor"], returnFirstDependency); - define("recordingCreator", [embyWebComponentsBowerPath + "/recordingcreator/recordingcreator"], returnFirstDependency); - define("recordingEditor", [embyWebComponentsBowerPath + "/recordingcreator/recordingeditor"], returnFirstDependency); - define("seriesRecordingEditor", [embyWebComponentsBowerPath + "/recordingcreator/seriesrecordingeditor"], returnFirstDependency); - define("recordingFields", [embyWebComponentsBowerPath + "/recordingcreator/recordingfields"], returnFirstDependency); - define("recordingHelper", [embyWebComponentsBowerPath + "/recordingcreator/recordinghelper"], returnFirstDependency); - define("subtitleEditor", [embyWebComponentsBowerPath + "/subtitleeditor/subtitleeditor"], returnFirstDependency); - define("itemIdentifier", [embyWebComponentsBowerPath + "/itemidentifier/itemidentifier"], returnFirstDependency); - define("mediaInfo", [embyWebComponentsBowerPath + "/mediainfo/mediainfo"], returnFirstDependency); - define("itemContextMenu", [embyWebComponentsBowerPath + "/itemcontextmenu"], returnFirstDependency); - define("imageEditor", [embyWebComponentsBowerPath + "/imageeditor/imageeditor"], returnFirstDependency); - define("dom", [embyWebComponentsBowerPath + "/dom"], returnFirstDependency); - - define("fullscreen-doubleclick", [embyWebComponentsBowerPath + "/fullscreen/fullscreen-doubleclick"], returnFirstDependency); - define("fullscreenManager", [embyWebComponentsBowerPath + "/fullscreen/fullscreenmanager", 'events'], returnFirstDependency); - - define("layoutManager", [embyWebComponentsBowerPath + "/layoutmanager"], getLayoutManager); - define("playMenu", [embyWebComponentsBowerPath + "/playmenu"], returnFirstDependency); - define("refreshDialog", [embyWebComponentsBowerPath + "/refreshdialog/refreshdialog"], returnFirstDependency); - define("backdrop", [embyWebComponentsBowerPath + "/backdrop/backdrop"], returnFirstDependency); - define("fetchHelper", [embyWebComponentsBowerPath + "/fetchhelper"], returnFirstDependency); - - define("roundCardStyle", ["cardStyle", 'css!' + embyWebComponentsBowerPath + "/cardbuilder/roundcard"], returnFirstDependency); - define("cardStyle", ['css!' + embyWebComponentsBowerPath + "/cardbuilder/card"], returnFirstDependency); - define("cardBuilder", [embyWebComponentsBowerPath + "/cardbuilder/cardbuilder"], returnFirstDependency); - define("peoplecardbuilder", [embyWebComponentsBowerPath + "/cardbuilder/peoplecardbuilder"], returnFirstDependency); - define("chaptercardbuilder", [embyWebComponentsBowerPath + "/cardbuilder/chaptercardbuilder"], returnFirstDependency); - - define("mouseManager", [embyWebComponentsBowerPath + "/input/mouse"], returnFirstDependency); - - define("deleteHelper", [embyWebComponentsBowerPath + "/deletehelper"], returnFirstDependency); - define("tvguide", [embyWebComponentsBowerPath + "/guide/guide"], returnFirstDependency); - define("programStyles", ['css!' + embyWebComponentsBowerPath + "/guide/programs"], returnFirstDependency); - define("guide-settings-dialog", [embyWebComponentsBowerPath + "/guide/guide-settings"], returnFirstDependency); - define("syncDialog", [embyWebComponentsBowerPath + "/sync/sync"], returnFirstDependency); - define("syncToggle", [embyWebComponentsBowerPath + "/sync/synctoggle"], returnFirstDependency); - define("syncJobEditor", [embyWebComponentsBowerPath + "/sync/syncjobeditor"], returnFirstDependency); - define("syncJobList", [embyWebComponentsBowerPath + "/sync/syncjoblist"], returnFirstDependency); - define("voiceDialog", [embyWebComponentsBowerPath + "/voice/voicedialog"], returnFirstDependency); - define("voiceReceiver", [embyWebComponentsBowerPath + "/voice/voicereceiver"], returnFirstDependency); - define("voiceProcessor", [embyWebComponentsBowerPath + "/voice/voiceprocessor"], returnFirstDependency); - - define("viewManager", [embyWebComponentsBowerPath + "/viewmanager/viewmanager"], function (viewManager) { - window.ViewManager = viewManager; - viewManager.dispatchPageEvents(true); - return viewManager; - }); - - // hack for an android test before browserInfo is loaded - if (Dashboard.isRunningInCordova() && window.MainActivity) { - define("shell", ["cordova/shell"], returnFirstDependency); - } else { - define("shell", [embyWebComponentsBowerPath + "/shell"], returnFirstDependency); - } - - define("sharingmanager", [embyWebComponentsBowerPath + "/sharing/sharingmanager"], returnFirstDependency); - - if (Dashboard.isRunningInCordova()) { - paths.apphost = "cordova/apphost"; - } else { - paths.apphost = "components/apphost"; - } - - // hack for an android test before browserInfo is loaded - if (Dashboard.isRunningInCordova() && window.MainActivity) { - paths.appStorage = "cordova/appstorage"; - paths.filesystem = 'cordova/filesystem'; - } else { - paths.appStorage = getAppStorage(apiClientBowerPath); - paths.filesystem = embyWebComponentsBowerPath + '/filesystem'; - } - - var sha1Path = bowerPath + "/cryptojslib/components/sha1-min"; - var md5Path = bowerPath + "/cryptojslib/components/md5-min"; - var shim = {}; - - shim[sha1Path] = { - deps: [bowerPath + "/cryptojslib/components/core-min"] - }; - - shim[md5Path] = { - deps: [bowerPath + "/cryptojslib/components/core-min"] - }; - - requirejs.config({ - waitSeconds: 0, - map: { - '*': { - 'css': bowerPath + '/emby-webcomponents/require/requirecss', - 'html': bowerPath + '/emby-webcomponents/require/requirehtml', - 'text': bowerPath + '/emby-webcomponents/require/requiretext' - } - }, - urlArgs: urlArgs, - - paths: paths, - shim: shim - }); - - define("cryptojs-sha1", [sha1Path]); - define("cryptojs-md5", [md5Path]); - - define("jstree", [bowerPath + "/jstree/dist/jstree", "css!thirdparty/jstree/themes/default/style.min.css"]); - - define("dashboardcss", ['css!css/dashboard']); - - define("jqmtable", ["thirdparty/jquerymobile-1.4.5/jqm.table", 'css!thirdparty/jquerymobile-1.4.5/jqm.table.css']); - - define("jqmwidget", ["thirdparty/jquerymobile-1.4.5/jqm.widget"]); - - define("jqmslider", ["thirdparty/jquerymobile-1.4.5/jqm.slider", 'css!thirdparty/jquerymobile-1.4.5/jqm.slider.css']); - - define("jqmpopup", ["thirdparty/jquerymobile-1.4.5/jqm.popup", 'css!thirdparty/jquerymobile-1.4.5/jqm.popup.css']); - - define("jqmlistview", ['css!thirdparty/jquerymobile-1.4.5/jqm.listview.css']); - - define("jqmpanel", ["thirdparty/jquerymobile-1.4.5/jqm.panel", 'css!thirdparty/jquerymobile-1.4.5/jqm.panel.css']); - - define("slideshow", [embyWebComponentsBowerPath + "/slideshow/slideshow"], returnFirstDependency); - - define('fetch', [bowerPath + '/fetch/fetch']); - - define('raf', [embyWebComponentsBowerPath + '/polyfills/raf']); - define('functionbind', [embyWebComponentsBowerPath + '/polyfills/bind']); - define('arraypolyfills', [embyWebComponentsBowerPath + '/polyfills/array']); - define('objectassign', [embyWebComponentsBowerPath + '/polyfills/objectassign']); - - define("clearButtonStyle", ['css!' + embyWebComponentsBowerPath + '/clearbutton']); - define("userdataButtons", [embyWebComponentsBowerPath + "/userdatabuttons/userdatabuttons"], returnFirstDependency); - define("listView", [embyWebComponentsBowerPath + "/listview/listview"], returnFirstDependency); - define("listViewStyle", ['css!' + embyWebComponentsBowerPath + "/listview/listview"], returnFirstDependency); - define("formDialogStyle", ['css!' + embyWebComponentsBowerPath + "/formdialog"], returnFirstDependency); - define("indicators", [embyWebComponentsBowerPath + "/indicators/indicators"], returnFirstDependency); - - define("registrationServices", [embyWebComponentsBowerPath + "/registrationservices/registrationservices"], returnFirstDependency); - - if (Dashboard.isRunningInCordova()) { - define("iapManager", ["cordova/iap"], returnFirstDependency); - define("fileupload", ["cordova/fileupload"], returnFirstDependency); - } else { - define("iapManager", ["components/iap"], returnFirstDependency); - define("fileupload", [apiClientBowerPath + "/fileupload"], returnFirstDependency); - } - define("connectionmanager", [apiClientBowerPath + "/connectionmanager"]); - - define("cameraRoll", [apiClientBowerPath + "/cameraroll"], returnFirstDependency); - define("contentuploader", [apiClientBowerPath + "/sync/contentuploader"]); - define("serversync", [apiClientBowerPath + "/sync/serversync"]); - define("multiserversync", [apiClientBowerPath + "/sync/multiserversync"]); - define("offlineusersync", [apiClientBowerPath + "/sync/offlineusersync"]); - define("mediasync", [apiClientBowerPath + "/sync/mediasync"]); - - define("swiper", [bowerPath + "/Swiper/dist/js/swiper.min", "css!" + bowerPath + "/Swiper/dist/css/swiper.min"], returnFirstDependency); - - define("scroller", [embyWebComponentsBowerPath + "/scroller/smoothscroller"], returnFirstDependency); - define("toast", [embyWebComponentsBowerPath + "/toast/toast"], returnFirstDependency); - define("scrollHelper", [embyWebComponentsBowerPath + "/scrollhelper"], returnFirstDependency); - - define("appSettings", [embyWebComponentsBowerPath + "/appsettings"], updateAppSettings); - define("userSettings", [embyWebComponentsBowerPath + "/usersettings/usersettings"], returnFirstDependency); - define("userSettingsBuilder", [embyWebComponentsBowerPath + "/usersettings/usersettingsbuilder"], returnFirstDependency); - - define("material-icons", ['css!' + embyWebComponentsBowerPath + '/fonts/material-icons/style']); - define("robotoFont", ['css!' + embyWebComponentsBowerPath + '/fonts/roboto/style']); - define("scrollStyles", ['css!' + embyWebComponentsBowerPath + '/scrollstyles']); - - define("navdrawer", ['components/navdrawer/navdrawer'], returnFirstDependency); - define("viewcontainer", ['components/viewcontainer-lite', 'css!' + embyWebComponentsBowerPath + '/viewmanager/viewcontainer-lite'], returnFirstDependency); - define('queryString', [bowerPath + '/query-string/index'], function () { - return queryString; - }); - - define("jQuery", [bowerPath + '/jquery/dist/jquery.slim.min'], function () { - - if (window.ApiClient) { - jQuery.ajax = ApiClient.ajax; - } - return jQuery; - }); - - define("fnchecked", ['legacy/fnchecked']); - - define("dialogHelper", [embyWebComponentsBowerPath + "/dialoghelper/dialoghelper"], function (dialoghelper) { - - dialoghelper.setOnOpen(onDialogOpen); - return dialoghelper; - }); - - define("inputmanager", ['inputManager'], returnFirstDependency); - - // alias - define("historyManager", ['embyRouter'], returnFirstDependency); - - define("headroom-window", ['headroom'], createWindowHeadroom); - define("hammer-main", ['hammer'], createMainContentHammer); - define("appfooter-shared", ['appfooter'], createSharedAppFooter); - - // mock this for now. not used in this app - define("skinManager", [], function () { - - return { - loadUserSkin: function () { - - Emby.Page.show('/home.html'); - } - }; - }); - - define("connectionManager", [], function () { - return ConnectionManager; - }); - - define('apiClientResolver', [], function () { - return function () { - return window.ApiClient; - }; - }); - - define("embyRouter", [embyWebComponentsBowerPath + '/router'], function (embyRouter) { - - embyRouter.showLocalLogin = function (apiClient, serverId, manualLogin) { - Dashboard.navigate('login.html?serverid=' + serverId); - }; - - embyRouter.showVideoOsd = function () { - return Dashboard.navigate('videoosd.html'); - }; - - embyRouter.showSelectServer = function () { - Dashboard.navigate('selectserver.html'); - }; - - embyRouter.showWelcome = function () { - - if (Dashboard.isConnectMode()) { - Dashboard.navigate('connectlogin.html?mode=welcome'); - } else { - Dashboard.navigate('login.html'); - } - }; - - embyRouter.showSettings = function () { - Dashboard.navigate('mypreferencesmenu.html'); - }; - - embyRouter.showGuide = function () { - Dashboard.navigate('livetv.html?tab=1'); - }; - - embyRouter.goHome = function () { - Dashboard.navigate('home.html'); - }; - - embyRouter.showSearch = function () { - Dashboard.navigate('search.html'); - }; - - embyRouter.showLiveTV = function () { - Dashboard.navigate('livetv.html'); - }; - - embyRouter.showRecordedTV = function () { - Dashboard.navigate('livetv.html?tab=3'); - }; - - embyRouter.showFavorites = function () { - Dashboard.navigate('favorites.html'); - }; - - embyRouter.showSettings = function () { - Dashboard.navigate('mypreferencesmenu.html'); - }; - - embyRouter.setTitle = function () { - }; - - function showItem(item, serverId, options) { - if (typeof (item) === 'string') { - require(['connectionManager'], function (connectionManager) { - var apiClient = connectionManager.currentApiClient(); - apiClient.getItem(apiClient.getCurrentUserId(), item).then(function (item) { - embyRouter.showItem(item, options); - }); - }); - } else { - - if (arguments.length == 2) { - options = arguments[1]; - } - - var context = options ? options.context : null; - Emby.Page.show('/' + LibraryBrowser.getHref(item, context), { item: item }); - } - } - - embyRouter.showItem = showItem; - - return embyRouter; - }); - } - - function updateAppSettings(appSettings) { - - appSettings.enableExternalPlayers = function (val) { - - if (val != null) { - appSettings.set('externalplayers', val.toString()); - } - - return appSettings.get('externalplayers') === 'true'; - }; - - return appSettings; - } - - function onDialogOpen(dlg) { - if (!dlg.classList.contains('background-theme-a') && !dlg.classList.contains('actionSheet')) { - - dlg.classList.add('background-theme-b'); - dlg.classList.add('ui-body-b'); - } - } - - function initRequireWithBrowser(browser) { - - var bowerPath = getBowerPath(); - var apiClientBowerPath = bowerPath + "/emby-apiclient"; - var embyWebComponentsBowerPath = bowerPath + '/emby-webcomponents'; - - if (Dashboard.isRunningInCordova() && browser.safari) { - define("actionsheet", ["cordova/actionsheet"], returnFirstDependency); - } else { - define("actionsheet", ["webActionSheet"], returnFirstDependency); - } - - if (!('registerElement' in document)) { - if (browser.msie) { - define("registerElement", [bowerPath + '/webcomponentsjs/webcomponents-lite.min.js']); - } else { - define("registerElement", [bowerPath + '/document-register-element/build/document-register-element']); - } - } else { - define("registerElement", []); - } - - if ((window.chrome && window.chrome.sockets)) { - define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery-chrome"], returnFirstDependency); - } else if (Dashboard.isRunningInCordova() && browser.android) { - define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency); - } else if (Dashboard.isRunningInCordova() && browser.safari) { - define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery-chrome"], returnFirstDependency); - } else { - define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery"], returnFirstDependency); - } - - if (Dashboard.isRunningInCordova() && browser.safari) { - define("imageFetcher", ['cordova/imagestore'], returnFirstDependency); - } else { - define("imageFetcher", [embyWebComponentsBowerPath + "/images/basicimagefetcher"], returnFirstDependency); - } - - var preferNativeAlerts = browser.tv; - // use native alerts if preferred and supported (not supported in opera tv) - if (preferNativeAlerts && window.alert) { - define("alert", [embyWebComponentsBowerPath + "/alert/nativealert"], returnFirstDependency); - } else { - define("alert", [embyWebComponentsBowerPath + "/alert/alert"], returnFirstDependency); - } - - define("dialog", [embyWebComponentsBowerPath + "/dialog/dialog"], returnFirstDependency); - - if (preferNativeAlerts && window.confirm) { - define("confirm", [embyWebComponentsBowerPath + "/confirm/nativeconfirm"], returnFirstDependency); - } else { - define("confirm", [embyWebComponentsBowerPath + "/confirm/confirm"], returnFirstDependency); - } - - var preferNativePrompt = preferNativeAlerts || browser.xboxOne; - if (preferNativePrompt && window.confirm) { - define("prompt", [embyWebComponentsBowerPath + "/prompt/nativeprompt"], returnFirstDependency); - } else { - define("prompt", [embyWebComponentsBowerPath + "/prompt/prompt"], returnFirstDependency); - } - - if (browser.tizen || browser.operaTv) { - // Need the older version due to artifacts - define("loading", [embyWebComponentsBowerPath + "/loading/loading-legacy"], returnFirstDependency); - } else { - define("loading", [embyWebComponentsBowerPath + "/loading/loading-lite"], returnFirstDependency); - } - - define("multi-download", [embyWebComponentsBowerPath + '/multidownload'], returnFirstDependency); - - if (Dashboard.isRunningInCordova() && browser.android) { - define("fileDownloader", ['cordova/filedownloader'], returnFirstDependency); - define("localassetmanager", ["cordova/localassetmanager"], returnFirstDependency); - } else { - define("fileDownloader", [embyWebComponentsBowerPath + '/filedownloader'], returnFirstDependency); - define("localassetmanager", [apiClientBowerPath + "/localassetmanager"], returnFirstDependency); - } - - define("screenLock", [embyWebComponentsBowerPath + "/resourcelocks/nullresourcelock"], returnFirstDependency); - - if (Dashboard.isRunningInCordova() && browser.android) { - define("resourceLockManager", [embyWebComponentsBowerPath + "/resourcelocks/resourcelockmanager"], returnFirstDependency); - define("wakeLock", ["cordova/wakelock"], returnFirstDependency); - define("networkLock", ["cordova/networklock"], returnFirstDependency); - } else { - define("resourceLockManager", [embyWebComponentsBowerPath + "/resourcelocks/resourcelockmanager"], returnFirstDependency); - define("wakeLock", [embyWebComponentsBowerPath + "/resourcelocks/nullresourcelock"], returnFirstDependency); - define("networkLock", [embyWebComponentsBowerPath + "/resourcelocks/nullresourcelock"], returnFirstDependency); - } - } - - function getDummyResourceLockManager() { - return { - request: function (resourceType) { - return Promise.reject(); - } - }; - } - - function init() { - - if (Dashboard.isRunningInCordova() && browserInfo.android) { - define("nativedirectorychooser", ["cordova/nativedirectorychooser"]); - } - - if (Dashboard.isRunningInCordova() && browserInfo.android) { - define("localsync", ["cordova/localsync"], returnFirstDependency); - } - else { - define("localsync", ["scripts/localsync"], returnFirstDependency); - } - - define("livetvcss", ['css!css/livetv.css']); - define("detailtablecss", ['css!css/detailtable.css']); - define("autoorganizetablecss", ['css!css/autoorganizetable.css']); - - define("buttonenabled", ["legacy/buttonenabled"]); - - initAfterDependencies(); - } - - function getRequirePromise(deps) { - - return new Promise(function (resolve, reject) { - - require(deps, resolve); - }); - } - - function initAfterDependencies() { - - var list = []; - - if (!window.fetch) { - list.push('fetch'); - } - - if (typeof Object.assign != 'function') { - list.push('objectassign'); - } - - if (!Array.prototype.filter) { - list.push('arraypolyfills'); - } - - if (!Function.prototype.bind) { - list.push('functionbind'); - } - - if (!window.requestAnimationFrame) { - list.push('raf'); - } - - require(list, function () { - - createConnectionManager().then(function () { - - console.log('initAfterDependencies promises resolved'); - - require(['globalize'], function (globalize) { - - window.Globalize = globalize; - - Promise.all([loadCoreDictionary(globalize), loadSharedComponentsDictionary(globalize)]).then(onGlobalizeInit); - }); - }); - }); - } - - function loadSharedComponentsDictionary(globalize) { - - var baseUrl = 'bower_components/emby-webcomponents/strings/'; - - var languages = ['ar', 'bg-bg', 'ca', 'cs', 'da', 'de', 'el', 'en-gb', 'en-us', 'es-ar', 'es-mx', 'es', 'fi', 'fr', 'gsw', 'he', 'hr', 'hu', 'id', 'it', 'kk', 'ko', 'ms', 'nb', 'nl', 'pl', 'pt-br', 'pt-pt', 'ro', 'ru', 'sk', 'sl-si', 'sv', 'tr', 'uk', 'vi', 'zh-cn', 'zh-hk', 'zh-tw']; - - var translations = languages.map(function (i) { - return { - lang: i, - path: baseUrl + i + '.json' - }; - }); - - globalize.loadStrings({ - name: 'sharedcomponents', - translations: translations - }); - } - - function loadCoreDictionary(globalize) { - - var baseUrl = 'strings/'; - - var languages = ['ar', 'bg-bg', 'ca', 'cs', 'da', 'de', 'el', 'en-gb', 'en-us', 'es-ar', 'es-mx', 'es', 'fi', 'fr', 'gsw', 'he', 'hr', 'hu', 'id', 'it', 'kk', 'ko', 'ms', 'nb', 'nl', 'pl', 'pt-br', 'pt-pt', 'ro', 'ru', 'sl-si', 'sv', 'tr', 'uk', 'vi', 'zh-cn', 'zh-hk', 'zh-tw']; - - var translations = languages.map(function (i) { - return { - lang: i, - path: baseUrl + i + '.json' - }; - }); - - globalize.defaultModule('core'); - - return globalize.loadStrings({ - name: 'core', - translations: translations - }); - } - - function onGlobalizeInit() { - - document.title = Globalize.translateDocument(document.title, 'core'); - - require(['apphost'], function (appHost) { - - loadPlugins([], appHost, browserInfo).then(onAppReady); - }); - } - - function defineRoute(newRoute, dictionary) { - - var baseRoute = Emby.Page.baseUrl(); - - var path = newRoute.path; - - path = path.replace(baseRoute, ''); - - console.log('Defining route: ' + path); - - newRoute.dictionary = newRoute.dictionary || dictionary || 'core'; - Emby.Page.addRoute(path, newRoute); - } - - function defineCoreRoutes() { - - console.log('Defining core routes'); - - defineRoute({ - path: '/addplugin.html', - dependencies: [], - autoFocus: false, - roles: 'admin', - controller: 'scripts/addpluginpage' - }); - - defineRoute({ - path: '/appservices.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/autoorganizelog.html', - dependencies: ['scripts/taskbutton', 'autoorganizetablecss'], - controller: 'dashboard/autoorganizelog', - roles: 'admin' - }); - - defineRoute({ - path: '/autoorganizesmart.html', - dependencies: ['emby-button'], - controller: 'dashboard/autoorganizesmart', - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/autoorganizetv.html', - dependencies: ['emby-checkbox', 'emby-input', 'emby-button', 'emby-select', 'emby-collapse'], - controller: 'dashboard/autoorganizetv', - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/channelitems.html', - dependencies: [], - autoFocus: false, - transition: 'fade' - }); - - defineRoute({ - path: '/channels.html', - dependencies: [], - autoFocus: false, - transition: 'fade', - controller: 'scripts/channels' - }); - - defineRoute({ - path: '/channelsettings.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/cinemamodeconfiguration.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/connectlogin.html', - dependencies: ['emby-button', 'emby-input'], - autoFocus: false, - anonymous: true, - startup: true, - controller: 'scripts/connectlogin' - }); - - defineRoute({ - path: '/dashboard.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/dashboardgeneral.html', - controller: 'dashboard/dashboardgeneral', - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/dashboardhosting.html', - dependencies: ['emby-input', 'emby-button'], - autoFocus: false, - roles: 'admin', - controller: 'dashboard/dashboardhosting' - }); - - defineRoute({ - path: '/device.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/devices.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/devicesupload.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/dlnaprofile.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/dlnaprofiles.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/dlnaserversettings.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/dlnasettings.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/edititemmetadata.html', - dependencies: [], - controller: 'scripts/edititemmetadata', - autoFocus: false - }); - - defineRoute({ - path: '/encodingsettings.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/favorites.html', - dependencies: [], - autoFocus: false, - controller: 'scripts/favorites' - }); - - defineRoute({ - path: '/forgotpassword.html', - dependencies: ['emby-input', 'emby-button'], - anonymous: true, - startup: true, - controller: 'scripts/forgotpassword' - }); - - defineRoute({ - path: '/forgotpasswordpin.html', - dependencies: ['emby-input', 'emby-button'], - autoFocus: false, - anonymous: true, - startup: true, - controller: 'scripts/forgotpasswordpin' - }); - - defineRoute({ - path: '/gamegenres.html', - dependencies: [], - autoFocus: false - }); - - defineRoute({ - path: '/games.html', - dependencies: [], - autoFocus: false - }); - - defineRoute({ - path: '/gamesrecommended.html', - dependencies: [], - autoFocus: false - }); - - defineRoute({ - path: '/gamestudios.html', - dependencies: [], - autoFocus: false - }); - - defineRoute({ - path: '/gamesystems.html', - dependencies: [], - autoFocus: false - }); - - defineRoute({ - path: '/home.html', - dependencies: [], - autoFocus: false, - controller: 'scripts/indexpage', - transition: 'fade', - type: 'home' - }); - - defineRoute({ - path: '/index.html', - dependencies: [], - autoFocus: false, - isDefaultRoute: true - }); - - defineRoute({ - path: '/itemdetails.html', - dependencies: ['emby-button', 'scripts/livetvcomponents', 'paper-icon-button-light', 'emby-itemscontainer'], - controller: 'scripts/itemdetailpage', - autoFocus: false, - transition: 'fade' - }); - - defineRoute({ - path: '/itemlist.html', - dependencies: [], - autoFocus: false, - controller: 'scripts/itemlistpage', - transition: 'fade' - }); - - defineRoute({ - path: '/kids.html', - dependencies: [], - autoFocus: false - }); - - defineRoute({ - path: '/library.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/librarydisplay.html', - dependencies: [], - autoFocus: false, - roles: 'admin', - controller: 'dashboard/librarydisplay' - }); - - defineRoute({ - path: '/librarysettings.html', - dependencies: ['emby-collapse', 'emby-input', 'emby-button', 'emby-select'], - autoFocus: false, - roles: 'admin', - controller: 'dashboard/librarysettings' - }); - - defineRoute({ - path: '/livetv.html', - dependencies: ['emby-button', 'livetvcss'], - controller: 'scripts/livetvsuggested', - autoFocus: false, - transition: 'fade' - }); - - defineRoute({ - path: '/livetvguideprovider.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/livetvitems.html', - dependencies: [], - autoFocus: false, - controller: 'scripts/livetvitems' - }); - - defineRoute({ - path: '/livetvseriestimer.html', - dependencies: ['emby-checkbox', 'emby-input', 'emby-button', 'emby-collapse', 'scripts/livetvcomponents', 'scripts/livetvseriestimer', 'livetvcss'], - autoFocus: false, - controller: 'scripts/livetvseriestimer' - }); - - defineRoute({ - path: '/livetvsettings.html', - dependencies: [], - autoFocus: false - }); - - defineRoute({ - path: '/livetvstatus.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/livetvtunerprovider-hdhomerun.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/livetvtunerprovider-m3u.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/livetvtunerprovider-satip.html', - dependencies: ['emby-input'], - autoFocus: false, - roles: 'admin', - controller: 'dashboard/livetvtunerprovider-satip' - }); - - defineRoute({ - path: '/log.html', - dependencies: ['emby-checkbox'], - roles: 'admin', - controller: 'dashboard/logpage' - }); - - defineRoute({ - path: '/login.html', - dependencies: ['emby-button', 'emby-input'], - autoFocus: false, - anonymous: true, - startup: true, - controller: 'scripts/loginpage' - }); - - defineRoute({ - path: '/metadataadvanced.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/metadataimages.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/metadatanfo.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/metadatasubtitles.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/movies.html', - dependencies: ['emby-button'], - autoFocus: false, - controller: 'scripts/moviesrecommended', - transition: 'fade' - }); - - defineRoute({ - path: '/music.html', - dependencies: [], - controller: 'scripts/musicrecommended', - autoFocus: false, - transition: 'fade' - }); - - defineRoute({ - path: '/mypreferencesdisplay.html', - dependencies: ['emby-checkbox', 'emby-button', 'emby-select'], - autoFocus: false, - transition: 'fade', - controller: 'scripts/mypreferencesdisplay' - }); - - defineRoute({ - path: '/mypreferenceshome.html', - dependencies: ['emby-checkbox', 'emby-button', 'emby-select'], - autoFocus: false, - transition: 'fade', - controller: 'scripts/mypreferenceshome' - }); - - defineRoute({ - path: '/mypreferenceslanguages.html', - dependencies: ['emby-button', 'emby-checkbox', 'emby-select'], - autoFocus: false, - transition: 'fade', - controller: 'scripts/mypreferenceslanguages' - }); - - defineRoute({ - path: '/mypreferencesmenu.html', - dependencies: ['emby-button'], - autoFocus: false, - transition: 'fade', - controller: 'scripts/mypreferencescommon' - }); - - defineRoute({ - path: '/myprofile.html', - dependencies: ['emby-button', 'emby-collapse', 'emby-checkbox', 'emby-input'], - autoFocus: false, - transition: 'fade', - controller: 'scripts/myprofile' - }); - - defineRoute({ - path: '/mysync.html', - dependencies: [], - autoFocus: false, - transition: 'fade', - controller: 'scripts/mysync' - }); - - defineRoute({ - path: '/camerauploadsettings.html', - dependencies: [], - autoFocus: false, - transition: 'fade', - controller: 'scripts/camerauploadsettings' - }); - - defineRoute({ - path: '/mysyncjob.html', - dependencies: [], - autoFocus: false, - transition: 'fade', - controller: 'scripts/syncjob' - }); - - defineRoute({ - path: '/mysyncsettings.html', - dependencies: ['emby-checkbox', 'emby-input', 'emby-button', 'paper-icon-button-light'], - autoFocus: false, - transition: 'fade', - controller: 'scripts/mysyncsettings' - }); - - defineRoute({ - path: '/notificationlist.html', - dependencies: [], - autoFocus: false - }); - - defineRoute({ - path: '/notificationsetting.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/notificationsettings.html', - controller: 'scripts/notificationsettings', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/nowplaying.html', - dependencies: ['paper-icon-button-light', 'emby-slider', 'emby-button', 'emby-input', 'emby-itemscontainer'], - controller: 'scripts/nowplayingpage', - autoFocus: false, - transition: 'fade', - fullscreen: true, - supportsThemeMedia: true - }); - - defineRoute({ - path: '/photos.html', - dependencies: [], - autoFocus: false, - transition: 'fade' - }); - - defineRoute({ - path: '/playbackconfiguration.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/playlists.html', - dependencies: [], - autoFocus: false, - transition: 'fade', - controller: 'scripts/playlists' - }); - - defineRoute({ - path: '/plugincatalog.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/plugins.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/reports.html', - dependencies: [], - autoFocus: false - }); - - defineRoute({ - path: '/scheduledtask.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/scheduledtasks.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/search.html', - dependencies: [], - controller: 'scripts/searchpage' - }); - - defineRoute({ - path: '/secondaryitems.html', - dependencies: [], - autoFocus: false, - controller: 'scripts/secondaryitems' - }); - - defineRoute({ - path: '/selectserver.html', - dependencies: ['listViewStyle', 'emby-button'], - autoFocus: false, - anonymous: true, - startup: true, - controller: 'scripts/selectserver' - }); - - defineRoute({ - path: '/serversecurity.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/shared.html', - dependencies: [], - autoFocus: false, - anonymous: true - }); - - defineRoute({ - path: '/streamingsettings.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/support.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/supporterkey.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/syncactivity.html', - dependencies: [], - autoFocus: false, - controller: 'scripts/syncactivity' - }); - - defineRoute({ - path: '/syncsettings.html', - dependencies: [], - autoFocus: false - }); - - defineRoute({ - path: '/tv.html', - dependencies: ['paper-icon-button-light', 'emby-button'], - autoFocus: false, - controller: 'scripts/tvrecommended', - transition: 'fade' - }); - - defineRoute({ - path: '/useredit.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/userlibraryaccess.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/usernew.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/userparentalcontrol.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/userpassword.html', - dependencies: ['emby-input', 'emby-button', 'emby-checkbox'], - autoFocus: false, - controller: 'scripts/userpasswordpage' - }); - - defineRoute({ - path: '/userprofiles.html', - dependencies: [], - autoFocus: false, - roles: 'admin' - }); - - defineRoute({ - path: '/wizardagreement.html', - dependencies: ['dashboardcss'], - autoFocus: false, - anonymous: true - }); - - defineRoute({ - path: '/wizardcomponents.html', - dependencies: ['dashboardcss', 'emby-button', 'emby-input', 'emby-select'], - autoFocus: false, - anonymous: true, - controller: 'dashboard/wizardcomponents' - }); - - defineRoute({ - path: '/wizardfinish.html', - dependencies: ['emby-button', 'dashboardcss'], - autoFocus: false, - anonymous: true, - controller: 'dashboard/wizardfinishpage' - }); - - defineRoute({ - path: '/wizardlibrary.html', - dependencies: ['dashboardcss'], - autoFocus: false, - anonymous: true - }); - - defineRoute({ - path: '/wizardlivetvguide.html', - dependencies: ['dashboardcss'], - autoFocus: false, - anonymous: true - }); - - defineRoute({ - path: '/wizardlivetvtuner.html', - dependencies: ['dashboardcss'], - autoFocus: false, - anonymous: true - }); - - defineRoute({ - path: '/wizardsettings.html', - dependencies: ['dashboardcss'], - autoFocus: false, - anonymous: true - }); - - defineRoute({ - path: '/wizardstart.html', - dependencies: ['dashboardcss'], - autoFocus: false, - anonymous: true - }); - - defineRoute({ - path: '/wizarduser.html', - dependencies: ['dashboardcss', 'emby-input'], - autoFocus: false, - anonymous: true - }); - - defineRoute({ - path: '/videoosd.html', - dependencies: [], - transition: 'fade', - controller: 'scripts/videoosd', - autoFocus: false, - type: 'video-osd', - supportsThemeMedia: true, - fullscreen: true - }); - - defineRoute({ - path: '/configurationpage', - dependencies: ['jQuery'], - autoFocus: false, - enableCache: false, - enableContentQueryString: true, - roles: 'admin' - }); - - defineRoute({ - path: '/', - isDefaultRoute: true, - autoFocus: false, - dependencies: [] - }); - } - - function loadPlugins(externalPlugins, appHost, browser, shell) { - - console.log('Loading installed plugins'); - - // Load installed plugins - - var list = [ - //'plugins/defaultskin/plugin', - //'plugins/logoscreensaver/plugin', - //'plugins/backdropscreensaver/plugin', - //'plugins/defaultsoundeffects/plugin', - 'bower_components/emby-webcomponents/playback/playbackvalidation' - ]; - - if (Dashboard.isRunningInCordova() && browser.android) { - - // use the html audio player if flac is supported - if (document.createElement('audio').canPlayType('audio/flac').replace(/no/, '') && - document.createElement('audio').canPlayType('audio/ogg; codecs="opus"').replace(/no/, '')) { - - } else { - window.VlcAudio = true; - } - - // Needed for video - list.push('cordova/vlcplayer'); - - } else if (Dashboard.isRunningInCordova() && browser.safari) { - list.push('cordova/audioplayer'); - } - - list.push('bower_components/emby-webcomponents/htmlaudioplayer/plugin'); - - if (Dashboard.isRunningInCordova() && browser.safari) { - list.push('cordova/chromecast'); - } - - if (Dashboard.isRunningInCordova() && browser.android) { - // intent player - list.push('cordova/externalplayer'); - } - - list.push('bower_components/emby-webcomponents/htmlvideoplayer/plugin'); - - if (appHost.supports('remotecontrol')) { - list.push('bower_components/emby-webcomponents/sessionplayer'); - - if (browser.chrome) { - list.push('bower_components/emby-webcomponents/chromecastplayer'); - } - } - - list.push('bower_components/emby-webcomponents/youtubeplayer/plugin'); - - //if (globalScope.webapis && webapis.avplay) { - // list.push('plugins/tizenavplayer/plugin'); - //} else { - // list.push('plugins/htmlvideoplayer/plugin'); - //} - - //if (!browser.tv) { - // list.push('plugins/confirmstillplaying/plugin'); - //} - - //if (!browser.keyboard) { - // list.push('plugins/keyboard/plugin'); - //} - - for (var i = 0, length = externalPlugins.length; i < length; i++) { - list.push(externalPlugins[i]); - } - - //if (shell.canExec) { - // list.push('plugins/externalplayer/plugin'); - //} - - return new Promise(function (resolve, reject) { - - Promise.all(list.map(loadPlugin)).then(function () { - - require(['packageManager'], function (packageManager) { - packageManager.init().then(resolve, reject); - }); - - }, reject); - }); - } - - function loadPlugin(url) { - - return new Promise(function (resolve, reject) { - - require(['pluginManager'], function (pluginManager) { - pluginManager.loadPlugin(url).then(resolve, reject); - }); - }); - } - - function enableNativeGamepadKeyMapping() { - - // On Windows UWP, this will tell the platform to make the gamepad emit normal keyboard events - if (window.navigator && typeof window.navigator.gamepadInputEmulation === "string") { - // We want the gamepad to provide gamepad VK keyboard events rather than moving a - // mouse like cursor. Set to "keyboard", the gamepad will provide such keyboard events - // and provide input to the DOM navigator.getGamepads API. - window.navigator.gamepadInputEmulation = "keyboard"; - return true; - } - - return false; - } - - function isGamepadSupported() { - return 'ongamepadconnected' in window || navigator.getGamepads || navigator.webkitGetGamepads; - } - - function onAppReady() { - - console.log('Begin onAppReady'); - - var deps = []; - - deps.push('apphost'); - deps.push('embyRouter'); - - if (!(AppInfo.isNativeApp && browserInfo.android)) { - document.documentElement.classList.add('minimumSizeTabs'); - } - - // Do these now to prevent a flash of content - if (AppInfo.isNativeApp && browserInfo.android) { - deps.push('css!devices/android/android.css'); - } else if (AppInfo.isNativeApp && browserInfo.safari) { - deps.push('css!devices/ios/ios.css'); - } - - loadTheme(); - - if (Dashboard.isRunningInCordova()) { - deps.push('registrationServices'); - - if (browserInfo.android) { - deps.push('cordova/androidcredentials'); - } - } - - deps.push('libraryMenu'); - - console.log('onAppReady - loading dependencies'); - - require(deps, function (appHost, pageObjects) { - - console.log('Loaded dependencies in onAppReady'); - - window.Emby = {}; - window.Emby.Page = pageObjects; - defineCoreRoutes(); - Emby.Page.start({ - click: true, - hashbang: Dashboard.isRunningInCordova() - }); - - var postInitDependencies = []; - - if (!enableNativeGamepadKeyMapping() && isGamepadSupported()) { - postInitDependencies.push('bower_components/emby-webcomponents/input/gamepadtokey'); - } - - postInitDependencies.push('bower_components/emby-webcomponents/thememediaplayer'); - postInitDependencies.push('css!css/chromecast.css'); - postInitDependencies.push('scripts/autobackdrops'); - - if (Dashboard.isRunningInCordova()) { - - if (browserInfo.android) { - postInitDependencies.push('cordova/mediasession'); - postInitDependencies.push('cordova/chromecast'); - - } else if (browserInfo.safari) { - - postInitDependencies.push('cordova/volume'); - postInitDependencies.push('cordova/statusbar'); - postInitDependencies.push('cordova/orientation'); - postInitDependencies.push('cordova/remotecontrols'); - - //postInitDependencies.push('cordova/backgroundfetch'); - } - } - - postInitDependencies.push('scripts/nowplayingbar'); - - postInitDependencies.push('bower_components/emby-webcomponents/playback/remotecontrolautoplay'); - - // Prefer custom font over Segoe if on desktop windows - if (!browserInfo.mobile && navigator.userAgent.toLowerCase().indexOf('windows') != -1) { - //postInitDependencies.push('opensansFont'); - postInitDependencies.push('robotoFont'); - } - - postInitDependencies.push('bower_components/emby-webcomponents/input/api'); - postInitDependencies.push('mouseManager'); - - if (!browserInfo.tv) { - - registerServiceWorker(); - if (window.Notification) { - postInitDependencies.push('bower_components/emby-webcomponents/notifications/notifications'); - } - } - - postInitDependencies.push('playerSelectionMenu'); - - if (appHost.supports('fullscreenchange')) { - require(['fullscreen-doubleclick']); - } - - require(postInitDependencies); - initAutoSync(); - }); - } - - function registerServiceWorker() { - - if (navigator.serviceWorker) { - try { - navigator.serviceWorker.register('serviceworker.js').then(function () { - return navigator.serviceWorker.ready; - }).then(function (reg) { - - if (reg && reg.sync) { - // https://github.com/WICG/BackgroundSync/blob/master/explainer.md - return reg.sync.register('emby-sync').then(function () { - window.SyncRegistered = Dashboard.isConnectMode(); - }); - } - }); - - } catch (err) { - console.log('Error registering serviceWorker: ' + err); - } - } - } - - function initAutoSync() { - require(['serverNotifications', 'events'], function (serverNotifications, events) { - events.on(serverNotifications, 'SyncJobItemReady', function (e, apiClient, data) { - require(['localsync'], function (localSync) { - localSync.sync({}); - }); - }); - }); - } - - initRequire(); - - function onWebComponentsReady(browser) { - - var initialDependencies = []; - - if (!window.Promise || browser.web0s) { - initialDependencies.push('bower_components/emby-webcomponents/native-promise-only/lib/npo.src'); - } - - initRequireWithBrowser(browser); - - window.browserInfo = browser; - setAppInfo(); - setDocumentClasses(browser); - - require(initialDependencies, init); - } - - require(['browser'], onWebComponentsReady); -})(); - -function pageClassOn(eventName, className, fn) { - 'use strict'; - - document.addEventListener(eventName, function (e) { - - var target = e.target; - if (target.classList.contains(className)) { - fn.call(target, e); - } - }); -} - -function pageIdOn(eventName, id, fn) { - 'use strict'; - - document.addEventListener(eventName, function (e) { - - var target = e.target; - if (target.id == id) { - fn.call(target, e); - } - }); -} - -pageClassOn('viewinit', "page", function () { - 'use strict'; - - var page = this; - - var current = page.getAttribute('data-theme'); - - if (!current) { - - var newTheme; - - if (page.classList.contains('libraryPage')) { - newTheme = 'b'; - } else { - newTheme = 'a'; - } - - page.setAttribute("data-theme", newTheme); - current = newTheme; - } - - page.classList.add("ui-page"); - page.classList.add("ui-page-theme-" + current); - page.classList.add("ui-body-" + current); - - var contents = page.querySelectorAll("div[data-role='content']"); - - for (var i = 0, length = contents.length; i < length; i++) { - var content = contents[i]; - //var theme = content.getAttribute("theme") || undefined; - - //content.classList.add("ui-content"); - //if (self.options.contentTheme) { - // content.classList.add("ui-body-" + (self.options.contentTheme)); - //} - // Add ARIA role - content.setAttribute("role", "main"); - content.classList.add("ui-content"); - } -}); - -pageClassOn('viewshow', "page", function () { - 'use strict'; - - var page = this; - - var currentTheme = page.classList.contains('ui-page-theme-a') ? 'a' : 'b'; - var docElem = document.documentElement; - - if (currentTheme == 'a') { - docElem.classList.add('background-theme-a'); - docElem.classList.remove('background-theme-b'); - } else { - docElem.classList.add('background-theme-b'); - docElem.classList.remove('background-theme-a'); - } - - Dashboard.ensureHeader(page); -}); \ No newline at end of file +function getWindowLocationSearch(win){"use strict";var search=(win||window).location.search;if(!search){var index=window.location.href.indexOf("?");index!=-1&&(search=window.location.href.substring(index))}return search||""}function getParameterByName(name,url){"use strict";name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regexS="[\\?&]"+name+"=([^&#]*)",regex=new RegExp(regexS,"i"),results=regex.exec(url||getWindowLocationSearch());return null==results?"":decodeURIComponent(results[1].replace(/\+/g," "))}function pageClassOn(eventName,className,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.classList.contains(className)&&fn.call(target,e)})}function pageIdOn(eventName,id,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.id==id&&fn.call(target,e)})}var Dashboard={isConnectMode:function(){if(AppInfo.isNativeApp)return!0;var url=window.location.href.toLowerCase();return url.indexOf("mediabrowser.tv")!=-1||url.indexOf("emby.media")!=-1},isRunningInCordova:function(){return"cordova"==window.appMode},onRequestFail:function(e,data){if(401==data.status&&"ParentalControl"==data.errorCode){var currentView=ViewManager.currentView();currentView&&!currentView.classList.contains(".standalonePage")&&Dashboard.alert({message:Globalize.translate("MessageLoggedOutParentalControl"),callback:function(){Dashboard.logout(!1)}})}},getCurrentUser:function(){return window.ApiClient.getCurrentUser()},serverAddress:function(){if(Dashboard.isConnectMode()){var apiClient=window.ApiClient;return apiClient?apiClient.serverAddress():null}var urlLower=window.location.href.toLowerCase(),index=urlLower.lastIndexOf("/web");if(index!=-1)return urlLower.substring(0,index);var loc=window.location,address=loc.protocol+"//"+loc.hostname;return loc.port&&(address+=":"+loc.port),address},getCurrentUserId:function(){var apiClient=window.ApiClient;return apiClient?apiClient.getCurrentUserId():null},onServerChanged:function(userId,accessToken,apiClient){apiClient=apiClient||window.ApiClient,window.ApiClient=apiClient},logout:function(logoutWithServer){function onLogoutDone(){var loginPage;Dashboard.isConnectMode()?(loginPage="connectlogin.html",window.ApiClient=null):loginPage="login.html",Dashboard.navigate(loginPage)}logoutWithServer===!1?onLogoutDone():ConnectionManager.logout().then(onLogoutDone)},getConfigurationPageUrl:function(name){return"configurationpage?name="+encodeURIComponent(name)},navigate:function(url,preserveQueryString){if(!url)throw new Error("url cannot be null or empty");var queryString=getWindowLocationSearch();return preserveQueryString&&queryString&&(url+=queryString),Emby.Page.show(url)},showLoadingMsg:function(){Dashboard.loadingVisible=!0,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},hideLoadingMsg:function(){Dashboard.loadingVisible=!1,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},processPluginConfigurationUpdateResult:function(){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processServerConfigurationUpdateResult:function(result){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processErrorResponse:function(response){Dashboard.hideLoadingMsg();var status=""+response.status;response.statusText&&(status=response.statusText),Dashboard.alert({title:status,message:response.headers?response.headers.get("X-Application-Error-Code"):null})},alert:function(options){return"string"==typeof options?void require(["toast"],function(toast){toast({text:options})}):void require(["alert"],function(alert){alert({title:options.title||Globalize.translate("HeaderAlert"),text:options.message}).then(options.callback||function(){})})},restartServer:function(){var apiClient=window.ApiClient;apiClient&&(Dashboard.suppressAjaxErrors=!0,Dashboard.showLoadingMsg(),apiClient.restartServer().then(function(){setTimeout(function(){Dashboard.reloadPageWhenServerAvailable()},250)},function(){Dashboard.suppressAjaxErrors=!1}))},reloadPageWhenServerAvailable:function(retryCount){var apiClient=window.ApiClient;apiClient&&apiClient.getJSON(apiClient.getUrl("System/Info")).then(function(info){info.HasPendingRestart?Dashboard.retryReload(retryCount):window.location.reload(!0)},function(){Dashboard.retryReload(retryCount)})},retryReload:function(retryCount){setTimeout(function(){retryCount=retryCount||0,retryCount++,retryCount<10?Dashboard.reloadPageWhenServerAvailable(retryCount):Dashboard.suppressAjaxErrors=!1},500)},showUserFlyout:function(){Dashboard.navigate("mypreferencesmenu.html")},getPluginSecurityInfo:function(){var apiClient=window.ApiClient;if(!apiClient)return Promise.reject();var cachedInfo=Dashboard.pluginSecurityInfo;return cachedInfo?Promise.resolve(cachedInfo):apiClient.ajax({type:"GET",url:apiClient.getUrl("Plugins/SecurityInfo"),dataType:"json",error:function(){}}).then(function(result){return Dashboard.pluginSecurityInfo=result,result})},resetPluginSecurityInfo:function(){Dashboard.pluginSecurityInfo=null},ensureHeader:function(page){page.classList.contains("standalonePage")&&!page.classList.contains("noHeaderPage")&&Dashboard.renderHeader(page)},renderHeader:function(page){var header=page.querySelector(".header");if(!header){var headerHtml="";headerHtml+='",page.insertAdjacentHTML("afterbegin",headerHtml)}},getToolsLinkHtml:function(item){var menuHtml="",pageIds=item.pageIds?item.pageIds.join(","):"";return pageIds=pageIds?' data-pageids="'+pageIds+'"':"",menuHtml+='",menuHtml+='',menuHtml+=item.name,menuHtml+="",menuHtml+=""},getToolsMenuHtml:function(page){var i,length,item,items=Dashboard.getToolsMenuLinks(page),menuHtml="";for(menuHtml+='
',i=0,length=items.length;i
"),item.href?menuHtml+=Dashboard.getToolsLinkHtml(item):(menuHtml+='
',menuHtml+=item.name,menuHtml+="
");return menuHtml+="
"},getToolsMenuLinks:function(){return[{name:Globalize.translate("TabServer")},{name:Globalize.translate("TabDashboard"),href:"dashboard.html",pageIds:["dashboardPage"],icon:"dashboard"},{name:Globalize.translate("TabSettings"),href:"dashboardgeneral.html",pageIds:["dashboardGeneralPage"],icon:"settings"},{name:Globalize.translate("TabDevices"),href:"devices.html",pageIds:["devicesPage","devicePage"],icon:"tablet"},{name:Globalize.translate("TabUsers"),href:"userprofiles.html",pageIds:["userProfilesPage","newUserPage","editUserPage","userLibraryAccessPage","userParentalControlPage","userPasswordPage"],icon:"people"},{name:"Emby Premiere",href:"supporterkey.html",pageIds:["supporterKeyPage"],icon:"star"},{divider:!0,name:Globalize.translate("TabLibrary"),href:"library.html",pageIds:["mediaLibraryPage","librarySettingsPage","libraryDisplayPage","metadataImagesConfigurationPage","metadataNfoPage"],icon:"folder",color:"#38c"},{name:Globalize.translate("TabSubtitles"),href:"metadatasubtitles.html",pageIds:["metadataSubtitlesPage"],icon:"closed_caption"},{name:Globalize.translate("TabPlayback"),icon:"play_circle_filled",color:"#E5342E",href:"cinemamodeconfiguration.html",pageIds:["cinemaModeConfigurationPage","playbackConfigurationPage","streamingSettingsPage"]},{name:Globalize.translate("TabSync"),icon:"sync",href:"syncactivity.html",pageIds:["syncActivityPage","syncJobPage","devicesUploadPage","syncSettingsPage"],color:"#009688"},{name:Globalize.translate("TabTranscoding"),icon:"transform",href:"encodingsettings.html",pageIds:["encodingSettingsPage"]},{divider:!0,name:Globalize.translate("TabExtras")},{name:Globalize.translate("TabAutoOrganize"),color:"#01C0DD",href:"autoorganizelog.html",pageIds:["libraryFileOrganizerPage","libraryFileOrganizerSmartMatchPage","libraryFileOrganizerLogPage"],icon:"folder"},{name:Globalize.translate("DLNA"),href:"dlnasettings.html",pageIds:["dlnaSettingsPage","dlnaProfilesPage","dlnaProfilePage"],icon:"settings"},{name:Globalize.translate("TabLiveTV"),href:"livetvstatus.html",pageIds:["liveTvStatusPage","liveTvSettingsPage","liveTvTunerProviderHdHomerunPage","liveTvTunerProviderM3UPage","liveTvTunerProviderSatPage"],icon:"dvr"},{name:Globalize.translate("TabNotifications"),icon:"notifications",color:"brown",href:"notificationsettings.html",pageIds:["notificationSettingsPage","notificationSettingPage"]},{name:Globalize.translate("TabPlugins"),icon:"add_shopping_cart",color:"#9D22B1",href:"plugins.html",pageIds:["pluginsPage","pluginCatalogPage"]},{divider:!0,name:Globalize.translate("TabExpert")},{name:Globalize.translate("TabAdvanced"),icon:"settings",href:"dashboardhosting.html",color:"#F16834",pageIds:["dashboardHostingPage","serverSecurityPage"]},{name:Globalize.translate("TabLogs"),href:"log.html",pageIds:["logPage"],icon:"folder_open"},{name:Globalize.translate("TabScheduledTasks"),href:"scheduledtasks.html",pageIds:["scheduledTasksPage","scheduledTaskPage"],icon:"schedule"},{name:Globalize.translate("MetadataManager"),href:"edititemmetadata.html",pageIds:[],icon:"mode_edit"},{name:Globalize.translate("ButtonReports"),href:"reports.html",pageIds:[],icon:"insert_chart"}]},getSupportedRemoteCommands:function(){return["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"]},capabilities:function(){var caps={PlayableMediaTypes:["Audio","Video"],SupportedCommands:Dashboard.getSupportedRemoteCommands(),SupportsPersistentIdentifier:Dashboard.isRunningInCordova(),SupportsMediaControl:!0,SupportedLiveMediaTypes:["Audio","Video"]};return Dashboard.isRunningInCordova()&&!browserInfo.safari&&(caps.SupportsSync=!0,caps.SupportsContentUploading=!0),caps},normalizeImageOptions:function(options){AppInfo.hasLowImageBandwidth&&(options.enableImageEnhancers=!1);var setQuality;if(options.maxWidth&&(setQuality=!0),options.width&&(setQuality=!0),options.maxHeight&&(setQuality=!0),options.height&&(setQuality=!0),setQuality){var quality=90,isBackdrop="backdrop"==(options.type||"").toLowerCase();isBackdrop&&(quality-=10),browserInfo.slow&&(quality-=40),AppInfo.hasLowImageBandwidth&&!isBackdrop&&(quality-=10),options.quality=quality}}},AppInfo={};!function(){"use strict";function setAppInfo(){var isCordova=Dashboard.isRunningInCordova();AppInfo.enableHomeTabs=!0,AppInfo.enableAutoSave=browserInfo.touch,AppInfo.enableAppStorePolicy=isCordova;var isIOS=browserInfo.ipad||browserInfo.iphone,isAndroid=browserInfo.android;isIOS&&(AppInfo.hasLowImageBandwidth=!0),isCordova?(AppInfo.isNativeApp=!0,AppInfo.enableHomeTabs=!1,isAndroid&&(AppInfo.supportsExternalPlayers=!0)):AppInfo.enableSupporterMembership=!0,AppInfo.supportsFileInput=!(AppInfo.isNativeApp&&isAndroid),isCordova&&isIOS?AppInfo.moreIcon="more-horiz":AppInfo.moreIcon="more-vert",AppInfo.supportsUserDisplayLanguageSetting=Dashboard.isConnectMode()}function initializeApiClient(apiClient){AppInfo.enableAppStorePolicy&&(apiClient.getAvailablePlugins=function(){return Promise.resolve([])},apiClient.getInstalledPlugins=function(){return Promise.resolve([])}),apiClient.normalizeImageOptions=Dashboard.normalizeImageOptions,Events.off(apiClient,"requestfail",Dashboard.onRequestFail),Events.on(apiClient,"requestfail",Dashboard.onRequestFail)}function onApiClientCreated(e,newApiClient){initializeApiClient(newApiClient),window.$&&($.ajax=newApiClient.ajax)}function defineConnectionManager(connectionManager){window.ConnectionManager=connectionManager,define("connectionManager",[],function(){return connectionManager})}function bindConnectionManagerEvents(connectionManager,events,userSettings){window.Events=events,events.on(ConnectionManager,"apiclientcreated",onApiClientCreated),connectionManager.currentApiClient=function(){if(!localApiClient){var server=connectionManager.getLastUsedServer();server&&(localApiClient=connectionManager.getApiClient(server.Id))}return localApiClient},connectionManager.onLocalUserSignedIn=function(user){return localApiClient=connectionManager.getApiClient(user.ServerId),window.ApiClient=localApiClient,userSettings.setUserInfo(user.Id,localApiClient)},events.on(connectionManager,"localusersignedout",function(){userSettings.setUserInfo(null,null)})}function createConnectionManager(){return new Promise(function(resolve,reject){require(["connectionManagerFactory","apphost","credentialprovider","events","userSettings"],function(connectionManagerExports,apphost,credentialProvider,events,userSettings){window.MediaBrowser=Object.assign(window.MediaBrowser||{},connectionManagerExports);var credentialProviderInstance=new credentialProvider,promises=[apphost.getSyncProfile(),apphost.appInfo()];Promise.all(promises).then(function(responses){var deviceProfile=responses[0],appInfo=responses[1],capabilities=Dashboard.capabilities();capabilities.DeviceProfile=deviceProfile;var connectionManager=new MediaBrowser.ConnectionManager(credentialProviderInstance,appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,capabilities,window.devicePixelRatio);return defineConnectionManager(connectionManager),bindConnectionManagerEvents(connectionManager,events,userSettings),Dashboard.isConnectMode()?void resolve():(console.log("loading ApiClient singleton"),getRequirePromise(["apiclient"]).then(function(apiClientFactory){console.log("creating ApiClient singleton");var apiClient=new apiClientFactory(Dashboard.serverAddress(),appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,window.devicePixelRatio);apiClient.enableAutomaticNetworking=!1,connectionManager.addApiClient(apiClient),require(["css!"+apiClient.getUrl("Branding/Css")]),window.ApiClient=apiClient,localApiClient=apiClient,console.log("loaded ApiClient singleton"),resolve()}))})})})}function setDocumentClasses(browser){var elem=document.documentElement;AppInfo.enableSupporterMembership||elem.classList.add("supporterMembershipDisabled")}function loadTheme(){var name=getParameterByName("theme");if(name)return void require(["themes/"+name+"/theme"]);if(!AppInfo.isNativeApp){var date=new Date,month=date.getMonth(),day=date.getDate();return 9==month&&day>=30?void require(["themes/halloween/theme"]):void 0}}function returnFirstDependency(obj){return obj}function getBowerPath(){return"bower_components"}function getLayoutManager(layoutManager){return layoutManager.init(),layoutManager}function getAppStorage(basePath){try{return localStorage.setItem("_test","0"),localStorage.removeItem("_test"),basePath+"/appstorage-localstorage"}catch(e){return basePath+"/appstorage-memory"}}function createWindowHeadroom(){var headroom=new Headroom([],{tolerance:{down:0,up:0},classes:{}});return headroom.init(),headroom}function createMainContentHammer(Hammer){var hammer=new Hammer(document.querySelector(".mainDrawerPanelContent"),null);return hammer}function createSharedAppFooter(appFooter){var footer=new appFooter({});return footer}function initRequire(){var urlArgs="v="+(window.dashboardVersion||(new Date).getDate()),bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents",paths={velocity:bowerPath+"/velocity/velocity.min",vibrant:bowerPath+"/vibrant/dist/vibrant",ironCardList:"components/ironcardlist/ironcardlist",scrollThreshold:"components/scrollthreshold",playlisteditor:"components/playlisteditor/playlisteditor",medialibrarycreator:"components/medialibrarycreator/medialibrarycreator",medialibraryeditor:"components/medialibraryeditor/medialibraryeditor",howler:bowerPath+"/howlerjs/howler.min",sortable:bowerPath+"/Sortable/Sortable.min",isMobile:bowerPath+"/isMobile/isMobile.min",headroom:bowerPath+"/headroomjs/dist/headroom",masonry:bowerPath+"/masonry/dist/masonry.pkgd.min",humanedate:"components/humanedate",libraryBrowser:"scripts/librarybrowser",chromecasthelpers:"components/chromecasthelpers",events:apiClientBowerPath+"/events",credentialprovider:apiClientBowerPath+"/credentials",apiclient:apiClientBowerPath+"/apiclient",connectionManagerFactory:bowerPath+"/emby-apiclient/connectionmanager",visibleinviewport:embyWebComponentsBowerPath+"/visibleinviewport",browserdeviceprofile:embyWebComponentsBowerPath+"/browserdeviceprofile",browser:embyWebComponentsBowerPath+"/browser",inputManager:embyWebComponentsBowerPath+"/inputmanager",qualityoptions:embyWebComponentsBowerPath+"/qualityoptions",hammer:bowerPath+"/hammerjs/hammer.min",pageJs:embyWebComponentsBowerPath+"/pagejs/page",focusManager:embyWebComponentsBowerPath+"/focusmanager",datetime:embyWebComponentsBowerPath+"/datetime",globalize:embyWebComponentsBowerPath+"/globalize",itemHelper:embyWebComponentsBowerPath+"/itemhelper",itemShortcuts:embyWebComponentsBowerPath+"/shortcuts",serverNotifications:embyWebComponentsBowerPath+"/servernotifications",playbackManager:embyWebComponentsBowerPath+"/playback/playbackmanager",nowPlayingHelper:embyWebComponentsBowerPath+"/playback/nowplayinghelper",pluginManager:embyWebComponentsBowerPath+"/pluginmanager",packageManager:embyWebComponentsBowerPath+"/packagemanager",webAnimations:bowerPath+"/web-animations-js/web-animations-next-lite.min"};paths.hlsjs=bowerPath+"/hlsjs/dist/hls.min",define("webActionSheet",[embyWebComponentsBowerPath+"/actionsheet/actionsheet"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.sharingMenu="cordova/sharingwidget":define("sharingMenu",[embyWebComponentsBowerPath+"/sharing/sharingmenu"],returnFirstDependency),paths.wakeonlan=apiClientBowerPath+"/wakeonlan",define("libjass",[bowerPath+"/libjass/libjass.min","css!"+bowerPath+"/libjass/libjass"],returnFirstDependency),window.IntersectionObserver?define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-intersectionobserver"],returnFirstDependency):define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-scroll"],returnFirstDependency),define("imageLoader",[embyWebComponentsBowerPath+"/images/imagehelper"],returnFirstDependency),define("appfooter",["components/appfooter/appfooter"],returnFirstDependency),define("dockedtabs",["components/dockedtabs/dockedtabs"],returnFirstDependency),define("directorybrowser",["components/directorybrowser/directorybrowser"],returnFirstDependency),define("metadataEditor",[embyWebComponentsBowerPath+"/metadataeditor/metadataeditor"],returnFirstDependency),define("personEditor",[embyWebComponentsBowerPath+"/metadataeditor/personeditor"],returnFirstDependency),define("playerSelectionMenu",[embyWebComponentsBowerPath+"/playback/playerselection"],returnFirstDependency),define("playerSettingsMenu",[embyWebComponentsBowerPath+"/playback/playersettingsmenu"],returnFirstDependency),define("libraryMenu",["scripts/librarymenu"],returnFirstDependency),define("emby-collapse",[embyWebComponentsBowerPath+"/emby-collapse/emby-collapse"],returnFirstDependency),define("emby-button",[embyWebComponentsBowerPath+"/emby-button/emby-button"],returnFirstDependency),define("emby-itemscontainer",[embyWebComponentsBowerPath+"/emby-itemscontainer/emby-itemscontainer"],returnFirstDependency),define("emby-tabs",[embyWebComponentsBowerPath+"/emby-tabs/emby-tabs"],returnFirstDependency),define("itemHoverMenu",[embyWebComponentsBowerPath+"/itemhovermenu/itemhovermenu"],returnFirstDependency),define("multiSelect",[embyWebComponentsBowerPath+"/multiselect/multiselect"],returnFirstDependency),define("alphaPicker",[embyWebComponentsBowerPath+"/alphapicker/alphapicker"],returnFirstDependency),define("paper-icon-button-light",[embyWebComponentsBowerPath+"/emby-button/paper-icon-button-light"]),define("connectHelper",[embyWebComponentsBowerPath+"/emby-connect/connecthelper"],returnFirstDependency),define("emby-input",[embyWebComponentsBowerPath+"/emby-input/emby-input"],returnFirstDependency),define("emby-select",[embyWebComponentsBowerPath+"/emby-select/emby-select"],returnFirstDependency),define("emby-slider",[embyWebComponentsBowerPath+"/emby-slider/emby-slider"],returnFirstDependency),define("emby-checkbox",[embyWebComponentsBowerPath+"/emby-checkbox/emby-checkbox"],returnFirstDependency),define("emby-toggle",[embyWebComponentsBowerPath+"/emby-toggle/emby-toggle"],returnFirstDependency),define("emby-radio",[embyWebComponentsBowerPath+"/emby-radio/emby-radio"],returnFirstDependency),define("emby-textarea",[embyWebComponentsBowerPath+"/emby-textarea/emby-textarea"],returnFirstDependency),define("collectionEditor",[embyWebComponentsBowerPath+"/collectioneditor/collectioneditor"],returnFirstDependency),define("playlistEditor",[embyWebComponentsBowerPath+"/playlisteditor/playlisteditor"],returnFirstDependency),define("recordingCreator",[embyWebComponentsBowerPath+"/recordingcreator/recordingcreator"],returnFirstDependency),define("recordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/recordingeditor"],returnFirstDependency),define("seriesRecordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/seriesrecordingeditor"],returnFirstDependency),define("recordingFields",[embyWebComponentsBowerPath+"/recordingcreator/recordingfields"],returnFirstDependency),define("recordingHelper",[embyWebComponentsBowerPath+"/recordingcreator/recordinghelper"],returnFirstDependency),define("subtitleEditor",[embyWebComponentsBowerPath+"/subtitleeditor/subtitleeditor"],returnFirstDependency),define("itemIdentifier",[embyWebComponentsBowerPath+"/itemidentifier/itemidentifier"],returnFirstDependency),define("mediaInfo",[embyWebComponentsBowerPath+"/mediainfo/mediainfo"],returnFirstDependency),define("itemContextMenu",[embyWebComponentsBowerPath+"/itemcontextmenu"],returnFirstDependency),define("imageEditor",[embyWebComponentsBowerPath+"/imageeditor/imageeditor"],returnFirstDependency),define("dom",[embyWebComponentsBowerPath+"/dom"],returnFirstDependency),define("fullscreen-doubleclick",[embyWebComponentsBowerPath+"/fullscreen/fullscreen-doubleclick"],returnFirstDependency),define("fullscreenManager",[embyWebComponentsBowerPath+"/fullscreen/fullscreenmanager","events"],returnFirstDependency),define("layoutManager",[embyWebComponentsBowerPath+"/layoutmanager"],getLayoutManager),define("playMenu",[embyWebComponentsBowerPath+"/playmenu"],returnFirstDependency),define("refreshDialog",[embyWebComponentsBowerPath+"/refreshdialog/refreshdialog"],returnFirstDependency),define("backdrop",[embyWebComponentsBowerPath+"/backdrop/backdrop"],returnFirstDependency),define("fetchHelper",[embyWebComponentsBowerPath+"/fetchhelper"],returnFirstDependency),define("roundCardStyle",["cardStyle","css!"+embyWebComponentsBowerPath+"/cardbuilder/roundcard"],returnFirstDependency),define("cardStyle",["css!"+embyWebComponentsBowerPath+"/cardbuilder/card"],returnFirstDependency),define("cardBuilder",[embyWebComponentsBowerPath+"/cardbuilder/cardbuilder"],returnFirstDependency),define("peoplecardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/peoplecardbuilder"],returnFirstDependency),define("chaptercardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/chaptercardbuilder"],returnFirstDependency),define("mouseManager",[embyWebComponentsBowerPath+"/input/mouse"],returnFirstDependency),define("deleteHelper",[embyWebComponentsBowerPath+"/deletehelper"],returnFirstDependency),define("tvguide",[embyWebComponentsBowerPath+"/guide/guide"],returnFirstDependency),define("programStyles",["css!"+embyWebComponentsBowerPath+"/guide/programs"],returnFirstDependency),define("guide-settings-dialog",[embyWebComponentsBowerPath+"/guide/guide-settings"],returnFirstDependency),define("syncDialog",[embyWebComponentsBowerPath+"/sync/sync"],returnFirstDependency),define("syncToggle",[embyWebComponentsBowerPath+"/sync/synctoggle"],returnFirstDependency),define("syncJobEditor",[embyWebComponentsBowerPath+"/sync/syncjobeditor"],returnFirstDependency),define("syncJobList",[embyWebComponentsBowerPath+"/sync/syncjoblist"],returnFirstDependency),define("voiceDialog",[embyWebComponentsBowerPath+"/voice/voicedialog"],returnFirstDependency),define("voiceReceiver",[embyWebComponentsBowerPath+"/voice/voicereceiver"],returnFirstDependency),define("voiceProcessor",[embyWebComponentsBowerPath+"/voice/voiceprocessor"],returnFirstDependency),define("viewManager",[embyWebComponentsBowerPath+"/viewmanager/viewmanager"],function(viewManager){return window.ViewManager=viewManager,viewManager.dispatchPageEvents(!0),viewManager}),Dashboard.isRunningInCordova()&&window.MainActivity?define("shell",["cordova/shell"],returnFirstDependency):define("shell",[embyWebComponentsBowerPath+"/shell"],returnFirstDependency),define("sharingmanager",[embyWebComponentsBowerPath+"/sharing/sharingmanager"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.apphost="cordova/apphost":paths.apphost="components/apphost",Dashboard.isRunningInCordova()&&window.MainActivity?(paths.appStorage="cordova/appstorage",paths.filesystem="cordova/filesystem"):(paths.appStorage=getAppStorage(apiClientBowerPath),paths.filesystem=embyWebComponentsBowerPath+"/filesystem");var sha1Path=bowerPath+"/cryptojslib/components/sha1-min",md5Path=bowerPath+"/cryptojslib/components/md5-min",shim={};shim[sha1Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},shim[md5Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},requirejs.config({waitSeconds:0,map:{"*":{css:bowerPath+"/emby-webcomponents/require/requirecss",html:bowerPath+"/emby-webcomponents/require/requirehtml",text:bowerPath+"/emby-webcomponents/require/requiretext"}},urlArgs:urlArgs,paths:paths,shim:shim}),define("cryptojs-sha1",[sha1Path]),define("cryptojs-md5",[md5Path]),define("jstree",[bowerPath+"/jstree/dist/jstree","css!thirdparty/jstree/themes/default/style.min.css"]),define("dashboardcss",["css!css/dashboard"]),define("jqmtable",["thirdparty/jquerymobile-1.4.5/jqm.table","css!thirdparty/jquerymobile-1.4.5/jqm.table.css"]),define("jqmwidget",["thirdparty/jquerymobile-1.4.5/jqm.widget"]),define("jqmslider",["thirdparty/jquerymobile-1.4.5/jqm.slider","css!thirdparty/jquerymobile-1.4.5/jqm.slider.css"]),define("jqmpopup",["thirdparty/jquerymobile-1.4.5/jqm.popup","css!thirdparty/jquerymobile-1.4.5/jqm.popup.css"]),define("jqmlistview",["css!thirdparty/jquerymobile-1.4.5/jqm.listview.css"]),define("jqmpanel",["thirdparty/jquerymobile-1.4.5/jqm.panel","css!thirdparty/jquerymobile-1.4.5/jqm.panel.css"]),define("slideshow",[embyWebComponentsBowerPath+"/slideshow/slideshow"],returnFirstDependency),define("fetch",[bowerPath+"/fetch/fetch"]),define("raf",[embyWebComponentsBowerPath+"/polyfills/raf"]),define("functionbind",[embyWebComponentsBowerPath+"/polyfills/bind"]),define("arraypolyfills",[embyWebComponentsBowerPath+"/polyfills/array"]),define("objectassign",[embyWebComponentsBowerPath+"/polyfills/objectassign"]),define("clearButtonStyle",["css!"+embyWebComponentsBowerPath+"/clearbutton"]),define("userdataButtons",[embyWebComponentsBowerPath+"/userdatabuttons/userdatabuttons"],returnFirstDependency),define("listView",[embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("listViewStyle",["css!"+embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("formDialogStyle",["css!"+embyWebComponentsBowerPath+"/formdialog"],returnFirstDependency),define("indicators",[embyWebComponentsBowerPath+"/indicators/indicators"],returnFirstDependency),define("registrationServices",[embyWebComponentsBowerPath+"/registrationservices/registrationservices"],returnFirstDependency),Dashboard.isRunningInCordova()?(define("iapManager",["cordova/iap"],returnFirstDependency),define("fileupload",["cordova/fileupload"],returnFirstDependency)):(define("iapManager",["components/iap"],returnFirstDependency),define("fileupload",[apiClientBowerPath+"/fileupload"],returnFirstDependency)),define("connectionmanager",[apiClientBowerPath+"/connectionmanager"]),define("cameraRoll",[apiClientBowerPath+"/cameraroll"],returnFirstDependency),define("contentuploader",[apiClientBowerPath+"/sync/contentuploader"]),define("serversync",[apiClientBowerPath+"/sync/serversync"]),define("multiserversync",[apiClientBowerPath+"/sync/multiserversync"]),define("offlineusersync",[apiClientBowerPath+"/sync/offlineusersync"]),define("mediasync",[apiClientBowerPath+"/sync/mediasync"]),define("swiper",[bowerPath+"/Swiper/dist/js/swiper.min","css!"+bowerPath+"/Swiper/dist/css/swiper.min"],returnFirstDependency),define("scroller",[embyWebComponentsBowerPath+"/scroller/smoothscroller"],returnFirstDependency),define("toast",[embyWebComponentsBowerPath+"/toast/toast"],returnFirstDependency),define("scrollHelper",[embyWebComponentsBowerPath+"/scrollhelper"],returnFirstDependency),define("appSettings",[embyWebComponentsBowerPath+"/appsettings"],updateAppSettings),define("userSettings",[embyWebComponentsBowerPath+"/usersettings/usersettings"],returnFirstDependency),define("userSettingsBuilder",[embyWebComponentsBowerPath+"/usersettings/usersettingsbuilder"],returnFirstDependency),define("material-icons",["css!"+embyWebComponentsBowerPath+"/fonts/material-icons/style"]),define("robotoFont",["css!"+embyWebComponentsBowerPath+"/fonts/roboto/style"]),define("scrollStyles",["css!"+embyWebComponentsBowerPath+"/scrollstyles"]),define("navdrawer",["components/navdrawer/navdrawer"],returnFirstDependency),define("viewcontainer",["components/viewcontainer-lite","css!"+embyWebComponentsBowerPath+"/viewmanager/viewcontainer-lite"],returnFirstDependency),define("queryString",[bowerPath+"/query-string/index"],function(){return queryString}),define("jQuery",[bowerPath+"/jquery/dist/jquery.slim.min"],function(){return window.ApiClient&&(jQuery.ajax=ApiClient.ajax),jQuery}),define("fnchecked",["legacy/fnchecked"]),define("dialogHelper",[embyWebComponentsBowerPath+"/dialoghelper/dialoghelper"],function(dialoghelper){return dialoghelper.setOnOpen(onDialogOpen),dialoghelper}),define("inputmanager",["inputManager"],returnFirstDependency),define("historyManager",["embyRouter"],returnFirstDependency),define("headroom-window",["headroom"],createWindowHeadroom),define("hammer-main",["hammer"],createMainContentHammer),define("appfooter-shared",["appfooter"],createSharedAppFooter),define("skinManager",[],function(){return{loadUserSkin:function(){Emby.Page.show("/home.html")}}}),define("connectionManager",[],function(){return ConnectionManager}),define("apiClientResolver",[],function(){return function(){return window.ApiClient}}),define("embyRouter",[embyWebComponentsBowerPath+"/router"],function(embyRouter){function showItem(item,serverId,options){if("string"==typeof item)require(["connectionManager"],function(connectionManager){var apiClient=connectionManager.currentApiClient();apiClient.getItem(apiClient.getCurrentUserId(),item).then(function(item){embyRouter.showItem(item,options)})});else{2==arguments.length&&(options=arguments[1]);var context=options?options.context:null;Emby.Page.show("/"+LibraryBrowser.getHref(item,context),{item:item})}}return embyRouter.showLocalLogin=function(apiClient,serverId,manualLogin){Dashboard.navigate("login.html?serverid="+serverId)},embyRouter.showVideoOsd=function(){return Dashboard.navigate("videoosd.html")},embyRouter.showSelectServer=function(){Dashboard.navigate("selectserver.html")},embyRouter.showWelcome=function(){Dashboard.isConnectMode()?Dashboard.navigate("connectlogin.html?mode=welcome"):Dashboard.navigate("login.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.showGuide=function(){Dashboard.navigate("livetv.html?tab=1")},embyRouter.goHome=function(){Dashboard.navigate("home.html"); +},embyRouter.showSearch=function(){Dashboard.navigate("search.html")},embyRouter.showLiveTV=function(){Dashboard.navigate("livetv.html")},embyRouter.showRecordedTV=function(){Dashboard.navigate("livetv.html?tab=3")},embyRouter.showFavorites=function(){Dashboard.navigate("favorites.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.setTitle=function(){},embyRouter.showItem=showItem,embyRouter})}function updateAppSettings(appSettings){return appSettings.enableExternalPlayers=function(val){return null!=val&&appSettings.set("externalplayers",val.toString()),"true"===appSettings.get("externalplayers")},appSettings}function onDialogOpen(dlg){dlg.classList.contains("background-theme-a")||dlg.classList.contains("actionSheet")||(dlg.classList.add("background-theme-b"),dlg.classList.add("ui-body-b"))}function initRequireWithBrowser(browser){var bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents";Dashboard.isRunningInCordova()&&browser.safari?define("actionsheet",["cordova/actionsheet"],returnFirstDependency):define("actionsheet",["webActionSheet"],returnFirstDependency),"registerElement"in document?define("registerElement",[]):browser.msie?define("registerElement",[bowerPath+"/webcomponentsjs/webcomponents-lite.min.js"]):define("registerElement",[bowerPath+"/document-register-element/build/document-register-element"]),window.chrome&&window.chrome.sockets?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.android?define("serverdiscovery",["cordova/serverdiscovery"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.safari?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.safari?define("imageFetcher",["cordova/imagestore"],returnFirstDependency):define("imageFetcher",[embyWebComponentsBowerPath+"/images/basicimagefetcher"],returnFirstDependency);var preferNativeAlerts=browser.tv;preferNativeAlerts&&window.alert?define("alert",[embyWebComponentsBowerPath+"/alert/nativealert"],returnFirstDependency):define("alert",[embyWebComponentsBowerPath+"/alert/alert"],returnFirstDependency),define("dialog",[embyWebComponentsBowerPath+"/dialog/dialog"],returnFirstDependency),preferNativeAlerts&&window.confirm?define("confirm",[embyWebComponentsBowerPath+"/confirm/nativeconfirm"],returnFirstDependency):define("confirm",[embyWebComponentsBowerPath+"/confirm/confirm"],returnFirstDependency);var preferNativePrompt=preferNativeAlerts||browser.xboxOne;preferNativePrompt&&window.confirm?define("prompt",[embyWebComponentsBowerPath+"/prompt/nativeprompt"],returnFirstDependency):define("prompt",[embyWebComponentsBowerPath+"/prompt/prompt"],returnFirstDependency),browser.tizen||browser.operaTv?define("loading",[embyWebComponentsBowerPath+"/loading/loading-legacy"],returnFirstDependency):define("loading",[embyWebComponentsBowerPath+"/loading/loading-lite"],returnFirstDependency),define("multi-download",[embyWebComponentsBowerPath+"/multidownload"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("fileDownloader",["cordova/filedownloader"],returnFirstDependency),define("localassetmanager",["cordova/localassetmanager"],returnFirstDependency)):(define("fileDownloader",[embyWebComponentsBowerPath+"/filedownloader"],returnFirstDependency),define("localassetmanager",[apiClientBowerPath+"/localassetmanager"],returnFirstDependency)),define("screenLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",["cordova/wakelock"],returnFirstDependency),define("networkLock",["cordova/networklock"],returnFirstDependency)):(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),define("networkLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency))}function init(){Dashboard.isRunningInCordova()&&browserInfo.android&&define("nativedirectorychooser",["cordova/nativedirectorychooser"]),Dashboard.isRunningInCordova()&&browserInfo.android?define("localsync",["cordova/localsync"],returnFirstDependency):define("localsync",["scripts/localsync"],returnFirstDependency),define("livetvcss",["css!css/livetv.css"]),define("detailtablecss",["css!css/detailtable.css"]),define("autoorganizetablecss",["css!css/autoorganizetable.css"]),define("buttonenabled",["legacy/buttonenabled"]),initAfterDependencies()}function getRequirePromise(deps){return new Promise(function(resolve,reject){require(deps,resolve)})}function initAfterDependencies(){var list=[];window.fetch||list.push("fetch"),"function"!=typeof Object.assign&&list.push("objectassign"),Array.prototype.filter||list.push("arraypolyfills"),Function.prototype.bind||list.push("functionbind"),window.requestAnimationFrame||list.push("raf"),require(list,function(){createConnectionManager().then(function(){console.log("initAfterDependencies promises resolved"),require(["globalize"],function(globalize){window.Globalize=globalize,Promise.all([loadCoreDictionary(globalize),loadSharedComponentsDictionary(globalize)]).then(onGlobalizeInit)})})})}function loadSharedComponentsDictionary(globalize){var baseUrl="bower_components/emby-webcomponents/strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sk","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});globalize.loadStrings({name:"sharedcomponents",translations:translations})}function loadCoreDictionary(globalize){var baseUrl="strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});return globalize.defaultModule("core"),globalize.loadStrings({name:"core",translations:translations})}function onGlobalizeInit(){document.title=Globalize.translateDocument(document.title,"core"),require(["apphost"],function(appHost){loadPlugins([],appHost,browserInfo).then(onAppReady)})}function defineRoute(newRoute,dictionary){var baseRoute=Emby.Page.baseUrl(),path=newRoute.path;path=path.replace(baseRoute,""),console.log("Defining route: "+path),newRoute.dictionary=newRoute.dictionary||dictionary||"core",Emby.Page.addRoute(path,newRoute)}function defineCoreRoutes(){console.log("Defining core routes"),defineRoute({path:"/addplugin.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"scripts/addpluginpage"}),defineRoute({path:"/appservices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizelog.html",dependencies:["scripts/taskbutton","autoorganizetablecss"],controller:"dashboard/autoorganizelog",roles:"admin"}),defineRoute({path:"/autoorganizesmart.html",dependencies:["emby-button"],controller:"dashboard/autoorganizesmart",autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizetv.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-select","emby-collapse"],controller:"dashboard/autoorganizetv",autoFocus:!1,roles:"admin"}),defineRoute({path:"/channelitems.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/channels.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/channels"}),defineRoute({path:"/channelsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/cinemamodeconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/connectlogin.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/connectlogin"}),defineRoute({path:"/dashboard.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardgeneral.html",controller:"dashboard/dashboardgeneral",autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardhosting.html",dependencies:["emby-input","emby-button"],autoFocus:!1,roles:"admin",controller:"dashboard/dashboardhosting"}),defineRoute({path:"/device.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devicesupload.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofile.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaserversettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnasettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/edititemmetadata.html",dependencies:[],controller:"scripts/edititemmetadata",autoFocus:!1}),defineRoute({path:"/encodingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/favorites.html",dependencies:[],autoFocus:!1,controller:"scripts/favorites"}),defineRoute({path:"/forgotpassword.html",dependencies:["emby-input","emby-button"],anonymous:!0,startup:!0,controller:"scripts/forgotpassword"}),defineRoute({path:"/forgotpasswordpin.html",dependencies:["emby-input","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/forgotpasswordpin"}),defineRoute({path:"/gamegenres.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/games.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesrecommended.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamestudios.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesystems.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/home.html",dependencies:[],autoFocus:!1,controller:"scripts/indexpage",transition:"fade",type:"home"}),defineRoute({path:"/index.html",dependencies:[],autoFocus:!1,isDefaultRoute:!0}),defineRoute({path:"/itemdetails.html",dependencies:["emby-button","scripts/livetvcomponents","paper-icon-button-light","emby-itemscontainer"],controller:"scripts/itemdetailpage",autoFocus:!1,transition:"fade"}),defineRoute({path:"/itemlist.html",dependencies:[],autoFocus:!1,controller:"scripts/itemlistpage",transition:"fade"}),defineRoute({path:"/kids.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/library.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/librarydisplay.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"dashboard/librarydisplay"}),defineRoute({path:"/librarysettings.html",dependencies:["emby-collapse","emby-input","emby-button","emby-select"],autoFocus:!1,roles:"admin",controller:"dashboard/librarysettings"}),defineRoute({path:"/livetv.html",dependencies:["emby-button","livetvcss"],controller:"scripts/livetvsuggested",autoFocus:!1,transition:"fade"}),defineRoute({path:"/livetvguideprovider.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvitems.html",dependencies:[],autoFocus:!1,controller:"scripts/livetvitems"}),defineRoute({path:"/livetvseriestimer.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-collapse","scripts/livetvcomponents","scripts/livetvseriestimer","livetvcss"],autoFocus:!1,controller:"scripts/livetvseriestimer"}),defineRoute({path:"/livetvsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/livetvstatus.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-hdhomerun.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-m3u.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-satip.html",dependencies:["emby-input"],autoFocus:!1,roles:"admin",controller:"dashboard/livetvtunerprovider-satip"}),defineRoute({path:"/log.html",dependencies:["emby-checkbox"],roles:"admin",controller:"dashboard/logpage"}),defineRoute({path:"/login.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/loginpage"}),defineRoute({path:"/metadataadvanced.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadataimages.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatanfo.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatasubtitles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/movies.html",dependencies:["emby-button"],autoFocus:!1,controller:"scripts/moviesrecommended",transition:"fade"}),defineRoute({path:"/music.html",dependencies:[],controller:"scripts/musicrecommended",autoFocus:!1,transition:"fade"}),defineRoute({path:"/mypreferencesdisplay.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencesdisplay"}),defineRoute({path:"/mypreferenceshome.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceshome"}),defineRoute({path:"/mypreferenceslanguages.html",dependencies:["emby-button","emby-checkbox","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceslanguages"}),defineRoute({path:"/mypreferencesmenu.html",dependencies:["emby-button"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencescommon"}),defineRoute({path:"/myprofile.html",dependencies:["emby-button","emby-collapse","emby-checkbox","emby-input"],autoFocus:!1,transition:"fade",controller:"scripts/myprofile"}),defineRoute({path:"/mysync.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/mysync"}),defineRoute({path:"/camerauploadsettings.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/camerauploadsettings"}),defineRoute({path:"/mysyncjob.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/syncjob"}),defineRoute({path:"/mysyncsettings.html",dependencies:["emby-checkbox","emby-input","emby-button","paper-icon-button-light"],autoFocus:!1,transition:"fade",controller:"scripts/mysyncsettings"}),defineRoute({path:"/notificationlist.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/notificationsetting.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/notificationsettings.html",controller:"scripts/notificationsettings",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/nowplaying.html",dependencies:["paper-icon-button-light","emby-slider","emby-button","emby-input","emby-itemscontainer"],controller:"scripts/nowplayingpage",autoFocus:!1,transition:"fade",fullscreen:!0,supportsThemeMedia:!0}),defineRoute({path:"/photos.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/playbackconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/playlists.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/playlists"}),defineRoute({path:"/plugincatalog.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/plugins.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/reports.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/scheduledtask.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/scheduledtasks.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/search.html",dependencies:[],controller:"scripts/searchpage"}),defineRoute({path:"/secondaryitems.html",dependencies:[],autoFocus:!1,controller:"scripts/secondaryitems"}),defineRoute({path:"/selectserver.html",dependencies:["listViewStyle","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/selectserver"}),defineRoute({path:"/serversecurity.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/shared.html",dependencies:[],autoFocus:!1,anonymous:!0}),defineRoute({path:"/streamingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/support.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/supporterkey.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/syncactivity.html",dependencies:[],autoFocus:!1,controller:"scripts/syncactivity"}),defineRoute({path:"/syncsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/tv.html",dependencies:["paper-icon-button-light","emby-button"],autoFocus:!1,controller:"scripts/tvrecommended",transition:"fade"}),defineRoute({path:"/useredit.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userlibraryaccess.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/usernew.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userparentalcontrol.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userpassword.html",dependencies:["emby-input","emby-button","emby-checkbox"],autoFocus:!1,controller:"scripts/userpasswordpage"}),defineRoute({path:"/userprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/wizardagreement.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardcomponents.html",dependencies:["dashboardcss","emby-button","emby-input","emby-select"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardcomponents"}),defineRoute({path:"/wizardfinish.html",dependencies:["emby-button","dashboardcss"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardfinishpage"}),defineRoute({path:"/wizardlibrary.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvguide.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvtuner.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardsettings.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardstart.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizarduser.html",dependencies:["dashboardcss","emby-input"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/videoosd.html",dependencies:[],transition:"fade",controller:"scripts/videoosd",autoFocus:!1,type:"video-osd",supportsThemeMedia:!0,fullscreen:!0}),defineRoute({path:"/configurationpage",dependencies:["jQuery"],autoFocus:!1,enableCache:!1,enableContentQueryString:!0,roles:"admin"}),defineRoute({path:"/",isDefaultRoute:!0,autoFocus:!1,dependencies:[]})}function loadPlugins(externalPlugins,appHost,browser,shell){console.log("Loading installed plugins");var list=["bower_components/emby-webcomponents/playback/playbackvalidation"];Dashboard.isRunningInCordova()&&browser.android?(document.createElement("audio").canPlayType("audio/flac").replace(/no/,"")&&document.createElement("audio").canPlayType('audio/ogg; codecs="opus"').replace(/no/,"")||(window.VlcAudio=!0),list.push("cordova/vlcplayer")):Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/audioplayer"),list.push("bower_components/emby-webcomponents/htmlaudioplayer/plugin"),Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/chromecast"),Dashboard.isRunningInCordova()&&browser.android&&list.push("cordova/externalplayer"),list.push("bower_components/emby-webcomponents/htmlvideoplayer/plugin"),appHost.supports("remotecontrol")&&(list.push("bower_components/emby-webcomponents/sessionplayer"),browser.chrome&&list.push("bower_components/emby-webcomponents/chromecastplayer")),list.push("bower_components/emby-webcomponents/youtubeplayer/plugin");for(var i=0,length=externalPlugins.length;i', ''); - - page.querySelector('.lnkPremiere').addEventListener('click', onSupporterLinkClick); - - }).on('pageshow', "#supporterKeyPage", function () { - - var page = this; - loadUserInfo(page); - load(page); - }); - -}); \ No newline at end of file +define(["fetchHelper","jQuery","registrationServices"],function(fetchHelper,$,registrationServices){"use strict";function load(page){Dashboard.showLoadingMsg(),ApiClient.getPluginSecurityInfo().then(function(info){$("#txtSupporterKey",page).val(info.SupporterKey),info.SupporterKey&&!info.IsMBSupporter?(page.querySelector("#txtSupporterKey").classList.add("invalidEntry"),$(".notSupporter",page).show()):(page.querySelector("#txtSupporterKey").classList.remove("invalidEntry"),$(".notSupporter",page).hide()),Dashboard.hideLoadingMsg()})}function loadUserInfo(page){Dashboard.getPluginSecurityInfo().then(function(info){info.IsMBSupporter?$(".supporterContainer",page).addClass("hide"):$(".supporterContainer",page).removeClass("hide")})}function retrieveSupporterKey(){Dashboard.showLoadingMsg();var form=this,email=$("#txtEmail",form).val(),url="https://mb3admin.com/admin/service/supporter/retrievekey?email="+email;return console.log(url),fetchHelper.ajax({url:url,type:"POST",dataType:"json"}).then(function(result){Dashboard.hideLoadingMsg(),result.Success?require(["toast"],function(toast){toast(Globalize.translate("MessageKeyEmailedTo").replace("{0}",email))}):require(["toast"],function(toast){toast(result.ErrorMessage)}),console.log(result)}),!1}function onSupporterLinkClick(e){registrationServices.showPremiereInfo(),e.preventDefault(),e.stopPropagation()}var SupporterKeyPage={updateSupporterKey:function(){Dashboard.showLoadingMsg();var form=this,key=$("#txtSupporterKey",form).val(),info={SupporterKey:key};return ApiClient.updatePluginSecurityInfo(info).then(function(){Dashboard.resetPluginSecurityInfo(),Dashboard.hideLoadingMsg(),key?Dashboard.alert({message:Globalize.translate("MessageKeyUpdated"),title:Globalize.translate("HeaderConfirmation")}):Dashboard.alert({message:Globalize.translate("MessageKeyRemoved"),title:Globalize.translate("HeaderConfirmation")});var page=$(form).parents(".page")[0];load(page)}),!1},linkSupporterKeys:function(){Dashboard.showLoadingMsg();var form=this,email=$("#txtNewEmail",form).val(),newkey=$("#txtNewKey",form).val(),oldkey=$("#txtOldKey",form).val(),url="https://mb3admin.com/admin/service/supporter/linkKeys";return console.log(url),fetchHelper.ajax({url:url,type:"POST",dataType:"json",query:{email:email,newkey:newkey,oldkey:oldkey}}).then(function(result){Dashboard.hideLoadingMsg(),result.Success?require(["toast"],function(toast){toast(Globalize.translate("MessageKeysLinked"))}):require(["toast"],function(toast){toast(result.ErrorMessage)}),console.log(result)}),!1}};$(document).on("pageinit","#supporterKeyPage",function(){var page=this;$("#supporterKeyForm",this).on("submit",SupporterKeyPage.updateSupporterKey),$("#lostKeyForm",this).on("submit",retrieveSupporterKey),$("#linkKeysForm",this).on("submit",SupporterKeyPage.linkSupporterKeys),page.querySelector(".benefits").innerHTML=Globalize.translate("HeaderSupporterBenefit",'',""),page.querySelector(".lnkPremiere").addEventListener("click",onSupporterLinkClick)}).on("pageshow","#supporterKeyPage",function(){var page=this;loadUserInfo(page),load(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/syncactivity.js b/dashboard-ui/scripts/syncactivity.js index 607a3bf83e..9d73c21be7 100644 --- a/dashboard-ui/scripts/syncactivity.js +++ b/dashboard-ui/scripts/syncactivity.js @@ -1,61 +1 @@ -define(['loading', 'apphost', 'globalize', 'syncJobList', 'events', 'scripts/taskbutton', 'localsync', 'emby-button', 'paper-icon-button-light'], function (loading, appHost, globalize, syncJobList, events, taskButton) { - 'use strict'; - - function getTabs() { - return [ - { - href: 'syncactivity.html', - name: Globalize.translate('TabSyncJobs') - }, - { - href: 'devicesupload.html', - name: Globalize.translate('TabCameraUpload') - }, - { - href: 'appservices.html?context=sync', - name: Globalize.translate('TabServices') - }, - { - href: 'syncsettings.html', - name: Globalize.translate('TabSettings') - }]; - } - - return function (view, params) { - - var mySyncJobList = new syncJobList({ - isLocalSync: params.mode === 'offline', - serverId: ApiClient.serverId(), - userId: params.mode === 'offline' ? null : ApiClient.getCurrentUserId(), - element: view.querySelector('.syncActivity'), - mode: params.mode - }); - - view.addEventListener('viewshow', function () { - - LibraryMenu.setTabs('syncadmin', 0, getTabs); - - taskButton({ - mode: 'on', - progressElem: view.querySelector('.syncProgress'), - taskKey: 'SyncPrepare', - button: view.querySelector('.btnSync') - }); - }); - - view.addEventListener('viewbeforehide', function () { - - taskButton({ - mode: 'off', - taskKey: 'SyncPrepare', - button: view.querySelector('.btnSync') - }); - }); - - view.addEventListener('viewdestroy', function () { - - mySyncJobList.destroy(); - }); - }; - -}); \ No newline at end of file +define(["loading","apphost","globalize","syncJobList","events","scripts/taskbutton","localsync","emby-button","paper-icon-button-light"],function(loading,appHost,globalize,syncJobList,events,taskButton){"use strict";function getTabs(){return[{href:"syncactivity.html",name:Globalize.translate("TabSyncJobs")},{href:"devicesupload.html",name:Globalize.translate("TabCameraUpload")},{href:"appservices.html?context=sync",name:Globalize.translate("TabServices")},{href:"syncsettings.html",name:Globalize.translate("TabSettings")}]}return function(view,params){var mySyncJobList=new syncJobList({isLocalSync:"offline"===params.mode,serverId:ApiClient.serverId(),userId:"offline"===params.mode?null:ApiClient.getCurrentUserId(),element:view.querySelector(".syncActivity"),mode:params.mode});view.addEventListener("viewshow",function(){LibraryMenu.setTabs("syncadmin",0,getTabs),taskButton({mode:"on",progressElem:view.querySelector(".syncProgress"),taskKey:"SyncPrepare",button:view.querySelector(".btnSync")})}),view.addEventListener("viewbeforehide",function(){taskButton({mode:"off",taskKey:"SyncPrepare",button:view.querySelector(".btnSync")})}),view.addEventListener("viewdestroy",function(){mySyncJobList.destroy()})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/syncsettings.js b/dashboard-ui/scripts/syncsettings.js index f7c99178a1..8054af66f0 100644 --- a/dashboard-ui/scripts/syncsettings.js +++ b/dashboard-ui/scripts/syncsettings.js @@ -1,92 +1 @@ -define(['jQuery', 'fnchecked'], function ($) { - 'use strict'; - - function loadPage(page, config) { - - $('#txtSyncTempPath', page).val(config.TemporaryPath || ''); - $('#txtUploadSpeedLimit', page).val((config.UploadSpeedLimitBytes / 1000000) || ''); - $('#txtCpuCoreLimit', page).val(config.TranscodingCpuCoreLimit); - $('#chkEnableFullSpeedConversion', page).checked(config.EnableFullSpeedTranscoding); - - Dashboard.hideLoadingMsg(); - } - - function onSubmit() { - Dashboard.showLoadingMsg(); - - var form = this; - - ApiClient.getNamedConfiguration("sync").then(function (config) { - - config.TemporaryPath = $('#txtSyncTempPath', form).val(); - config.UploadSpeedLimitBytes = parseInt(parseFloat(($('#txtUploadSpeedLimit', form).val() || '0')) * 1000000); - config.TranscodingCpuCoreLimit = parseInt($('#txtCpuCoreLimit', form).val()); - config.EnableFullSpeedTranscoding = $('#chkEnableFullSpeedConversion', form).checked(); - - ApiClient.updateNamedConfiguration("sync", config).then(Dashboard.processServerConfigurationUpdateResult); - }); - - // Disable default form submission - return false; - } - - function getTabs() { - return [ - { - href: 'syncactivity.html', - name: Globalize.translate('TabSyncJobs') - }, - { - href: 'devicesupload.html', - name: Globalize.translate('TabCameraUpload') - }, - { - href: 'appservices.html?context=sync', - name: Globalize.translate('TabServices') - }, - { - href: 'syncsettings.html', - name: Globalize.translate('TabSettings') - }]; - } - - $(document).on('pageinit', "#syncSettingsPage", function () { - - var page = this; - - $('#btnSelectSyncTempPath', page).on("click.selectDirectory", function () { - - require(['directorybrowser'], function (directoryBrowser) { - - var picker = new directoryBrowser(); - - picker.show({ - - callback: function (path) { - if (path) { - $('#txtSyncTempPath', page).val(path); - } - picker.close(); - } - }); - }); - }); - - $('.syncSettingsForm').off('submit', onSubmit).on('submit', onSubmit); - - - }).on('pageshow', "#syncSettingsPage", function () { - - Dashboard.showLoadingMsg(); - - LibraryMenu.setTabs('syncadmin', 3, getTabs); - var page = this; - - ApiClient.getNamedConfiguration("sync").then(function (config) { - - loadPage(page, config); - - }); - }); - -}); +define(["jQuery","fnchecked"],function($){"use strict";function loadPage(page,config){$("#txtSyncTempPath",page).val(config.TemporaryPath||""),$("#txtUploadSpeedLimit",page).val(config.UploadSpeedLimitBytes/1e6||""),$("#txtCpuCoreLimit",page).val(config.TranscodingCpuCoreLimit),$("#chkEnableFullSpeedConversion",page).checked(config.EnableFullSpeedTranscoding),Dashboard.hideLoadingMsg()}function onSubmit(){Dashboard.showLoadingMsg();var form=this;return ApiClient.getNamedConfiguration("sync").then(function(config){config.TemporaryPath=$("#txtSyncTempPath",form).val(),config.UploadSpeedLimitBytes=parseInt(1e6*parseFloat($("#txtUploadSpeedLimit",form).val()||"0")),config.TranscodingCpuCoreLimit=parseInt($("#txtCpuCoreLimit",form).val()),config.EnableFullSpeedTranscoding=$("#chkEnableFullSpeedConversion",form).checked(),ApiClient.updateNamedConfiguration("sync",config).then(Dashboard.processServerConfigurationUpdateResult)}),!1}function getTabs(){return[{href:"syncactivity.html",name:Globalize.translate("TabSyncJobs")},{href:"devicesupload.html",name:Globalize.translate("TabCameraUpload")},{href:"appservices.html?context=sync",name:Globalize.translate("TabServices")},{href:"syncsettings.html",name:Globalize.translate("TabSettings")}]}$(document).on("pageinit","#syncSettingsPage",function(){var page=this;$("#btnSelectSyncTempPath",page).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&$("#txtSyncTempPath",page).val(path),picker.close()}})})}),$(".syncSettingsForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#syncSettingsPage",function(){Dashboard.showLoadingMsg(),LibraryMenu.setTabs("syncadmin",3,getTabs);var page=this;ApiClient.getNamedConfiguration("sync").then(function(config){loadPage(page,config)})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/taskbutton.js b/dashboard-ui/scripts/taskbutton.js index b3a8f9560a..a325a0c343 100644 --- a/dashboard-ui/scripts/taskbutton.js +++ b/dashboard-ui/scripts/taskbutton.js @@ -1,149 +1 @@ -define(['userSettings', 'emby-button'], function (userSettings) { - 'use strict'; - - return function (options) { - - var button = options.button; - - function pollTasks() { - - ApiClient.getScheduledTasks({ - - IsEnabled: true - - }).then(updateTasks); - } - - function updateTasks(tasks) { - - var task = tasks.filter(function (t) { - - return t.Key == options.taskKey; - - })[0]; - - if (options.panel) { - if (task) { - options.panel.classList.remove('hide'); - } else { - options.panel.classList.add('hide'); - } - } - - if (!task) { - return; - } - - if (task.State == 'Idle') { - button.removeAttribute('disabled'); - } else { - button.setAttribute('disabled', 'disabled'); - } - - button.setAttribute('data-taskid', task.Id); - - var progress = (task.CurrentProgressPercentage || 0).toFixed(1); - - if (options.progressElem) { - options.progressElem.value = progress; - - if (task.State == 'Running') { - options.progressElem.classList.remove('hide'); - } else { - options.progressElem.classList.add('hide'); - } - } - - if (options.lastResultElem) { - var lastResult = task.LastExecutionResult ? task.LastExecutionResult.Status : ''; - - if (lastResult == "Failed") { - options.lastResultElem.html('(' + Globalize.translate('LabelFailed') + ')'); - } - else if (lastResult == "Cancelled") { - options.lastResultElem.html('(' + Globalize.translate('LabelCancelled') + ')'); - } - else if (lastResult == "Aborted") { - options.lastResultElem.html('' + Globalize.translate('LabelAbortedByServerShutdown') + ''); - } else { - options.lastResultElem.html(lastResult); - } - } - } - - function onScheduledTaskMessageConfirmed(id) { - ApiClient.startScheduledTask(id).then(pollTasks); - } - - function onButtonClick() { - - var button = this; - var taskId = button.getAttribute('data-taskid'); - onScheduledTaskMessageConfirmed(taskId); - } - - function onSocketOpen() { - startInterval(); - } - - function onSocketMessage(e, msg) { - if (msg.MessageType == "ScheduledTasksInfo") { - - var tasks = msg.Data; - - updateTasks(tasks); - } - } - - var pollInterval; - - function onPollIntervalFired() { - - if (!ApiClient.isWebSocketOpen()) { - pollTasks(); - } - } - - function startInterval() { - if (ApiClient.isWebSocketOpen()) { - ApiClient.sendWebSocketMessage("ScheduledTasksInfoStart", "1000,1000"); - } - if (pollInterval) { - clearInterval(pollInterval); - } - pollInterval = setInterval(onPollIntervalFired, 5000); - } - - function stopInterval() { - if (ApiClient.isWebSocketOpen()) { - ApiClient.sendWebSocketMessage("ScheduledTasksInfoStop"); - } - if (pollInterval) { - clearInterval(pollInterval); - } - } - - if (options.panel) { - options.panel.classList.add('hide'); - } - - if (options.mode == 'off') { - - button.removeEventListener('click', onButtonClick); - Events.off(ApiClient, 'websocketmessage', onSocketMessage); - Events.off(ApiClient, 'websocketopen', onSocketOpen); - stopInterval(); - - } else { - - button.addEventListener('click', onButtonClick); - - pollTasks(); - - startInterval(); - - Events.on(ApiClient, 'websocketmessage', onSocketMessage); - Events.on(ApiClient, 'websocketopen', onSocketOpen); - } - }; -}); \ No newline at end of file +define(["userSettings","emby-button"],function(userSettings){"use strict";return function(options){function pollTasks(){ApiClient.getScheduledTasks({IsEnabled:!0}).then(updateTasks)}function updateTasks(tasks){var task=tasks.filter(function(t){return t.Key==options.taskKey})[0];if(options.panel&&(task?options.panel.classList.remove("hide"):options.panel.classList.add("hide")),task){"Idle"==task.State?button.removeAttribute("disabled"):button.setAttribute("disabled","disabled"),button.setAttribute("data-taskid",task.Id);var progress=(task.CurrentProgressPercentage||0).toFixed(1);if(options.progressElem&&(options.progressElem.value=progress,"Running"==task.State?options.progressElem.classList.remove("hide"):options.progressElem.classList.add("hide")),options.lastResultElem){var lastResult=task.LastExecutionResult?task.LastExecutionResult.Status:"";"Failed"==lastResult?options.lastResultElem.html('('+Globalize.translate("LabelFailed")+")"):"Cancelled"==lastResult?options.lastResultElem.html('('+Globalize.translate("LabelCancelled")+")"):"Aborted"==lastResult?options.lastResultElem.html(''+Globalize.translate("LabelAbortedByServerShutdown")+""):options.lastResultElem.html(lastResult)}}}function onScheduledTaskMessageConfirmed(id){ApiClient.startScheduledTask(id).then(pollTasks)}function onButtonClick(){var button=this,taskId=button.getAttribute("data-taskid");onScheduledTaskMessageConfirmed(taskId)}function onSocketOpen(){startInterval()}function onSocketMessage(e,msg){if("ScheduledTasksInfo"==msg.MessageType){var tasks=msg.Data;updateTasks(tasks)}}function onPollIntervalFired(){ApiClient.isWebSocketOpen()||pollTasks()}function startInterval(){ApiClient.isWebSocketOpen()&&ApiClient.sendWebSocketMessage("ScheduledTasksInfoStart","1000,1000"),pollInterval&&clearInterval(pollInterval),pollInterval=setInterval(onPollIntervalFired,5e3)}function stopInterval(){ApiClient.isWebSocketOpen()&&ApiClient.sendWebSocketMessage("ScheduledTasksInfoStop"),pollInterval&&clearInterval(pollInterval)}var pollInterval,button=options.button;options.panel&&options.panel.classList.add("hide"),"off"==options.mode?(button.removeEventListener("click",onButtonClick),Events.off(ApiClient,"websocketmessage",onSocketMessage),Events.off(ApiClient,"websocketopen",onSocketOpen),stopInterval()):(button.addEventListener("click",onButtonClick),pollTasks(),startInterval(),Events.on(ApiClient,"websocketmessage",onSocketMessage),Events.on(ApiClient,"websocketopen",onSocketOpen))}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/tvgenres.js b/dashboard-ui/scripts/tvgenres.js index a2e5013b86..e3f65772e3 100644 --- a/dashboard-ui/scripts/tvgenres.js +++ b/dashboard-ui/scripts/tvgenres.js @@ -1,247 +1 @@ -define(['libraryBrowser', 'cardBuilder', 'lazyLoader', 'apphost', 'globalize', 'dom'], function (libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, dom) { - 'use strict'; - - return function (view, params, tabContent) { - - var self = this; - - var data = {}; - function getPageData() { - var key = getSavedQueryKey(); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Series", - Recursive: true, - EnableTotalRecordCount: false - }, - view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster') - }; - - pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData; - } - - function getQuery() { - - return getPageData().query; - } - - function getSavedQueryKey() { - - return libraryBrowser.getSavedQueryKey('seriesgenres'); - } - - function getPromise() { - - Dashboard.showLoadingMsg(); - var query = getQuery(); - - return ApiClient.getGenres(Dashboard.getCurrentUserId(), query); - } - - function enableScrollX() { - return browserInfo.mobile; - } - - function getThumbShape() { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - } - - function getPortraitShape() { - return enableScrollX() ? 'overflowPortrait' : 'portrait'; - } - - function getMoreItemsHref(itemId, type) { - - return 'secondaryitems.html?type=' + type + '&genreId=' + itemId + '&parentId=' + params.topParentId; - } - - dom.addEventListener(tabContent, 'click', function (e) { - - var btnMoreFromGenre = dom.parentWithClass(e.target, 'btnMoreFromGenre'); - if (btnMoreFromGenre) { - var id = btnMoreFromGenre.getAttribute('data-id'); - Dashboard.navigate(getMoreItemsHref(id, 'Series')); - } - - }, { - passive: true - }); - - function fillItemsContainer(elem) { - - var id = elem.getAttribute('data-id'); - - var viewStyle = self.getCurrentViewStyle(); - - var limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? - 5 : - 8; - - if (enableScrollX()) { - limit = 10; - } - - var enableImageTypes = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? - "Primary,Backdrop,Thumb" : - "Primary"; - - var query = { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Series", - Recursive: true, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", - ImageTypeLimit: 1, - EnableImageTypes: enableImageTypes, - Limit: limit, - GenreIds: id, - EnableTotalRecordCount: false, - ParentId: params.topParentId - }; - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - if (viewStyle == "Thumb") { - cardBuilder.buildCards(result.Items, { - itemsContainer: elem, - shape: getThumbShape(), - preferThumb: true, - showTitle: true, - scalable: true, - centerText: true, - overlayMoreButton: true, - allowBottomPadding: false - }); - } - else if (viewStyle == "ThumbCard") { - - cardBuilder.buildCards(result.Items, { - itemsContainer: elem, - shape: getThumbShape(), - preferThumb: true, - showTitle: true, - scalable: true, - centerText: false, - cardLayout: true, - vibrant: supportsImageAnalysis, - showSeriesYear: true - }); - } - else if (viewStyle == "PosterCard") { - cardBuilder.buildCards(result.Items, { - itemsContainer: elem, - shape: getPortraitShape(), - showTitle: true, - scalable: true, - centerText: false, - cardLayout: true, - vibrant: supportsImageAnalysis, - showSeriesYear: true - }); - } - else if (viewStyle == "Poster") { - cardBuilder.buildCards(result.Items, { - itemsContainer: elem, - shape: getPortraitShape(), - showTitle: true, - scalable: true, - centerText: true, - overlayMoreButton: true, - allowBottomPadding: false - }); - } - - if (result.Items.length >= query.Limit) { - tabContent.querySelector('.btnMoreFromGenre' + id).classList.remove('hide'); - } - }); - } - - function reloadItems(context, promise) { - - var query = getQuery(); - - promise.then(function (result) { - - var elem = context.querySelector('#items'); - var html = ''; - - var items = result.Items; - - for (var i = 0, length = items.length; i < length; i++) { - - var item = items[i]; - - html += '
'; - - html += '
'; - html += '

'; - html += item.Name; - html += '

'; - html += ''; - html += '
'; - - if (enableScrollX()) { - html += '
'; - } else { - html += '
'; - } - html += '
'; - - html += '
'; - } - - elem.innerHTML = html; - - lazyLoader.lazyChildren(elem, fillItemsContainer); - - libraryBrowser.saveQueryValues(getSavedQueryKey(), query); - - Dashboard.hideLoadingMsg(); - }); - } - - self.getViewStyles = function () { - return 'Poster,PosterCard,Thumb,ThumbCard'.split(','); - }; - - self.getCurrentViewStyle = function () { - return getPageData(tabContent).view; - }; - - self.setCurrentViewStyle = function (viewStyle) { - getPageData(tabContent).view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); - fullyReload(); - }; - - self.enableViewSelection = true; - var promise; - - self.preRender = function () { - promise = getPromise(); - }; - - self.renderTab = function () { - - reloadItems(tabContent, promise); - }; - - function fullyReload() { - self.preRender(); - self.renderTab(); - } - }; -}); \ No newline at end of file +define(["libraryBrowser","cardBuilder","lazyLoader","apphost","globalize","dom"],function(libraryBrowser,cardBuilder,lazyLoader,appHost,globalize,dom){"use strict";return function(view,params,tabContent){function getPageData(){var key=getSavedQueryKey(),pageData=data[key];return pageData||(pageData=data[key]={query:{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"Series",Recursive:!0,EnableTotalRecordCount:!1},view:libraryBrowser.getSavedView(key)||(appHost.preferVisualCards?"PosterCard":"Poster")},pageData.query.ParentId=params.topParentId,libraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(){return getPageData().query}function getSavedQueryKey(){return libraryBrowser.getSavedQueryKey("seriesgenres")}function getPromise(){Dashboard.showLoadingMsg();var query=getQuery();return ApiClient.getGenres(Dashboard.getCurrentUserId(),query)}function enableScrollX(){return browserInfo.mobile}function getThumbShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function getPortraitShape(){return enableScrollX()?"overflowPortrait":"portrait"}function getMoreItemsHref(itemId,type){return"secondaryitems.html?type="+type+"&genreId="+itemId+"&parentId="+params.topParentId}function fillItemsContainer(elem){var id=elem.getAttribute("data-id"),viewStyle=self.getCurrentViewStyle(),limit="Thumb"==viewStyle||"ThumbCard"==viewStyle?5:8;enableScrollX()&&(limit=10);var enableImageTypes="Thumb"==viewStyle||"ThumbCard"==viewStyle?"Primary,Backdrop,Thumb":"Primary",query={SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"Series",Recursive:!0,Fields:"PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",ImageTypeLimit:1,EnableImageTypes:enableImageTypes,Limit:limit,GenreIds:id,EnableTotalRecordCount:!1,ParentId:params.topParentId};ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){var supportsImageAnalysis=appHost.supports("imageanalysis");"Thumb"==viewStyle?cardBuilder.buildCards(result.Items,{itemsContainer:elem,shape:getThumbShape(),preferThumb:!0,showTitle:!0,scalable:!0,centerText:!0,overlayMoreButton:!0,allowBottomPadding:!1}):"ThumbCard"==viewStyle?cardBuilder.buildCards(result.Items,{itemsContainer:elem,shape:getThumbShape(),preferThumb:!0,showTitle:!0,scalable:!0,centerText:!1,cardLayout:!0,vibrant:supportsImageAnalysis,showSeriesYear:!0}):"PosterCard"==viewStyle?cardBuilder.buildCards(result.Items,{itemsContainer:elem,shape:getPortraitShape(),showTitle:!0,scalable:!0,centerText:!1,cardLayout:!0,vibrant:supportsImageAnalysis,showSeriesYear:!0}):"Poster"==viewStyle&&cardBuilder.buildCards(result.Items,{itemsContainer:elem,shape:getPortraitShape(),showTitle:!0,scalable:!0,centerText:!0,overlayMoreButton:!0,allowBottomPadding:!1}),result.Items.length>=query.Limit&&tabContent.querySelector(".btnMoreFromGenre"+id).classList.remove("hide")})}function reloadItems(context,promise){var query=getQuery();promise.then(function(result){for(var elem=context.querySelector("#items"),html="",items=result.Items,i=0,length=items.length;i',html+='
',html+='

',html+=item.Name,html+="

",html+='",html+="
",html+=enableScrollX()?'
':'
',html+="
",html+="
"}elem.innerHTML=html,lazyLoader.lazyChildren(elem,fillItemsContainer),libraryBrowser.saveQueryValues(getSavedQueryKey(),query),Dashboard.hideLoadingMsg()})}function fullyReload(){self.preRender(),self.renderTab()}var self=this,data={};dom.addEventListener(tabContent,"click",function(e){var btnMoreFromGenre=dom.parentWithClass(e.target,"btnMoreFromGenre");if(btnMoreFromGenre){var id=btnMoreFromGenre.getAttribute("data-id");Dashboard.navigate(getMoreItemsHref(id,"Series"))}},{passive:!0}),self.getViewStyles=function(){return"Poster,PosterCard,Thumb,ThumbCard".split(",")},self.getCurrentViewStyle=function(){return getPageData(tabContent).view},self.setCurrentViewStyle=function(viewStyle){getPageData(tabContent).view=viewStyle,libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent),viewStyle),fullyReload()},self.enableViewSelection=!0;var promise;self.preRender=function(){promise=getPromise()},self.renderTab=function(){reloadItems(tabContent,promise)}}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/tvlatest.js b/dashboard-ui/scripts/tvlatest.js index 3b92833fec..09442f3f76 100644 --- a/dashboard-ui/scripts/tvlatest.js +++ b/dashboard-ui/scripts/tvlatest.js @@ -1,81 +1 @@ -define(['components/categorysyncbuttons', 'components/groupedcards', 'cardBuilder', 'apphost', 'imageLoader'], function (categorysyncbuttons, groupedcards, cardBuilder, appHost, imageLoader) { - 'use strict'; - - function getView() { - - return 'Thumb'; - } - - function getLatestPromise(context, params) { - - Dashboard.showLoadingMsg(); - - var userId = Dashboard.getCurrentUserId(); - - var parentId = params.topParentId; - - var options = { - - IncludeItemTypes: "Episode", - Limit: 30, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", - ParentId: parentId, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb" - }; - - return ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)); - } - - function loadLatest(context, params, promise) { - - promise.then(function (items) { - - var html = ''; - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = supportsImageAnalysis; - - html += cardBuilder.getCardsHtml({ - items: items, - shape: "backdrop", - preferThumb: true, - showTitle: true, - showSeriesYear: true, - showParentTitle: true, - overlayText: false, - cardLayout: cardLayout, - showUnplayedIndicator: false, - showChildCountIndicator: true, - centerText: !cardLayout, - lazy: true, - overlayPlayButton: true, - vibrant: supportsImageAnalysis, - lines: 2 - }); - - var elem = context.querySelector('#latestEpisodes'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - - Dashboard.hideLoadingMsg(); - }); - } - return function (view, params, tabContent) { - - var self = this; - - categorysyncbuttons.init(tabContent); var latestPromise; - - self.preRender = function () { - latestPromise = getLatestPromise(view, params); - }; - - self.renderTab = function () { - - loadLatest(tabContent, params, latestPromise); - }; - - tabContent.querySelector('#latestEpisodes').addEventListener('click', groupedcards.onItemsContainerClick); - }; -}); \ No newline at end of file +define(["components/categorysyncbuttons","components/groupedcards","cardBuilder","apphost","imageLoader"],function(categorysyncbuttons,groupedcards,cardBuilder,appHost,imageLoader){"use strict";function getLatestPromise(context,params){Dashboard.showLoadingMsg();var userId=Dashboard.getCurrentUserId(),parentId=params.topParentId,options={IncludeItemTypes:"Episode",Limit:30,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",ParentId:parentId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb"};return ApiClient.getJSON(ApiClient.getUrl("Users/"+userId+"/Items/Latest",options))}function loadLatest(context,params,promise){promise.then(function(items){var html="",supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis;html+=cardBuilder.getCardsHtml({items:items,shape:"backdrop",preferThumb:!0,showTitle:!0,showSeriesYear:!0,showParentTitle:!0,overlayText:!1,cardLayout:cardLayout,showUnplayedIndicator:!1,showChildCountIndicator:!0,centerText:!cardLayout,lazy:!0,overlayPlayButton:!0,vibrant:supportsImageAnalysis,lines:2});var elem=context.querySelector("#latestEpisodes");elem.innerHTML=html,imageLoader.lazyChildren(elem),Dashboard.hideLoadingMsg()})}return function(view,params,tabContent){var self=this;categorysyncbuttons.init(tabContent);var latestPromise;self.preRender=function(){latestPromise=getLatestPromise(view,params)},self.renderTab=function(){loadLatest(tabContent,params,latestPromise)},tabContent.querySelector("#latestEpisodes").addEventListener("click",groupedcards.onItemsContainerClick)}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/tvrecommended.js b/dashboard-ui/scripts/tvrecommended.js index a97d0ad1a6..0e2b12dc95 100644 --- a/dashboard-ui/scripts/tvrecommended.js +++ b/dashboard-ui/scripts/tvrecommended.js @@ -1,304 +1 @@ -define(['libraryBrowser', 'dom', 'components/categorysyncbuttons', 'cardBuilder', 'apphost', 'playbackManager', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (libraryBrowser, dom, categorysyncbuttons, cardBuilder, appHost, playbackManager) { - 'use strict'; - - return function (view, params) { - - var self = this; - - function reload() { - - Dashboard.showLoadingMsg(); - - loadResume(); - loadNextUp(); - } - - function loadNextUp() { - - var query = { - - Limit: 24, - Fields: "PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo", - UserId: Dashboard.getCurrentUserId(), - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb" - }; - - query.ParentId = LibraryMenu.getTopParentId(); - - ApiClient.getNextUpEpisodes(query).then(function (result) { - - if (result.Items.length) { - view.querySelector('.noNextUpItems').classList.add('hide'); - } else { - view.querySelector('.noNextUpItems').classList.remove('hide'); - } - - var container = view.querySelector('#nextUpItems'); - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - cardBuilder.buildCards(result.Items, { - itemsContainer: container, - preferThumb: true, - shape: "backdrop", - scalable: true, - showTitle: true, - showParentTitle: true, - overlayText: false, - centerText: !supportsImageAnalysis, - overlayPlayButton: true, - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - }); - - Dashboard.hideLoadingMsg(); - }); - } - - function enableScrollX() { - return browserInfo.mobile; - } - - function getThumbShape() { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - } - - function loadResume() { - - var parentId = LibraryMenu.getTopParentId(); - - var screenWidth = dom.getWindowSize().innerWidth; - var limit = screenWidth >= 1600 ? 5 : 6; - - var options = { - - SortBy: "DatePlayed", - SortOrder: "Descending", - IncludeItemTypes: "Episode", - Filters: "IsResumable", - Limit: limit, - Recursive: true, - Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo", - ExcludeLocationTypes: "Virtual", - ParentId: parentId, - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", - EnableTotalRecordCount: false - }; - - ApiClient.getItems(Dashboard.getCurrentUserId(), options).then(function (result) { - - if (result.Items.length) { - view.querySelector('#resumableSection').classList.remove('hide'); - } else { - view.querySelector('#resumableSection').classList.add('hide'); - } - - var allowBottomPadding = !enableScrollX(); - - var container = view.querySelector('#resumableItems'); - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = supportsImageAnalysis; - - cardBuilder.buildCards(result.Items, { - itemsContainer: container, - preferThumb: true, - shape: getThumbShape(), - scalable: true, - showTitle: true, - showParentTitle: true, - overlayText: false, - centerText: !cardLayout, - overlayPlayButton: true, - allowBottomPadding: allowBottomPadding, - cardLayout: cardLayout, - vibrant: supportsImageAnalysis - }); - }); - } - - self.initTab = function () { - - var tabContent = self.tabContent; - - var resumableItemsContainer = tabContent.querySelector('#resumableItems'); - - if (enableScrollX()) { - resumableItemsContainer.classList.add('hiddenScrollX'); - resumableItemsContainer.classList.remove('vertical-wrap'); - } else { - resumableItemsContainer.classList.remove('hiddenScrollX'); - resumableItemsContainer.classList.add('vertical-wrap'); - } - - categorysyncbuttons.init(tabContent); - }; - - self.renderTab = function () { - reload(); - }; - - var tabControllers = []; - var renderedTabs = []; - - function getTabController(page, index, callback) { - - var depends = []; - - switch (index) { - - case 0: - break; - case 1: - depends.push('scripts/tvlatest'); - break; - case 2: - depends.push('scripts/tvupcoming'); - break; - case 3: - depends.push('scripts/tvshows'); - break; - case 4: - depends.push('scripts/tvgenres'); - break; - case 5: - depends.push('scripts/tvstudios'); - break; - case 6: - depends.push('scripts/episodes'); - break; - default: - break; - } - - require(depends, function (controllerFactory) { - var tabContent; - if (index == 0) { - tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); - self.tabContent = tabContent; - } - var controller = tabControllers[index]; - if (!controller) { - tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); - controller = index ? new controllerFactory(view, params, tabContent) : self; - tabControllers[index] = controller; - - if (controller.initTab) { - controller.initTab(); - } - } - - callback(controller); - }); - } - - function preLoadTab(page, index) { - - getTabController(page, index, function (controller) { - if (renderedTabs.indexOf(index) == -1) { - if (controller.preRender) { - controller.preRender(); - } - } - }); - } - - function loadTab(page, index) { - - getTabController(page, index, function (controller) { - if (renderedTabs.indexOf(index) == -1) { - renderedTabs.push(index); - controller.renderTab(); - } - }); - } - - var viewTabs = view.querySelector('.libraryViewNav'); - - function onPlaybackStop(e, state) { - - if (state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') { - - renderedTabs = []; - viewTabs.triggerTabChange(); - } - } - - if (enableScrollX()) { - view.querySelector('#resumableItems').classList.add('hiddenScrollX'); - } else { - view.querySelector('#resumableItems').classList.remove('hiddenScrollX'); - } - libraryBrowser.configurePaperLibraryTabs(view, viewTabs, view.querySelectorAll('.pageTabContent'), [0, 1, 2, 4, 5, 6]); - - viewTabs.addEventListener('beforetabchange', function (e) { - preLoadTab(view, parseInt(e.detail.selectedTabIndex)); - }); - viewTabs.addEventListener('tabchange', function (e) { - loadTab(view, parseInt(e.detail.selectedTabIndex)); - }); - - function onWebSocketMessage(e, data) { - - var msg = data; - - if (msg.MessageType === "UserDataChanged") { - - if (msg.Data.UserId == Dashboard.getCurrentUserId()) { - - renderedTabs = []; - } - } - - } - - view.addEventListener('viewbeforeshow', function (e) { - - if (!view.getAttribute('data-title')) { - - var parentId = params.topParentId; - - if (parentId) { - - ApiClient.getItem(Dashboard.getCurrentUserId(), parentId).then(function (item) { - - view.setAttribute('data-title', item.Name); - LibraryMenu.setTitle(item.Name); - }); - - - } else { - view.setAttribute('data-title', Globalize.translate('TabShows')); - LibraryMenu.setTitle(Globalize.translate('TabShows')); - } - } - - Events.on(playbackManager, 'playbackstop', onPlaybackStop); - Events.on(ApiClient, "websocketmessage", onWebSocketMessage); - }); - - view.addEventListener('viewbeforehide', function (e) { - - Events.off(playbackManager, 'playbackstop', onPlaybackStop); - Events.off(ApiClient, "websocketmessage", onWebSocketMessage); - }); - - require(["headroom-window"], function (headroom) { - headroom.add(viewTabs); - self.headroom = headroom; - }); - - view.addEventListener('viewdestroy', function (e) { - - if (self.headroom) { - self.headroom.remove(viewTabs); - } - tabControllers.forEach(function (t) { - if (t.destroy) { - t.destroy(); - } - }); - }); - }; -}); \ No newline at end of file +define(["libraryBrowser","dom","components/categorysyncbuttons","cardBuilder","apphost","playbackManager","scrollStyles","emby-itemscontainer","emby-tabs","emby-button"],function(libraryBrowser,dom,categorysyncbuttons,cardBuilder,appHost,playbackManager){"use strict";return function(view,params){function reload(){Dashboard.showLoadingMsg(),loadResume(),loadNextUp()}function loadNextUp(){var query={Limit:24,Fields:"PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo",UserId:Dashboard.getCurrentUserId(),ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb"};query.ParentId=LibraryMenu.getTopParentId(),ApiClient.getNextUpEpisodes(query).then(function(result){result.Items.length?view.querySelector(".noNextUpItems").classList.add("hide"):view.querySelector(".noNextUpItems").classList.remove("hide");var container=view.querySelector("#nextUpItems"),supportsImageAnalysis=appHost.supports("imageanalysis");cardBuilder.buildCards(result.Items,{itemsContainer:container,preferThumb:!0,shape:"backdrop",scalable:!0,showTitle:!0,showParentTitle:!0,overlayText:!1,centerText:!supportsImageAnalysis,overlayPlayButton:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),Dashboard.hideLoadingMsg()})}function enableScrollX(){return browserInfo.mobile}function getThumbShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function loadResume(){var parentId=LibraryMenu.getTopParentId(),screenWidth=dom.getWindowSize().innerWidth,limit=screenWidth>=1600?5:6,options={SortBy:"DatePlayed",SortOrder:"Descending",IncludeItemTypes:"Episode",Filters:"IsResumable",Limit:limit,Recursive:!0,Fields:"PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo",ExcludeLocationTypes:"Virtual",ParentId:parentId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb",EnableTotalRecordCount:!1};ApiClient.getItems(Dashboard.getCurrentUserId(),options).then(function(result){result.Items.length?view.querySelector("#resumableSection").classList.remove("hide"):view.querySelector("#resumableSection").classList.add("hide");var allowBottomPadding=!enableScrollX(),container=view.querySelector("#resumableItems"),supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis;cardBuilder.buildCards(result.Items,{itemsContainer:container,preferThumb:!0,shape:getThumbShape(),scalable:!0,showTitle:!0,showParentTitle:!0,overlayText:!1,centerText:!cardLayout,overlayPlayButton:!0,allowBottomPadding:allowBottomPadding,cardLayout:cardLayout,vibrant:supportsImageAnalysis})})}function getTabController(page,index,callback){var depends=[];switch(index){case 0:break;case 1:depends.push("scripts/tvlatest");break;case 2:depends.push("scripts/tvupcoming");break;case 3:depends.push("scripts/tvshows");break;case 4:depends.push("scripts/tvgenres");break;case 5:depends.push("scripts/tvstudios");break;case 6:depends.push("scripts/episodes")}require(depends,function(controllerFactory){var tabContent;0==index&&(tabContent=view.querySelector(".pageTabContent[data-index='"+index+"']"),self.tabContent=tabContent);var controller=tabControllers[index];controller||(tabContent=view.querySelector(".pageTabContent[data-index='"+index+"']"),controller=index?new controllerFactory(view,params,tabContent):self,tabControllers[index]=controller,controller.initTab&&controller.initTab()),callback(controller)})}function preLoadTab(page,index){getTabController(page,index,function(controller){renderedTabs.indexOf(index)==-1&&controller.preRender&&controller.preRender()})}function loadTab(page,index){getTabController(page,index,function(controller){renderedTabs.indexOf(index)==-1&&(renderedTabs.push(index),controller.renderTab())})}function onPlaybackStop(e,state){state.NowPlayingItem&&"Video"==state.NowPlayingItem.MediaType&&(renderedTabs=[],viewTabs.triggerTabChange())}function onWebSocketMessage(e,data){var msg=data;"UserDataChanged"===msg.MessageType&&msg.Data.UserId==Dashboard.getCurrentUserId()&&(renderedTabs=[])}var self=this;self.initTab=function(){var tabContent=self.tabContent,resumableItemsContainer=tabContent.querySelector("#resumableItems");enableScrollX()?(resumableItemsContainer.classList.add("hiddenScrollX"),resumableItemsContainer.classList.remove("vertical-wrap")):(resumableItemsContainer.classList.remove("hiddenScrollX"),resumableItemsContainer.classList.add("vertical-wrap")),categorysyncbuttons.init(tabContent)},self.renderTab=function(){reload()};var tabControllers=[],renderedTabs=[],viewTabs=view.querySelector(".libraryViewNav");enableScrollX()?view.querySelector("#resumableItems").classList.add("hiddenScrollX"):view.querySelector("#resumableItems").classList.remove("hiddenScrollX"),libraryBrowser.configurePaperLibraryTabs(view,viewTabs,view.querySelectorAll(".pageTabContent"),[0,1,2,4,5,6]),viewTabs.addEventListener("beforetabchange",function(e){preLoadTab(view,parseInt(e.detail.selectedTabIndex))}),viewTabs.addEventListener("tabchange",function(e){loadTab(view,parseInt(e.detail.selectedTabIndex))}),view.addEventListener("viewbeforeshow",function(e){if(!view.getAttribute("data-title")){var parentId=params.topParentId;parentId?ApiClient.getItem(Dashboard.getCurrentUserId(),parentId).then(function(item){view.setAttribute("data-title",item.Name),LibraryMenu.setTitle(item.Name)}):(view.setAttribute("data-title",Globalize.translate("TabShows")),LibraryMenu.setTitle(Globalize.translate("TabShows")))}Events.on(playbackManager,"playbackstop",onPlaybackStop),Events.on(ApiClient,"websocketmessage",onWebSocketMessage)}),view.addEventListener("viewbeforehide",function(e){Events.off(playbackManager,"playbackstop",onPlaybackStop),Events.off(ApiClient,"websocketmessage",onWebSocketMessage)}),require(["headroom-window"],function(headroom){headroom.add(viewTabs),self.headroom=headroom}),view.addEventListener("viewdestroy",function(e){self.headroom&&self.headroom.remove(viewTabs),tabControllers.forEach(function(t){t.destroy&&t.destroy()})})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/tvshows.js b/dashboard-ui/scripts/tvshows.js index 80a16dd9b7..c16fc6eb3b 100644 --- a/dashboard-ui/scripts/tvshows.js +++ b/dashboard-ui/scripts/tvshows.js @@ -1,304 +1 @@ -define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'apphost', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, cardBuilder, appHost) { - 'use strict'; - - return function (view, params, tabContent) { - - var self = this; - var pageSize = libraryBrowser.getDefaultPageSize(); - - var data = {}; - - function getPageData(context) { - var key = getSavedQueryKey(context); - var pageData = data[key]; - - if (!pageData) { - pageData = data[key] = { - query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Series", - Recursive: true, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - StartIndex: 0, - Limit: pageSize - }, - view: libraryBrowser.getSavedView(key) || 'Poster' - }; - - pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); - } - return pageData; - } - - function getQuery(context) { - - return getPageData(context).query; - } - - function getSavedQueryKey(context) { - - if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('series'); - } - return context.savedQueryKey; - } - - function onViewStyleChange() { - - var viewStyle = self.getCurrentViewStyle(); - - var itemsContainer = tabContent.querySelector('.itemsContainer'); - - if (viewStyle == "List") { - - itemsContainer.classList.add('vertical-list'); - itemsContainer.classList.remove('vertical-wrap'); - } - else { - - itemsContainer.classList.remove('vertical-list'); - itemsContainer.classList.add('vertical-wrap'); - } - itemsContainer.innerHTML = ''; - } - - function reloadItems(page) { - - Dashboard.showLoadingMsg(); - - var query = getQuery(page); - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - // Scroll back up so they can see the results from the beginning - window.scrollTo(0, 0); - - updateFilterControls(page); - - var pagingHtml = LibraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false, - addLayoutButton: false, - sortButton: false, - filterButton: false - }); - - var html; - var viewStyle = self.getCurrentViewStyle(); - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - if (viewStyle == "Thumb") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "backdrop", - preferThumb: true, - context: 'tvshows', - lazy: true, - overlayMoreButton: true - }); - } - else if (viewStyle == "ThumbCard") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "backdrop", - preferThumb: true, - context: 'tvshows', - lazy: true, - cardLayout: true, - showTitle: true, - showSeriesYear: true, - vibrant: supportsImageAnalysis - }); - } - else if (viewStyle == "Banner") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "banner", - preferBanner: true, - context: 'tvshows', - lazy: true - }); - } - else if (viewStyle == "List") { - - html = listView.getListViewHtml({ - items: result.Items, - context: 'tvshows', - sortBy: query.SortBy - }); - } - else if (viewStyle == "PosterCard") { - - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "portrait", - context: 'tvshows', - showTitle: true, - showSeriesYear: true, - lazy: true, - cardLayout: true, - vibrant: supportsImageAnalysis - }); - } - else { - - // Poster - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: "portrait", - context: 'tvshows', - centerText: true, - lazy: true, - overlayMoreButton: true - }); - } - - var i, length; - var elems = tabContent.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].innerHTML = pagingHtml; - } - - function onNextPageClick() { - query.StartIndex += query.Limit; - reloadItems(tabContent); - } - - function onPreviousPageClick() { - query.StartIndex -= query.Limit; - reloadItems(tabContent); - } - - elems = tabContent.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); - } - - elems = tabContent.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); - } - - var itemsContainer = tabContent.querySelector('.itemsContainer'); - itemsContainer.innerHTML = html; - imageLoader.lazyChildren(itemsContainer); - - libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); - - Dashboard.hideLoadingMsg(); - }); - } - - self.showFilterMenu = function () { - - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { - - var filterDialog = new filterDialogFactory({ - query: getQuery(tabContent), - mode: 'series' - }); - - Events.on(filterDialog, 'filterchange', function () { - getQuery(tabContent).StartIndex = 0; - reloadItems(tabContent); - }); - - filterDialog.show(); - }); - } - - function updateFilterControls(tabContent) { - - } - - function initPage(tabContent) { - - tabContent.querySelector('.btnFilter').addEventListener('click', function () { - self.showFilterMenu(); - }); - - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { - libraryBrowser.showSortMenu({ - items: [{ - name: Globalize.translate('OptionNameSort'), - id: 'SortName' - }, - { - name: Globalize.translate('OptionImdbRating'), - id: 'CommunityRating,SortName' - }, - { - name: Globalize.translate('OptionDateAdded'), - id: 'DateCreated,SortName' - }, - { - name: Globalize.translate('OptionDatePlayed'), - id: 'DatePlayed,SortName' - }, - { - name: Globalize.translate('OptionMetascore'), - id: 'Metascore,SortName' - }, - { - name: Globalize.translate('OptionParentalRating'), - id: 'OfficialRating,SortName' - }, - { - name: Globalize.translate('OptionReleaseDate'), - id: 'PremiereDate,SortName' - }], - callback: function () { - getQuery(tabContent).StartIndex = 0; - reloadItems(tabContent); - }, - query: getQuery(tabContent), - button: e.target - }); - }); - - var btnSelectView = tabContent.querySelector('.btnSelectView'); - btnSelectView.addEventListener('click', function (e) { - - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'Banner,List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); - }); - - btnSelectView.addEventListener('layoutchange', function (e) { - - var viewStyle = e.detail.viewStyle; - - getPageData(tabContent).view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); - getQuery(tabContent).StartIndex = 0; - onViewStyleChange(); - reloadItems(tabContent); - }); - } - - self.getCurrentViewStyle = function () { - return getPageData(tabContent).view; - }; - - initPage(tabContent); - onViewStyleChange(); - - self.renderTab = function () { - - reloadItems(tabContent); - updateFilterControls(tabContent); - }; - - self.destroy = function () { - }; - }; -}); \ No newline at end of file +define(["events","libraryBrowser","imageLoader","listView","cardBuilder","apphost","emby-itemscontainer"],function(events,libraryBrowser,imageLoader,listView,cardBuilder,appHost){"use strict";return function(view,params,tabContent){function getPageData(context){var key=getSavedQueryKey(context),pageData=data[key];return pageData||(pageData=data[key]={query:{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"Series",Recursive:!0,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",StartIndex:0,Limit:pageSize},view:libraryBrowser.getSavedView(key)||"Poster"},pageData.query.ParentId=params.topParentId,libraryBrowser.loadSavedQueryValues(key,pageData.query)),pageData}function getQuery(context){return getPageData(context).query}function getSavedQueryKey(context){return context.savedQueryKey||(context.savedQueryKey=libraryBrowser.getSavedQueryKey("series")),context.savedQueryKey}function onViewStyleChange(){var viewStyle=self.getCurrentViewStyle(),itemsContainer=tabContent.querySelector(".itemsContainer");"List"==viewStyle?(itemsContainer.classList.add("vertical-list"),itemsContainer.classList.remove("vertical-wrap")):(itemsContainer.classList.remove("vertical-list"),itemsContainer.classList.add("vertical-wrap")),itemsContainer.innerHTML=""}function reloadItems(page){Dashboard.showLoadingMsg();var query=getQuery(page);ApiClient.getItems(Dashboard.getCurrentUserId(),query).then(function(result){function onNextPageClick(){query.StartIndex+=query.Limit,reloadItems(tabContent)}function onPreviousPageClick(){query.StartIndex-=query.Limit,reloadItems(tabContent)}window.scrollTo(0,0),updateFilterControls(page);var html,pagingHtml=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1,addLayoutButton:!1,sortButton:!1,filterButton:!1}),viewStyle=self.getCurrentViewStyle(),supportsImageAnalysis=appHost.supports("imageanalysis");html="Thumb"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",preferThumb:!0,context:"tvshows",lazy:!0,overlayMoreButton:!0}):"ThumbCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"backdrop",preferThumb:!0,context:"tvshows",lazy:!0,cardLayout:!0,showTitle:!0,showSeriesYear:!0,vibrant:supportsImageAnalysis}):"Banner"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"banner",preferBanner:!0,context:"tvshows",lazy:!0}):"List"==viewStyle?listView.getListViewHtml({items:result.Items,context:"tvshows",sortBy:query.SortBy}):"PosterCard"==viewStyle?cardBuilder.getCardsHtml({items:result.Items,shape:"portrait",context:"tvshows",showTitle:!0,showSeriesYear:!0,lazy:!0,cardLayout:!0,vibrant:supportsImageAnalysis}):cardBuilder.getCardsHtml({items:result.Items,shape:"portrait",context:"tvshows",centerText:!0,lazy:!0,overlayMoreButton:!0});var i,length,elems=tabContent.querySelectorAll(".paging");for(i=0,length=elems.length;i'; - - var allowBottomPadding = true; - - if (enableScrollX()) { - allowBottomPadding = false; - html += '
'; - } else { - html += '
'; - } - - var supportsImageAnalysis = appHost.supports('imageanalysis'); - - html += cardBuilder.getCardsHtml({ - items: group.items, - showLocationTypeIndicator: false, - shape: getThumbShape(), - showTitle: true, - preferThumb: true, - lazy: true, - showDetailsMenu: true, - centerText: !supportsImageAnalysis, - showParentTitle: true, - overlayText: false, - allowBottomPadding: allowBottomPadding, - cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis - - }); - html += '
'; - - html += '
'; - } - - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - } - return function (view, params, tabContent) { - - var self = this; - var upcomingPromise; - - self.preRender = function () { - upcomingPromise = getUpcomingPromise(view, params); - }; - - self.renderTab = function () { - - loadUpcoming(tabContent, params, upcomingPromise); - }; - }; -}); \ No newline at end of file +define(["datetime","libraryBrowser","cardBuilder","apphost","imageLoader","scrollStyles","emby-itemscontainer"],function(datetime,libraryBrowser,cardBuilder,appHost,imageLoader){"use strict";function getUpcomingPromise(context,params){Dashboard.showLoadingMsg();var query={Limit:40,Fields:"AirTime,UserData",UserId:Dashboard.getCurrentUserId(),ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",EnableTotalRecordCount:!1};return query.ParentId=params.topParentId,ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming",query))}function loadUpcoming(context,params,promise){promise.then(function(result){var items=result.Items;items.length?context.querySelector(".noItemsMessage").style.display="none":context.querySelector(".noItemsMessage").style.display="block";var elem=context.querySelector("#upcomingItems");renderUpcoming(elem,items),Dashboard.hideLoadingMsg()})}function enableScrollX(){return browserInfo.mobile}function getThumbShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function renderUpcoming(elem,items){var i,length,groups=[],currentGroupName="",currentGroup=[];for(i=0,length=items.length;i',html+='

'+group.name+"

";var allowBottomPadding=!0;enableScrollX()?(allowBottomPadding=!1,html+='
'):html+='
';var supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:group.items,showLocationTypeIndicator:!1,shape:getThumbShape(),showTitle:!0,preferThumb:!0,lazy:!0,showDetailsMenu:!0,centerText:!supportsImageAnalysis,showParentTitle:!0,overlayText:!1,allowBottomPadding:allowBottomPadding,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
",html+="
"}elem.innerHTML=html,imageLoader.lazyChildren(elem)}return function(view,params,tabContent){var upcomingPromise,self=this;self.preRender=function(){upcomingPromise=getUpcomingPromise(view,params)},self.renderTab=function(){loadUpcoming(tabContent,params,upcomingPromise)}}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/useredit.js b/dashboard-ui/scripts/useredit.js index 08162da1f1..e53d4dfd1c 100644 --- a/dashboard-ui/scripts/useredit.js +++ b/dashboard-ui/scripts/useredit.js @@ -1,159 +1 @@ -define(['jQuery', 'fnchecked'], function ($) { - 'use strict'; - - var currentUser; - - function loadUser(page, user) { - - currentUser = user; - - if (user.Policy.IsDisabled) { - $('.disabledUserBanner', page).show(); - } else { - $('.disabledUserBanner', page).hide(); - } - - if (user.ConnectLinkType == 'Guest') { - $('#fldConnectInfo', page).hide(); - $('#txtUserName', page).prop("disabled", "disabled"); - } else { - $('#txtUserName', page).prop("disabled", "").removeAttr('disabled'); - $('#fldConnectInfo', page).show(); - } - - $('.lnkEditUserPreferences', page).attr('href', 'mypreferencesmenu.html?userId=' + user.Id); - - LibraryMenu.setTitle(user.Name); - - $('#txtUserName', page).val(user.Name); - $('#txtConnectUserName', page).val(currentUser.ConnectUserName); - - $('#chkIsAdmin', page).checked(user.Policy.IsAdministrator); - - $('#chkDisabled', page).checked(user.Policy.IsDisabled); - $('#chkIsHidden', page).checked(user.Policy.IsHidden); - $('#chkRemoteControlSharedDevices', page).checked(user.Policy.EnableSharedDeviceControl); - $('#chkEnableRemoteControlOtherUsers', page).checked(user.Policy.EnableRemoteControlOfOtherUsers); - - $('#chkEnableDownloading', page).checked(user.Policy.EnableContentDownloading); - - $('#chkManageLiveTv', page).checked(user.Policy.EnableLiveTvManagement); - $('#chkEnableLiveTvAccess', page).checked(user.Policy.EnableLiveTvAccess); - $('#chkEnableContentDeletion', page).checked(user.Policy.EnableContentDeletion); - - $('#chkDisableUserPreferences', page).checked((!user.Policy.EnableUserPreferenceAccess)); - - $('#chkEnableMediaPlayback', page).checked(user.Policy.EnableMediaPlayback); - $('#chkEnableAudioPlaybackTranscoding', page).checked(user.Policy.EnableAudioPlaybackTranscoding); - $('#chkEnableVideoPlaybackTranscoding', page).checked(user.Policy.EnableVideoPlaybackTranscoding); - $('#chkEnableVideoPlaybackRemuxing', page).checked(user.Policy.EnablePlaybackRemuxing); - - $('#chkEnableSync', page).checked(user.Policy.EnableSync); - $('#chkEnableSyncTranscoding', page).checked(user.Policy.EnableSyncTranscoding); - $('#chkEnableSharing', page).checked(user.Policy.EnablePublicSharing); - - Dashboard.hideLoadingMsg(); - } - - function onSaveComplete(page, user) { - - Dashboard.hideLoadingMsg(); - - var currentConnectUsername = currentUser.ConnectUserName || ''; - var enteredConnectUsername = $('#txtConnectUserName', page).val(); - - if (currentConnectUsername == enteredConnectUsername) { - require(['toast'], function (toast) { - toast(Globalize.translate('SettingsSaved')); - }); - } else { - - require(['connectHelper'], function (connectHelper) { - connectHelper.updateUserLink(ApiClient, user, $('#txtConnectUserName', page).val()).then(function () { - - loadData(page); - }); - }); - } - } - - function saveUser(user, page) { - - user.Name = $('#txtUserName', page).val(); - - user.Policy.IsAdministrator = $('#chkIsAdmin', page).checked(); - - user.Policy.IsHidden = $('#chkIsHidden', page).checked(); - user.Policy.IsDisabled = $('#chkDisabled', page).checked(); - user.Policy.EnableRemoteControlOfOtherUsers = $('#chkEnableRemoteControlOtherUsers', page).checked(); - user.Policy.EnableLiveTvManagement = $('#chkManageLiveTv', page).checked(); - user.Policy.EnableLiveTvAccess = $('#chkEnableLiveTvAccess', page).checked(); - user.Policy.EnableContentDeletion = $('#chkEnableContentDeletion', page).checked(); - user.Policy.EnableUserPreferenceAccess = !$('#chkDisableUserPreferences', page).checked(); - user.Policy.EnableSharedDeviceControl = $('#chkRemoteControlSharedDevices', page).checked(); - - user.Policy.EnableMediaPlayback = $('#chkEnableMediaPlayback', page).checked(); - user.Policy.EnableAudioPlaybackTranscoding = $('#chkEnableAudioPlaybackTranscoding', page).checked(); - user.Policy.EnableVideoPlaybackTranscoding = $('#chkEnableVideoPlaybackTranscoding', page).checked(); - user.Policy.EnablePlaybackRemuxing = $('#chkEnableVideoPlaybackRemuxing', page).checked(); - - user.Policy.EnableContentDownloading = $('#chkEnableDownloading', page).checked(); - - user.Policy.EnableSync = $('#chkEnableSync', page).checked(); - user.Policy.EnableSyncTranscoding = $('#chkEnableSyncTranscoding', page).checked(); - user.Policy.EnablePublicSharing = $('#chkEnableSharing', page).checked(); - - ApiClient.updateUser(user).then(function () { - - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - - onSaveComplete(page, user); - }); - }); - } - - function onSubmit() { - var page = $(this).parents('.page'); - - Dashboard.showLoadingMsg(); - - getUser().then(function (result) { - saveUser(result, page); - }); - - // Disable default form submission - return false; - } - - function getUser() { - - var userId = getParameterByName("userId"); - - return ApiClient.getUser(userId); - } - - function loadData(page) { - - Dashboard.showLoadingMsg(); - - getUser().then(function (user) { - - loadUser(page, user); - }); - } - - $(document).on('pageinit', "#editUserPage", function () { - - $('.editUserProfileForm').off('submit', onSubmit).on('submit', onSubmit); - - this.querySelector('.sharingHelp').innerHTML = Globalize.translate('OptionAllowLinkSharingHelp', 30); - - }).on('pagebeforeshow', "#editUserPage", function () { - - var page = this; - - loadData(page); - - }); - -}); \ No newline at end of file +define(["jQuery","fnchecked"],function($){"use strict";function loadUser(page,user){currentUser=user,user.Policy.IsDisabled?$(".disabledUserBanner",page).show():$(".disabledUserBanner",page).hide(),"Guest"==user.ConnectLinkType?($("#fldConnectInfo",page).hide(),$("#txtUserName",page).prop("disabled","disabled")):($("#txtUserName",page).prop("disabled","").removeAttr("disabled"),$("#fldConnectInfo",page).show()),$(".lnkEditUserPreferences",page).attr("href","mypreferencesmenu.html?userId="+user.Id),LibraryMenu.setTitle(user.Name),$("#txtUserName",page).val(user.Name),$("#txtConnectUserName",page).val(currentUser.ConnectUserName),$("#chkIsAdmin",page).checked(user.Policy.IsAdministrator),$("#chkDisabled",page).checked(user.Policy.IsDisabled),$("#chkIsHidden",page).checked(user.Policy.IsHidden),$("#chkRemoteControlSharedDevices",page).checked(user.Policy.EnableSharedDeviceControl),$("#chkEnableRemoteControlOtherUsers",page).checked(user.Policy.EnableRemoteControlOfOtherUsers),$("#chkEnableDownloading",page).checked(user.Policy.EnableContentDownloading),$("#chkManageLiveTv",page).checked(user.Policy.EnableLiveTvManagement),$("#chkEnableLiveTvAccess",page).checked(user.Policy.EnableLiveTvAccess),$("#chkEnableContentDeletion",page).checked(user.Policy.EnableContentDeletion),$("#chkDisableUserPreferences",page).checked(!user.Policy.EnableUserPreferenceAccess),$("#chkEnableMediaPlayback",page).checked(user.Policy.EnableMediaPlayback),$("#chkEnableAudioPlaybackTranscoding",page).checked(user.Policy.EnableAudioPlaybackTranscoding),$("#chkEnableVideoPlaybackTranscoding",page).checked(user.Policy.EnableVideoPlaybackTranscoding),$("#chkEnableVideoPlaybackRemuxing",page).checked(user.Policy.EnablePlaybackRemuxing),$("#chkEnableSync",page).checked(user.Policy.EnableSync),$("#chkEnableSyncTranscoding",page).checked(user.Policy.EnableSyncTranscoding),$("#chkEnableSharing",page).checked(user.Policy.EnablePublicSharing),Dashboard.hideLoadingMsg()}function onSaveComplete(page,user){Dashboard.hideLoadingMsg();var currentConnectUsername=currentUser.ConnectUserName||"",enteredConnectUsername=$("#txtConnectUserName",page).val();currentConnectUsername==enteredConnectUsername?require(["toast"],function(toast){toast(Globalize.translate("SettingsSaved"))}):require(["connectHelper"],function(connectHelper){connectHelper.updateUserLink(ApiClient,user,$("#txtConnectUserName",page).val()).then(function(){loadData(page)})})}function saveUser(user,page){user.Name=$("#txtUserName",page).val(),user.Policy.IsAdministrator=$("#chkIsAdmin",page).checked(),user.Policy.IsHidden=$("#chkIsHidden",page).checked(),user.Policy.IsDisabled=$("#chkDisabled",page).checked(),user.Policy.EnableRemoteControlOfOtherUsers=$("#chkEnableRemoteControlOtherUsers",page).checked(),user.Policy.EnableLiveTvManagement=$("#chkManageLiveTv",page).checked(),user.Policy.EnableLiveTvAccess=$("#chkEnableLiveTvAccess",page).checked(),user.Policy.EnableContentDeletion=$("#chkEnableContentDeletion",page).checked(),user.Policy.EnableUserPreferenceAccess=!$("#chkDisableUserPreferences",page).checked(),user.Policy.EnableSharedDeviceControl=$("#chkRemoteControlSharedDevices",page).checked(),user.Policy.EnableMediaPlayback=$("#chkEnableMediaPlayback",page).checked(),user.Policy.EnableAudioPlaybackTranscoding=$("#chkEnableAudioPlaybackTranscoding",page).checked(),user.Policy.EnableVideoPlaybackTranscoding=$("#chkEnableVideoPlaybackTranscoding",page).checked(),user.Policy.EnablePlaybackRemuxing=$("#chkEnableVideoPlaybackRemuxing",page).checked(),user.Policy.EnableContentDownloading=$("#chkEnableDownloading",page).checked(),user.Policy.EnableSync=$("#chkEnableSync",page).checked(),user.Policy.EnableSyncTranscoding=$("#chkEnableSyncTranscoding",page).checked(),user.Policy.EnablePublicSharing=$("#chkEnableSharing",page).checked(),ApiClient.updateUser(user).then(function(){ApiClient.updateUserPolicy(user.Id,user.Policy).then(function(){onSaveComplete(page,user)})})}function onSubmit(){var page=$(this).parents(".page");return Dashboard.showLoadingMsg(),getUser().then(function(result){saveUser(result,page)}),!1}function getUser(){var userId=getParameterByName("userId");return ApiClient.getUser(userId)}function loadData(page){Dashboard.showLoadingMsg(),getUser().then(function(user){loadUser(page,user)})}var currentUser;$(document).on("pageinit","#editUserPage",function(){$(".editUserProfileForm").off("submit",onSubmit).on("submit",onSubmit),this.querySelector(".sharingHelp").innerHTML=Globalize.translate("OptionAllowLinkSharingHelp",30)}).on("pagebeforeshow","#editUserPage",function(){var page=this;loadData(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/userlibraryaccess.js b/dashboard-ui/scripts/userlibraryaccess.js index 6bf4bc8789..9415eacb93 100644 --- a/dashboard-ui/scripts/userlibraryaccess.js +++ b/dashboard-ui/scripts/userlibraryaccess.js @@ -1,239 +1 @@ -define(['jQuery', 'fnchecked'], function ($) { - 'use strict'; - - function loadMediaFolders(page, user, mediaFolders) { - - var html = ''; - - html += '

' + Globalize.translate('HeaderLibraries') + '

'; - - html += '
'; - - for (var i = 0, length = mediaFolders.length; i < length; i++) { - - var folder = mediaFolders[i]; - - var isChecked = user.Policy.EnableAllFolders || user.Policy.EnabledFolders.indexOf(folder.Id) != -1; - var checkedAttribute = isChecked ? ' checked="checked"' : ''; - - html += ''; - } - - html += '
'; - - $('.folderAccess', page).html(html).trigger('create'); - - $('#chkEnableAllFolders', page).checked(user.Policy.EnableAllFolders).trigger('change'); - } - - function loadChannels(page, user, channels) { - - var html = ''; - - html += '

' + Globalize.translate('HeaderChannels') + '

'; - - html += '
'; - - for (var i = 0, length = channels.length; i < length; i++) { - - var folder = channels[i]; - - var isChecked = user.Policy.EnableAllChannels || user.Policy.EnabledChannels.indexOf(folder.Id) != -1; - var checkedAttribute = isChecked ? ' checked="checked"' : ''; - - html += ''; - } - - html += '
'; - - $('.channelAccess', page).show().html(html).trigger('create'); - - if (channels.length) { - $('.channelAccessContainer', page).show(); - } else { - $('.channelAccessContainer', page).hide(); - } - - $('#chkEnableAllChannels', page).checked(user.Policy.EnableAllChannels).trigger('change'); - } - - function loadDevices(page, user, devices) { - - var html = ''; - - html += '

' + Globalize.translate('HeaderDevices') + '

'; - - html += '
'; - - for (var i = 0, length = devices.length; i < length; i++) { - - var device = devices[i]; - - var checkedAttribute = user.Policy.EnableAllDevices || user.Policy.EnabledDevices.indexOf(device.Id) != -1 ? ' checked="checked"' : ''; - - html += ''; - } - - html += '
'; - - $('.deviceAccess', page).show().html(html).trigger('create'); - - $('#chkEnableAllDevices', page).checked(user.Policy.EnableAllDevices).trigger('change'); - - if (user.Policy.IsAdministrator) { - page.querySelector('.deviceAccessContainer').classList.add('hide'); - } else { - page.querySelector('.deviceAccessContainer').classList.remove('hide'); - } - } - - function loadUser(page, user, loggedInUser, mediaFolders, channels, devices) { - - $(page).trigger('userloaded', [user]); - - LibraryMenu.setTitle(user.Name); - - loadChannels(page, user, channels); - loadMediaFolders(page, user, mediaFolders); - loadDevices(page, user, devices); - - Dashboard.hideLoadingMsg(); - } - - function onSaveComplete(page) { - - Dashboard.hideLoadingMsg(); - - require(['toast'], function (toast) { - toast(Globalize.translate('SettingsSaved')); - }); - } - - function saveUser(user, page) { - - user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).checked(); - user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? - [] : - $('.chkFolder', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - - user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).checked(); - user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? - [] : - $('.chkChannel', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - - user.Policy.EnableAllDevices = $('#chkEnableAllDevices', page).checked(); - user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? - [] : - $('.chkDevice', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - - // Legacy - user.Policy.BlockedChannels = null; - user.Policy.BlockedMediaFolders = null; - - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - onSaveComplete(page); - }); - } - - function onSubmit() { - var page = $(this).parents('.page'); - - Dashboard.showLoadingMsg(); - - var userId = getParameterByName("userId"); - - ApiClient.getUser(userId).then(function (result) { - saveUser(result, page); - }); - - // Disable default form submission - return false; - } - - $(document).on('pageinit', "#userLibraryAccessPage", function () { - - var page = this; - - $('#chkEnableAllDevices', page).on('change', function () { - - if (this.checked) { - $('.deviceAccessListContainer', page).hide(); - } else { - $('.deviceAccessListContainer', page).show(); - } - - }); - - $('#chkEnableAllChannels', page).on('change', function () { - - if (this.checked) { - $('.channelAccessListContainer', page).hide(); - } else { - $('.channelAccessListContainer', page).show(); - } - - }); - - $('#chkEnableAllFolders', page).on('change', function () { - - if (this.checked) { - $('.folderAccessListContainer', page).hide(); - } else { - $('.folderAccessListContainer', page).show(); - } - - }); - - $('.userLibraryAccessForm').off('submit', onSubmit).on('submit', onSubmit); - - }).on('pageshow', "#userLibraryAccessPage", function () { - - var page = this; - - Dashboard.showLoadingMsg(); - - var userId = getParameterByName("userId"); - - var promise1; - - if (!userId) { - - var deferred = $.Deferred(); - - deferred.resolveWith(null, [{ - Configuration: {} - }]); - - promise1 = deferred.promise(); - } else { - - promise1 = ApiClient.getUser(userId); - } - - var promise2 = Dashboard.getCurrentUser(); - var promise4 = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", { IsHidden: false })); - var promise5 = ApiClient.getJSON(ApiClient.getUrl("Channels")); - var promise6 = ApiClient.getJSON(ApiClient.getUrl('Devices', { - SupportsPersistentIdentifier: true - })); - - Promise.all([promise1, promise2, promise4, promise5, promise6]).then(function (responses) { - - loadUser(page, responses[0], responses[1], responses[2].Items, responses[3].Items, responses[4].Items); - - }); - }); - -}); \ No newline at end of file +define(["jQuery","fnchecked"],function($){"use strict";function loadMediaFolders(page,user,mediaFolders){var html="";html+='

'+Globalize.translate("HeaderLibraries")+"

",html+='
';for(var i=0,length=mediaFolders.length;i"+folder.Name+""}html+="
",$(".folderAccess",page).html(html).trigger("create"),$("#chkEnableAllFolders",page).checked(user.Policy.EnableAllFolders).trigger("change")}function loadChannels(page,user,channels){var html="";html+='

'+Globalize.translate("HeaderChannels")+"

",html+='
';for(var i=0,length=channels.length;i"+folder.Name+""}html+="
",$(".channelAccess",page).show().html(html).trigger("create"),channels.length?$(".channelAccessContainer",page).show():$(".channelAccessContainer",page).hide(),$("#chkEnableAllChannels",page).checked(user.Policy.EnableAllChannels).trigger("change")}function loadDevices(page,user,devices){var html="";html+='

'+Globalize.translate("HeaderDevices")+"

",html+='
';for(var i=0,length=devices.length;i"+device.Name+" - "+device.AppName+""}html+="
",$(".deviceAccess",page).show().html(html).trigger("create"),$("#chkEnableAllDevices",page).checked(user.Policy.EnableAllDevices).trigger("change"),user.Policy.IsAdministrator?page.querySelector(".deviceAccessContainer").classList.add("hide"):page.querySelector(".deviceAccessContainer").classList.remove("hide")}function loadUser(page,user,loggedInUser,mediaFolders,channels,devices){$(page).trigger("userloaded",[user]),LibraryMenu.setTitle(user.Name),loadChannels(page,user,channels),loadMediaFolders(page,user,mediaFolders),loadDevices(page,user,devices),Dashboard.hideLoadingMsg()}function onSaveComplete(page){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("SettingsSaved"))})}function saveUser(user,page){user.Policy.EnableAllFolders=$("#chkEnableAllFolders",page).checked(),user.Policy.EnabledFolders=user.Policy.EnableAllFolders?[]:$(".chkFolder",page).get().filter(function(c){return c.checked}).map(function(c){return c.getAttribute("data-id")}),user.Policy.EnableAllChannels=$("#chkEnableAllChannels",page).checked(),user.Policy.EnabledChannels=user.Policy.EnableAllChannels?[]:$(".chkChannel",page).get().filter(function(c){return c.checked}).map(function(c){return c.getAttribute("data-id")}),user.Policy.EnableAllDevices=$("#chkEnableAllDevices",page).checked(),user.Policy.EnabledDevices=user.Policy.EnableAllDevices?[]:$(".chkDevice",page).get().filter(function(c){return c.checked}).map(function(c){return c.getAttribute("data-id")}),user.Policy.BlockedChannels=null,user.Policy.BlockedMediaFolders=null,ApiClient.updateUserPolicy(user.Id,user.Policy).then(function(){onSaveComplete(page)})}function onSubmit(){var page=$(this).parents(".page");Dashboard.showLoadingMsg();var userId=getParameterByName("userId");return ApiClient.getUser(userId).then(function(result){saveUser(result,page)}),!1}$(document).on("pageinit","#userLibraryAccessPage",function(){var page=this;$("#chkEnableAllDevices",page).on("change",function(){this.checked?$(".deviceAccessListContainer",page).hide():$(".deviceAccessListContainer",page).show()}),$("#chkEnableAllChannels",page).on("change",function(){this.checked?$(".channelAccessListContainer",page).hide():$(".channelAccessListContainer",page).show()}),$("#chkEnableAllFolders",page).on("change",function(){this.checked?$(".folderAccessListContainer",page).hide():$(".folderAccessListContainer",page).show()}),$(".userLibraryAccessForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#userLibraryAccessPage",function(){var page=this;Dashboard.showLoadingMsg();var promise1,userId=getParameterByName("userId");if(userId)promise1=ApiClient.getUser(userId);else{var deferred=$.Deferred();deferred.resolveWith(null,[{Configuration:{}}]),promise1=deferred.promise()}var promise2=Dashboard.getCurrentUser(),promise4=ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders",{IsHidden:!1})),promise5=ApiClient.getJSON(ApiClient.getUrl("Channels")),promise6=ApiClient.getJSON(ApiClient.getUrl("Devices",{SupportsPersistentIdentifier:!0}));Promise.all([promise1,promise2,promise4,promise5,promise6]).then(function(responses){loadUser(page,responses[0],responses[1],responses[2].Items,responses[3].Items,responses[4].Items)})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/usernew.js b/dashboard-ui/scripts/usernew.js index d164ae911c..80c072ad6c 100644 --- a/dashboard-ui/scripts/usernew.js +++ b/dashboard-ui/scripts/usernew.js @@ -1,173 +1 @@ -define(['jQuery', 'fnchecked', 'emby-checkbox'], function ($) { - 'use strict'; - - function loadMediaFolders(page, mediaFolders) { - - var html = ''; - - html += '

' + Globalize.translate('HeaderLibraries') + '

'; - - html += '
'; - - for (var i = 0, length = mediaFolders.length; i < length; i++) { - - var folder = mediaFolders[i]; - - var checkedAttribute = ' checked="checked"'; - - html += ''; - } - - html += '
'; - - $('.folderAccess', page).html(html).trigger('create'); - - $('#chkEnableAllFolders', page).checked(true).trigger('change'); - } - - function loadChannels(page, channels) { - - var html = ''; - - html += '

' + Globalize.translate('HeaderChannels') + '

'; - - html += '
'; - - for (var i = 0, length = channels.length; i < length; i++) { - - var folder = channels[i]; - - var checkedAttribute = ' checked="checked"'; - - html += ''; - } - - html += '
'; - - $('.channelAccess', page).show().html(html).trigger('create'); - - if (channels.length) { - $('.channelAccessContainer', page).show(); - } else { - $('.channelAccessContainer', page).hide(); - } - - $('#chkEnableAllChannels', page).checked(true).trigger('change'); - } - - function loadUser(page) { - - $('#txtUserName', page).val(''); - - Dashboard.showLoadingMsg(); - - var promise4 = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", { IsHidden: false })); - - var promise5 = ApiClient.getJSON(ApiClient.getUrl("Channels")); - - Promise.all([promise4, promise5]).then(function (responses) { - - loadMediaFolders(page, responses[0].Items); - loadChannels(page, responses[1].Items); - - Dashboard.hideLoadingMsg(); - }); - } - - function saveUser(page) { - - var name = $('#txtUserName', page).val(); - - ApiClient.createUser(name).then(function (user) { - - user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).checked(); - user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? - [] : - $('.chkFolder', page).get().filter(function (i) { - return i.checked; - }).map(function (i) { - return i.getAttribute('data-id'); - }); - - user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).checked(); - user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? - [] : - $('.chkChannel', page).get().filter(function (i) { - return i.checked; - }).map(function (i) { - return i.getAttribute('data-id'); - }); - - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - Dashboard.navigate("useredit.html?userId=" + user.Id); - }); - - }, function (response) { - - if (response.status == 400) { - - Dashboard.alert({ - message: page.querySelector('.labelNewUserNameHelp').innerHTML - }); - - } else { - require(['toast'], function (toast) { - toast(Globalize.translate('DefaultErrorMessage')); - }); - } - - Dashboard.hideLoadingMsg(); - }); - } - - function onSubmit() { - var page = $(this).parents('.page')[0]; - - Dashboard.showLoadingMsg(); - - saveUser(page); - - // Disable default form submission - return false; - } - - function loadData(page) { - - loadUser(page); - } - - $(document).on('pageinit', "#newUserPage", function () { - - var page = this; - - $('#chkEnableAllChannels', page).on('change', function () { - - if (this.checked) { - $('.channelAccessListContainer', page).hide(); - } else { - $('.channelAccessListContainer', page).show(); - } - - }); - - $('#chkEnableAllFolders', page).on('change', function () { - - if (this.checked) { - $('.folderAccessListContainer', page).hide(); - } else { - $('.folderAccessListContainer', page).show(); - } - - }); - - $('.newUserProfileForm').off('submit', onSubmit).on('submit', onSubmit); - - }).on('pageshow', "#newUserPage", function () { - - var page = this; - - loadData(page); - - }); - -}); \ No newline at end of file +define(["jQuery","fnchecked","emby-checkbox"],function($){"use strict";function loadMediaFolders(page,mediaFolders){var html="";html+='

'+Globalize.translate("HeaderLibraries")+"

",html+='
';for(var i=0,length=mediaFolders.length;i"+folder.Name+""}html+="
",$(".folderAccess",page).html(html).trigger("create"),$("#chkEnableAllFolders",page).checked(!0).trigger("change")}function loadChannels(page,channels){var html="";html+='

'+Globalize.translate("HeaderChannels")+"

",html+='
';for(var i=0,length=channels.length;i"+folder.Name+""}html+="
",$(".channelAccess",page).show().html(html).trigger("create"),channels.length?$(".channelAccessContainer",page).show():$(".channelAccessContainer",page).hide(),$("#chkEnableAllChannels",page).checked(!0).trigger("change")}function loadUser(page){$("#txtUserName",page).val(""),Dashboard.showLoadingMsg();var promise4=ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders",{IsHidden:!1})),promise5=ApiClient.getJSON(ApiClient.getUrl("Channels"));Promise.all([promise4,promise5]).then(function(responses){loadMediaFolders(page,responses[0].Items),loadChannels(page,responses[1].Items),Dashboard.hideLoadingMsg()})}function saveUser(page){var name=$("#txtUserName",page).val();ApiClient.createUser(name).then(function(user){user.Policy.EnableAllFolders=$("#chkEnableAllFolders",page).checked(),user.Policy.EnabledFolders=user.Policy.EnableAllFolders?[]:$(".chkFolder",page).get().filter(function(i){return i.checked}).map(function(i){return i.getAttribute("data-id")}),user.Policy.EnableAllChannels=$("#chkEnableAllChannels",page).checked(),user.Policy.EnabledChannels=user.Policy.EnableAllChannels?[]:$(".chkChannel",page).get().filter(function(i){return i.checked}).map(function(i){return i.getAttribute("data-id")}),ApiClient.updateUserPolicy(user.Id,user.Policy).then(function(){Dashboard.navigate("useredit.html?userId="+user.Id)})},function(response){400==response.status?Dashboard.alert({message:page.querySelector(".labelNewUserNameHelp").innerHTML}):require(["toast"],function(toast){toast(Globalize.translate("DefaultErrorMessage"))}),Dashboard.hideLoadingMsg()})}function onSubmit(){var page=$(this).parents(".page")[0];return Dashboard.showLoadingMsg(),saveUser(page),!1}function loadData(page){loadUser(page)}$(document).on("pageinit","#newUserPage",function(){var page=this;$("#chkEnableAllChannels",page).on("change",function(){this.checked?$(".channelAccessListContainer",page).hide():$(".channelAccessListContainer",page).show()}),$("#chkEnableAllFolders",page).on("change",function(){this.checked?$(".folderAccessListContainer",page).hide():$(".folderAccessListContainer",page).show()}),$(".newUserProfileForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#newUserPage",function(){var page=this;loadData(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/userparentalcontrol.js b/dashboard-ui/scripts/userparentalcontrol.js index 60f4514873..3099a0cff7 100644 --- a/dashboard-ui/scripts/userparentalcontrol.js +++ b/dashboard-ui/scripts/userparentalcontrol.js @@ -1,355 +1 @@ -define(['jQuery', 'datetime', 'listViewStyle', 'paper-icon-button-light'], function ($, datetime) { - 'use strict'; - - function populateRatings(allParentalRatings, page) { - - var html = ""; - - html += ""; - - var ratings = []; - var i, length, rating; - - for (i = 0, length = allParentalRatings.length; i < length; i++) { - - rating = allParentalRatings[i]; - - if (ratings.length) { - - var lastRating = ratings[ratings.length - 1]; - - if (lastRating.Value === rating.Value) { - - lastRating.Name += "/" + rating.Name; - continue; - } - - } - - ratings.push({ Name: rating.Name, Value: rating.Value }); - } - - for (i = 0, length = ratings.length; i < length; i++) { - - rating = ratings[i]; - - html += ""; - } - - $('#selectMaxParentalRating', page).html(html); - } - - function loadUnratedItems(page, user) { - - var items = [ - { name: Globalize.translate('OptionBlockBooks'), value: 'Book' }, - { name: Globalize.translate('OptionBlockGames'), value: 'Game' }, - { name: Globalize.translate('OptionBlockChannelContent'), value: 'ChannelContent' }, - { name: Globalize.translate('OptionBlockLiveTvChannels'), value: 'LiveTvChannel' }, - { name: Globalize.translate('OptionBlockMovies'), value: 'Movie' }, - { name: Globalize.translate('OptionBlockMusic'), value: 'Music' }, - { name: Globalize.translate('OptionBlockTrailers'), value: 'Trailer' }, - { name: Globalize.translate('OptionBlockTvShows'), value: 'Series' }, - { name: Globalize.translate('OptionBlockOthers'), value: 'Other' } - ]; - - var html = ''; - - html += '

' + Globalize.translate('HeaderBlockItemsWithNoRating') + '

'; - - html += '
'; - - for (var i = 0, length = items.length; i < length; i++) { - - var item = items[i]; - - var checkedAttribute = user.Policy.BlockUnratedItems.indexOf(item.value) != -1 ? ' checked="checked"' : ''; - - html += ''; - } - - html += '
'; - - $('.blockUnratedItems', page).html(html).trigger('create'); - } - - function loadUser(page, user, allParentalRatings) { - - LibraryMenu.setTitle(user.Name); - - loadUnratedItems(page, user); - loadBlockedTags(page, user.Policy.BlockedTags); - - populateRatings(allParentalRatings, page); - - var ratingValue = ""; - - if (user.Policy.MaxParentalRating) { - - for (var i = 0, length = allParentalRatings.length; i < length; i++) { - - var rating = allParentalRatings[i]; - - if (user.Policy.MaxParentalRating >= rating.Value) { - ratingValue = rating.Value; - } - } - } - - $('#selectMaxParentalRating', page).val(ratingValue); - - if (user.Policy.IsAdministrator) { - $('.accessScheduleSection', page).hide(); - } else { - $('.accessScheduleSection', page).show(); - } - - renderAccessSchedule(page, user.Policy.AccessSchedules || []); - - Dashboard.hideLoadingMsg(); - } - - function loadBlockedTags(page, tags) { - - var html = tags.map(function (h) { - - var li = '
'; - - li += '
'; - li += '

'; - li += h; - li += '

'; - li += '
'; - - li += ''; - - li += '
'; - - return li; - - }).join(''); - - if (html) { - html = '
' + html + '
'; - } - - var elem = $('.blockedTags', page).html(html).trigger('create'); - - $('.btnDeleteTag', elem).on('click', function () { - - var tag = this.getAttribute('data-tag'); - - var newTags = tags.filter(function (t) { - return t != tag; - }); - - loadBlockedTags(page, newTags); - }); - } - - function deleteAccessSchedule(page, schedules, index) { - - schedules.splice(index, 1); - - renderAccessSchedule(page, schedules); - } - - function renderAccessSchedule(page, schedules) { - - var html = ''; - var index = 0; - - html += schedules.map(function (a) { - - var itemHtml = ''; - - itemHtml += '
'; - - itemHtml += '
'; - itemHtml += '

'; - itemHtml += Globalize.translate('Option' + a.DayOfWeek); - itemHtml += '

'; - itemHtml += '
' + getDisplayTime(a.StartHour) + ' - ' + getDisplayTime(a.EndHour) + '
'; - itemHtml += '
'; - - itemHtml += ''; - - itemHtml += '
'; - - index++; - - return itemHtml; - - }).join(''); - - var accessScheduleList = page.querySelector('.accessScheduleList'); - accessScheduleList.innerHTML = html; - - $('.btnDelete', accessScheduleList).on('click', function () { - - deleteAccessSchedule(page, schedules, parseInt(this.getAttribute('data-index'))); - }); - } - - function onSaveComplete(page) { - - Dashboard.hideLoadingMsg(); - - require(['toast'], function (toast) { - toast(Globalize.translate('SettingsSaved')); - }); - } - - function saveUser(user, page) { - - user.Policy.MaxParentalRating = $('#selectMaxParentalRating', page).val() || null; - - user.Policy.BlockUnratedItems = $('.chkUnratedItem', page).get().filter(function (i) { - - return i.checked; - - }).map(function (i) { - - return i.getAttribute('data-itemtype'); - - }); - - user.Policy.AccessSchedules = getSchedulesFromPage(page); - - user.Policy.BlockedTags = getBlockedTagsFromPage(page); - - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - onSaveComplete(page); - }); - } - - window.UserParentalControlPage = { - - onSubmit: function () { - - var page = $(this).parents('.page'); - - Dashboard.showLoadingMsg(); - - var userId = getParameterByName("userId"); - - ApiClient.getUser(userId).then(function (result) { - saveUser(result, page); - }); - - // Disable default form submission - return false; - } - }; - - function getDisplayTime(hours) { - - var minutes = 0; - - var pct = hours % 1; - - if (pct) { - minutes = parseInt(pct * 60); - } - - return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0)); - } - - function showSchedulePopup(page, schedule, index) { - - schedule = schedule || {}; - - require(['components/accessschedule/accessschedule'], function (accessschedule) { - accessschedule.show({ - schedule: schedule - }).then(function (updatedSchedule) { - - var schedules = getSchedulesFromPage(page); - - if (index == -1) { - index = schedules.length; - } - - schedules[index] = updatedSchedule; - - renderAccessSchedule(page, schedules); - }); - }); - } - - function getSchedulesFromPage(page) { - - return $('.liSchedule', page).map(function () { - - return { - DayOfWeek: this.getAttribute('data-day'), - StartHour: this.getAttribute('data-start'), - EndHour: this.getAttribute('data-end') - }; - - }).get(); - } - - function getBlockedTagsFromPage(page) { - - return $('.blockedTag', page).map(function () { - - return this.getAttribute('data-tag'); - - }).get(); - } - - function showBlockedTagPopup(page) { - - require(['prompt'], function (prompt) { - - prompt({ - label: Globalize.translate('LabelTag') - - }).then(function (value) { - var tags = getBlockedTagsFromPage(page); - - if (tags.indexOf(value) == -1) { - tags.push(value); - loadBlockedTags(page, tags); - } - }); - - }); - } - - $(document).on('pageinit', "#userParentalControlPage", function () { - - var page = this; - - - $('.btnAddSchedule', page).on('click', function () { - - showSchedulePopup(page, {}, -1); - }); - - $('.btnAddBlockedTag', page).on('click', function () { - - showBlockedTagPopup(page); - }); - - $('.userParentalControlForm').off('submit', UserParentalControlPage.onSubmit).on('submit', UserParentalControlPage.onSubmit); - - }).on('pageshow', "#userParentalControlPage", function () { - - var page = this; - - Dashboard.showLoadingMsg(); - - var userId = getParameterByName("userId"); - var promise1 = ApiClient.getUser(userId); - var promise2 = ApiClient.getParentalRatings(); - - Promise.all([promise1, promise2]).then(function (responses) { - - loadUser(page, responses[0], responses[1]); - - }); - }); - -}); \ No newline at end of file +define(["jQuery","datetime","listViewStyle","paper-icon-button-light"],function($,datetime){"use strict";function populateRatings(allParentalRatings,page){var html="";html+="";var i,length,rating,ratings=[];for(i=0,length=allParentalRatings.length;i"+rating.Name+"";$("#selectMaxParentalRating",page).html(html)}function loadUnratedItems(page,user){var items=[{name:Globalize.translate("OptionBlockBooks"),value:"Book"},{name:Globalize.translate("OptionBlockGames"),value:"Game"},{name:Globalize.translate("OptionBlockChannelContent"),value:"ChannelContent"},{name:Globalize.translate("OptionBlockLiveTvChannels"),value:"LiveTvChannel"},{name:Globalize.translate("OptionBlockMovies"),value:"Movie"},{name:Globalize.translate("OptionBlockMusic"),value:"Music"},{name:Globalize.translate("OptionBlockTrailers"),value:"Trailer"},{name:Globalize.translate("OptionBlockTvShows"),value:"Series"},{name:Globalize.translate("OptionBlockOthers"),value:"Other"}],html="";html+='

'+Globalize.translate("HeaderBlockItemsWithNoRating")+"

",html+='
';for(var i=0,length=items.length;i"+item.name+""}html+="
",$(".blockUnratedItems",page).html(html).trigger("create")}function loadUser(page,user,allParentalRatings){LibraryMenu.setTitle(user.Name),loadUnratedItems(page,user),loadBlockedTags(page,user.Policy.BlockedTags),populateRatings(allParentalRatings,page);var ratingValue="";if(user.Policy.MaxParentalRating)for(var i=0,length=allParentalRatings.length;i=rating.Value&&(ratingValue=rating.Value)}$("#selectMaxParentalRating",page).val(ratingValue),user.Policy.IsAdministrator?$(".accessScheduleSection",page).hide():$(".accessScheduleSection",page).show(),renderAccessSchedule(page,user.Policy.AccessSchedules||[]),Dashboard.hideLoadingMsg()}function loadBlockedTags(page,tags){var html=tags.map(function(h){var li='
';return li+='
',li+='

',li+=h,li+="

",li+="
",li+='',li+="
"}).join("");html&&(html='
'+html+"
");var elem=$(".blockedTags",page).html(html).trigger("create");$(".btnDeleteTag",elem).on("click",function(){var tag=this.getAttribute("data-tag"),newTags=tags.filter(function(t){return t!=tag});loadBlockedTags(page,newTags)})}function deleteAccessSchedule(page,schedules,index){schedules.splice(index,1),renderAccessSchedule(page,schedules)}function renderAccessSchedule(page,schedules){var html="",index=0;html+=schedules.map(function(a){var itemHtml="";return itemHtml+='
',itemHtml+='
',itemHtml+='

',itemHtml+=Globalize.translate("Option"+a.DayOfWeek),itemHtml+="

",itemHtml+='
'+getDisplayTime(a.StartHour)+" - "+getDisplayTime(a.EndHour)+"
",itemHtml+="
",itemHtml+='',itemHtml+="
",index++,itemHtml}).join("");var accessScheduleList=page.querySelector(".accessScheduleList");accessScheduleList.innerHTML=html,$(".btnDelete",accessScheduleList).on("click",function(){deleteAccessSchedule(page,schedules,parseInt(this.getAttribute("data-index")))})}function onSaveComplete(page){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("SettingsSaved"))})}function saveUser(user,page){user.Policy.MaxParentalRating=$("#selectMaxParentalRating",page).val()||null,user.Policy.BlockUnratedItems=$(".chkUnratedItem",page).get().filter(function(i){return i.checked}).map(function(i){return i.getAttribute("data-itemtype")}),user.Policy.AccessSchedules=getSchedulesFromPage(page),user.Policy.BlockedTags=getBlockedTagsFromPage(page),ApiClient.updateUserPolicy(user.Id,user.Policy).then(function(){onSaveComplete(page)})}function getDisplayTime(hours){var minutes=0,pct=hours%1;return pct&&(minutes=parseInt(60*pct)),datetime.getDisplayTime(new Date(2e3,1,1,hours,minutes,0,0))}function showSchedulePopup(page,schedule,index){schedule=schedule||{},require(["components/accessschedule/accessschedule"],function(accessschedule){accessschedule.show({schedule:schedule}).then(function(updatedSchedule){var schedules=getSchedulesFromPage(page);index==-1&&(index=schedules.length),schedules[index]=updatedSchedule,renderAccessSchedule(page,schedules)})})}function getSchedulesFromPage(page){return $(".liSchedule",page).map(function(){return{DayOfWeek:this.getAttribute("data-day"),StartHour:this.getAttribute("data-start"),EndHour:this.getAttribute("data-end")}}).get()}function getBlockedTagsFromPage(page){return $(".blockedTag",page).map(function(){return this.getAttribute("data-tag")}).get()}function showBlockedTagPopup(page){require(["prompt"],function(prompt){prompt({label:Globalize.translate("LabelTag")}).then(function(value){var tags=getBlockedTagsFromPage(page);tags.indexOf(value)==-1&&(tags.push(value),loadBlockedTags(page,tags))})})}window.UserParentalControlPage={onSubmit:function(){var page=$(this).parents(".page");Dashboard.showLoadingMsg();var userId=getParameterByName("userId");return ApiClient.getUser(userId).then(function(result){saveUser(result,page)}),!1}},$(document).on("pageinit","#userParentalControlPage",function(){var page=this;$(".btnAddSchedule",page).on("click",function(){showSchedulePopup(page,{},-1)}),$(".btnAddBlockedTag",page).on("click",function(){showBlockedTagPopup(page)}),$(".userParentalControlForm").off("submit",UserParentalControlPage.onSubmit).on("submit",UserParentalControlPage.onSubmit)}).on("pageshow","#userParentalControlPage",function(){var page=this;Dashboard.showLoadingMsg();var userId=getParameterByName("userId"),promise1=ApiClient.getUser(userId),promise2=ApiClient.getParentalRatings();Promise.all([promise1,promise2]).then(function(responses){loadUser(page,responses[0],responses[1])})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/userpassword.js b/dashboard-ui/scripts/userpassword.js index e366129be3..70c2b590a8 100644 --- a/dashboard-ui/scripts/userpassword.js +++ b/dashboard-ui/scripts/userpassword.js @@ -1,45 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - function loadUser(page, user) { - - LibraryMenu.setTitle(user.Name); - - if (user.ConnectLinkType == 'Guest') { - - $('.connectMessage', page).show(); - } - else { - $('.connectMessage', page).hide(); - } - - Dashboard.hideLoadingMsg(); - } - - function loadData(page) { - - Dashboard.showLoadingMsg(); - - var userId = getParameterByName("userId"); - - ApiClient.getUser(userId).then(function (user) { - - loadUser(page, user); - - }); - } - - $(document).on('pageinit', "#userPasswordPage", function () { - - $('.adminUpdatePasswordForm').off('submit', UpdatePasswordPage.onSubmit).on('submit', UpdatePasswordPage.onSubmit); - $('.adminLocalAccessForm').off('submit', UpdatePasswordPage.onLocalAccessSubmit).on('submit', UpdatePasswordPage.onLocalAccessSubmit); - - }).on('pagebeforeshow', "#userPasswordPage", function () { - - var page = this; - - loadData(page); - - }); - -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";function loadUser(page,user){LibraryMenu.setTitle(user.Name),"Guest"==user.ConnectLinkType?$(".connectMessage",page).show():$(".connectMessage",page).hide(),Dashboard.hideLoadingMsg()}function loadData(page){Dashboard.showLoadingMsg();var userId=getParameterByName("userId");ApiClient.getUser(userId).then(function(user){loadUser(page,user)})}$(document).on("pageinit","#userPasswordPage",function(){$(".adminUpdatePasswordForm").off("submit",UpdatePasswordPage.onSubmit).on("submit",UpdatePasswordPage.onSubmit),$(".adminLocalAccessForm").off("submit",UpdatePasswordPage.onLocalAccessSubmit).on("submit",UpdatePasswordPage.onLocalAccessSubmit)}).on("pagebeforeshow","#userPasswordPage",function(){var page=this;loadData(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/userpasswordpage.js b/dashboard-ui/scripts/userpasswordpage.js index 0087cf0a32..8f75aaeefb 100644 --- a/dashboard-ui/scripts/userpasswordpage.js +++ b/dashboard-ui/scripts/userpasswordpage.js @@ -1,227 +1 @@ -define([], function () { - 'use strict'; - - function loadUser(page, params) { - - var userid = params.userId; - - ApiClient.getUser(userid).then(function (user) { - - Dashboard.getCurrentUser().then(function (loggedInUser) { - - LibraryMenu.setTitle(user.Name); - - var showPasswordSection = true; - var showLocalAccessSection = false; - if (user.ConnectLinkType == 'Guest') { - page.querySelector('.localAccessSection').classList.add('hide'); - showPasswordSection = false; - } - else if (user.HasConfiguredPassword) { - page.querySelector('#btnResetPassword').classList.remove('hide'); - page.querySelector('#fldCurrentPassword').classList.remove('hide'); - showLocalAccessSection = true; - } else { - page.querySelector('#btnResetPassword').classList.add('hide'); - page.querySelector('#fldCurrentPassword').classList.add('hide'); - } - - if (showPasswordSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector('.passwordSection').classList.remove('hide'); - } else { - page.querySelector('.passwordSection').classList.add('hide'); - } - - if (showLocalAccessSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector('.localAccessSection').classList.remove('hide'); - } else { - page.querySelector('.localAccessSection').classList.add('hide'); - } - - var txtEasyPassword = page.querySelector('#txtEasyPassword'); - txtEasyPassword.value = ''; - - if (user.HasConfiguredEasyPassword) { - txtEasyPassword.placeholder = '******'; - page.querySelector('#btnResetEasyPassword').classList.remove('hide'); - } else { - txtEasyPassword.removeAttribute('placeholder'); - txtEasyPassword.placeholder = ''; - page.querySelector('#btnResetEasyPassword').classList.add('hide'); - } - - page.querySelector('.chkEnableLocalEasyPassword').checked = user.Configuration.EnableLocalPassword; - }); - }); - - page.querySelector('#txtCurrentPassword').value = ''; - page.querySelector('#txtNewPassword').value = ''; - page.querySelector('#txtNewPasswordConfirm').value = ''; - } - - return function (view, params) { - - function saveEasyPassword() { - - var userId = params.userId; - - var easyPassword = view.querySelector('#txtEasyPassword').value; - - if (easyPassword) { - - ApiClient.updateEasyPassword(userId, easyPassword).then(function () { - - onEasyPasswordSaved(userId); - - }); - - } else { - onEasyPasswordSaved(userId); - } - } - - function onEasyPasswordSaved(userId) { - - ApiClient.getUser(userId).then(function (user) { - - user.Configuration.EnableLocalPassword = view.querySelector('.chkEnableLocalEasyPassword').checked; - - ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function () { - - Dashboard.hideLoadingMsg(); - - require(['toast'], function (toast) { - toast(Globalize.translate('MessageSettingsSaved')); - }); - loadUser(view, params); - }); - }); - } - - function savePassword() { - - var userId = params.userId; - - var currentPassword = view.querySelector('#txtCurrentPassword').value; - var newPassword = view.querySelector('#txtNewPassword').value; - - ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function () { - - Dashboard.hideLoadingMsg(); - - require(['toast'], function (toast) { - toast(Globalize.translate('PasswordSaved')); - }); - loadUser(view, params); - - }, function () { - - Dashboard.hideLoadingMsg(); - - Dashboard.alert({ - title: Globalize.translate('HeaderLoginFailure'), - message: Globalize.translate('MessageInvalidUser') - }); - - }); - - } - - function onSubmit(e) { - - var form = this; - - if (form.querySelector('#txtNewPassword').value != form.querySelector('#txtNewPasswordConfirm').value) { - - require(['toast'], function (toast) { - toast(Globalize.translate('PasswordMatchError')); - }); - } else { - - Dashboard.showLoadingMsg(); - savePassword(); - } - - // Disable default form submission - e.preventDefault(); - return false; - } - - function onLocalAccessSubmit(e) { - - Dashboard.showLoadingMsg(); - - saveEasyPassword(); - - // Disable default form submission - e.preventDefault(); - return false; - } - - function resetPassword() { - - var msg = Globalize.translate('PasswordResetConfirmation'); - - require(['confirm'], function (confirm) { - - confirm(msg, Globalize.translate('PasswordResetHeader')).then(function () { - - var userId = params.userId; - - Dashboard.showLoadingMsg(); - - ApiClient.resetUserPassword(userId).then(function () { - - Dashboard.hideLoadingMsg(); - - Dashboard.alert({ - message: Globalize.translate('PasswordResetComplete'), - title: Globalize.translate('PasswordResetHeader') - }); - - loadUser(view, params); - - }); - }); - }); - } - - function resetEasyPassword() { - - var msg = Globalize.translate('PinCodeResetConfirmation'); - - require(['confirm'], function (confirm) { - - confirm(msg, Globalize.translate('HeaderPinCodeReset')).then(function () { - - var userId = params.userId; - - Dashboard.showLoadingMsg(); - - ApiClient.resetEasyPassword(userId).then(function () { - - Dashboard.hideLoadingMsg(); - - Dashboard.alert({ - message: Globalize.translate('PinCodeResetComplete'), - title: Globalize.translate('HeaderPinCodeReset') - }); - - loadUser(view, params); - - }); - }); - }); - } - - view.querySelector('.updatePasswordForm').addEventListener('submit', onSubmit); - view.querySelector('.localAccessForm').addEventListener('submit', onLocalAccessSubmit); - - view.querySelector('#btnResetEasyPassword').addEventListener('click', resetEasyPassword); - view.querySelector('#btnResetPassword').addEventListener('click', resetPassword); - - view.addEventListener('viewshow', function () { - loadUser(view, params); - }); - }; -}); \ No newline at end of file +define([],function(){"use strict";function loadUser(page,params){var userid=params.userId;ApiClient.getUser(userid).then(function(user){Dashboard.getCurrentUser().then(function(loggedInUser){LibraryMenu.setTitle(user.Name);var showPasswordSection=!0,showLocalAccessSection=!1;"Guest"==user.ConnectLinkType?(page.querySelector(".localAccessSection").classList.add("hide"),showPasswordSection=!1):user.HasConfiguredPassword?(page.querySelector("#btnResetPassword").classList.remove("hide"),page.querySelector("#fldCurrentPassword").classList.remove("hide"),showLocalAccessSection=!0):(page.querySelector("#btnResetPassword").classList.add("hide"),page.querySelector("#fldCurrentPassword").classList.add("hide")),showPasswordSection&&(loggedInUser.Policy.IsAdministrator||user.Policy.EnableUserPreferenceAccess)?page.querySelector(".passwordSection").classList.remove("hide"):page.querySelector(".passwordSection").classList.add("hide"),showLocalAccessSection&&(loggedInUser.Policy.IsAdministrator||user.Policy.EnableUserPreferenceAccess)?page.querySelector(".localAccessSection").classList.remove("hide"):page.querySelector(".localAccessSection").classList.add("hide");var txtEasyPassword=page.querySelector("#txtEasyPassword");txtEasyPassword.value="",user.HasConfiguredEasyPassword?(txtEasyPassword.placeholder="******",page.querySelector("#btnResetEasyPassword").classList.remove("hide")):(txtEasyPassword.removeAttribute("placeholder"),txtEasyPassword.placeholder="",page.querySelector("#btnResetEasyPassword").classList.add("hide")),page.querySelector(".chkEnableLocalEasyPassword").checked=user.Configuration.EnableLocalPassword})}),page.querySelector("#txtCurrentPassword").value="",page.querySelector("#txtNewPassword").value="",page.querySelector("#txtNewPasswordConfirm").value=""}return function(view,params){function saveEasyPassword(){var userId=params.userId,easyPassword=view.querySelector("#txtEasyPassword").value;easyPassword?ApiClient.updateEasyPassword(userId,easyPassword).then(function(){onEasyPasswordSaved(userId)}):onEasyPasswordSaved(userId)}function onEasyPasswordSaved(userId){ApiClient.getUser(userId).then(function(user){user.Configuration.EnableLocalPassword=view.querySelector(".chkEnableLocalEasyPassword").checked,ApiClient.updateUserConfiguration(user.Id,user.Configuration).then(function(){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))}),loadUser(view,params)})})}function savePassword(){var userId=params.userId,currentPassword=view.querySelector("#txtCurrentPassword").value,newPassword=view.querySelector("#txtNewPassword").value;ApiClient.updateUserPassword(userId,currentPassword,newPassword).then(function(){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("PasswordSaved"))}),loadUser(view,params)},function(){Dashboard.hideLoadingMsg(),Dashboard.alert({title:Globalize.translate("HeaderLoginFailure"),message:Globalize.translate("MessageInvalidUser")})})}function onSubmit(e){var form=this;return form.querySelector("#txtNewPassword").value!=form.querySelector("#txtNewPasswordConfirm").value?require(["toast"],function(toast){toast(Globalize.translate("PasswordMatchError"))}):(Dashboard.showLoadingMsg(),savePassword()),e.preventDefault(),!1}function onLocalAccessSubmit(e){return Dashboard.showLoadingMsg(),saveEasyPassword(),e.preventDefault(),!1}function resetPassword(){var msg=Globalize.translate("PasswordResetConfirmation");require(["confirm"],function(confirm){confirm(msg,Globalize.translate("PasswordResetHeader")).then(function(){var userId=params.userId;Dashboard.showLoadingMsg(),ApiClient.resetUserPassword(userId).then(function(){Dashboard.hideLoadingMsg(),Dashboard.alert({message:Globalize.translate("PasswordResetComplete"),title:Globalize.translate("PasswordResetHeader")}),loadUser(view,params)})})})}function resetEasyPassword(){var msg=Globalize.translate("PinCodeResetConfirmation");require(["confirm"],function(confirm){confirm(msg,Globalize.translate("HeaderPinCodeReset")).then(function(){var userId=params.userId;Dashboard.showLoadingMsg(),ApiClient.resetEasyPassword(userId).then(function(){Dashboard.hideLoadingMsg(),Dashboard.alert({message:Globalize.translate("PinCodeResetComplete"),title:Globalize.translate("HeaderPinCodeReset")}),loadUser(view,params)})})})}view.querySelector(".updatePasswordForm").addEventListener("submit",onSubmit),view.querySelector(".localAccessForm").addEventListener("submit",onLocalAccessSubmit),view.querySelector("#btnResetEasyPassword").addEventListener("click",resetEasyPassword),view.querySelector("#btnResetPassword").addEventListener("click",resetPassword),view.addEventListener("viewshow",function(){loadUser(view,params)})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/userprofilespage.js b/dashboard-ui/scripts/userprofilespage.js index 83e1aa1111..19c2a9db48 100644 --- a/dashboard-ui/scripts/userprofilespage.js +++ b/dashboard-ui/scripts/userprofilespage.js @@ -1,409 +1 @@ -define(['jQuery', 'humanedate', 'paper-icon-button-light', 'cardStyle'], function ($) { - 'use strict'; - - function deleteUser(page, id) { - - var msg = Globalize.translate('DeleteUserConfirmation'); - - require(['confirm'], function (confirm) { - - confirm({ - - title: Globalize.translate('DeleteUser'), - text: msg, - confirmText: Globalize.translate('ButtonDelete'), - primary: 'cancel' - - }).then(function () { - - Dashboard.showLoadingMsg(); - - ApiClient.deleteUser(id).then(function () { - - loadData(page); - }); - }); - - }); - } - - function showUserMenu(elem) { - - var card = $(elem).parents('.card')[0]; - var page = $(card).parents('.page')[0]; - var userId = card.getAttribute('data-userid'); - - var menuItems = []; - - menuItems.push({ - name: Globalize.translate('ButtonOpen'), - id: 'open', - ironIcon: 'mode-edit' - }); - - menuItems.push({ - name: Globalize.translate('ButtonLibraryAccess'), - id: 'access', - ironIcon: 'lock' - }); - - menuItems.push({ - name: Globalize.translate('ButtonParentalControl'), - id: 'parentalcontrol', - ironIcon: 'person' - }); - - menuItems.push({ - name: Globalize.translate('ButtonDelete'), - id: 'delete', - ironIcon: 'delete' - }); - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - items: menuItems, - positionTo: card, - callback: function (id) { - - switch (id) { - - case 'open': - Dashboard.navigate('useredit.html?userId=' + userId); - break; - case 'access': - Dashboard.navigate('userlibraryaccess.html?userId=' + userId); - break; - case 'parentalcontrol': - Dashboard.navigate('userparentalcontrol.html?userId=' + userId); - break; - case 'delete': - deleteUser(page, userId); - break; - default: - break; - } - } - }); - - }); - } - - function getUserHtml(user, addConnectIndicator) { - - var html = ''; - - var cssClass = "card squareCard scalableCard squareCard-scalable"; - - if (user.Policy.IsDisabled) { - cssClass += ' grayscale'; - } - - html += "
"; - - html += '
'; - html += '"; - - html += '
'; - - html += '
'; - html += ''; - html += "
"; - - html += '
'; - html += user.Name; - html += "
"; - - html += '
'; - var lastSeen = getLastSeenText(user.LastActivityDate); - if (lastSeen != "") { - html += lastSeen; - } - else { - html += " "; - } - html += '
'; - - // cardFooter - html += "
"; - - // cardBox - html += "
"; - - // card - html += "
"; - - return html; - } - - function getLastSeenText(lastActivityDate) { - - if (!lastActivityDate) { - return ""; - } - - return "Last seen " + humane_date(lastActivityDate); - } - - function getUserSectionHtml(users, addConnectIndicator) { - - var html = ''; - - html += users.map(function (u) { - - return getUserHtml(u, addConnectIndicator); - - }).join(''); - - return html; - } - - function renderUsersIntoElement(elem, users, addConnectIndicator) { - - var html = getUserSectionHtml(users, addConnectIndicator); - - elem.html(html); - - $('.btnUserMenu', elem).on('click', function () { - showUserMenu(this); - }); - } - - function renderUsers(page, users) { - - renderUsersIntoElement($('.localUsers', page), users.filter(function (u) { - return u.ConnectLinkType != 'Guest'; - }), true); - - renderUsersIntoElement($('.connectUsers', page), users.filter(function (u) { - return u.ConnectLinkType == 'Guest'; - })); - } - - function showPendingUserMenu(elem) { - - var menuItems = []; - - menuItems.push({ - name: Globalize.translate('ButtonCancel'), - id: 'delete', - ironIcon: 'delete' - }); - - require(['actionsheet'], function (actionsheet) { - - var card = $(elem).parents('.card')[0]; - var page = $(elem).parents('.page')[0]; - var id = card.getAttribute('data-id'); - - actionsheet.show({ - items: menuItems, - positionTo: card, - callback: function (menuItemId) { - - switch (menuItemId) { - - case 'delete': - cancelAuthorization(page, id); - break; - default: - break; - } - } - }); - }); - } - - function getPendingUserHtml(user) { - - var html = ''; - - var cssClass = "card squareCard"; - - html += "
"; - - html += '
'; - html += '"; - - html += '
'; - - html += '
'; - html += ''; - html += "
"; - - html += '
'; - html += user.UserName; - html += "
"; - - // cardFooter - html += "
"; - - // cardBox - html += "
"; - - // card - html += "
"; - - return html; - } - - function renderPendingGuests(page, users) { - - if (users.length) { - $('.sectionPendingGuests', page).show(); - } else { - $('.sectionPendingGuests', page).hide(); - } - - var html = users.map(getPendingUserHtml).join(''); - - var elem = $('.pending', page).html(html); - - $('.btnUserMenu', elem).on('click', function () { - showPendingUserMenu(this); - }); - } - - function cancelAuthorization(page, id) { - - Dashboard.showLoadingMsg(); - - // Add/Update connect info - ApiClient.ajax({ - - type: "DELETE", - url: ApiClient.getUrl('Connect/Pending', { - - Id: id - - }) - - }).then(function () { - - loadData(page); - - }); - } - - function loadData(page) { - - Dashboard.showLoadingMsg(); - - ApiClient.getUsers().then(function (users) { - renderUsers(page, users); - Dashboard.hideLoadingMsg(); - }); - - ApiClient.getJSON(ApiClient.getUrl('Connect/Pending')).then(function (pending) { - - renderPendingGuests(page, pending); - }); - } - - function showLinkUser(page, userId) { - - require(['components/guestinviter/connectlink'], function (connectlink) { - - connectlink.show().then(function () { - loadData(page); - }); - }); - } - - function showInvitePopup(page) { - - Dashboard.getCurrentUser().then(function (user) { - - if (!user.ConnectUserId) { - - showLinkUser(page, user.Id); - return; - } - - require(['components/guestinviter/guestinviter'], function (guestinviter) { - - guestinviter.show().then(function () { - loadData(page); - }); - }); - }); - } - - $(document).on('pageinit', "#userProfilesPage", function () { - - var page = this; - - $('.btnInvite', page).on('click', function () { - - showInvitePopup(page); - }); - - $('.btnAddUser', page).on('click', function () { - - Dashboard.navigate('usernew.html'); - }); - - }).on('pagebeforeshow', "#userProfilesPage", function () { - - var page = this; - - loadData(page); - }); - -}); \ No newline at end of file +define(["jQuery","humanedate","paper-icon-button-light","cardStyle"],function($){"use strict";function deleteUser(page,id){var msg=Globalize.translate("DeleteUserConfirmation");require(["confirm"],function(confirm){confirm({title:Globalize.translate("DeleteUser"),text:msg,confirmText:Globalize.translate("ButtonDelete"),primary:"cancel"}).then(function(){Dashboard.showLoadingMsg(),ApiClient.deleteUser(id).then(function(){loadData(page)})})})}function showUserMenu(elem){var card=$(elem).parents(".card")[0],page=$(card).parents(".page")[0],userId=card.getAttribute("data-userid"),menuItems=[];menuItems.push({name:Globalize.translate("ButtonOpen"),id:"open",ironIcon:"mode-edit"}),menuItems.push({name:Globalize.translate("ButtonLibraryAccess"),id:"access",ironIcon:"lock"}),menuItems.push({name:Globalize.translate("ButtonParentalControl"),id:"parentalcontrol",ironIcon:"person"}),menuItems.push({name:Globalize.translate("ButtonDelete"),id:"delete",ironIcon:"delete"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:card,callback:function(id){switch(id){case"open":Dashboard.navigate("useredit.html?userId="+userId);break;case"access":Dashboard.navigate("userlibraryaccess.html?userId="+userId);break;case"parentalcontrol":Dashboard.navigate("userparentalcontrol.html?userId="+userId);break;case"delete":deleteUser(page,userId)}}})})}function getUserHtml(user,addConnectIndicator){var html="",cssClass="card squareCard scalableCard squareCard-scalable";user.Policy.IsDisabled&&(cssClass+=" grayscale"),html+="
",html+='
',html+='",html+='
',html+='
',html+='',html+="
",html+='
',html+=user.Name,html+="
",html+='
';var lastSeen=getLastSeenText(user.LastActivityDate);return html+=""!=lastSeen?lastSeen:" ",html+="
",html+="
",html+="
",html+="
"}function getLastSeenText(lastActivityDate){return lastActivityDate?"Last seen "+humane_date(lastActivityDate):""}function getUserSectionHtml(users,addConnectIndicator){var html="";return html+=users.map(function(u){return getUserHtml(u,addConnectIndicator)}).join("")}function renderUsersIntoElement(elem,users,addConnectIndicator){var html=getUserSectionHtml(users,addConnectIndicator);elem.html(html),$(".btnUserMenu",elem).on("click",function(){showUserMenu(this)})}function renderUsers(page,users){renderUsersIntoElement($(".localUsers",page),users.filter(function(u){return"Guest"!=u.ConnectLinkType}),!0),renderUsersIntoElement($(".connectUsers",page),users.filter(function(u){return"Guest"==u.ConnectLinkType}))}function showPendingUserMenu(elem){var menuItems=[];menuItems.push({name:Globalize.translate("ButtonCancel"),id:"delete",ironIcon:"delete"}),require(["actionsheet"],function(actionsheet){var card=$(elem).parents(".card")[0],page=$(elem).parents(".page")[0],id=card.getAttribute("data-id");actionsheet.show({items:menuItems,positionTo:card,callback:function(menuItemId){switch(menuItemId){case"delete":cancelAuthorization(page,id)}}})})}function getPendingUserHtml(user){var html="",cssClass="card squareCard";html+="
",html+='
',html+='",html+='
',html+='
',html+='',html+="
",html+='
',html+=user.UserName,html+="
",html+="
",html+="
",html+="
"}function renderPendingGuests(page,users){users.length?$(".sectionPendingGuests",page).show():$(".sectionPendingGuests",page).hide();var html=users.map(getPendingUserHtml).join(""),elem=$(".pending",page).html(html);$(".btnUserMenu",elem).on("click",function(){showPendingUserMenu(this)})}function cancelAuthorization(page,id){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Connect/Pending",{Id:id})}).then(function(){loadData(page)})}function loadData(page){Dashboard.showLoadingMsg(),ApiClient.getUsers().then(function(users){renderUsers(page,users),Dashboard.hideLoadingMsg()}),ApiClient.getJSON(ApiClient.getUrl("Connect/Pending")).then(function(pending){renderPendingGuests(page,pending)})}function showLinkUser(page,userId){require(["components/guestinviter/connectlink"],function(connectlink){connectlink.show().then(function(){loadData(page)})})}function showInvitePopup(page){Dashboard.getCurrentUser().then(function(user){return user.ConnectUserId?void require(["components/guestinviter/guestinviter"],function(guestinviter){guestinviter.show().then(function(){loadData(page)})}):void showLinkUser(page,user.Id)})}$(document).on("pageinit","#userProfilesPage",function(){var page=this;$(".btnInvite",page).on("click",function(){showInvitePopup(page)}),$(".btnAddUser",page).on("click",function(){Dashboard.navigate("usernew.html")})}).on("pagebeforeshow","#userProfilesPage",function(){var page=this;loadData(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/videoosd.js b/dashboard-ui/scripts/videoosd.js index cf2ad332d6..78f8162cb5 100644 --- a/dashboard-ui/scripts/videoosd.js +++ b/dashboard-ui/scripts/videoosd.js @@ -1,1047 +1 @@ -define(['playbackManager', 'dom', 'inputmanager', 'datetime', 'itemHelper', 'mediaInfo', 'focusManager', 'imageLoader', 'scrollHelper', 'events', 'connectionManager', 'browser', 'globalize', 'apphost', 'layoutManager', 'scrollStyles', 'emby-slider'], function (playbackManager, dom, inputManager, datetime, itemHelper, mediaInfo, focusManager, imageLoader, scrollHelper, events, connectionManager, browser, globalize, appHost, layoutManager) { - 'use strict'; - - function seriesImageUrl(item, options) { - - if (item.Type !== 'Episode') { - return null; - } - - options = options || {}; - options.type = options.type || "Primary"; - - if (options.type === 'Primary') { - - if (item.SeriesPrimaryImageTag) { - - options.tag = item.SeriesPrimaryImageTag; - - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); - } - } - - if (options.type === 'Thumb') { - - if (item.SeriesThumbImageTag) { - - options.tag = item.SeriesThumbImageTag; - - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); - } - if (item.ParentThumbImageTag) { - - options.tag = item.ParentThumbImageTag; - - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options); - } - } - - return null; - } - - function imageUrl(item, options) { - - options = options || {}; - options.type = options.type || "Primary"; - - if (item.ImageTags && item.ImageTags[options.type]) { - - options.tag = item.ImageTags[options.type]; - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options); - } - - if (options.type === 'Primary') { - if (item.AlbumId && item.AlbumPrimaryImageTag) { - - options.tag = item.AlbumPrimaryImageTag; - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); - } - } - - return null; - } - - function logoImageUrl(item, apiClient, options) { - - options = options || {}; - options.type = "Logo"; - - if (item.ImageTags && item.ImageTags.Logo) { - - options.tag = item.ImageTags.Logo; - return apiClient.getScaledImageUrl(item.Id, options); - } - - if (item.ParentLogoImageTag) { - options.tag = item.ParentLogoImageTag; - return apiClient.getScaledImageUrl(item.ParentLogoItemId, options); - } - - return null; - } - - return function (view, params) { - - var self = this; - var currentPlayer; - var currentPlayerSupportedCommands = []; - var currentRuntimeTicks = 0; - var lastUpdateTime = 0; - var isEnabled; - var currentItem; - - var nowPlayingVolumeSlider = view.querySelector('.osdVolumeSlider'); - var nowPlayingVolumeSliderContainer = view.querySelector('.osdVolumeSliderContainer'); - - var nowPlayingPositionSlider = view.querySelector('.osdPositionSlider'); - - var nowPlayingPositionText = view.querySelector('.osdPositionText'); - var nowPlayingDurationText = view.querySelector('.osdDurationText'); - var endsAtText = view.querySelector('.endsAtText'); - - var btnRewind = view.querySelector('.btnRewind'); - var btnFastForward = view.querySelector('.btnFastForward'); - - var transitionEndEventName = dom.whichTransitionEvent(); - - var headerElement = document.querySelector('.skinHeader'); - var osdBottomElement = document.querySelector('.videoOsdBottom'); - - function updateNowPlayingInfo(state) { - - var item = state.NowPlayingItem; - currentItem = item; - - setPoster(item); - - if (!item) { - Emby.Page.setTitle(''); - nowPlayingVolumeSlider.disabled = true; - nowPlayingPositionSlider.disabled = true; - btnFastForward.disabled = true; - btnRewind.disabled = true; - - view.querySelector('.btnSubtitles').classList.add('hide'); - view.querySelector('.btnAudio').classList.add('hide'); - - view.querySelector('.osdTitle').innerHTML = ''; - view.querySelector('.osdMediaInfo').innerHTML = ''; - return; - } - - setTitle(item); - - view.querySelector('.osdTitle').innerHTML = itemHelper.getDisplayName(item); - view.querySelector('.osdMediaInfo').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(item, { - runtime: false, - subtitles: false, - tomatoes: false, - endsAt: false - }); - - nowPlayingVolumeSlider.disabled = false; - nowPlayingPositionSlider.disabled = false; - btnFastForward.disabled = false; - btnRewind.disabled = false; - - if (playbackManager.subtitleTracks(currentPlayer).length) { - view.querySelector('.btnSubtitles').classList.remove('hide'); - } else { - view.querySelector('.btnSubtitles').classList.add('hide'); - } - - if (playbackManager.audioTracks(currentPlayer).length > 1) { - view.querySelector('.btnAudio').classList.remove('hide'); - } else { - view.querySelector('.btnAudio').classList.add('hide'); - } - - } - - function setTitle(item) { - - var url = logoImageUrl(item, connectionManager.getApiClient(item.ServerId), {}); - - if (url) { - - //var pageTitle = document.querySelector('.pageTitle'); - //pageTitle.style.backgroundImage = "url('" + url + "')"; - //pageTitle.classList.add('pageTitleWithLogo'); - //pageTitle.innerHTML = ''; - //document.querySelector('.headerLogo').classList.add('hide'); - } else { - Emby.Page.setTitle(''); - } - } - - function setPoster(item) { - - var osdPoster = view.querySelector('.osdPoster'); - - if (item) { - - var imgUrl = seriesImageUrl(item, { type: 'Primary' }) || - seriesImageUrl(item, { type: 'Thumb' }) || - imageUrl(item, { type: 'Primary' }); - - if (imgUrl) { - osdPoster.innerHTML = ''; - return; - } - } - - osdPoster.innerHTML = ''; - } - - var _osdOpen = true; - - function isOsdOpen() { - return _osdOpen; - } - - function showOsd() { - - slideDownToShow(headerElement); - slideUpToShow(osdBottomElement); - startHideTimer(); - } - - function hideOsd() { - - slideUpToHide(headerElement); - slideDownToHide(osdBottomElement); - } - - var hideTimeout; - - function startHideTimer() { - stopHideTimer(); - hideTimeout = setTimeout(hideOsd, 5000); - } - - function stopHideTimer() { - if (hideTimeout) { - clearTimeout(hideTimeout); - hideTimeout = null; - } - } - - function slideDownToShow(elem) { - - elem.classList.remove('osdHeader-hidden'); - } - - function slideUpToHide(elem) { - - elem.classList.add('osdHeader-hidden'); - } - - function clearBottomPanelAnimationEventListeners(elem) { - - dom.removeEventListener(elem, transitionEndEventName, onSlideDownComplete, { - once: true - }); - } - - function slideUpToShow(elem) { - - if (_osdOpen) { - return; - } - - _osdOpen = true; - - clearBottomPanelAnimationEventListeners(elem); - - elem.classList.remove('hide'); - - // trigger a reflow to force it to animate again - void elem.offsetWidth; - - elem.classList.remove('videoOsdBottom-hidden'); - - setTimeout(function () { - focusManager.focus(elem.querySelector('.btnPause')); - }, 50); - - view.dispatchEvent(new CustomEvent('video-osd-show', { - bubbles: true, - cancelable: false - })); - } - - function onSlideDownComplete(e) { - - var elem = e.target; - - elem.classList.add('hide'); - - dom.removeEventListener(elem, transitionEndEventName, onSlideDownComplete, { - once: true - }); - - view.dispatchEvent(new CustomEvent('video-osd-hide', { - bubbles: true, - cancelable: false - })); - } - - function slideDownToHide(elem) { - - if (!_osdOpen) { - return; - } - - clearBottomPanelAnimationEventListeners(elem); - - // trigger a reflow to force it to animate again - void elem.offsetWidth; - - elem.classList.add('videoOsdBottom-hidden'); - - dom.addEventListener(elem, transitionEndEventName, onSlideDownComplete, { - once: true - }); - - _osdOpen = false; - } - - var lastMouseMoveData; - - function onMouseMove(e) { - - var eventX = e.screenX || 0; - var eventY = e.screenY || 0; - - var obj = lastMouseMoveData; - if (!obj) { - lastMouseMoveData = { - x: eventX, - y: eventY - }; - return; - } - - // if coord are same, it didn't move - if (Math.abs(eventX - obj.x) < 10 && Math.abs(eventY - obj.y) < 10) { - return; - } - - obj.x = eventX; - obj.y = eventY; - - showOsd(); - } - - function onInputCommand(e) { - - switch (e.detail.command) { - - case 'left': - if (isOsdOpen()) { - showOsd(); - } else { - e.preventDefault(); - playbackManager.rewind(); - } - break; - case 'right': - if (isOsdOpen()) { - showOsd(); - } else { - e.preventDefault(); - playbackManager.fastForward(); - } - break; - case 'up': - case 'down': - case 'select': - case 'menu': - case 'info': - case 'play': - case 'playpause': - case 'pause': - case 'fastforward': - case 'rewind': - case 'next': - case 'previous': - showOsd(); - break; - default: - break; - } - } - - function updateFullscreenIcon() { - if (playbackManager.isFullscreen(currentPlayer)) { - view.querySelector('.btnFullscreen').setAttribute('title', globalize.translate('ExitFullscreen')); - view.querySelector('.btnFullscreen i').innerHTML = ''; - } else { - view.querySelector('.btnFullscreen').setAttribute('title', globalize.translate('Fullscreen')); - view.querySelector('.btnFullscreen i').innerHTML = ''; - } - } - - view.addEventListener('viewbeforeshow', function (e) { - - headerElement.classList.add('osdHeader'); - // Make sure the UI is completely transparent - Emby.Page.setTransparency('full'); - }); - - view.addEventListener('viewshow', function (e) { - - events.on(playbackManager, 'playerchange', onPlayerChange); - bindToPlayer(playbackManager.getCurrentPlayer()); - - dom.addEventListener(document, 'mousemove', onMouseMove, { - passive: true - }); - document.body.classList.add('autoScrollY'); - - showOsd(); - - inputManager.on(window, onInputCommand); - - dom.addEventListener(window, 'keydown', onWindowKeyDown, { - passive: true - }); - }); - - view.addEventListener('viewbeforehide', function () { - - dom.removeEventListener(window, 'keydown', onWindowKeyDown, { - passive: true - }); - - stopHideTimer(); - headerElement.classList.remove('osdHeader'); - headerElement.classList.remove('osdHeader-hidden'); - dom.removeEventListener(document, 'mousemove', onMouseMove, { - passive: true - }); - document.body.classList.remove('autoScrollY'); - - inputManager.off(window, onInputCommand); - events.off(playbackManager, 'playerchange', onPlayerChange); - releaseCurrentPlayer(); - }); - - if (appHost.supports('remotecontrol') && !layoutManager.tv) { - view.querySelector('.btnCast').classList.remove('hide'); - } - - view.querySelector('.btnCast').addEventListener('click', function () { - var btn = this; - require(['playerSelectionMenu'], function (playerSelectionMenu) { - playerSelectionMenu.show(btn); - }); - }); - - view.querySelector('.btnFullscreen').addEventListener('click', function () { - playbackManager.toggleFullscreen(currentPlayer); - }); - - view.querySelector('.btnPip').addEventListener('click', function () { - playbackManager.togglePictureInPicture(currentPlayer); - }); - - view.querySelector('.btnSettings').addEventListener('click', onSettingsButtonClick); - - function onPlayerChange() { - - var player = playbackManager.getCurrentPlayer(); - - if (player && !player.isLocalPlayer) { - view.querySelector('.btnCast i').innerHTML = ''; - } else { - view.querySelector('.btnCast i').innerHTML = ''; - } - bindToPlayer(player); - } - - function onStateChanged(event, state) { - - //console.log('nowplaying event: ' + e.type); - var player = this; - - if (!state.NowPlayingItem) { - return; - } - - isEnabled = true; - - updatePlayerStateInternal(event, state); - updatePlaylist(player); - - enableStopOnBack(true); - } - - function onPlayPauseStateChanged(e) { - - if (!isEnabled) { - return; - } - - var player = this; - updatePlayPauseState(player.paused()); - } - - function onVolumeChanged(e) { - - if (!isEnabled) { - return; - } - - var player = this; - - updatePlayerVolumeState(player.isMuted(), player.getVolume()); - } - - function onPlaybackStart(e, state) { - - console.log('nowplaying event: ' + e.type); - - var player = this; - - onStateChanged.call(player, e, state); - } - - function onPlaybackStopped(e, state) { - - currentRuntimeTicks = null; - - console.log('nowplaying event: ' + e.type); - - if (state.nextMediaType !== 'Video') { - - view.removeEventListener('viewbeforehide', onViewHideStopPlayback); - - Emby.Page.back(); - } - } - - function bindToPlayer(player) { - - if (player === currentPlayer) { - return; - } - - releaseCurrentPlayer(); - - currentPlayer = player; - - if (!player) { - return; - } - - playbackManager.getPlayerState(player).then(function (state) { - - onStateChanged.call(player, { type: 'init' }, state); - }); - - events.on(player, 'playbackstart', onPlaybackStart); - events.on(player, 'playbackstop', onPlaybackStopped); - events.on(player, 'volumechange', onVolumeChanged); - events.on(player, 'pause', onPlayPauseStateChanged); - events.on(player, 'playing', onPlayPauseStateChanged); - events.on(player, 'timeupdate', onTimeUpdate); - events.on(player, 'fullscreenchange', updateFullscreenIcon); - } - - function releaseCurrentPlayer() { - - var player = currentPlayer; - - if (player) { - - events.off(player, 'playbackstart', onPlaybackStart); - events.off(player, 'playbackstop', onPlaybackStopped); - events.off(player, 'volumechange', onVolumeChanged); - events.off(player, 'pause', onPlayPauseStateChanged); - events.off(player, 'playing', onPlayPauseStateChanged); - events.off(player, 'timeupdate', onTimeUpdate); - events.off(player, 'fullscreenchange', updateFullscreenIcon); - - currentPlayer = null; - } - } - - function onTimeUpdate(e) { - - if (!isEnabled) { - return; - } - - // Try to avoid hammering the document with changes - var now = new Date().getTime(); - if ((now - lastUpdateTime) < 700) { - - return; - } - lastUpdateTime = now; - - var player = this; - currentRuntimeTicks = playbackManager.duration(player); - updateTimeDisplay(playbackManager.currentTime(player), currentRuntimeTicks); - } - - function updatePlayPauseState(isPaused) { - - if (isPaused) { - view.querySelector('.btnPause i').innerHTML = ''; - } else { - view.querySelector('.btnPause i').innerHTML = ''; - } - } - - function updatePlayerStateInternal(event, state) { - - var playerInfo = playbackManager.getPlayerInfo(); - - var playState = state.PlayState || {}; - - updatePlayPauseState(playState.IsPaused); - - var supportedCommands = playerInfo.supportedCommands; - currentPlayerSupportedCommands = supportedCommands; - - //if (supportedCommands.indexOf('SetRepeatMode') == -1) { - // toggleRepeatButton.classList.add('hide'); - //} else { - // toggleRepeatButton.classList.remove('hide'); - //} - - //if (playState.RepeatMode == 'RepeatAll') { - // toggleRepeatButtonIcon.innerHTML = "repeat"; - // toggleRepeatButton.classList.add('repeatActive'); - //} - //else if (playState.RepeatMode == 'RepeatOne') { - // toggleRepeatButtonIcon.innerHTML = "repeat_one"; - // toggleRepeatButton.classList.add('repeatActive'); - //} else { - // toggleRepeatButtonIcon.innerHTML = "repeat"; - // toggleRepeatButton.classList.remove('repeatActive'); - //} - - updatePlayerVolumeState(playState.IsMuted, playState.VolumeLevel); - - if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) { - nowPlayingPositionSlider.disabled = !playState.CanSeek; - } - - btnFastForward.disabled = !playState.CanSeek; - btnRewind.disabled = !playState.CanSeek; - - var nowPlayingItem = state.NowPlayingItem || {}; - updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks); - - updateNowPlayingInfo(state); - - if (state.MediaSource && state.MediaSource.SupportsTranscoding && supportedCommands.indexOf('SetMaxStreamingBitrate') !== -1) { - view.querySelector('.btnSettings').classList.remove('hide'); - } else { - view.querySelector('.btnSettings').classList.add('hide'); - } - - if (supportedCommands.indexOf('ToggleFullscreen') === -1) { - view.querySelector('.btnFullscreen').classList.add('hide'); - } else { - view.querySelector('.btnFullscreen').classList.remove('hide'); - } - - if (supportedCommands.indexOf('PictureInPicture') === -1) { - view.querySelector('.btnPip').classList.add('hide'); - } else { - view.querySelector('.btnPip').classList.remove('hide'); - } - - updateFullscreenIcon(); - } - - function updateTimeDisplay(positionTicks, runtimeTicks) { - - if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) { - if (runtimeTicks) { - - var pct = positionTicks / runtimeTicks; - pct *= 100; - - nowPlayingPositionSlider.value = pct; - - } else { - - nowPlayingPositionSlider.value = 0; - } - - if (runtimeTicks && positionTicks != null) { - endsAtText.innerHTML = '  -  ' + mediaInfo.getEndsAtFromPosition(runtimeTicks, positionTicks, true); - } else { - endsAtText.innerHTML = ''; - } - } - - updateTimeText(nowPlayingPositionText, positionTicks); - updateTimeText(nowPlayingDurationText, runtimeTicks, true); - } - - function updatePlayerVolumeState(isMuted, volumeLevel) { - - var supportedCommands = currentPlayerSupportedCommands; - - var showMuteButton = true; - var showVolumeSlider = true; - - if (supportedCommands.indexOf('Mute') === -1) { - showMuteButton = false; - } - - if (supportedCommands.indexOf('SetVolume') === -1) { - showVolumeSlider = false; - } - - if (currentPlayer.isLocalPlayer && appHost.supports('physicalvolumecontrol')) { - showMuteButton = false; - showVolumeSlider = false; - } - - if (isMuted) { - view.querySelector('.buttonMute').setAttribute('title', globalize.translate('Unmute')); - view.querySelector('.buttonMute i').innerHTML = ''; - } else { - view.querySelector('.buttonMute').setAttribute('title', globalize.translate('Mute')); - view.querySelector('.buttonMute i').innerHTML = ''; - } - - if (showMuteButton) { - view.querySelector('.buttonMute').classList.remove('hide'); - } else { - view.querySelector('.buttonMute').classList.add('hide'); - } - - // See bindEvents for why this is necessary - if (nowPlayingVolumeSlider) { - - if (showVolumeSlider) { - nowPlayingVolumeSliderContainer.classList.remove('hide'); - } else { - nowPlayingVolumeSliderContainer.classList.add('hide'); - } - - if (!nowPlayingVolumeSlider.dragging) { - nowPlayingVolumeSlider.value = volumeLevel || 0; - } - } - } - - function updatePlaylist(player) { - - var btnPreviousTrack = view.querySelector('.btnPreviousTrack'); - var btnNextTrack = view.querySelector('.btnNextTrack'); - - btnPreviousTrack.classList.remove('hide'); - btnNextTrack.classList.remove('hide'); - - btnNextTrack.disabled = false; - btnPreviousTrack.disabled = false; - } - - function updateTimeText(elem, ticks, divider) { - - if (ticks == null) { - elem.innerHTML = ''; - return; - } - - var html = datetime.getDisplayRunningTime(ticks); - - if (divider) { - html = ' / ' + html; - } - - elem.innerHTML = html; - } - - function onSettingsButtonClick(e) { - - var btn = this; - - require(['playerSettingsMenu'], function (playerSettingsMenu) { - playerSettingsMenu.show({ - mediaType: 'Video', - player: currentPlayer, - positionTo: btn - }); - }); - } - - function showAudioTrackSelection() { - - var player = currentPlayer; - - var audioTracks = playbackManager.audioTracks(player); - - var currentIndex = playbackManager.getAudioStreamIndex(player); - - var menuItems = audioTracks.map(function (stream) { - - var opt = { - name: stream.DisplayTitle, - id: stream.Index - }; - - if (stream.Index === currentIndex) { - opt.selected = true; - } - - return opt; - }); - - var positionTo = this; - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - items: menuItems, - title: globalize.translate('Audio'), - positionTo: positionTo - }).then(function (id) { - var index = parseInt(id); - if (index !== currentIndex) { - playbackManager.setAudioStreamIndex(index, currentPlayer); - } - }); - }); - } - - function showSubtitleTrackSelection() { - - var player = currentPlayer; - - var streams = playbackManager.subtitleTracks(player); - - var currentIndex = playbackManager.getSubtitleStreamIndex(player); - if (currentIndex == null) { - currentIndex = -1; - } - - streams.unshift({ - Index: -1, - DisplayTitle: globalize.translate('Off') - }); - - var menuItems = streams.map(function (stream) { - - var opt = { - name: stream.DisplayTitle, - id: stream.Index - }; - - if (stream.Index === currentIndex) { - opt.selected = true; - } - - return opt; - }); - - var positionTo = this; - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - title: globalize.translate('Subtitles'), - items: menuItems, - positionTo: positionTo - }).then(function (id) { - var index = parseInt(id); - if (index !== currentIndex) { - playbackManager.setSubtitleStreamIndex(index, currentPlayer); - } - }); - - }); - } - - view.addEventListener('viewhide', function () { - - headerElement.classList.remove('hide'); - }); - - function onWindowKeyDown(e) { - if (e.keyCode === 32 && !isOsdOpen()) { - playbackManager.playPause(currentPlayer); - showOsd(); - } - } - - view.querySelector('.pageContainer').addEventListener('click', function () { - - // TODO: Replace this check with click vs tap detection - if (!browser.touch) { - playbackManager.playPause(currentPlayer); - } - showOsd(); - }); - - view.querySelector('.buttonMute').addEventListener('click', function () { - - playbackManager.toggleMute(currentPlayer); - }); - - nowPlayingVolumeSlider.addEventListener('change', function () { - - playbackManager.setVolume(this.value, currentPlayer); - }); - - nowPlayingPositionSlider.addEventListener('change', function () { - - if (currentPlayer) { - - var newPercent = parseFloat(this.value); - - playbackManager.seekPercent(newPercent, currentPlayer); - } - }); - - function getImgUrl(item, chapter, index, maxWidth, apiClient) { - - if (chapter.ImageTag) { - - return apiClient.getScaledImageUrl(item.Id, { - maxWidth: maxWidth, - tag: chapter.ImageTag, - type: "Chapter", - index: index - }); - } - - return null; - } - - function getChapterBubbleHtml(apiClient, item, chapters, positionTicks) { - - var chapter; - var index = -1; - - for (var i = 0, length = chapters.length; i < length; i++) { - - var currentChapter = chapters[i]; - - if (positionTicks >= currentChapter.StartPositionTicks) { - chapter = currentChapter; - index = i; - } - } - - if (!chapter) { - return null; - } - - var src = getImgUrl(item, chapter, index, 400, apiClient); - - if (src) { - - var html = '
'; - html += ''; - - html += '
'; - html += '
'; - html += chapter.Name; - html += '
'; - html += '

'; - html += datetime.getDisplayRunningTime(positionTicks); - html += '

'; - html += '
'; - - html += '
'; - - return html; - } - - return null; - } - - nowPlayingPositionSlider.getBubbleHtml = function (value) { - - showOsd(); - - if (!currentRuntimeTicks) { - return '--:--'; - } - - var ticks = currentRuntimeTicks; - ticks /= 100; - ticks *= value; - - var item = currentItem; - if (item && item.Chapters && item.Chapters.length && item.Chapters[0].ImageTag) { - var html = getChapterBubbleHtml(connectionManager.getApiClient(item.ServerId), item, item.Chapters, ticks); - - if (html) { - return html; - } - } - - return '

' + datetime.getDisplayRunningTime(ticks) + '

'; - }; - - view.querySelector('.btnPreviousTrack').addEventListener('click', function () { - - playbackManager.previousChapter(currentPlayer); - }); - - view.querySelector('.btnPause').addEventListener('click', function () { - - playbackManager.playPause(currentPlayer); - }); - - view.querySelector('.btnNextTrack').addEventListener('click', function () { - - playbackManager.nextChapter(currentPlayer); - }); - - btnRewind.addEventListener('click', function () { - - playbackManager.rewind(currentPlayer); - }); - - btnFastForward.addEventListener('click', function () { - - playbackManager.fastForward(currentPlayer); - }); - - view.querySelector('.btnAudio').addEventListener('click', showAudioTrackSelection); - view.querySelector('.btnSubtitles').addEventListener('click', showSubtitleTrackSelection); - - function onViewHideStopPlayback() { - - if (playbackManager.isPlayingVideo()) { - - var player = currentPlayer; - - // Unbind this event so that we don't go back twice - view.removeEventListener('viewbeforehide', onViewHideStopPlayback); - - releaseCurrentPlayer(); - - playbackManager.stop(player); - - // or - //Emby.Page.setTransparency(Emby.TransparencyLevel.Backdrop); - } - } - - function enableStopOnBack(enabled) { - - view.removeEventListener('viewbeforehide', onViewHideStopPlayback); - - if (enabled) { - if (playbackManager.isPlayingVideo(currentPlayer)) { - view.addEventListener('viewbeforehide', onViewHideStopPlayback); - } - } - } - - }; - -}); \ No newline at end of file +define(["playbackManager","dom","inputmanager","datetime","itemHelper","mediaInfo","focusManager","imageLoader","scrollHelper","events","connectionManager","browser","globalize","apphost","layoutManager","scrollStyles","emby-slider"],function(playbackManager,dom,inputManager,datetime,itemHelper,mediaInfo,focusManager,imageLoader,scrollHelper,events,connectionManager,browser,globalize,appHost,layoutManager){"use strict";function seriesImageUrl(item,options){if("Episode"!==item.Type)return null;if(options=options||{},options.type=options.type||"Primary","Primary"===options.type&&item.SeriesPrimaryImageTag)return options.tag=item.SeriesPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if("Thumb"===options.type){if(item.SeriesThumbImageTag)return options.tag=item.SeriesThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if(item.ParentThumbImageTag)return options.tag=item.ParentThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId,options)}return null}function imageUrl(item,options){return options=options||{},options.type=options.type||"Primary",item.ImageTags&&item.ImageTags[options.type]?(options.tag=item.ImageTags[options.type],connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId||item.Id,options)):"Primary"===options.type&&item.AlbumId&&item.AlbumPrimaryImageTag?(options.tag=item.AlbumPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId,options)):null}function logoImageUrl(item,apiClient,options){return options=options||{},options.type="Logo",item.ImageTags&&item.ImageTags.Logo?(options.tag=item.ImageTags.Logo,apiClient.getScaledImageUrl(item.Id,options)):item.ParentLogoImageTag?(options.tag=item.ParentLogoImageTag,apiClient.getScaledImageUrl(item.ParentLogoItemId,options)):null}return function(view,params){function updateNowPlayingInfo(state){var item=state.NowPlayingItem;return currentItem=item,setPoster(item),item?(setTitle(item),view.querySelector(".osdTitle").innerHTML=itemHelper.getDisplayName(item),view.querySelector(".osdMediaInfo").innerHTML=mediaInfo.getPrimaryMediaInfoHtml(item,{runtime:!1,subtitles:!1,tomatoes:!1,endsAt:!1}),nowPlayingVolumeSlider.disabled=!1,nowPlayingPositionSlider.disabled=!1,btnFastForward.disabled=!1,btnRewind.disabled=!1,playbackManager.subtitleTracks(currentPlayer).length?view.querySelector(".btnSubtitles").classList.remove("hide"):view.querySelector(".btnSubtitles").classList.add("hide"),void(playbackManager.audioTracks(currentPlayer).length>1?view.querySelector(".btnAudio").classList.remove("hide"):view.querySelector(".btnAudio").classList.add("hide"))):(Emby.Page.setTitle(""),nowPlayingVolumeSlider.disabled=!0,nowPlayingPositionSlider.disabled=!0,btnFastForward.disabled=!0,btnRewind.disabled=!0,view.querySelector(".btnSubtitles").classList.add("hide"),view.querySelector(".btnAudio").classList.add("hide"),view.querySelector(".osdTitle").innerHTML="",void(view.querySelector(".osdMediaInfo").innerHTML=""))}function setTitle(item){var url=logoImageUrl(item,connectionManager.getApiClient(item.ServerId),{});url||Emby.Page.setTitle("")}function setPoster(item){var osdPoster=view.querySelector(".osdPoster");if(item){var imgUrl=seriesImageUrl(item,{type:"Primary"})||seriesImageUrl(item,{type:"Thumb"})||imageUrl(item,{type:"Primary"});if(imgUrl)return void(osdPoster.innerHTML='')}osdPoster.innerHTML=""}function isOsdOpen(){return _osdOpen}function showOsd(){slideDownToShow(headerElement),slideUpToShow(osdBottomElement),startHideTimer()}function hideOsd(){slideUpToHide(headerElement),slideDownToHide(osdBottomElement)}function startHideTimer(){stopHideTimer(),hideTimeout=setTimeout(hideOsd,5e3)}function stopHideTimer(){hideTimeout&&(clearTimeout(hideTimeout),hideTimeout=null)}function slideDownToShow(elem){elem.classList.remove("osdHeader-hidden")}function slideUpToHide(elem){elem.classList.add("osdHeader-hidden")}function clearBottomPanelAnimationEventListeners(elem){dom.removeEventListener(elem,transitionEndEventName,onSlideDownComplete,{once:!0})}function slideUpToShow(elem){_osdOpen||(_osdOpen=!0,clearBottomPanelAnimationEventListeners(elem),elem.classList.remove("hide"),void elem.offsetWidth,elem.classList.remove("videoOsdBottom-hidden"),setTimeout(function(){focusManager.focus(elem.querySelector(".btnPause"))},50),view.dispatchEvent(new CustomEvent("video-osd-show",{bubbles:!0,cancelable:!1})))}function onSlideDownComplete(e){var elem=e.target;elem.classList.add("hide"),dom.removeEventListener(elem,transitionEndEventName,onSlideDownComplete,{once:!0}),view.dispatchEvent(new CustomEvent("video-osd-hide",{bubbles:!0,cancelable:!1}))}function slideDownToHide(elem){_osdOpen&&(clearBottomPanelAnimationEventListeners(elem),void elem.offsetWidth,elem.classList.add("videoOsdBottom-hidden"),dom.addEventListener(elem,transitionEndEventName,onSlideDownComplete,{once:!0}),_osdOpen=!1)}function onMouseMove(e){var eventX=e.screenX||0,eventY=e.screenY||0,obj=lastMouseMoveData;return obj?void(Math.abs(eventX-obj.x)<10&&Math.abs(eventY-obj.y)<10||(obj.x=eventX,obj.y=eventY,showOsd())):void(lastMouseMoveData={x:eventX,y:eventY})}function onInputCommand(e){switch(e.detail.command){case"left":isOsdOpen()?showOsd():(e.preventDefault(),playbackManager.rewind());break;case"right":isOsdOpen()?showOsd():(e.preventDefault(),playbackManager.fastForward());break;case"up":case"down":case"select":case"menu":case"info":case"play":case"playpause":case"pause":case"fastforward":case"rewind":case"next":case"previous":showOsd()}}function updateFullscreenIcon(){playbackManager.isFullscreen(currentPlayer)?(view.querySelector(".btnFullscreen").setAttribute("title",globalize.translate("ExitFullscreen")),view.querySelector(".btnFullscreen i").innerHTML=""):(view.querySelector(".btnFullscreen").setAttribute("title",globalize.translate("Fullscreen")),view.querySelector(".btnFullscreen i").innerHTML="")}function onPlayerChange(){var player=playbackManager.getCurrentPlayer();player&&!player.isLocalPlayer?view.querySelector(".btnCast i").innerHTML="":view.querySelector(".btnCast i").innerHTML="",bindToPlayer(player)}function onStateChanged(event,state){var player=this;state.NowPlayingItem&&(isEnabled=!0,updatePlayerStateInternal(event,state),updatePlaylist(player),enableStopOnBack(!0))}function onPlayPauseStateChanged(e){if(isEnabled){var player=this;updatePlayPauseState(player.paused())}}function onVolumeChanged(e){if(isEnabled){var player=this;updatePlayerVolumeState(player.isMuted(),player.getVolume())}}function onPlaybackStart(e,state){console.log("nowplaying event: "+e.type);var player=this;onStateChanged.call(player,e,state)}function onPlaybackStopped(e,state){currentRuntimeTicks=null,console.log("nowplaying event: "+e.type),"Video"!==state.nextMediaType&&(view.removeEventListener("viewbeforehide",onViewHideStopPlayback),Emby.Page.back())}function bindToPlayer(player){player!==currentPlayer&&(releaseCurrentPlayer(),currentPlayer=player,player&&(playbackManager.getPlayerState(player).then(function(state){onStateChanged.call(player,{type:"init"},state)}),events.on(player,"playbackstart",onPlaybackStart),events.on(player,"playbackstop",onPlaybackStopped),events.on(player,"volumechange",onVolumeChanged),events.on(player,"pause",onPlayPauseStateChanged),events.on(player,"playing",onPlayPauseStateChanged),events.on(player,"timeupdate",onTimeUpdate),events.on(player,"fullscreenchange",updateFullscreenIcon)))}function releaseCurrentPlayer(){var player=currentPlayer;player&&(events.off(player,"playbackstart",onPlaybackStart),events.off(player,"playbackstop",onPlaybackStopped),events.off(player,"volumechange",onVolumeChanged),events.off(player,"pause",onPlayPauseStateChanged),events.off(player,"playing",onPlayPauseStateChanged),events.off(player,"timeupdate",onTimeUpdate),events.off(player,"fullscreenchange",updateFullscreenIcon),currentPlayer=null)}function onTimeUpdate(e){if(isEnabled){var now=(new Date).getTime();if(!(now-lastUpdateTime<700)){lastUpdateTime=now;var player=this;currentRuntimeTicks=playbackManager.duration(player),updateTimeDisplay(playbackManager.currentTime(player),currentRuntimeTicks)}}}function updatePlayPauseState(isPaused){isPaused?view.querySelector(".btnPause i").innerHTML="":view.querySelector(".btnPause i").innerHTML=""}function updatePlayerStateInternal(event,state){var playerInfo=playbackManager.getPlayerInfo(),playState=state.PlayState||{};updatePlayPauseState(playState.IsPaused);var supportedCommands=playerInfo.supportedCommands;currentPlayerSupportedCommands=supportedCommands,updatePlayerVolumeState(playState.IsMuted,playState.VolumeLevel),nowPlayingPositionSlider&&!nowPlayingPositionSlider.dragging&&(nowPlayingPositionSlider.disabled=!playState.CanSeek),btnFastForward.disabled=!playState.CanSeek,btnRewind.disabled=!playState.CanSeek;var nowPlayingItem=state.NowPlayingItem||{};updateTimeDisplay(playState.PositionTicks,nowPlayingItem.RunTimeTicks),updateNowPlayingInfo(state),state.MediaSource&&state.MediaSource.SupportsTranscoding&&supportedCommands.indexOf("SetMaxStreamingBitrate")!==-1?view.querySelector(".btnSettings").classList.remove("hide"):view.querySelector(".btnSettings").classList.add("hide"),supportedCommands.indexOf("ToggleFullscreen")===-1?view.querySelector(".btnFullscreen").classList.add("hide"):view.querySelector(".btnFullscreen").classList.remove("hide"),supportedCommands.indexOf("PictureInPicture")===-1?view.querySelector(".btnPip").classList.add("hide"):view.querySelector(".btnPip").classList.remove("hide"),updateFullscreenIcon()}function updateTimeDisplay(positionTicks,runtimeTicks){if(nowPlayingPositionSlider&&!nowPlayingPositionSlider.dragging){if(runtimeTicks){var pct=positionTicks/runtimeTicks;pct*=100,nowPlayingPositionSlider.value=pct}else nowPlayingPositionSlider.value=0;runtimeTicks&&null!=positionTicks?endsAtText.innerHTML="  -  "+mediaInfo.getEndsAtFromPosition(runtimeTicks,positionTicks,!0):endsAtText.innerHTML=""}updateTimeText(nowPlayingPositionText,positionTicks),updateTimeText(nowPlayingDurationText,runtimeTicks,!0)}function updatePlayerVolumeState(isMuted,volumeLevel){var supportedCommands=currentPlayerSupportedCommands,showMuteButton=!0,showVolumeSlider=!0;supportedCommands.indexOf("Mute")===-1&&(showMuteButton=!1),supportedCommands.indexOf("SetVolume")===-1&&(showVolumeSlider=!1),currentPlayer.isLocalPlayer&&appHost.supports("physicalvolumecontrol")&&(showMuteButton=!1,showVolumeSlider=!1),isMuted?(view.querySelector(".buttonMute").setAttribute("title",globalize.translate("Unmute")),view.querySelector(".buttonMute i").innerHTML=""):(view.querySelector(".buttonMute").setAttribute("title",globalize.translate("Mute")),view.querySelector(".buttonMute i").innerHTML=""),showMuteButton?view.querySelector(".buttonMute").classList.remove("hide"):view.querySelector(".buttonMute").classList.add("hide"),nowPlayingVolumeSlider&&(showVolumeSlider?nowPlayingVolumeSliderContainer.classList.remove("hide"):nowPlayingVolumeSliderContainer.classList.add("hide"),nowPlayingVolumeSlider.dragging||(nowPlayingVolumeSlider.value=volumeLevel||0))}function updatePlaylist(player){var btnPreviousTrack=view.querySelector(".btnPreviousTrack"),btnNextTrack=view.querySelector(".btnNextTrack");btnPreviousTrack.classList.remove("hide"),btnNextTrack.classList.remove("hide"),btnNextTrack.disabled=!1,btnPreviousTrack.disabled=!1}function updateTimeText(elem,ticks,divider){if(null==ticks)return void(elem.innerHTML="");var html=datetime.getDisplayRunningTime(ticks);divider&&(html=" / "+html),elem.innerHTML=html}function onSettingsButtonClick(e){var btn=this;require(["playerSettingsMenu"],function(playerSettingsMenu){playerSettingsMenu.show({mediaType:"Video",player:currentPlayer,positionTo:btn})})}function showAudioTrackSelection(){var player=currentPlayer,audioTracks=playbackManager.audioTracks(player),currentIndex=playbackManager.getAudioStreamIndex(player),menuItems=audioTracks.map(function(stream){var opt={name:stream.DisplayTitle,id:stream.Index};return stream.Index===currentIndex&&(opt.selected=!0),opt}),positionTo=this;require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,title:globalize.translate("Audio"),positionTo:positionTo}).then(function(id){var index=parseInt(id);index!==currentIndex&&playbackManager.setAudioStreamIndex(index,currentPlayer)})})}function showSubtitleTrackSelection(){var player=currentPlayer,streams=playbackManager.subtitleTracks(player),currentIndex=playbackManager.getSubtitleStreamIndex(player);null==currentIndex&&(currentIndex=-1),streams.unshift({Index:-1,DisplayTitle:globalize.translate("Off")});var menuItems=streams.map(function(stream){var opt={name:stream.DisplayTitle,id:stream.Index};return stream.Index===currentIndex&&(opt.selected=!0),opt}),positionTo=this;require(["actionsheet"],function(actionsheet){actionsheet.show({title:globalize.translate("Subtitles"),items:menuItems,positionTo:positionTo}).then(function(id){var index=parseInt(id);index!==currentIndex&&playbackManager.setSubtitleStreamIndex(index,currentPlayer)})})}function onWindowKeyDown(e){32!==e.keyCode||isOsdOpen()||(playbackManager.playPause(currentPlayer),showOsd())}function getImgUrl(item,chapter,index,maxWidth,apiClient){return chapter.ImageTag?apiClient.getScaledImageUrl(item.Id,{maxWidth:maxWidth,tag:chapter.ImageTag,type:"Chapter",index:index}):null}function getChapterBubbleHtml(apiClient,item,chapters,positionTicks){for(var chapter,index=-1,i=0,length=chapters.length;i=currentChapter.StartPositionTicks&&(chapter=currentChapter,index=i)}if(!chapter)return null;var src=getImgUrl(item,chapter,index,400,apiClient);if(src){var html='
';return html+='',html+='
',html+='
',html+=chapter.Name,html+="
",html+='

',html+=datetime.getDisplayRunningTime(positionTicks),html+="

",html+="
",html+="
"}return null}function onViewHideStopPlayback(){if(playbackManager.isPlayingVideo()){var player=currentPlayer;view.removeEventListener("viewbeforehide",onViewHideStopPlayback),releaseCurrentPlayer(),playbackManager.stop(player)}}function enableStopOnBack(enabled){view.removeEventListener("viewbeforehide",onViewHideStopPlayback),enabled&&playbackManager.isPlayingVideo(currentPlayer)&&view.addEventListener("viewbeforehide",onViewHideStopPlayback)}var currentPlayer,isEnabled,currentItem,hideTimeout,lastMouseMoveData,currentPlayerSupportedCommands=[],currentRuntimeTicks=0,lastUpdateTime=0,nowPlayingVolumeSlider=view.querySelector(".osdVolumeSlider"),nowPlayingVolumeSliderContainer=view.querySelector(".osdVolumeSliderContainer"),nowPlayingPositionSlider=view.querySelector(".osdPositionSlider"),nowPlayingPositionText=view.querySelector(".osdPositionText"),nowPlayingDurationText=view.querySelector(".osdDurationText"),endsAtText=view.querySelector(".endsAtText"),btnRewind=view.querySelector(".btnRewind"),btnFastForward=view.querySelector(".btnFastForward"),transitionEndEventName=dom.whichTransitionEvent(),headerElement=document.querySelector(".skinHeader"),osdBottomElement=document.querySelector(".videoOsdBottom"),_osdOpen=!0;view.addEventListener("viewbeforeshow",function(e){headerElement.classList.add("osdHeader"),Emby.Page.setTransparency("full")}),view.addEventListener("viewshow",function(e){events.on(playbackManager,"playerchange",onPlayerChange),bindToPlayer(playbackManager.getCurrentPlayer()),dom.addEventListener(document,"mousemove",onMouseMove,{passive:!0}),document.body.classList.add("autoScrollY"),showOsd(),inputManager.on(window,onInputCommand),dom.addEventListener(window,"keydown",onWindowKeyDown,{passive:!0})}),view.addEventListener("viewbeforehide",function(){dom.removeEventListener(window,"keydown",onWindowKeyDown,{passive:!0}),stopHideTimer(),headerElement.classList.remove("osdHeader"),headerElement.classList.remove("osdHeader-hidden"),dom.removeEventListener(document,"mousemove",onMouseMove,{passive:!0}),document.body.classList.remove("autoScrollY"),inputManager.off(window,onInputCommand),events.off(playbackManager,"playerchange",onPlayerChange),releaseCurrentPlayer()}),appHost.supports("remotecontrol")&&!layoutManager.tv&&view.querySelector(".btnCast").classList.remove("hide"),view.querySelector(".btnCast").addEventListener("click",function(){var btn=this;require(["playerSelectionMenu"],function(playerSelectionMenu){playerSelectionMenu.show(btn)})}),view.querySelector(".btnFullscreen").addEventListener("click",function(){playbackManager.toggleFullscreen(currentPlayer)}),view.querySelector(".btnPip").addEventListener("click",function(){playbackManager.togglePictureInPicture(currentPlayer)}),view.querySelector(".btnSettings").addEventListener("click",onSettingsButtonClick),view.addEventListener("viewhide",function(){headerElement.classList.remove("hide")}),view.querySelector(".pageContainer").addEventListener("click",function(){browser.touch||playbackManager.playPause(currentPlayer),showOsd()}),view.querySelector(".buttonMute").addEventListener("click",function(){playbackManager.toggleMute(currentPlayer)}),nowPlayingVolumeSlider.addEventListener("change",function(){playbackManager.setVolume(this.value,currentPlayer)}),nowPlayingPositionSlider.addEventListener("change",function(){if(currentPlayer){var newPercent=parseFloat(this.value);playbackManager.seekPercent(newPercent,currentPlayer)}}),nowPlayingPositionSlider.getBubbleHtml=function(value){if(showOsd(),!currentRuntimeTicks)return"--:--";var ticks=currentRuntimeTicks;ticks/=100,ticks*=value;var item=currentItem;if(item&&item.Chapters&&item.Chapters.length&&item.Chapters[0].ImageTag){var html=getChapterBubbleHtml(connectionManager.getApiClient(item.ServerId),item,item.Chapters,ticks);if(html)return html}return'

'+datetime.getDisplayRunningTime(ticks)+"

"},view.querySelector(".btnPreviousTrack").addEventListener("click",function(){playbackManager.previousChapter(currentPlayer)}),view.querySelector(".btnPause").addEventListener("click",function(){playbackManager.playPause(currentPlayer)}),view.querySelector(".btnNextTrack").addEventListener("click",function(){playbackManager.nextChapter(currentPlayer)}),btnRewind.addEventListener("click",function(){playbackManager.rewind(currentPlayer)}),btnFastForward.addEventListener("click",function(){playbackManager.fastForward(currentPlayer)}),view.querySelector(".btnAudio").addEventListener("click",showAudioTrackSelection),view.querySelector(".btnSubtitles").addEventListener("click",showSubtitleTrackSelection)}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/wizardagreement.js b/dashboard-ui/scripts/wizardagreement.js index 9e39c04826..ebc72636c7 100644 --- a/dashboard-ui/scripts/wizardagreement.js +++ b/dashboard-ui/scripts/wizardagreement.js @@ -1,26 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - function onSubmit() { - - var page = $(this).parents('.page')[0]; - - if (page.querySelector('.chkAccept').checked) { - Dashboard.navigate('wizardfinish.html'); - } else { - - Dashboard.alert({ - message: Globalize.translate('MessagePleaseAcceptTermsOfServiceBeforeContinuing'), - title: '' - }); - } - - return false; - } - - $(document).on('pageinit', '#wizardAgreementPage', function () { - - $('.wizardAgreementForm').off('submit', onSubmit).on('submit', onSubmit); - }); - -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";function onSubmit(){var page=$(this).parents(".page")[0];return page.querySelector(".chkAccept").checked?Dashboard.navigate("wizardfinish.html"):Dashboard.alert({message:Globalize.translate("MessagePleaseAcceptTermsOfServiceBeforeContinuing"),title:""}),!1}$(document).on("pageinit","#wizardAgreementPage",function(){$(".wizardAgreementForm").off("submit",onSubmit).on("submit",onSubmit)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/wizardcontroller.js b/dashboard-ui/scripts/wizardcontroller.js index 3f2e5c73cb..7ec6969576 100644 --- a/dashboard-ui/scripts/wizardcontroller.js +++ b/dashboard-ui/scripts/wizardcontroller.js @@ -1,21 +1 @@ -define([], function () { - 'use strict'; - - function navigateToComponents() { - var apiClient = ApiClient; - - apiClient.getJSON(apiClient.getUrl('Startup/Info')).then(function (info) { - - if (info.HasMediaEncoder) { - Dashboard.navigate('wizardagreement.html'); - - } else { - Dashboard.navigate('wizardcomponents.html'); - } - }); - } - - return { - navigateToComponents: navigateToComponents - }; -}); \ No newline at end of file +define([],function(){"use strict";function navigateToComponents(){var apiClient=ApiClient;apiClient.getJSON(apiClient.getUrl("Startup/Info")).then(function(info){info.HasMediaEncoder?Dashboard.navigate("wizardagreement.html"):Dashboard.navigate("wizardcomponents.html")})}return{navigateToComponents:navigateToComponents}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/wizardlivetvguide.js b/dashboard-ui/scripts/wizardlivetvguide.js index 6081f8972e..23d2fd68e8 100644 --- a/dashboard-ui/scripts/wizardlivetvguide.js +++ b/dashboard-ui/scripts/wizardlivetvguide.js @@ -1,93 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - var guideController; - - function init(page, type) { - - Dashboard.showLoadingMsg(); - - var apiClient = ApiClient; - - apiClient.getJSON(apiClient.getUrl('Startup/Configuration')).then(function (config) { - - var providerId = null; - - if ((config.LiveTvGuideProviderType || '').toLowerCase() == type.toLowerCase()) { - if (config.LiveTvGuideProviderId) { - providerId = config.LiveTvGuideProviderId; - } - } - - var url = 'components/tvproviders/' + type.toLowerCase() + '.js'; - - require([url], function (factory) { - - var instance = new factory(page, providerId, { - showCancelButton: false, - showSubmitButton: false, - showConfirmation: false - }); - - Dashboard.hideLoadingMsg(); - instance.init(); - guideController = instance; - - Events.on(guideController, 'submitted', skip); - }); - }); - } - - function loadTemplate(page, type) { - - guideController = null; - - ApiClient.ajax({ - - type: 'GET', - url: 'components/tvproviders/' + type.toLowerCase() + '.template.html' - - }).then(function (html) { - - var elem = page.querySelector('.providerTemplate'); - elem.innerHTML = Globalize.translateDocument(html); - - init(page, type); - }); - } - - function skip() { - require(['scripts/wizardcontroller'], function (wizardcontroller) { - wizardcontroller.navigateToComponents(); - }); - } - - function next() { - guideController.submit(); - } - - function reload(page) { - - $('#selectType', page).trigger('change'); - } - - $(document).on('pageinit', "#wizardGuidePage", function () { - - var page = this; - - $('#selectType', page).on('change', function () { - - loadTemplate(page, this.value); - }); - - $('.btnSkip', page).on('click', skip); - $('.btnNext', page).on('click', next); - - }).on('pageshow', "#wizardGuidePage", function () { - - var page = this; - - reload(page); - }); - -}); +define(["jQuery"],function($){"use strict";function init(page,type){Dashboard.showLoadingMsg();var apiClient=ApiClient;apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function(config){var providerId=null;(config.LiveTvGuideProviderType||"").toLowerCase()==type.toLowerCase()&&config.LiveTvGuideProviderId&&(providerId=config.LiveTvGuideProviderId);var url="components/tvproviders/"+type.toLowerCase()+".js";require([url],function(factory){var instance=new factory(page,providerId,{showCancelButton:!1,showSubmitButton:!1,showConfirmation:!1});Dashboard.hideLoadingMsg(),instance.init(),guideController=instance,Events.on(guideController,"submitted",skip)})})}function loadTemplate(page,type){guideController=null,ApiClient.ajax({type:"GET",url:"components/tvproviders/"+type.toLowerCase()+".template.html"}).then(function(html){var elem=page.querySelector(".providerTemplate");elem.innerHTML=Globalize.translateDocument(html),init(page,type)})}function skip(){require(["scripts/wizardcontroller"],function(wizardcontroller){wizardcontroller.navigateToComponents()})}function next(){guideController.submit()}function reload(page){$("#selectType",page).trigger("change")}var guideController;$(document).on("pageinit","#wizardGuidePage",function(){var page=this;$("#selectType",page).on("change",function(){loadTemplate(page,this.value)}),$(".btnSkip",page).on("click",skip),$(".btnNext",page).on("click",next)}).on("pageshow","#wizardGuidePage",function(){var page=this;reload(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/wizardlivetvtuner.js b/dashboard-ui/scripts/wizardlivetvtuner.js index 1e654deef5..07d3905d98 100644 --- a/dashboard-ui/scripts/wizardlivetvtuner.js +++ b/dashboard-ui/scripts/wizardlivetvtuner.js @@ -1,92 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - function save(page) { - - Dashboard.showLoadingMsg(); - - var apiClient = ApiClient; - - // After saving chapter task, now save server config - apiClient.getJSON(apiClient.getUrl('Startup/Configuration')).then(function (config) { - - config.LiveTvTunerType = $('#selectTunerType', page).val(); - config.LiveTvTunerPath = $('.txtDevicePath', page).val(); - - apiClient.ajax({ - - type: 'POST', - data: config, - url: apiClient.getUrl('Startup/Configuration') - - }).then(function () { - - Dashboard.hideLoadingMsg(); - navigateToNextPage(config); - - }, function () { - - Dashboard.hideLoadingMsg(); - Dashboard.alert({ - message: Globalize.translate('ErrorSavingTvProvider') - }); - - }); - }); - - } - - function reload(page) { - - Dashboard.showLoadingMsg(); - - var apiClient = ApiClient; - - apiClient.getJSON(apiClient.getUrl('Startup/Configuration')).then(function (config) { - - $('#selectTunerType', page).val(config.LiveTvTunerType || 'hdhomerun'); - page.querySelector('.txtDevicePath').value = config.LiveTvTunerPath || ''; - - Dashboard.hideLoadingMsg(); - }); - } - - function navigateToNextPage(config) { - - if (config.LiveTvTunerPath && config.LiveTvTunerType) { - Dashboard.navigate('wizardlivetvguide.html'); - } else { - skip(); - } - } - - function skip() { - require(['scripts/wizardcontroller'], function (wizardcontroller) { - wizardcontroller.navigateToComponents(); - }); - } - - function onSubmit() { - var form = this; - - save(form); - - return false; - } - - $(document).on('pageinit', "#wizardTunerPage", function () { - - var page = this; - - $('form', page).off('submit', onSubmit).on('submit', onSubmit); - - $('.btnSkip', page).on('click', skip); - - }).on('pageshow', "#wizardTunerPage", function () { - - var page = this; - - reload(page); - }); - -}); +define(["jQuery"],function($){"use strict";function save(page){Dashboard.showLoadingMsg();var apiClient=ApiClient;apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function(config){config.LiveTvTunerType=$("#selectTunerType",page).val(),config.LiveTvTunerPath=$(".txtDevicePath",page).val(),apiClient.ajax({type:"POST",data:config,url:apiClient.getUrl("Startup/Configuration")}).then(function(){Dashboard.hideLoadingMsg(),navigateToNextPage(config)},function(){Dashboard.hideLoadingMsg(),Dashboard.alert({message:Globalize.translate("ErrorSavingTvProvider")})})})}function reload(page){Dashboard.showLoadingMsg();var apiClient=ApiClient;apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function(config){$("#selectTunerType",page).val(config.LiveTvTunerType||"hdhomerun"),page.querySelector(".txtDevicePath").value=config.LiveTvTunerPath||"",Dashboard.hideLoadingMsg()})}function navigateToNextPage(config){config.LiveTvTunerPath&&config.LiveTvTunerType?Dashboard.navigate("wizardlivetvguide.html"):skip()}function skip(){require(["scripts/wizardcontroller"],function(wizardcontroller){wizardcontroller.navigateToComponents()})}function onSubmit(){var form=this;return save(form),!1}$(document).on("pageinit","#wizardTunerPage",function(){var page=this;$("form",page).off("submit",onSubmit).on("submit",onSubmit),$(".btnSkip",page).on("click",skip)}).on("pageshow","#wizardTunerPage",function(){var page=this;reload(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/wizardsettings.js b/dashboard-ui/scripts/wizardsettings.js index 51ab666881..2d94d09815 100644 --- a/dashboard-ui/scripts/wizardsettings.js +++ b/dashboard-ui/scripts/wizardsettings.js @@ -1,117 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - function save(page) { - - Dashboard.showLoadingMsg(); - - var apiClient = ApiClient; - - // After saving chapter task, now save server config - apiClient.getJSON(apiClient.getUrl('Startup/Configuration')).then(function (config) { - - config.PreferredMetadataLanguage = $('#selectLanguage', page).val(); - config.MetadataCountryCode = $('#selectCountry', page).val(); - - apiClient.ajax({ - - type: 'POST', - data: config, - url: apiClient.getUrl('Startup/Configuration') - - }).then(function () { - - navigateToNextPage(); - - }); - }); - - } - - function populateLanguages(select, languages) { - - var html = ""; - - html += ""; - - for (var i = 0, length = languages.length; i < length; i++) { - - var culture = languages[i]; - - html += ""; - } - - select.innerHTML = html; - } - - function populateCountries (select, allCountries) { - - var html = ""; - - html += ""; - - for (var i = 0, length = allCountries.length; i < length; i++) { - - var culture = allCountries[i]; - - html += ""; - } - - select.innerHTML = html; - } - - function reloadData(page, config, cultures, countries) { - - populateLanguages(page.querySelector('#selectLanguage'), cultures); - populateCountries(page.querySelector('#selectCountry'), countries); - - $('#selectLanguage', page).val(config.PreferredMetadataLanguage); - $('#selectCountry', page).val(config.MetadataCountryCode); - - Dashboard.hideLoadingMsg(); - } - - function reload(page) { - - Dashboard.showLoadingMsg(); - - var apiClient = ApiClient; - - var promise1 = apiClient.getJSON(apiClient.getUrl('Startup/Configuration')); - var promise2 = apiClient.getCultures(); - var promise3 = apiClient.getCountries(); - - Promise.all([promise1, promise2, promise3]).then(function (responses) { - - reloadData(page, responses[0], responses[1], responses[2]); - - }); - } - - function navigateToNextPage() { - - Dashboard.navigate('wizardlivetvtuner.html'); - } - - function onSubmit() { - var form = this; - - save(form); - - return false; - } - - $(document).on('pageinit', "#wizardSettingsPage", function () { - - var page = this; - - $('.wizardSettingsForm', page).off('submit', onSubmit).on('submit', onSubmit); - - }).on('pageshow', "#wizardSettingsPage", function () { - - var page = this; - - reload(page); - }); - -}); +define(["jQuery"],function($){"use strict";function save(page){Dashboard.showLoadingMsg();var apiClient=ApiClient;apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function(config){config.PreferredMetadataLanguage=$("#selectLanguage",page).val(),config.MetadataCountryCode=$("#selectCountry",page).val(),apiClient.ajax({type:"POST",data:config,url:apiClient.getUrl("Startup/Configuration")}).then(function(){navigateToNextPage()})})}function populateLanguages(select,languages){var html="";html+="";for(var i=0,length=languages.length;i"+culture.DisplayName+""}select.innerHTML=html}function populateCountries(select,allCountries){var html="";html+="";for(var i=0,length=allCountries.length;i"+culture.DisplayName+""}select.innerHTML=html}function reloadData(page,config,cultures,countries){populateLanguages(page.querySelector("#selectLanguage"),cultures),populateCountries(page.querySelector("#selectCountry"),countries),$("#selectLanguage",page).val(config.PreferredMetadataLanguage),$("#selectCountry",page).val(config.MetadataCountryCode),Dashboard.hideLoadingMsg()}function reload(page){Dashboard.showLoadingMsg();var apiClient=ApiClient,promise1=apiClient.getJSON(apiClient.getUrl("Startup/Configuration")),promise2=apiClient.getCultures(),promise3=apiClient.getCountries();Promise.all([promise1,promise2,promise3]).then(function(responses){reloadData(page,responses[0],responses[1],responses[2])})}function navigateToNextPage(){Dashboard.navigate("wizardlivetvtuner.html")}function onSubmit(){var form=this;return save(form),!1}$(document).on("pageinit","#wizardSettingsPage",function(){var page=this;$(".wizardSettingsForm",page).off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#wizardSettingsPage",function(){var page=this;reload(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/wizardstartpage.js b/dashboard-ui/scripts/wizardstartpage.js index e434c602aa..c5e7081dbf 100644 --- a/dashboard-ui/scripts/wizardstartpage.js +++ b/dashboard-ui/scripts/wizardstartpage.js @@ -1,71 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - function loadPage(page, config, languageOptions) { - - $('#selectLocalizationLanguage', page).html(languageOptions.map(function (l) { - - return ''; - - })).val(config.UICulture); - - Dashboard.hideLoadingMsg(); - } - - function save(page) { - - Dashboard.showLoadingMsg(); - - var apiClient = ApiClient; - - apiClient.getJSON(apiClient.getUrl('Startup/Configuration')).then(function (config) { - - config.UICulture = $('#selectLocalizationLanguage', page).val(); - - apiClient.ajax({ - - type: 'POST', - data: config, - url: apiClient.getUrl('Startup/Configuration') - - }).then(function () { - - Dashboard.navigate('wizarduser.html'); - - }); - }); - - } - - function onSubmit() { - save($(this).parents('.page')); - - return false; - } - - $(document).on('pageinit', "#wizardStartPage", function () { - - $('.wizardStartForm').off('submit', onSubmit).on('submit', onSubmit); - - window.ConnectionManager.clearData(); - - - }).on('pageshow', "#wizardStartPage", function () { - - Dashboard.showLoadingMsg(); - var page = this; - - var apiClient = ApiClient; - - var promise1 = apiClient.getJSON(apiClient.getUrl('Startup/Configuration')); - - var promise2 = apiClient.getJSON(apiClient.getUrl("Localization/Options")); - - Promise.all([promise1, promise2]).then(function (responses) { - - loadPage(page, responses[0], responses[1]); - - }); - }); - -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";function loadPage(page,config,languageOptions){$("#selectLocalizationLanguage",page).html(languageOptions.map(function(l){return'"})).val(config.UICulture),Dashboard.hideLoadingMsg()}function save(page){Dashboard.showLoadingMsg();var apiClient=ApiClient;apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function(config){config.UICulture=$("#selectLocalizationLanguage",page).val(),apiClient.ajax({type:"POST",data:config,url:apiClient.getUrl("Startup/Configuration")}).then(function(){Dashboard.navigate("wizarduser.html")})})}function onSubmit(){return save($(this).parents(".page")),!1}$(document).on("pageinit","#wizardStartPage",function(){$(".wizardStartForm").off("submit",onSubmit).on("submit",onSubmit),window.ConnectionManager.clearData()}).on("pageshow","#wizardStartPage",function(){Dashboard.showLoadingMsg();var page=this,apiClient=ApiClient,promise1=apiClient.getJSON(apiClient.getUrl("Startup/Configuration")),promise2=apiClient.getJSON(apiClient.getUrl("Localization/Options"));Promise.all([promise1,promise2]).then(function(responses){loadPage(page,responses[0],responses[1])})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/wizarduserpage.js b/dashboard-ui/scripts/wizarduserpage.js index f87b4781f2..0c8facfb52 100644 --- a/dashboard-ui/scripts/wizarduserpage.js +++ b/dashboard-ui/scripts/wizarduserpage.js @@ -1,104 +1 @@ -define(['jQuery'], function ($) { - 'use strict'; - - function getApiClient() { - return ApiClient; - } - - function onUpdateUserComplete(result) { - - Dashboard.hideLoadingMsg(); - - if (result.UserLinkResult) { - - var msgKey = result.UserLinkResult.IsPending ? 'MessagePendingEmbyAccountAdded' : 'MessageEmbyAccountAdded'; - - Dashboard.alert({ - message: Globalize.translate(msgKey), - title: Globalize.translate('HeaderEmbyAccountAdded'), - - callback: function () { - Dashboard.navigate('wizardlibrary.html'); - } - - }); - - } else { - Dashboard.navigate('wizardlibrary.html'); - } - } - - function submit(form) { - - Dashboard.showLoadingMsg(); - - var apiClient = getApiClient(); - - apiClient.ajax({ - - type: 'POST', - data: { - - Name: form.querySelector('#txtUsername').value, - ConnectUserName: form.querySelector('#txtConnectUserName').value - - }, - url: apiClient.getUrl('Startup/User'), - dataType: 'json' - - }).then(onUpdateUserComplete, function () { - - showEmbyConnectErrorMessage(form.querySelector('#txtConnectUserName').value); - }); - } - - function showEmbyConnectErrorMessage(username) { - - var msg; - - if (username) { - - msg = Globalize.translate('ErrorAddingEmbyConnectAccount1', 'https://emby.media/connect'); - msg += '

' + Globalize.translate('ErrorAddingEmbyConnectAccount2', 'apps@emby.media'); - - } else { - msg = Globalize.translate('DefaultErrorMessage'); - } - - Dashboard.alert({ - - message: msg - - }); - } - - function onSubmit() { - var form = this; - - submit(form); - - return false; - } - - $(document).on('pageinit', "#wizardUserPage", function () { - - $('.wizardUserForm').off('submit', onSubmit).on('submit', onSubmit); - - }).on('pageshow', "#wizardUserPage", function () { - - Dashboard.showLoadingMsg(); - - var page = this; - - var apiClient = getApiClient(); - - apiClient.getJSON(apiClient.getUrl('Startup/User')).then(function (user) { - - page.querySelector('#txtUsername').value = user.Name || ''; - page.querySelector('#txtConnectUserName').value = user.ConnectUserName || ''; - - Dashboard.hideLoadingMsg(); - }); - }); - -}); \ No newline at end of file +define(["jQuery"],function($){"use strict";function getApiClient(){return ApiClient}function onUpdateUserComplete(result){if(Dashboard.hideLoadingMsg(),result.UserLinkResult){var msgKey=result.UserLinkResult.IsPending?"MessagePendingEmbyAccountAdded":"MessageEmbyAccountAdded";Dashboard.alert({message:Globalize.translate(msgKey),title:Globalize.translate("HeaderEmbyAccountAdded"),callback:function(){Dashboard.navigate("wizardlibrary.html")}})}else Dashboard.navigate("wizardlibrary.html")}function submit(form){Dashboard.showLoadingMsg();var apiClient=getApiClient();apiClient.ajax({type:"POST",data:{Name:form.querySelector("#txtUsername").value,ConnectUserName:form.querySelector("#txtConnectUserName").value},url:apiClient.getUrl("Startup/User"),dataType:"json"}).then(onUpdateUserComplete,function(){showEmbyConnectErrorMessage(form.querySelector("#txtConnectUserName").value)})}function showEmbyConnectErrorMessage(username){var msg;username?(msg=Globalize.translate("ErrorAddingEmbyConnectAccount1",'https://emby.media/connect'),msg+="

"+Globalize.translate("ErrorAddingEmbyConnectAccount2","apps@emby.media")):msg=Globalize.translate("DefaultErrorMessage"),Dashboard.alert({message:msg})}function onSubmit(){var form=this;return submit(form),!1}$(document).on("pageinit","#wizardUserPage",function(){$(".wizardUserForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#wizardUserPage",function(){Dashboard.showLoadingMsg();var page=this,apiClient=getApiClient();apiClient.getJSON(apiClient.getUrl("Startup/User")).then(function(user){page.querySelector("#txtUsername").value=user.Name||"",page.querySelector("#txtConnectUserName").value=user.ConnectUserName||"",Dashboard.hideLoadingMsg()})})}); \ No newline at end of file diff --git a/dashboard-ui/themes/halloween/style.css b/dashboard-ui/themes/halloween/style.css index 9feb2f9458..ce0304c124 100644 --- a/dashboard-ui/themes/halloween/style.css +++ b/dashboard-ui/themes/halloween/style.css @@ -1,41 +1 @@ -.ui-body-b h1, .ui-body-b h2 { - color: #FF9100; -} - -.viewMenuBar, .halloweenInfoButton { - color: #FF9100 !important; -} - -.barsMenuButton { - color: #FF9100 !important; -} - -.libraryViewNav .ui-btn-active { - border-bottom-color: #FF9100 !important; - color: #FF9100 !important; -} - -.button-submit, .button-accent { - background: #FF9100 !important; -} - -.channelTimeslotHeader, .timeslotHeader { - background: #FF9100 !important; -} - -.channelTimeslotHeader { - border-right-color: #FF9100 !important; -} - -.emby-tab-button-active, .ui-body-b .emby-tab-button-active { - color: #FF9100 !important; - border-color: #FF9100 !important; -} - -.darkDrawer .sidebarLink.selectedSidebarLink, .darkDrawer .selectedMediaFolder { - color: #FF9100 !important; -} - -.visualCardBox-cardFooter { - color: #FF9100; -} \ No newline at end of file +.ui-body-b h1,.ui-body-b h2{color:#FF9100}.barsMenuButton,.darkDrawer .selectedMediaFolder,.darkDrawer .sidebarLink.selectedSidebarLink,.halloweenInfoButton,.libraryViewNav .ui-btn-active,.viewMenuBar{color:#FF9100!important}.libraryViewNav .ui-btn-active{border-bottom-color:#FF9100!important}.button-accent,.button-submit,.channelTimeslotHeader,.timeslotHeader{background:#FF9100!important}.channelTimeslotHeader{border-right-color:#FF9100!important}.emby-tab-button-active,.ui-body-b .emby-tab-button-active{color:#FF9100!important;border-color:#FF9100!important}.visualCardBox-cardFooter{color:#FF9100} \ No newline at end of file diff --git a/dashboard-ui/themes/halloween/theme.js b/dashboard-ui/themes/halloween/theme.js index 014954e81e..3fbcf0ae64 100644 --- a/dashboard-ui/themes/halloween/theme.js +++ b/dashboard-ui/themes/halloween/theme.js @@ -1,125 +1 @@ -define(['appSettings', 'backdrop', 'browser', 'globalize', 'require', 'paper-icon-button-light'], function (appSettings, backdrop, browser, globalize, require) { - 'use strict'; - - var lastSound = 0; - var iconCreated; - var destroyed; - var currentSound; - var cancelKey = 'cancelHalloween2015'; - var cancelValue = '6'; - - function onPageShow() { - var page = this; - - if (!destroyed) { - - if (appSettings.get(cancelKey) == cancelValue) { - - destroyed = true; - return; - } - - if (!browser.mobile) { - - require(['css!./style.css']); - - if (!page.classList.contains('itemDetailPage')) { - backdrop.setBackdrop('themes/halloween/bg.jpg'); - } - - if (lastSound == 0) { - playSound('http://github.com/MediaBrowser/Emby.Resources/raw/master/themes/halloween/monsterparadefade.mp3', .1); - } else if ((new Date().getTime() - lastSound) > 30000) { - playSound('http://github.com/MediaBrowser/Emby.Resources/raw/master/themes/halloween/howl.wav'); - } - - addIcon(); - } - } - } - - function addIcon() { - - if (iconCreated) { - return; - } - - iconCreated = true; - - var viewMenuSecondary = document.querySelector('.viewMenuSecondary'); - - if (viewMenuSecondary) { - - var html = ''; - - viewMenuSecondary.insertAdjacentHTML('afterbegin', html); - - viewMenuSecondary.querySelector('.halloweenInfoButton').addEventListener('click', onIconClick); - } - } - - function onIconClick() { - - require(['dialog'], function (dialog) { - dialog({ - - title: "Happy Halloween", - text: "Happy Halloween from the Emby Team. We hope your Halloween is spooktacular! Would you like to allow the Halloween theme to continue?", - - buttons: [ - { - id: 'yes', - name: globalize.translate('ButtonYes'), - type: 'submit' - }, - { - id: 'no', - name: globalize.translate('ButtonNo'), - type: 'cancel' - } - ] - - }).then(function (result) { - if (result == 'no') { - destroyTheme(); - } - }); - }); - } - - function destroyTheme() { - - destroyed = true; - - var halloweenInfoButton = document.querySelector('.halloweenInfoButton'); - if (halloweenInfoButton) { - halloweenInfoButton.parentNode.removeChild(halloweenInfoButton); - } - - if (currentSound) { - currentSound.stop(); - } - - backdrop.clear(); - appSettings.set(cancelKey, cancelValue); - window.location.reload(true); - } - - pageClassOn('pageshow', "libraryPage", onPageShow); - - function playSound(path, volume) { - - require(['howler'], function (howler) { - - var sound = new Howl({ - urls: [path], - volume: volume || .3 - }); - - sound.play(); - currentSound = sound; - lastSound = new Date().getTime(); - }); - } - -}); \ No newline at end of file +define(["appSettings","backdrop","browser","globalize","require","paper-icon-button-light"],function(appSettings,backdrop,browser,globalize,require){"use strict";function onPageShow(){var page=this;if(!destroyed){if(appSettings.get(cancelKey)==cancelValue)return void(destroyed=!0);browser.mobile||(require(["css!./style.css"]),page.classList.contains("itemDetailPage")||backdrop.setBackdrop("themes/halloween/bg.jpg"),0==lastSound?playSound("http://github.com/MediaBrowser/Emby.Resources/raw/master/themes/halloween/monsterparadefade.mp3",.1):(new Date).getTime()-lastSound>3e4&&playSound("http://github.com/MediaBrowser/Emby.Resources/raw/master/themes/halloween/howl.wav"),addIcon())}}function addIcon(){if(!iconCreated){iconCreated=!0;var viewMenuSecondary=document.querySelector(".viewMenuSecondary");if(viewMenuSecondary){var html='';viewMenuSecondary.insertAdjacentHTML("afterbegin",html),viewMenuSecondary.querySelector(".halloweenInfoButton").addEventListener("click",onIconClick)}}}function onIconClick(){require(["dialog"],function(dialog){dialog({title:"Happy Halloween",text:"Happy Halloween from the Emby Team. We hope your Halloween is spooktacular! Would you like to allow the Halloween theme to continue?",buttons:[{id:"yes",name:globalize.translate("ButtonYes"),type:"submit"},{id:"no",name:globalize.translate("ButtonNo"),type:"cancel"}]}).then(function(result){"no"==result&&destroyTheme()})})}function destroyTheme(){destroyed=!0;var halloweenInfoButton=document.querySelector(".halloweenInfoButton");halloweenInfoButton&&halloweenInfoButton.parentNode.removeChild(halloweenInfoButton),currentSound&¤tSound.stop(),backdrop.clear(),appSettings.set(cancelKey,cancelValue),window.location.reload(!0)}function playSound(path,volume){require(["howler"],function(howler){var sound=new Howl({urls:[path],volume:volume||.3});sound.play(),currentSound=sound,lastSound=(new Date).getTime()})}var iconCreated,destroyed,currentSound,lastSound=0,cancelKey="cancelHalloween2015",cancelValue="6";pageClassOn("pageshow","libraryPage",onPageShow)}); \ No newline at end of file diff --git a/dashboard-ui/themes/holiday/style.css b/dashboard-ui/themes/holiday/style.css index 23dd540588..fb5ce6261f 100644 --- a/dashboard-ui/themes/holiday/style.css +++ b/dashboard-ui/themes/holiday/style.css @@ -1,65 +1 @@ -.background-theme-b .backgroundContainer.withBackdrop { - background: rgba(6, 6, 6, .86) !important; -} - -.ui-body-b h1, .ui-body-b h2 { - color: #E53A35; -} - -.holidayInfoButton { - color: #E53A35 !important; -} - -.libraryViewNav .ui-btn-active { - border-bottom-color: #AC3326 !important; - color: #AC3326 !important; -} - -.channelTimeslotHeader, .timeslotHeader { - background: #cc3333 !important; -} - -.channelTimeslotHeader { - border-right-color: #cc3333 !important; -} - -.playedIndicator { - background-color: #cc3333 !important; -} - -.darkDrawer .sidebarLink:hover { - background: #AC3326; -} - -.darkDrawer .sidebarLink.selectedSidebarLink, .darkDrawer .selectedMediaFolder { - background: #AC3326 !important; -} - -#snowflakeContainer { - position: absolute; - left: 0px; - top: 0px; - pointer-events: none; -} - -.snowflake { - padding-left: 15px; - font-family: Cambria, Georgia, serif; - font-size: 14px; - line-height: 24px; - position: fixed; - color: #FFFFFF; - user-select: none; - z-index: 1000; -} - - .snowflake:hover { - cursor: default; - } - -.christmas .mainDrawer { - background-image: url(https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/themes/holiday/drawer.jpg); - background-size: cover; - background-position: 60% center; - background-repeat: no-repeat; -} +.background-theme-b .backgroundContainer.withBackdrop{background:rgba(6,6,6,.86)!important}.ui-body-b h1,.ui-body-b h2{color:#E53A35}.holidayInfoButton{color:#E53A35!important}.libraryViewNav .ui-btn-active{border-bottom-color:#AC3326!important;color:#AC3326!important}.channelTimeslotHeader,.timeslotHeader{background:#c33!important}.channelTimeslotHeader{border-right-color:#c33!important}.playedIndicator{background-color:#c33!important}.darkDrawer .sidebarLink:hover{background:#AC3326}.darkDrawer .selectedMediaFolder,.darkDrawer .sidebarLink.selectedSidebarLink{background:#AC3326!important}#snowflakeContainer{position:absolute;left:0;top:0;pointer-events:none}.snowflake{padding-left:15px;font-family:Cambria,Georgia,serif;font-size:14px;line-height:24px;position:fixed;color:#FFF;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1000}.snowflake:hover{cursor:default}.christmas .mainDrawer{background-image:url(https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/themes/holiday/drawer.jpg);-webkit-background-size:cover;background-size:cover;background-position:60% center;background-repeat:no-repeat} \ No newline at end of file diff --git a/dashboard-ui/themes/holiday/theme.js b/dashboard-ui/themes/holiday/theme.js index 6b729054e3..30004e1116 100644 --- a/dashboard-ui/themes/holiday/theme.js +++ b/dashboard-ui/themes/holiday/theme.js @@ -1,409 +1 @@ -define(['appSettings', 'backdrop', 'browser', 'globalize', 'require', 'events', 'paper-icon-button-light'], function (appSettings, backdrop, browser, globalize, require, events) { - 'use strict'; - - var lastSound = 0; - var iconCreated; - var destroyed; - var currentSound; - - function onPageShow() { - - if (!browser.mobile) { - - if (getHolidayTheme() == 'off') { - return; - } - - var page = this; - - require(['css!./style.css']); - - if (!page.classList.contains('itemDetailPage')) { - setBackdrop(page); - } - - playThemeMusic(); - - addSnowflakes(); - - addIcon(); - - setBodyClass(); - } - } - - function playThemeMusic() { - - if (getHolidayTheme() == 'off') { - return; - } - - if (lastSound == 0) { - playSound('https://github.com/MediaBrowser/Emby.Resources/raw/master/themes/holiday/christmas.wav', .1); - } else if ((new Date().getTime() - lastSound) > 30000) { - playSound('https://github.com/MediaBrowser/Emby.Resources/raw/master/themes/holiday/sleighbells.wav', .25); - } - } - - function destroyTheme() { - - document.documentElement.classList.remove('christmas'); - stopSnowflakes(); - - if (currentSound) { - currentSound.stop(); - } - - var holidayInfoButton = document.querySelector('.holidayInfoButton'); - if (holidayInfoButton) { - holidayInfoButton.parentNode.removeChild(holidayInfoButton); - } - - backdrop.clear(); - window.location.reload(true); - } - - var snowFlakesInitialized; - function addSnowflakes() { - - if (!snowFlakesInitialized) { - snowFlakesInitialized = true; - document.body.insertAdjacentHTML('beforeend', '

*

'); - generateSnowflakes(); - events.on(MediaController, 'beforeplaybackstart', onPlaybackStart); - } - } - - function onPlaybackStart() { - - if (currentSound) { - currentSound.stop(); - } - - stopSnowflakes(); - } - - function setBackdrop(page) { - - if (!page.classList.contains('itemDetailPage')) { - - if (getHolidayTheme() == 'christmas') { - backdrop.setBackdrop('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/themes/holiday/bgc.jpg'); - } else { - backdrop.setBackdrop('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/themes/holiday/bg.jpg'); - } - } - } - - var holidayThemeKey = 'holidaytheme9'; - function getHolidayTheme() { - return appSettings.get(holidayThemeKey); - } - - function setHolidayTheme(value) { - appSettings.set(holidayThemeKey, value); - setBodyClass(); - playThemeMusic(); - } - - function setBodyClass() { - if (getHolidayTheme() == 'christmas') { - document.documentElement.classList.add('christmas'); - } else { - document.documentElement.classList.remove('christmas'); - } - } - - function onIconClick(e) { - - // todo: switch this to action sheet - - var items = []; - - var current = getHolidayTheme(); - - items.push({ - name: 'None', - id: 'none', - ironIcon: current == 'off' ? 'check' : null - }); - items.push({ - name: 'Joy!', - id: 'joy', - ironIcon: current != 'off' && current != 'christmas' ? 'check' : null - }); - - items.push({ - name: 'Christmas', - id: 'christmas', - ironIcon: current == 'christmas' ? 'check' : null - }); - - require(['actionsheet'], function (actionsheet) { - - actionsheet.show({ - title: 'Happy holidays from the Emby team! Select your holiday theme:', - items: items, - callback: function (id) { - - switch (id) { - - case 'none': - setHolidayTheme('off'); - destroyTheme(); - break; - case 'joy': - setHolidayTheme(''); - setBackdrop($.mobile.activePage); - break; - case 'christmas': - setHolidayTheme('christmas'); - setBackdrop($.mobile.activePage); - break; - default: - break; - } - } - }); - - }); - } - - function addIcon() { - - if (iconCreated) { - return; - } - - iconCreated = true; - - var viewMenuSecondary = document.querySelector('.viewMenuSecondary'); - - if (viewMenuSecondary) { - - var html = ''; - - viewMenuSecondary.insertAdjacentHTML('afterbegin', html); - - viewMenuSecondary.querySelector('.holidayInfoButton').addEventListener('click', onIconClick); - } - } - - pageClassOn('pageshow', "libraryPage", onPageShow); - - function playSound(path, volume) { - - require(['howler'], function (howler) { - - var sound = new Howl({ - urls: [path], - volume: volume || .3 - }); - - sound.play(); - currentSound = sound; - lastSound = new Date().getTime(); - }); - } - -}); - -(function () { - - // The star of every good animation - var requestAnimationFrame = window.requestAnimationFrame || - window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || - window.msRequestAnimationFrame; - - var transforms = ["transform", - "msTransform", - "webkitTransform", - "mozTransform", - "oTransform"]; - - var transformProperty = getSupportedPropertyName(transforms); - - // Array to store our Snowflake objects - var snowflakes = []; - - // Global variables to store our browser's window size - var browserWidth; - var browserHeight; - - // Specify the number of snowflakes you want visible - var numberOfSnowflakes = 50; - - // Flag to reset the position of the snowflakes - var resetPosition = false; - - // - // It all starts here... - // - function setup() { - window.addEventListener("resize", setResetFlag, false); - } - setup(); - - // - // Vendor prefix management - // - function getSupportedPropertyName(properties) { - for (var i = 0; i < properties.length; i++) { - if (typeof document.body.style[properties[i]] != "undefined") { - return properties[i]; - } - } - return null; - } - - // - // Constructor for our Snowflake object - // - function Snowflake(element, radius, speed, xPos, yPos) { - - // set initial snowflake properties - this.element = element; - this.radius = radius; - this.speed = speed; - this.xPos = xPos; - this.yPos = yPos; - - // declare variables used for snowflake's motion - this.counter = 0; - this.sign = Math.random() < 0.5 ? 1 : -1; - - // setting an initial opacity and size for our snowflake - this.element.style.opacity = .1 + Math.random(); - this.element.style.fontSize = 12 + Math.random() * 50 + "px"; - } - - // - // The function responsible for actually moving our snowflake - // - Snowflake.prototype.update = function () { - - // using some trigonometry to determine our x and y position - this.counter += this.speed / 5000; - this.xPos += this.sign * this.speed * Math.cos(this.counter) / 40; - this.yPos += Math.sin(this.counter) / 40 + this.speed / 30; - - // setting our snowflake's position - setTranslate3DTransform(this.element, Math.round(this.xPos), Math.round(this.yPos)); - - // if snowflake goes below the browser window, move it back to the top - if (this.yPos > browserHeight) { - this.yPos = -50; - } - } - - // - // A performant way to set your snowflake's position - // - function setTranslate3DTransform(element, xPosition, yPosition) { - var val = "translate3d(" + xPosition + "px, " + yPosition + "px" + ", 0)"; - element.style[transformProperty] = val; - } - - // - // The function responsible for creating the snowflake - // - function generateSnowflakes() { - - // get our snowflake element from the DOM and store it - var originalSnowflake = document.querySelector(".snowflake"); - - // access our snowflake element's parent container - var snowflakeContainer = originalSnowflake.parentNode; - - // get our browser's size - browserWidth = document.documentElement.clientWidth; - browserHeight = document.documentElement.clientHeight; - - // create each individual snowflake - for (var i = 0; i < numberOfSnowflakes; i++) { - - // clone our original snowflake and add it to snowflakeContainer - var snowflakeCopy = originalSnowflake.cloneNode(true); - snowflakeContainer.appendChild(snowflakeCopy); - - // set our snowflake's initial position and related properties - var initialXPos = getPosition(50, browserWidth); - var initialYPos = getPosition(50, browserHeight); - var speed = 5 + Math.random() * 40; - var radius = 4 + Math.random() * 10; - - // create our Snowflake object - var snowflakeObject = new Snowflake(snowflakeCopy, - radius, - speed, - initialXPos, - initialYPos); - snowflakes.push(snowflakeObject); - } - - // remove the original snowflake because we no longer need it visible - snowflakeContainer.removeChild(originalSnowflake); - - // call the moveSnowflakes function every 30 milliseconds - moveSnowflakes(); - } - - var stopped = false; - - window.generateSnowflakes = generateSnowflakes; - window.stopSnowflakes = function () { - stopped = true; - - var elems = document.querySelectorAll('.snowflake'); - for (var i = 0, length = elems.length; i < length; i++) { - elems[i].parentNode.removeChild(elems[i]); - } - }; - - // - // Responsible for moving each snowflake by calling its update function - // - function moveSnowflakes() { - - if (stopped) { - return; - } - - for (var i = 0; i < snowflakes.length; i++) { - var snowflake = snowflakes[i]; - snowflake.update(); - } - - // Reset the position of all the snowflakes to a new value - if (resetPosition) { - browserWidth = document.documentElement.clientWidth; - browserHeight = document.documentElement.clientHeight; - - for (var i = 0; i < snowflakes.length; i++) { - var snowflake = snowflakes[i]; - - snowflake.xPos = getPosition(50, browserWidth); - snowflake.yPos = getPosition(50, browserHeight); - } - - resetPosition = false; - } - - requestAnimationFrame(moveSnowflakes); - } - - // - // This function returns a number between (maximum - offset) and (maximum + offset) - // - function getPosition(offset, size) { - return Math.round(-1 * offset + Math.random() * (size + 2 * offset)); - } - - // - // Trigger a reset of all the snowflakes' positions - // - function setResetFlag(e) { - resetPosition = true; - } -})(); \ No newline at end of file +define(["appSettings","backdrop","browser","globalize","require","events","paper-icon-button-light"],function(appSettings,backdrop,browser,globalize,require,events){"use strict";function onPageShow(){if(!browser.mobile){if("off"==getHolidayTheme())return;var page=this;require(["css!./style.css"]),page.classList.contains("itemDetailPage")||setBackdrop(page),playThemeMusic(),addSnowflakes(),addIcon(),setBodyClass()}}function playThemeMusic(){"off"!=getHolidayTheme()&&(0==lastSound?playSound("https://github.com/MediaBrowser/Emby.Resources/raw/master/themes/holiday/christmas.wav",.1):(new Date).getTime()-lastSound>3e4&&playSound("https://github.com/MediaBrowser/Emby.Resources/raw/master/themes/holiday/sleighbells.wav",.25))}function destroyTheme(){document.documentElement.classList.remove("christmas"),stopSnowflakes(),currentSound&¤tSound.stop();var holidayInfoButton=document.querySelector(".holidayInfoButton");holidayInfoButton&&holidayInfoButton.parentNode.removeChild(holidayInfoButton),backdrop.clear(),window.location.reload(!0)}function addSnowflakes(){snowFlakesInitialized||(snowFlakesInitialized=!0,document.body.insertAdjacentHTML("beforeend",'

*

'),generateSnowflakes(),events.on(MediaController,"beforeplaybackstart",onPlaybackStart))}function onPlaybackStart(){currentSound&¤tSound.stop(),stopSnowflakes()}function setBackdrop(page){page.classList.contains("itemDetailPage")||("christmas"==getHolidayTheme()?backdrop.setBackdrop("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/themes/holiday/bgc.jpg"):backdrop.setBackdrop("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/themes/holiday/bg.jpg"))}function getHolidayTheme(){return appSettings.get(holidayThemeKey)}function setHolidayTheme(value){appSettings.set(holidayThemeKey,value),setBodyClass(),playThemeMusic()}function setBodyClass(){"christmas"==getHolidayTheme()?document.documentElement.classList.add("christmas"):document.documentElement.classList.remove("christmas")}function onIconClick(e){var items=[],current=getHolidayTheme();items.push({name:"None",id:"none",ironIcon:"off"==current?"check":null}),items.push({name:"Joy!",id:"joy",ironIcon:"off"!=current&&"christmas"!=current?"check":null}),items.push({name:"Christmas",id:"christmas",ironIcon:"christmas"==current?"check":null}),require(["actionsheet"],function(actionsheet){actionsheet.show({title:"Happy holidays from the Emby team! Select your holiday theme:",items:items,callback:function(id){switch(id){case"none":setHolidayTheme("off"),destroyTheme();break;case"joy":setHolidayTheme(""),setBackdrop($.mobile.activePage);break;case"christmas":setHolidayTheme("christmas"),setBackdrop($.mobile.activePage)}}})})}function addIcon(){if(!iconCreated){iconCreated=!0;var viewMenuSecondary=document.querySelector(".viewMenuSecondary");if(viewMenuSecondary){var html='';viewMenuSecondary.insertAdjacentHTML("afterbegin",html),viewMenuSecondary.querySelector(".holidayInfoButton").addEventListener("click",onIconClick)}}}function playSound(path,volume){require(["howler"],function(howler){var sound=new Howl({urls:[path],volume:volume||.3});sound.play(),currentSound=sound,lastSound=(new Date).getTime()})}var iconCreated,currentSound,snowFlakesInitialized,lastSound=0,holidayThemeKey="holidaytheme9";pageClassOn("pageshow","libraryPage",onPageShow)}),function(){function setup(){window.addEventListener("resize",setResetFlag,!1)}function getSupportedPropertyName(properties){for(var i=0;ibrowserHeight&&(this.yPos=-50)};var stopped=!1;window.generateSnowflakes=generateSnowflakes,window.stopSnowflakes=function(){stopped=!0;for(var elems=document.querySelectorAll(".snowflake"),i=0,length=elems.length;i li { - margin: 0; - padding: 0; - list-style: none; - border-color: #ddd; - } - -/*.ui-content ul[data-role="listview"], -.ui-panel-inner > ul[data-role="listview"] { - margin: 1em 0; -}*/ - -.ui-collapsible-content > ul[data-role="listview"] { - margin: .5em 0; -} - -ul[data-role="listview"] > li { - display: block; - position: relative; - overflow: visible; -} - - ul[data-role="listview"] > li, - ul[data-role="listview"] > li[data-role="list-divider"], - ul[data-role="listview"] > li > a { - margin: 0; - display: block; - position: relative; - text-align: left; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - color: inherit !important; - font-weight: inherit !important; - font-size: inherit !important; - } - -ul[data-role="listview"] > li[data-role="list-divider"] { - background: #ddd; -} - -ul[data-role="listview"] > li > a:focus { - z-index: 1; -} - -ul[data-role="listview"] > li, -ul[data-role="listview"] > li[data-role="list-divider"] { - border-width: 1px 0 0 0; - border-style: solid; -} - - ul[data-role="listview"] > li, - ul[data-role="listview"] > li[data-role="list-divider"] { - border-right-width: 1px; - border-left-width: 1px; - } - - ul[data-role="listview"] > li:last-child, - ul[data-role="listview"] > li[data-role="list-divider"]:last-child, - ul[data-role="listview"] > li:last-child > a { - border-bottom-width: 1px; - } - -.ui-collapsible-content > ul[data-role="listview"]:not(ul[data-role="listview"]) > li:first-child, -.ui-collapsible-content > ul[data-role="listview"]:not(ul[data-role="listview"]) > li:first-child > a { - border-top-width: 0; -} - -.ui-collapsible-themed-content ul[data-role="listview"]:not(ul[data-role="listview"]) > li:last-child, -.ui-collapsible-themed-content ul[data-role="listview"]:not(ul[data-role="listview"]) > li:last-child > a { - border-bottom-width: 0; -} - -ul[data-role="listview"] > li:first-child, -ul[data-role="listview"] > li:first-child > a { - -webkit-border-top-right-radius: inherit; - border-top-right-radius: inherit; - -webkit-border-top-left-radius: inherit; - border-top-left-radius: inherit; -} - -ul[data-role="listview"] > li:last-child, -ul[data-role="listview"] > li:last-child > a { - -webkit-border-bottom-right-radius: inherit; - border-bottom-right-radius: inherit; - -webkit-border-bottom-left-radius: inherit; - border-bottom-left-radius: inherit; -} - -ul[data-role="listview"] > li.ui-li-has-alt > a { - -webkit-border-top-right-radius: 0; - border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; -} - -ul[data-role="listview"] > li:first-child > a + a { - -webkit-border-top-left-radius: 0; - border-top-left-radius: 0; - -webkit-border-top-right-radius: inherit; - border-top-right-radius: inherit; -} - -ul[data-role="listview"] > li:last-child > a + a { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -webkit-border-bottom-right-radius: inherit; - border-bottom-right-radius: inherit; -} - -ul[data-role="listview"] > li:first-child img:first-child:not(.ui-li-icon) { - -webkit-border-top-left-radius: inherit; - border-top-left-radius: inherit; -} - -ul[data-role="listview"] > li:last-child img:first-child:not(.ui-li-icon) { - -webkit-border-bottom-left-radius: inherit; - border-bottom-left-radius: inherit; -} - -.ui-collapsible-content > ul[data-role="listview"]:not(ul[data-role="listview"]) { - -webkit-border-radius: inherit; - border-radius: inherit; -} - -ul[data-role="listview"] > li { - padding: .7em 1em; -} - - ul[data-role="listview"] > li[data-role="list-divider"] { - padding: .5em 1.143em; - font-size: 14px; - font-weight: bold; - cursor: default; - outline: 0; /* Dividers in custom selectmenus have tabindex */ - } - - ul[data-role="listview"] > .ui-li-has-count > a, - ul[data-role="listview"] > .ui-li-static.ui-li-has-count, - ul[data-role="listview"] > li[data-role="list-divider"].ui-li-has-count { - padding-right: 2.8125em; - } - -ul[data-role="listview"] > .ui-li-has-count > .ui-btn-icon-right { - padding-right: 4.6875em; -} - -ul[data-role="listview"] > .ui-li-has-thumb > a, -ul[data-role="listview"] > .ui-li-static.ui-li-has-thumb { - min-height: 3.625em; - padding-left: 6.25em; -} -/* ui-li-has-icon deprecated in 1.4. TODO: remove in 1.5 */ -ul[data-role="listview"] > .ui-li-has-icon > a, -ul[data-role="listview"] > a + a { - min-height: 1.25em; - padding-left: 2.5em; -} -/* Used by both listview and custom multiple select button */ -.ui-li-count { - position: absolute; - font-size: 12.5px; - font-weight: bold; - text-align: center; - border-width: 1px; - border-style: solid; - padding: 0 .48em; - line-height: 1.6em; - min-height: 1.6em; - min-width: .64em; - right: .8em; - top: 50%; - margin-top: -.88em; -} - -ul[data-role="listview"] .ui-btn-icon-right .ui-li-count { - right: 3.2em; -} - -ul[data-role="listview"] > li h1, -ul[data-role="listview"] > li h2, -ul[data-role="listview"] > li h3, -ul[data-role="listview"] > li h4, -ul[data-role="listview"] > li h5, -ul[data-role="listview"] > li h6 { - font-size: 1em; - display: block; - margin: .45em 0; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} - -ul[data-role="listview"] > li p { - font-size: .75em; - font-weight: normal; - display: block; - margin: .6em 0; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} - -ul[data-role="listview"] .ui-li-aside { - position: absolute; - top: 1em; - right: 3.333em; - margin: 0; - text-align: right; -} - -ul[data-role="listview"] > li.ui-li-has-alt > a { - margin-right: 2.5em; - border-right-width: 0; -} - -ul[data-role="listview"] > li > a + a { - position: absolute; - width: 2.5em; - height: 100%; - min-height: auto; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - border-left-width: 1px; - top: 0; - right: 0; - margin: 0; - padding: 0; - z-index: 2; -} - -ul[data-role="listview"] > li > a + a { - border-right-width: 1px; -} - - ul[data-role="listview"] > li > a + a:focus { - z-index: 3; - } +ul[data-role=listview]{-webkit-border-radius:3px;border-radius:3px}ul[data-role=listview],ul[data-role=listview]>li{margin:0;padding:0;list-style:none;border-color:#ddd}.ui-collapsible-content>ul[data-role=listview]{margin:.5em 0}ul[data-role=listview]>li,ul[data-role=listview]>li>a,ul[data-role=listview]>li[data-role=list-divider]{margin:0;display:block;position:relative;text-align:left;-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:inherit!important;font-weight:inherit!important;font-size:inherit!important}ul[data-role=listview]>li>a:focus{z-index:1}ul[data-role=listview]>li,ul[data-role=listview]>li[data-role=list-divider]{border-width:1px 1px 0;border-style:solid}ul[data-role=listview]>li:last-child,ul[data-role=listview]>li:last-child>a,ul[data-role=listview]>li[data-role=list-divider]:last-child{border-bottom-width:1px}.ui-collapsible-content>ul[data-role=listview]:not(ul[data-role=listview])>li:first-child,.ui-collapsible-content>ul[data-role=listview]:not(ul[data-role=listview])>li:first-child>a{border-top-width:0}.ui-collapsible-themed-content ul[data-role=listview]:not(ul[data-role=listview])>li:last-child,.ui-collapsible-themed-content ul[data-role=listview]:not(ul[data-role=listview])>li:last-child>a{border-bottom-width:0}ul[data-role=listview]>li:first-child,ul[data-role=listview]>li:first-child>a{-webkit-border-top-right-radius:inherit;border-top-right-radius:inherit;-webkit-border-top-left-radius:inherit;border-top-left-radius:inherit}ul[data-role=listview]>li:last-child,ul[data-role=listview]>li:last-child>a{-webkit-border-bottom-right-radius:inherit;border-bottom-right-radius:inherit;-webkit-border-bottom-left-radius:inherit;border-bottom-left-radius:inherit}ul[data-role=listview]>li.ui-li-has-alt>a{-webkit-border-top-right-radius:0;border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}ul[data-role=listview]>li:first-child>a+a{-webkit-border-top-left-radius:0;border-top-left-radius:0;-webkit-border-top-right-radius:inherit;border-top-right-radius:inherit}ul[data-role=listview]>li:last-child>a+a{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:inherit;border-bottom-right-radius:inherit}ul[data-role=listview]>li:first-child img:first-child:not(.ui-li-icon){-webkit-border-top-left-radius:inherit;border-top-left-radius:inherit}ul[data-role=listview]>li:last-child img:first-child:not(.ui-li-icon){-webkit-border-bottom-left-radius:inherit;border-bottom-left-radius:inherit}.ui-collapsible-content>ul[data-role=listview]:not(ul[data-role=listview]){-webkit-border-radius:inherit;border-radius:inherit}ul[data-role=listview]>li{padding:.7em 1em}ul[data-role=listview]>li[data-role=list-divider]{background:#ddd;padding:.5em 1.143em;font-size:14px;font-weight:700;cursor:default;outline:0}ul[data-role=listview]>.ui-li-has-count>a,ul[data-role=listview]>.ui-li-static.ui-li-has-count,ul[data-role=listview]>li[data-role=list-divider].ui-li-has-count{padding-right:2.8125em}ul[data-role=listview]>.ui-li-has-count>.ui-btn-icon-right{padding-right:4.6875em}ul[data-role=listview]>.ui-li-has-thumb>a,ul[data-role=listview]>.ui-li-static.ui-li-has-thumb{min-height:3.625em;padding-left:6.25em}ul[data-role=listview]>.ui-li-has-icon>a,ul[data-role=listview]>a+a{min-height:1.25em;padding-left:2.5em}.ui-li-count{position:absolute;font-size:12.5px;font-weight:700;text-align:center;border-width:1px;border-style:solid;padding:0 .48em;line-height:1.6em;min-height:1.6em;min-width:.64em;right:.8em;top:50%;margin-top:-.88em}ul[data-role=listview] .ui-btn-icon-right .ui-li-count{right:3.2em}ul[data-role=listview]>li h1,ul[data-role=listview]>li h2,ul[data-role=listview]>li h3,ul[data-role=listview]>li h4,ul[data-role=listview]>li h5,ul[data-role=listview]>li h6{font-size:1em;display:block;margin:.45em 0;-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}ul[data-role=listview]>li p{font-size:.75em;font-weight:400;display:block;margin:.6em 0;-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}ul[data-role=listview] .ui-li-aside{position:absolute;top:1em;right:3.333em;margin:0;text-align:right}ul[data-role=listview]>li.ui-li-has-alt>a{margin-right:2.5em;border-right-width:0}ul[data-role=listview]>li>a+a{position:absolute;width:2.5em;height:100%;min-height:auto;-webkit-box-sizing:border-box;box-sizing:border-box;border-left-width:1px;top:0;right:0;margin:0;padding:0;z-index:2;border-right-width:1px}ul[data-role=listview]>li>a+a:focus{z-index:3} \ No newline at end of file diff --git a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.panel.css b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.panel.css index 929f626c90..360cbfaf90 100644 --- a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.panel.css +++ b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.panel.css @@ -1,288 +1 @@ -/* "page" containers - full-screen views, one should always be in view post-pageload */ -.ui-mobile [data-role=dialog] { - top: 0; - left: 0; - width: 100%; - min-height: 100%; - position: absolute; - border: 0; -} - -/* preset breakpoint to switch to stacked grid styles below 35em (560px) */ -@media (max-width: 35em) { - .ui-responsive > .ui-block-a, - .ui-responsive > .ui-block-b, - .ui-responsive > .ui-block-c, - .ui-responsive > .ui-block-d, - .ui-responsive > .ui-block-e { - width: 100%; - float: none; - } -} - -/* Panel */ -.ui-panel { - width: 17em; - min-height: 100%; - max-height: none; - border-width: 0; - position: absolute; - top: 0; - display: block; -} - -.ui-panel-closed { - width: 0; - max-height: 100%; - overflow: hidden; - visibility: hidden; - left: 0; - clip: rect(1px,1px,1px,1px); -} - -.ui-panel-fixed { - position: fixed; - bottom: -1px; /* Fixes gap on Chrome for Android */ - padding-bottom: 1px; -} - -.ui-panel-display-reveal { - z-index: 1; -} - -.ui-panel-display-push { - z-index: 999; -} - -.ui-panel-display-overlay { - z-index: 1001; /* Fixed toolbars have z-index 1000 */ -} - -.ui-panel-inner { - padding: 1em; -} - -/* Container, page and wrapper */ -.ui-panel-page-container { - overflow-x: visible; -} - -.ui-panel-page-container-themed .ui-page-active { - background: none; -} - -.ui-panel-wrapper { - position: relative; - min-height: inherit; - border: 0; - overflow-x: hidden; - z-index: 999; -} - -/* Fixed toolbars */ -.ui-panel-fixed-toolbar { - overflow-x: hidden; -} - -/* Dismiss */ -.ui-panel-dismiss { - position: absolute; - top: 0; - left: 0; - right: 0; - height: 100%; - z-index: 1002; - display: none; -} - -.ui-panel-dismiss-open { - display: block; -} - -/* Animate class is added to panel, wrapper and fixed toolbars */ -.ui-panel-animate { - -webkit-transition: -webkit-transform 300ms ease; - -webkit-transition-duration: 300ms; - -moz-transition: -moz-transform 300ms ease; - transition: transform 300ms ease; -} - -/* Fix for Windows Phone issue #6349: unset the transition for transforms in case of fixed toolbars. */ -@media screen and ( max-device-width: 768px ) { - .ui-page-header-fixed .ui-panel-animate.ui-panel-wrapper, - .ui-page-footer-fixed .ui-panel-animate.ui-panel-wrapper, - .ui-panel-animate.ui-panel-fixed-toolbar { - -ms-transition: none; - } - /* We need a transitionend event ... */ - .ui-panel-animate.ui-panel-fixed-toolbar { - -ms-transition: -ms-transform 1ms; - -ms-transform: rotate(0deg); - } -} - -/* Hardware acceleration for smoother transitions on WebKit browsers */ -.ui-panel-animate.ui-panel:not(.ui-panel-display-reveal) { - -webkit-backface-visibility: hidden; - -webkit-transform: translate3d(0,0,0); -} - -/* Panel positioning (for overlay and push) */ -/* Panel left closed */ -.ui-panel-position-left { - left: -17em; -} -/* Panel left closed animated */ -.ui-panel-animate.ui-panel-position-left.ui-panel-display-overlay, -.ui-panel-animate.ui-panel-position-left.ui-panel-display-push { - left: 0; - -webkit-transform: translate3d(-17em,0,0); - -moz-transform: translate3d(-17em,0,0); - transform: translate3d(-17em,0,0); -} -/* Panel left open */ -.ui-panel-position-left.ui-panel-display-reveal, /* Unset "panel left closed" for reveal */ -.ui-panel-open.ui-panel-position-left { - left: 0; -} -/* Panel left open animated */ -.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-overlay, -.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-push { - -webkit-transform: translate3d(0,0,0); - transform: translate3d(0,0,0); - -moz-transform: none; -} -/* Panel right closed */ -.ui-panel-position-right { - right: -17em; -} -/* Panel right closed animated */ -.ui-panel-animate.ui-panel-position-right.ui-panel-display-overlay, -.ui-panel-animate.ui-panel-position-right.ui-panel-display-push { - right: 0; - -webkit-transform: translate3d(17em,0,0); - -moz-transform: translate3d(17em,0,0); - transform: translate3d(17em,0,0); -} -/* Panel right open */ -.ui-panel-position-right.ui-panel-display-reveal, /* Unset "panel right closed" for reveal */ -.ui-panel-position-right.ui-panel-open { - right: 0; -} -/* Panel right open animated */ -.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-overlay, -.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-push { - -webkit-transform: translate3d(0,0,0); - transform: translate3d(0,0,0); - -moz-transform: none; -} - -/* Wrapper and fixed toolbars positioning (for reveal and push) */ -/* Panel left open */ -.ui-panel-page-content-position-left { - left: 17em; - right: -17em; -} -/* Panel left open animated */ -.ui-panel-animate.ui-panel-page-content-position-left { - left: 0; - right: 0; - -webkit-transform: translate3d(17em,0,0); - -moz-transform: translate3d(17em,0,0); - transform: translate3d(17em,0,0); -} -/* Panel right open */ -.ui-panel-page-content-position-right { - left: -17em; - right: 17em; -} -/* Panel right open animated */ -.ui-panel-animate.ui-panel-page-content-position-right { - left: 0; - right: 0; - -webkit-transform: translate3d(-17em,0,0); - -moz-transform: translate3d(-17em,0,0); - transform: translate3d(-17em,0,0); -} - -/* Dismiss model open */ -.ui-panel-dismiss-open.ui-panel-dismiss-position-left { - left: 17em; -} - -.ui-panel-dismiss-open.ui-panel-dismiss-position-right { - right: 17em; -} - -/* Shadows and borders */ -.ui-panel-display-reveal { - -webkit-box-shadow: inset -5px 0 5px rgba(0,0,0,.15); - -moz-box-shadow: inset -5px 0 5px rgba(0,0,0,.15); - box-shadow: inset -5px 0 5px rgba(0,0,0,.15); -} - -.ui-panel-position-right.ui-panel-display-reveal { - -webkit-box-shadow: inset 5px 0 5px rgba(0,0,0,.15); - -moz-box-shadow: inset 5px 0 5px rgba(0,0,0,.15); - box-shadow: inset 5px 0 5px rgba(0,0,0,.15); -} - -.ui-panel-display-overlay { - -webkit-box-shadow: 5px 0 5px rgba(0,0,0,.15); - -moz-box-shadow: 5px 0 5px rgba(0,0,0,.15); - box-shadow: 5px 0 5px rgba(0,0,0,.15); -} - -.ui-panel-position-right.ui-panel-display-overlay { - -webkit-box-shadow: -5px 0 5px rgba(0,0,0,.15); - -moz-box-shadow: -5px 0 5px rgba(0,0,0,.15); - box-shadow: -5px 0 5px rgba(0,0,0,.15); -} - -.ui-panel-open.ui-panel-position-left.ui-panel-display-push { - border-right-width: 1px; - margin-right: -1px; -} - -.ui-panel-page-content-position-left.ui-panel-page-content-display-push { - margin-left: 1px; - width: auto; -} - -.ui-panel-open.ui-panel-position-right.ui-panel-display-push { - border-left-width: 1px; - margin-left: -1px; -} - -.ui-panel-page-content-position-right.ui-panel-page-content-display-push { - margin-right: 1px; - width: auto; -} - -/* Responsive: wrap on wide viewports once open */ -@media (min-width:55em) { - .ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-left { - margin-right: 17em; - } - - .ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-right { - margin-left: 17em; - } - - .ui-responsive-panel .ui-panel-page-content-open { - width: auto; - } - - .ui-responsive-panel .ui-panel-dismiss-display-push, - .ui-responsive-panel.ui-page-active ~ .ui-panel-dismiss-display-push { - display: none; - } -} - -.ui-body-a.ui-panel { - background-color: #fff; -} - -.ui-body-b.ui-panel { - background-color: #222; -} +.ui-mobile [data-role=dialog],.ui-panel{min-height:100%;position:absolute;top:0}.ui-mobile [data-role=dialog]{left:0;width:100%;border:0}@media (max-width:35em){.ui-responsive>.ui-block-a,.ui-responsive>.ui-block-b,.ui-responsive>.ui-block-c,.ui-responsive>.ui-block-d,.ui-responsive>.ui-block-e{width:100%;float:none}}.ui-panel{width:17em;max-height:none;border-width:0;display:block}.ui-panel-closed{width:0;max-height:100%;overflow:hidden;visibility:hidden;left:0;clip:rect(1px,1px,1px,1px)}.ui-panel-fixed{position:fixed;bottom:-1px;padding-bottom:1px}.ui-panel-display-reveal{z-index:1;-webkit-box-shadow:inset -5px 0 5px rgba(0,0,0,.15);box-shadow:inset -5px 0 5px rgba(0,0,0,.15)}.ui-panel-display-push{z-index:999}.ui-panel-display-overlay{z-index:1001}.ui-panel-inner{padding:1em}.ui-panel-page-container{overflow-x:visible}.ui-panel-fixed-toolbar,.ui-panel-wrapper{overflow-x:hidden}.ui-panel-page-container-themed .ui-page-active{background:0 0}.ui-panel-wrapper{position:relative;min-height:inherit;border:0;z-index:999}.ui-panel-dismiss{position:absolute;top:0;left:0;right:0;height:100%;z-index:1002;display:none}.ui-panel-dismiss-open{display:block}.ui-panel-animate{-webkit-transition:-webkit-transform .3s ease;-o-transition:transform .3s ease;transition:transform .3s ease}@media screen and (max-device-width:768px){.ui-page-footer-fixed .ui-panel-animate.ui-panel-wrapper,.ui-page-header-fixed .ui-panel-animate.ui-panel-wrapper,.ui-panel-animate.ui-panel-fixed-toolbar{-ms-transition:none}.ui-panel-animate.ui-panel-fixed-toolbar{-ms-transition:-ms-transform 1ms;-ms-transform:rotate(0)}}.ui-panel-animate.ui-panel:not(.ui-panel-display-reveal){-webkit-backface-visibility:hidden;-webkit-transform:translate3d(0,0,0)}.ui-panel-position-left{left:-17em}.ui-panel-animate.ui-panel-position-left.ui-panel-display-overlay,.ui-panel-animate.ui-panel-position-left.ui-panel-display-push{left:0;-webkit-transform:translate3d(-17em,0,0);transform:translate3d(-17em,0,0)}.ui-panel-open.ui-panel-position-left,.ui-panel-position-left.ui-panel-display-reveal{left:0}.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-overlay,.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-push{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-moz-transform:none}.ui-panel-position-right{right:-17em}.ui-panel-animate.ui-panel-position-right.ui-panel-display-overlay,.ui-panel-animate.ui-panel-position-right.ui-panel-display-push{right:0;-webkit-transform:translate3d(17em,0,0);transform:translate3d(17em,0,0)}.ui-panel-position-right.ui-panel-display-reveal,.ui-panel-position-right.ui-panel-open{right:0}.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-overlay,.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-push{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-moz-transform:none}.ui-panel-page-content-position-left{left:17em;right:-17em}.ui-panel-animate.ui-panel-page-content-position-left{left:0;right:0;-webkit-transform:translate3d(17em,0,0);transform:translate3d(17em,0,0)}.ui-panel-page-content-position-right{left:-17em;right:17em}.ui-panel-animate.ui-panel-page-content-position-right{left:0;right:0;-webkit-transform:translate3d(-17em,0,0);transform:translate3d(-17em,0,0)}.ui-panel-dismiss-open.ui-panel-dismiss-position-left{left:17em}.ui-panel-dismiss-open.ui-panel-dismiss-position-right{right:17em}.ui-panel-position-right.ui-panel-display-reveal{-webkit-box-shadow:inset 5px 0 5px rgba(0,0,0,.15);box-shadow:inset 5px 0 5px rgba(0,0,0,.15)}.ui-panel-display-overlay{-webkit-box-shadow:5px 0 5px rgba(0,0,0,.15);box-shadow:5px 0 5px rgba(0,0,0,.15)}.ui-panel-position-right.ui-panel-display-overlay{-webkit-box-shadow:-5px 0 5px rgba(0,0,0,.15);box-shadow:-5px 0 5px rgba(0,0,0,.15)}.ui-panel-open.ui-panel-position-left.ui-panel-display-push{border-right-width:1px;margin-right:-1px}.ui-panel-page-content-position-left.ui-panel-page-content-display-push{margin-left:1px;width:auto}.ui-panel-open.ui-panel-position-right.ui-panel-display-push{border-left-width:1px;margin-left:-1px}.ui-panel-page-content-position-right.ui-panel-page-content-display-push{margin-right:1px;width:auto}@media (min-width:55em){.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-left{margin-right:17em}.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-right{margin-left:17em}.ui-responsive-panel .ui-panel-page-content-open{width:auto}.ui-responsive-panel .ui-panel-dismiss-display-push,.ui-responsive-panel.ui-page-active~.ui-panel-dismiss-display-push{display:none}}.ui-body-a.ui-panel{background-color:#fff}.ui-body-b.ui-panel{background-color:#222} \ No newline at end of file diff --git a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.panel.js b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.panel.js index 0a7cb9b3b6..a391844311 100644 --- a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.panel.js +++ b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.panel.js @@ -1,531 +1 @@ -define(['jqmwidget'], function () { - - (function ($, undefined) { - var props = { - "animation": {}, - "transition": {} - }, - testElement = document.createElement("a"), - vendorPrefixes = ["", "webkit-", "moz-", "o-"]; - - $.each(["animation", "transition"], function (i, test) { - - // Get correct name for test - var testName = (i === 0) ? test + "-" + "name" : test; - - $.each(vendorPrefixes, function (j, prefix) { - if (testElement.style[$.camelCase(prefix + testName)] !== undefined) { - props[test]["prefix"] = prefix; - return false; - } - }); - - // Set event and duration names for later use - props[test]["duration"] = - $.camelCase(props[test]["prefix"] + test + "-" + "duration"); - props[test]["event"] = - $.camelCase(props[test]["prefix"] + test + "-" + "end"); - - // All lower case if not a vendor prop - if (props[test]["prefix"] === "") { - props[test]["event"] = props[test]["event"].toLowerCase(); - } - }); - - // Remove the testElement - $(testElement).remove(); - - // Animation complete callback - $.fn.animationComplete = function (callback, type, fallbackTime) { - var timer, duration, - that = this, - eventBinding = function () { - - // Clear the timer so we don't call callback twice - clearTimeout(timer); - callback.apply(this, arguments); - }, - animationType = (!type || type === "animation") ? "animation" : "transition"; - - // If a fallback time was not passed set one - if (fallbackTime === undefined) { - - // Make sure the was not bound to document before checking .css - if ($(this).context !== document) { - - // Parse the durration since its in second multiple by 1000 for milliseconds - // Multiply by 3 to make sure we give the animation plenty of time. - duration = parseFloat( - $(this).css(props[animationType].duration) - ) * 3000; - } - - // If we could not read a duration use the default - if (duration === 0 || duration === undefined || isNaN(duration)) { - duration = $.fn.animationComplete.defaultDuration; - } - } - - // Sets up the fallback if event never comes - timer = setTimeout(function () { - $(that).off(props[animationType].event, eventBinding); - callback.apply(that); - }, duration); - - // Bind the event - return $(this).one(props[animationType].event, eventBinding); - }; - - // Allow default callback to be configured on mobileInit - $.fn.animationComplete.defaultDuration = 1000; - })(jQuery); - - (function ($, undefined) { - - $.widget("mobile.panel", { - options: { - animate: true, - theme: null, - position: "left", - dismissible: true, - display: "overlay", //accepts reveal, push, overlay - swipeClose: true, - positionFixed: true - }, - - _parentPage: null, - _page: null, - _modal: null, - _panelInner: null, - _wrapper: null, - - _create: function () { - var el = this.element, - parentPage = el.closest(".ui-page, [data-role='page']"); - - // expose some private props to other methods - $.extend(this, { - _parentPage: (parentPage.length > 0) ? parentPage : false, - _openedPage: null, - _page: this._getPage, - _panelInner: this._getPanelInner() - }); - if (this.options.display !== "overlay") { - this._getWrapper(); - } - this._addPanelClasses(); - - // if animating, add the class to do so - if (!!this.options.animate) { - this.element.addClass("ui-panel-animate"); - } - - this._bindUpdateLayout(); - this._bindCloseEvents(); - this._bindLinkListeners(); - this._bindPageEvents(); - - if (!!this.options.dismissible) { - this._createModal(); - } - - this._bindSwipeEvents(); - }, - - _getPanelInner: function () { - var panelInner = this.element[0].querySelector("." + "ui-panel-inner"); - if (!panelInner) { - panelInner = this.element.children().wrapAll("
").parent(); - } else { - panelInner = $(panelInner); - } - - return panelInner; - }, - - _createModal: function () { - var self = this, - target = self._parentPage ? self._parentPage.parent() : self.element.parent(); - - self._modal = $("
") - .on("mousedown", function () { - self.close(); - }) - .appendTo(target); - }, - - _getPage: function () { - var page = this._openedPage || this._parentPage || $(".ui-page-active"); - - return page; - }, - - _getWrapper: function () { - var wrapper = this._page().find("." + "ui-panel-wrapper"); - if (wrapper.length === 0) { - wrapper = this._page().children(".ui-header:not(.ui-header-fixed), .ui-content:not(.ui-popup), .ui-footer:not(.ui-footer-fixed)") - .wrapAll("
") - .parent(); - } - - this._wrapper = wrapper; - }, - - _getPosDisplayClasses: function (prefix) { - return prefix + "-position-right " + prefix + "-display-" + this.options.display; - }, - - _getPanelClasses: function () { - var panelClasses = "ui-panel" + - " " + this._getPosDisplayClasses("ui-panel") + - " " + "ui-panel-closed" + - " " + "ui-body-" + (this.options.theme ? this.options.theme : "inherit"); - - if (!!this.options.positionFixed) { - panelClasses += " " + "ui-panel-fixed"; - } - - return panelClasses; - }, - - _addPanelClasses: function () { - this.element.addClass(this._getPanelClasses()); - }, - - _handleCloseClick: function (event) { - if (!event.isDefaultPrevented()) { - this.close(); - } - }, - - _bindCloseEvents: function () { - }, - - _positionPanel: function (scrollToTop) { - var self = this, - panelInnerHeight = self._panelInner.outerHeight(), - expand = panelInnerHeight > (window.innerHeight || $(window).height()); - - if (expand || !self.options.positionFixed) { - if (expand) { - self._unfixPanel(); - } - if (scrollToTop) { - this.window[0].scrollTo(0, $.mobile.defaultHomeScroll); - } - } else { - self._fixPanel(); - } - }, - - _bindFixListener: function () { - this._on($(window), { "resize": "_positionPanel" }); - }, - - _unbindFixListener: function () { - this._off($(window), "resize"); - }, - - _unfixPanel: function () { - if (!!this.options.positionFixed) { - this.element.removeClass("ui-panel-fixed"); - } - }, - - _fixPanel: function () { - if (!!this.options.positionFixed) { - this.element.addClass("ui-panel-fixed"); - } - }, - - _bindUpdateLayout: function () { - var self = this; - - self.element.on("updatelayout", function (/* e */) { - if (self._open) { - self._positionPanel(); - } - }); - }, - - _bindLinkListeners: function () { - this._on("body", { - "click a": "_handleClick" - }); - - }, - - _handleClick: function (e) { - var link, - panelId = this.element.attr("id"); - - if (e.currentTarget.href.split("#")[1] === panelId && panelId !== undefined) { - - e.preventDefault(); - link = $(e.target); - if (link.hasClass("ui-btn")) { - link.addClass($.mobile.activeBtnClass); - this.element.one("panelopen panelclose", function () { - link.removeClass($.mobile.activeBtnClass); - }); - } - this.toggle(); - } - }, - - _bindSwipeEvents: function () { - var self = this, - area = self._modal ? self.element.add(self._modal) : self.element; - - // on swipe, close the panel - if (!!self.options.swipeClose) { - if (self.options.position === "left") { - area.on("swipeleft.panel", function (/* e */) { - self.close(); - }); - } else { - area.on("swiperight.panel", function (/* e */) { - self.close(); - }); - } - } - }, - - _bindPageEvents: function () { - var self = this; - - this.document - // Close the panel if another panel on the page opens - .on("panelbeforeopen", function (e) { - if (self._open && e.target !== self.element[0]) { - self.close(); - } - }) - // On escape, close? might need to have a target check too... - .on("keyup.panel", function (e) { - if (e.keyCode === 27 && self._open) { - self.close(); - } - }); - if (!this._parentPage && this.options.display !== "overlay") { - this._on(this.document, { - "pageshow": function () { - this._openedPage = null; - this._getWrapper(); - } - }); - } - // Clean up open panels after page hide - if (self._parentPage) { - this.document.on("pagehide", "[data-role='page']", function () { - if (self._open) { - self.close(true); - } - }); - } else { - this.document.on("pagebeforehide", function () { - if (self._open) { - self.close(true); - } - }); - } - }, - - // state storage of open or closed - _open: false, - _pageContentOpenClasses: null, - _modalOpenClasses: null, - - open: function (immediate) { - if (!this._open) { - var self = this, - o = self.options, - - _openPanel = function () { - self._off(self.document, "panelclose"); - self._page().data("panel", "open"); - - if (!!o.animate && o.display !== "overlay") { - self._wrapper.addClass("ui-panel-animate"); - } - - if (!immediate && !!o.animate) { - (self._wrapper || self.element) - .animationComplete(complete, "transition"); - } else { - setTimeout(complete, 0); - } - - if (o.theme && o.display !== "overlay") { - self._page().parent() - .addClass("ui-panel-page-container" + "-themed " + "ui-panel-page-container" + "-" + o.theme); - } - - self.element - .removeClass("ui-panel-closed") - .addClass("ui-panel-open"); - - self._positionPanel(true); - - self._pageContentOpenClasses = self._getPosDisplayClasses("ui-panel-page-content"); - - if (o.display !== "overlay") { - self._page().parent().addClass("ui-panel-page-container"); - self._wrapper.addClass(self._pageContentOpenClasses); - } - - self._modalOpenClasses = self._getPosDisplayClasses("ui-panel-dismiss") + " " + "ui-panel-dismiss-open"; - if (self._modal) { - self._modal - .addClass(self._modalOpenClasses) - .height(Math.max(self._modal.height(), self.document.height())); - } - }, - complete = function () { - - // Bail if the panel was closed before the opening animation has completed - if (!self._open) { - return; - } - - if (o.display !== "overlay") { - self._wrapper.addClass("ui-panel-page-content" + "-open"); - } - - self._bindFixListener(); - - self._trigger("open"); - - self._openedPage = self._page(); - }; - - self._trigger("beforeopen"); - - if (self._page().data("panel") === "open") { - self._on(self.document, { - "panelclose": _openPanel - }); - } else { - _openPanel(); - } - - self._open = true; - } - }, - - close: function (immediate) { - if (this._open) { - var self = this, - o = this.options, - - _closePanel = function () { - - self.element.removeClass("ui-panel-open"); - - if (o.display !== "overlay") { - self._wrapper.removeClass(self._pageContentOpenClasses); - } - - if (!immediate && !!o.animate) { - (self._wrapper || self.element) - .animationComplete(complete, "transition"); - } else { - setTimeout(complete, 0); - } - - if (self._modal) { - self._modal - .removeClass(self._modalOpenClasses) - .height(""); - } - }, - complete = function () { - if (o.theme && o.display !== "overlay") { - self._page().parent().removeClass("ui-panel-page-container" + "-themed " + "ui-panel-page-container" + "-" + o.theme); - } - - self.element.addClass("ui-panel-closed"); - - if (o.display !== "overlay") { - self._page().parent().removeClass("ui-panel-page-container"); - self._wrapper.removeClass("ui-panel-page-content" + "-open"); - } - - if (!!o.animate && o.display !== "overlay") { - self._wrapper.removeClass("ui-panel-animate"); - } - - self._fixPanel(); - self._unbindFixListener(); - - self._page().removeData("panel"); - - self._trigger("close"); - - self._openedPage = null; - }; - - self._trigger("beforeclose"); - - _closePanel(); - - self._open = false; - } - }, - - toggle: function () { - this[this._open ? "close" : "open"](); - }, - - _destroy: function () { - var otherPanels, - o = this.options, - multiplePanels = ($("body > :mobile-panel").length + $.mobile.activePage.find(":mobile-panel").length) > 1; - - if (o.display !== "overlay") { - - // remove the wrapper if not in use by another panel - otherPanels = $("body > :mobile-panel").add($.mobile.activePage.find(":mobile-panel")); - if (otherPanels.not(".ui-panel-display-overlay").not(this.element).length === 0) { - this._wrapper.children().unwrap(); - } - - if (this._open) { - - this._page().parent().removeClass("ui-panel-page-container"); - - if (o.theme) { - this._page().parent().removeClass("ui-panel-page-container" + "-themed " + "ui-panel-page-container" + "-" + o.theme); - } - } - } - - if (!multiplePanels) { - - this.document.off("panelopen panelclose"); - - } - - if (this._open) { - this._page().removeData("panel"); - } - - this._panelInner.children().unwrap(); - - this.element - .removeClass([this._getPanelClasses(), "ui-panel-open", "ui-panel-animate"].join(" ")) - .off("swipeleft.panel swiperight.panel") - .off("panelbeforeopen") - .off("panelhide") - .off("keyup.panel") - .off("updatelayout"); - - if (this._modal) { - this._modal.remove(); - } - } - }); - - })(jQuery); - -}); \ No newline at end of file +define(["jqmwidget"],function(){!function($,undefined){var props={animation:{},transition:{}},testElement=document.createElement("a"),vendorPrefixes=["","webkit-","moz-","o-"];$.each(["animation","transition"],function(i,test){var testName=0===i?test+"-name":test;$.each(vendorPrefixes,function(j,prefix){if(testElement.style[$.camelCase(prefix+testName)]!==undefined)return props[test].prefix=prefix,!1}),props[test].duration=$.camelCase(props[test].prefix+test+"-duration"),props[test].event=$.camelCase(props[test].prefix+test+"-end"),""===props[test].prefix&&(props[test].event=props[test].event.toLowerCase())}),$(testElement).remove(),$.fn.animationComplete=function(callback,type,fallbackTime){var timer,duration,that=this,eventBinding=function(){clearTimeout(timer),callback.apply(this,arguments)},animationType=type&&"animation"!==type?"transition":"animation";return fallbackTime===undefined&&($(this).context!==document&&(duration=3e3*parseFloat($(this).css(props[animationType].duration))),(0===duration||duration===undefined||isNaN(duration))&&(duration=$.fn.animationComplete.defaultDuration)),timer=setTimeout(function(){$(that).off(props[animationType].event,eventBinding),callback.apply(that)},duration),$(this).one(props[animationType].event,eventBinding)},$.fn.animationComplete.defaultDuration=1e3}(jQuery),function($,undefined){$.widget("mobile.panel",{options:{animate:!0,theme:null,position:"left",dismissible:!0,display:"overlay",swipeClose:!0,positionFixed:!0},_parentPage:null,_page:null,_modal:null,_panelInner:null,_wrapper:null,_create:function(){var el=this.element,parentPage=el.closest(".ui-page, [data-role='page']");$.extend(this,{_parentPage:parentPage.length>0&&parentPage,_openedPage:null,_page:this._getPage,_panelInner:this._getPanelInner()}),"overlay"!==this.options.display&&this._getWrapper(),this._addPanelClasses(),this.options.animate&&this.element.addClass("ui-panel-animate"),this._bindUpdateLayout(),this._bindCloseEvents(),this._bindLinkListeners(),this._bindPageEvents(),this.options.dismissible&&this._createModal(),this._bindSwipeEvents()},_getPanelInner:function(){var panelInner=this.element[0].querySelector(".ui-panel-inner");return panelInner=panelInner?$(panelInner):this.element.children().wrapAll("
").parent()},_createModal:function(){var self=this,target=self._parentPage?self._parentPage.parent():self.element.parent();self._modal=$("
").on("mousedown",function(){self.close()}).appendTo(target)},_getPage:function(){var page=this._openedPage||this._parentPage||$(".ui-page-active");return page},_getWrapper:function(){var wrapper=this._page().find(".ui-panel-wrapper");0===wrapper.length&&(wrapper=this._page().children(".ui-header:not(.ui-header-fixed), .ui-content:not(.ui-popup), .ui-footer:not(.ui-footer-fixed)").wrapAll("
").parent()),this._wrapper=wrapper},_getPosDisplayClasses:function(prefix){return prefix+"-position-right "+prefix+"-display-"+this.options.display},_getPanelClasses:function(){var panelClasses="ui-panel "+this._getPosDisplayClasses("ui-panel")+" ui-panel-closed ui-body-"+(this.options.theme?this.options.theme:"inherit");return this.options.positionFixed&&(panelClasses+=" ui-panel-fixed"),panelClasses},_addPanelClasses:function(){this.element.addClass(this._getPanelClasses())},_handleCloseClick:function(event){event.isDefaultPrevented()||this.close()},_bindCloseEvents:function(){},_positionPanel:function(scrollToTop){var self=this,panelInnerHeight=self._panelInner.outerHeight(),expand=panelInnerHeight>(window.innerHeight||$(window).height());expand||!self.options.positionFixed?(expand&&self._unfixPanel(),scrollToTop&&this.window[0].scrollTo(0,$.mobile.defaultHomeScroll)):self._fixPanel()},_bindFixListener:function(){this._on($(window),{resize:"_positionPanel"})},_unbindFixListener:function(){this._off($(window),"resize")},_unfixPanel:function(){this.options.positionFixed&&this.element.removeClass("ui-panel-fixed")},_fixPanel:function(){this.options.positionFixed&&this.element.addClass("ui-panel-fixed")},_bindUpdateLayout:function(){var self=this;self.element.on("updatelayout",function(){self._open&&self._positionPanel()})},_bindLinkListeners:function(){this._on("body",{"click a":"_handleClick"})},_handleClick:function(e){var link,panelId=this.element.attr("id");e.currentTarget.href.split("#")[1]===panelId&&panelId!==undefined&&(e.preventDefault(),link=$(e.target),link.hasClass("ui-btn")&&(link.addClass($.mobile.activeBtnClass),this.element.one("panelopen panelclose",function(){link.removeClass($.mobile.activeBtnClass)})),this.toggle())},_bindSwipeEvents:function(){var self=this,area=self._modal?self.element.add(self._modal):self.element;self.options.swipeClose&&("left"===self.options.position?area.on("swipeleft.panel",function(){self.close()}):area.on("swiperight.panel",function(){self.close()}))},_bindPageEvents:function(){var self=this;this.document.on("panelbeforeopen",function(e){self._open&&e.target!==self.element[0]&&self.close()}).on("keyup.panel",function(e){27===e.keyCode&&self._open&&self.close()}),this._parentPage||"overlay"===this.options.display||this._on(this.document,{pageshow:function(){this._openedPage=null,this._getWrapper()}}),self._parentPage?this.document.on("pagehide","[data-role='page']",function(){self._open&&self.close(!0)}):this.document.on("pagebeforehide",function(){self._open&&self.close(!0)})},_open:!1,_pageContentOpenClasses:null,_modalOpenClasses:null,open:function(immediate){if(!this._open){var self=this,o=self.options,_openPanel=function(){self._off(self.document,"panelclose"),self._page().data("panel","open"),o.animate&&"overlay"!==o.display&&self._wrapper.addClass("ui-panel-animate"),!immediate&&o.animate?(self._wrapper||self.element).animationComplete(complete,"transition"):setTimeout(complete,0),o.theme&&"overlay"!==o.display&&self._page().parent().addClass("ui-panel-page-container-themed ui-panel-page-container-"+o.theme),self.element.removeClass("ui-panel-closed").addClass("ui-panel-open"),self._positionPanel(!0),self._pageContentOpenClasses=self._getPosDisplayClasses("ui-panel-page-content"),"overlay"!==o.display&&(self._page().parent().addClass("ui-panel-page-container"),self._wrapper.addClass(self._pageContentOpenClasses)),self._modalOpenClasses=self._getPosDisplayClasses("ui-panel-dismiss")+" ui-panel-dismiss-open",self._modal&&self._modal.addClass(self._modalOpenClasses).height(Math.max(self._modal.height(),self.document.height()))},complete=function(){self._open&&("overlay"!==o.display&&self._wrapper.addClass("ui-panel-page-content-open"),self._bindFixListener(),self._trigger("open"),self._openedPage=self._page())};self._trigger("beforeopen"),"open"===self._page().data("panel")?self._on(self.document,{panelclose:_openPanel}):_openPanel(),self._open=!0}},close:function(immediate){if(this._open){var self=this,o=this.options,_closePanel=function(){self.element.removeClass("ui-panel-open"),"overlay"!==o.display&&self._wrapper.removeClass(self._pageContentOpenClasses),!immediate&&o.animate?(self._wrapper||self.element).animationComplete(complete,"transition"):setTimeout(complete,0),self._modal&&self._modal.removeClass(self._modalOpenClasses).height("")},complete=function(){o.theme&&"overlay"!==o.display&&self._page().parent().removeClass("ui-panel-page-container-themed ui-panel-page-container-"+o.theme),self.element.addClass("ui-panel-closed"),"overlay"!==o.display&&(self._page().parent().removeClass("ui-panel-page-container"),self._wrapper.removeClass("ui-panel-page-content-open")),o.animate&&"overlay"!==o.display&&self._wrapper.removeClass("ui-panel-animate"),self._fixPanel(),self._unbindFixListener(),self._page().removeData("panel"),self._trigger("close"),self._openedPage=null};self._trigger("beforeclose"),_closePanel(),self._open=!1}},toggle:function(){this[this._open?"close":"open"]()},_destroy:function(){var otherPanels,o=this.options,multiplePanels=$("body > :mobile-panel").length+$.mobile.activePage.find(":mobile-panel").length>1;"overlay"!==o.display&&(otherPanels=$("body > :mobile-panel").add($.mobile.activePage.find(":mobile-panel")),0===otherPanels.not(".ui-panel-display-overlay").not(this.element).length&&this._wrapper.children().unwrap(),this._open&&(this._page().parent().removeClass("ui-panel-page-container"),o.theme&&this._page().parent().removeClass("ui-panel-page-container-themed ui-panel-page-container-"+o.theme))),multiplePanels||this.document.off("panelopen panelclose"),this._open&&this._page().removeData("panel"),this._panelInner.children().unwrap(),this.element.removeClass([this._getPanelClasses(),"ui-panel-open","ui-panel-animate"].join(" ")).off("swipeleft.panel swiperight.panel").off("panelbeforeopen").off("panelhide").off("keyup.panel").off("updatelayout"),this._modal&&this._modal.remove()}})}(jQuery)}); \ No newline at end of file diff --git a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.popup.css b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.popup.css index c034aaa5ec..b1e050177f 100644 --- a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.popup.css +++ b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.popup.css @@ -1,453 +1 @@ -.ui-popup-container { - z-index: 99999; -} - -/* "page" containers - full-screen views, one should always be in view post-pageload */ -.ui-mobile [data-role=dialog] { - top: 0; - left: 0; - width: 100%; - min-height: 100%; - position: absolute; - border: 0; - background: #fff; -} - -.ui-popup { - background: #fff; -} -.ui-popup-open .ui-header-fixed, -.ui-popup-open .ui-footer-fixed { - position: absolute !important; /* See issues #4816, #4844 and #4874 and popup.js */ -} - -.ui-popup-screen { - background-image: url("data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="); /* Necessary to set some form of background to ensure element is clickable in IE6/7. While legacy IE won't understand the data-URI'd image, it ensures no additional requests occur in all other browsers with little overhead. */ - top: 0; - left: 0; - right: 0; - bottom: 1px; - position: absolute; - filter: Alpha(Opacity=0); - opacity: 0; - z-index: 1099; -} - - .ui-popup-screen.in { - opacity: 0.5; - filter: Alpha(Opacity=50); - } - - .ui-popup-screen.out { - opacity: 0; - filter: Alpha(Opacity=0); - } - -.ui-popup-container { - z-index: 1100; - display: inline-block; - position: absolute; - padding: 0; - outline: 0; -} - -.ui-popup { - position: relative; -} - - .ui-popup.ui-body-inherit { - border-width: 1px; - border-style: solid; - } - -.ui-popup-hidden { - left: 0; - top: 0; - position: absolute !important; - visibility: hidden; -} - -.ui-popup-truncate { - height: 1px; - width: 1px; - margin: -1px; - overflow: hidden; - clip: rect(1px,1px,1px,1px); -} - -.ui-popup.ui-content, -.ui-popup .ui-content { - overflow: visible; -} - -.ui-popup > .ui-header { - border-top-width: 0; -} - -.ui-popup > .ui-footer { - border-bottom-width: 0; -} - -.ui-popup > p, -.ui-popup > h1, -.ui-popup > h2, -.ui-popup > h3, -.ui-popup > h4, -.ui-popup > h5, -.ui-popup > h6 { - margin: .5em .4375em; -} - -.ui-popup > span { - display: block; - margin: .5em .4375em; -} - -.ui-popup-container .ui-content > p, -.ui-popup-container .ui-content > h1, -.ui-popup-container .ui-content > h2, -.ui-popup-container .ui-content > h3, -.ui-popup-container .ui-content > h4, -.ui-popup-container .ui-content > h5, -.ui-popup-container .ui-content > h6 { - margin: .5em 0; -} - -.ui-popup-container .ui-content > span { - margin: 0; -} - -.ui-popup-container .ui-content > p:first-child, -.ui-popup-container .ui-content > h1:first-child, -.ui-popup-container .ui-content > h2:first-child, -.ui-popup-container .ui-content > h3:first-child, -.ui-popup-container .ui-content > h4:first-child, -.ui-popup-container .ui-content > h5:first-child, -.ui-popup-container .ui-content > h6:first-child { - margin-top: 0; -} - -.ui-popup-container .ui-content > p:last-child, -.ui-popup-container .ui-content > h1:last-child, -.ui-popup-container .ui-content > h2:last-child, -.ui-popup-container .ui-content > h3:last-child, -.ui-popup-container .ui-content > h4:last-child, -.ui-popup-container .ui-content > h5:last-child, -.ui-popup-container .ui-content > h6:last-child { - margin-bottom: 0; -} - -.ui-popup > img { - max-width: 100%; - max-height: 100%; - vertical-align: middle; -} - -.ui-popup:not(.ui-content) > img:only-child, -.ui-popup:not(.ui-content) > .ui-btn-left:first-child + img:last-child, -.ui-popup:not(.ui-content) > .ui-btn-right:first-child + img:last-child { - -webkit-border-radius: inherit; - border-radius: inherit; -} - -.ui-popup iframe { - vertical-align: middle; -} - -.ui-popup > .ui-btn-left, -.ui-popup > .ui-btn-right { - position: absolute; - top: -11px; - margin: 0; - z-index: 1101; -} - -.ui-popup > .ui-btn-left { - left: -11px; -} - -.ui-popup > .ui-btn-right { - right: -11px; -} - - -@-webkit-keyframes fadein { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -@-moz-keyframes fadein { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -@keyframes fadein { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -@-webkit-keyframes fadeout { - from { - opacity: 1; - } - - to { - opacity: 0; - } -} - -@-moz-keyframes fadeout { - from { - opacity: 1; - } - - to { - opacity: 0; - } -} - -@keyframes fadeout { - from { - opacity: 1; - } - - to { - opacity: 0; - } -} - -.fade.out { - opacity: 0; - -webkit-animation-duration: 125ms; - -webkit-animation-name: fadeout; - -moz-animation-duration: 125ms; - -moz-animation-name: fadeout; - animation-duration: 125ms; - animation-name: fadeout; -} - -.fade.in { - opacity: 1; - -webkit-animation-duration: 225ms; - -webkit-animation-name: fadein; - -moz-animation-duration: 225ms; - -moz-animation-name: fadein; - animation-duration: 225ms; - animation-name: fadein; -} - - -/* Dimensions related to the popup arrow ------------------------------------------------------------------------------------------------------------*/ -/* desired triangle height: 10px */ - -/** - * guide for the arrow - its width, height, and offset are theme-dependent and - * should be expessed as left, right, top, bottom, so that the element bearing - * such a class becomes stretched inside its parent position: relative element. - * The left/top/right/bottom specified below should reflect the corresponding - * border radii and so it leaves room for the shadow: - * ..--------------------.. - * ." ^ top ". - * / v \ - * | +------------------+ | - * | | | | - * | left| |right| - * |<--->| |<--->| - * | +------------------+ | - * \ ^ / - * `. v bottom .' - * ""--------------------"" - * The idea is that the top/left of the arrow container box does not move to a - * coordinate smaller than the top/left of the guide and the right/bottom of - * the arrow container box does not move to a coordinate larger than the - * bottom/right of the guide. This will help us avoid the following situation: - * ..--------------------.. - * ." ^ top ". - * /|/ v \ - * / | +------------------+ | - * \ | | | | - * \| left| |right| - * |<--->| |<--->| - * | +------------------+ | - * \ ^ / - * `. v bottom .' - * ""--------------------"" - * The arrow should not receive a top/left coordinate such that it is too close - * to one of the corners, because then at first the shadow of the arrow and, - * given a coordinate even closer to the corner, even the body of the arrow will - * "stick out" of the corner of the popup. The guide provides a hint to the - * arrow positioning code as to which range of values is acceptable for the - * arrow container's top/left coordinate. - **/ - -.ui-popup-arrow-container { - width: 20px; - height: 20px; -} - - /* aside from the "infinities" (-1000,2000), triangle height is used */ - .ui-popup-arrow-container.ui-popup-arrow-l { - left: -10px; - clip: rect(-1000px,10px,2000px,-1000px); - } - - .ui-popup-arrow-container.ui-popup-arrow-t { - top: -10px; - clip: rect(-1000px,2000px,10px,-1000px); - } - - .ui-popup-arrow-container.ui-popup-arrow-r { - right: -10px; - clip: rect(-1000px,2000px,2000px,10px); - } - - .ui-popup-arrow-container.ui-popup-arrow-b { - bottom: -10px; - clip: rect(10px,2000px,1000px,-1000px); - } - - /** - * For each side, the arrow is twice the desired size and its corner is aligned - * with the edge of the container: - * - * /\ /\ +----+ /\ - * / \ / \ | /\ |top / \ - * +----+ \ / +----+ +-->|/ \| / \ - * left| / | \ / | \ |right | | | / \ - * |/ | \ / | \| | /| |\ / \ - * |\ | / \ | /| | / +----+ \ \ +----+ / - * | \ | / \ | / | | \ / \| |/ - * +----+ / \ +----+ | \ / | | - * ^ \ / \ / ^ | \ / +->|\ /| - * | \/ \/ | | \ / | | \/ |bottom - * | | | \/ | +----+ - * +-------------------+--------+-----------+ - * | - * arrow container - * (clips arrow) - **/ - - .ui-popup-arrow-container .ui-popup-arrow { - /* (4*desired triangle height)/sqrt(2) - does not account for border - centred within the outer rectangle */ - width: 28.284271247px; - height: 28.284271247px; - border-width: 1px; - border-style: solid; - } - - .ui-popup-arrow-container.ui-popup-arrow-t .ui-popup-arrow { - left: -4.142135623px; - top: 5.857864376px; - } - - .ui-popup-arrow-container.ui-popup-arrow-b .ui-popup-arrow { - left: -4.142135623px; - top: -14.142135623px; - } - - .ui-popup-arrow-container.ui-popup-arrow-l .ui-popup-arrow { - left: 5.857864376px; - top: -4.142135623px; - } - - .ui-popup-arrow-container.ui-popup-arrow-r .ui-popup-arrow { - left: -14.142135623px; - top: -4.142135623px; - } - - /* Fix rotation center for oldIE - see http://www.useragentman.com/IETransformsTranslator/ */ - .ui-popup-arrow-container.ui-popup-arrow-t.ie .ui-popup-arrow { - margin-left: -5.857864376269049px; - margin-top: -7.0710678118654755px; - } - - .ui-popup-arrow-container.ui-popup-arrow-b.ie .ui-popup-arrow { - margin-left: -5.857864376269049px; - margin-top: -4.142135623730951px; - } - - .ui-popup-arrow-container.ui-popup-arrow-l.ie .ui-popup-arrow { - margin-left: -7.0710678118654755px; - margin-top: -5.857864376269049px; - } - - .ui-popup-arrow-container.ui-popup-arrow-r.ie .ui-popup-arrow { - margin-left: -4.142135623730951px; - margin-top: -5.857864376269049px; - } - -/* structure */ -.ui-popup > .ui-popup-arrow-guide { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - visibility: hidden; -} - -.ui-popup-arrow-container { - position: absolute; -} - -.ui-popup-arrow { - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - transform: rotate(45deg); - position: absolute; - overflow: hidden; - box-sizing: border-box; -} - -.ui-popup-arrow-container.ie .ui-popup-arrow { - -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.7071067811865474, M12=-0.7071067811865477, M21=0.7071067811865477, M22=0.7071067811865474, SizingMethod='auto expand')"; - filter: progid:DXImageTransform.Microsoft.Matrix( M11=0.7071067811865474, M12=-0.7071067811865477, M21=0.7071067811865477, M22=0.7071067811865474, SizingMethod='auto expand'); -} - - - -/* Corner styling for dialogs and popups */ -.ui-corner-all > .ui-content:first-child { - -webkit-border-top-left-radius: inherit; - border-top-left-radius: inherit; - -webkit-border-top-right-radius: inherit; - border-top-right-radius: inherit; -} -.ui-corner-all > .ui-content:last-child { - -webkit-border-bottom-left-radius: inherit; - border-bottom-left-radius: inherit; - -webkit-border-bottom-right-radius: inherit; - border-bottom-right-radius: inherit; -} - - -/* Popup arrow */ -.ui-popup.ui-corner-all > .ui-popup-arrow-guide { - left: .6em /*{global-radii-blocks}*/; - right: .6em /*{global-radii-blocks}*/; - top: .6em /*{global-radii-blocks}*/; - bottom: .6em /*{global-radii-blocks}*/; -} - - -/* Used for hiding elements by the filterable widget. You can also use this class to hide list items or buttons in controlgroups; this ensures correct corner styling. */ -.ui-screen-hidden { - display: none !important; -} \ No newline at end of file +.ui-mobile [data-role=dialog]{top:0;left:0;width:100%;min-height:100%;position:absolute;border:0;background:#fff}.ui-popup{background:#fff}.ui-popup-open .ui-footer-fixed,.ui-popup-open .ui-header-fixed{position:absolute!important}.ui-popup-screen{background-image:url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==);top:0;left:0;right:0;bottom:1px;position:absolute;filter:Alpha(Opacity=0);opacity:0;z-index:1099}.ui-popup-screen.in{opacity:.5;filter:Alpha(Opacity=50)}.ui-popup-screen.out{opacity:0;filter:Alpha(Opacity=0)}.ui-popup-container{z-index:1100;display:inline-block;position:absolute;padding:0;outline:0}.ui-popup{position:relative}.ui-popup.ui-body-inherit{border-width:1px;border-style:solid}.ui-popup-hidden{left:0;top:0;position:absolute!important;visibility:hidden}.ui-popup-truncate{height:1px;width:1px;margin:-1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}.ui-popup>h1,.ui-popup>h2,.ui-popup>h3,.ui-popup>h4,.ui-popup>h5,.ui-popup>h6,.ui-popup>p,.ui-popup>span{margin:.5em .4375em}.ui-popup .ui-content,.ui-popup.ui-content{overflow:visible}.ui-popup>.ui-header{border-top-width:0}.ui-popup>.ui-footer{border-bottom-width:0}.ui-popup>span{display:block}.ui-popup-container .ui-content>h1,.ui-popup-container .ui-content>h2,.ui-popup-container .ui-content>h3,.ui-popup-container .ui-content>h4,.ui-popup-container .ui-content>h5,.ui-popup-container .ui-content>h6,.ui-popup-container .ui-content>p{margin:.5em 0}.ui-popup-container .ui-content>span{margin:0}.ui-popup-container .ui-content>h1:first-child,.ui-popup-container .ui-content>h2:first-child,.ui-popup-container .ui-content>h3:first-child,.ui-popup-container .ui-content>h4:first-child,.ui-popup-container .ui-content>h5:first-child,.ui-popup-container .ui-content>h6:first-child,.ui-popup-container .ui-content>p:first-child{margin-top:0}.ui-popup-container .ui-content>h1:last-child,.ui-popup-container .ui-content>h2:last-child,.ui-popup-container .ui-content>h3:last-child,.ui-popup-container .ui-content>h4:last-child,.ui-popup-container .ui-content>h5:last-child,.ui-popup-container .ui-content>h6:last-child,.ui-popup-container .ui-content>p:last-child{margin-bottom:0}.ui-popup>img{max-width:100%;max-height:100%;vertical-align:middle}.ui-popup:not(.ui-content)>.ui-btn-left:first-child+img:last-child,.ui-popup:not(.ui-content)>.ui-btn-right:first-child+img:last-child,.ui-popup:not(.ui-content)>img:only-child{-webkit-border-radius:inherit;border-radius:inherit}.ui-popup iframe{vertical-align:middle}.ui-popup>.ui-btn-left,.ui-popup>.ui-btn-right{position:absolute;top:-11px;margin:0;z-index:1101}.ui-popup>.ui-btn-left{left:-11px}.ui-popup>.ui-btn-right{right:-11px}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}@keyframes fadeout{from{opacity:1}to{opacity:0}}.fade.out{opacity:0;-moz-animation-duration:125ms;-moz-animation-name:fadeout;-webkit-animation-duration:125ms;animation-duration:125ms;-webkit-animation-name:fadeout;animation-name:fadeout}.fade.in{opacity:1;-moz-animation-duration:225ms;-moz-animation-name:fadein;-webkit-animation-duration:225ms;animation-duration:225ms;-webkit-animation-name:fadein;animation-name:fadein}.ui-popup-arrow-container{width:20px;height:20px;position:absolute}.ui-popup-arrow-container.ui-popup-arrow-l{left:-10px;clip:rect(-1000px,10px,2000px,-1000px)}.ui-popup-arrow-container.ui-popup-arrow-t{top:-10px;clip:rect(-1000px,2000px,10px,-1000px)}.ui-popup-arrow-container.ui-popup-arrow-r{right:-10px;clip:rect(-1000px,2000px,2000px,10px)}.ui-popup-arrow-container.ui-popup-arrow-b{bottom:-10px;clip:rect(10px,2000px,1000px,-1000px)}.ui-popup-arrow-container .ui-popup-arrow{width:28.28px;height:28.28px;border-width:1px;border-style:solid}.ui-popup-arrow-container.ui-popup-arrow-t .ui-popup-arrow{left:-4.14px;top:5.86px}.ui-popup-arrow-container.ui-popup-arrow-b .ui-popup-arrow{left:-4.14px;top:-14.14px}.ui-popup-arrow-container.ui-popup-arrow-l .ui-popup-arrow{left:5.86px;top:-4.14px}.ui-popup-arrow-container.ui-popup-arrow-r .ui-popup-arrow{left:-14.14px;top:-4.14px}.ui-popup-arrow-container.ui-popup-arrow-t.ie .ui-popup-arrow{margin-left:-5.86px;margin-top:-7.07px}.ui-popup-arrow-container.ui-popup-arrow-b.ie .ui-popup-arrow{margin-left:-5.86px;margin-top:-4.14px}.ui-popup-arrow-container.ui-popup-arrow-l.ie .ui-popup-arrow{margin-left:-7.07px;margin-top:-5.86px}.ui-popup-arrow-container.ui-popup-arrow-r.ie .ui-popup-arrow{margin-left:-4.14px;margin-top:-5.86px}.ui-popup>.ui-popup-arrow-guide{position:absolute;left:0;right:0;top:0;bottom:0;visibility:hidden}.ui-popup-arrow{-webkit-transform:rotate(45deg);transform:rotate(45deg);position:absolute;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box}.ui-popup-arrow-container.ie .ui-popup-arrow{-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.7071067811865474, M12=-0.7071067811865477, M21=0.7071067811865477, M22=0.7071067811865474, SizingMethod='auto expand')";filter:progid:DXImageTransform.Microsoft.Matrix( M11=.7071067811865474, M12=-.7071067811865477, M21=.7071067811865477, M22=.7071067811865474, SizingMethod='auto expand')}.ui-corner-all>.ui-content:first-child{-webkit-border-top-left-radius:inherit;border-top-left-radius:inherit;-webkit-border-top-right-radius:inherit;border-top-right-radius:inherit}.ui-corner-all>.ui-content:last-child{-webkit-border-bottom-left-radius:inherit;border-bottom-left-radius:inherit;-webkit-border-bottom-right-radius:inherit;border-bottom-right-radius:inherit}.ui-popup.ui-corner-all>.ui-popup-arrow-guide{left:.6em;right:.6em;top:.6em;bottom:.6em}.ui-screen-hidden{display:none!important} \ No newline at end of file diff --git a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.popup.js b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.popup.js index f325931b89..41770b4fe6 100644 --- a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.popup.js +++ b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.popup.js @@ -1,1284 +1 @@ -define(['jqmwidget'], function () { - - (function ($, undefined) { - var props = { - "animation": {}, - "transition": {} - }, - testElement = document.createElement("a"), - vendorPrefixes = ["", "webkit-", "moz-", "o-"]; - - $.each(["animation", "transition"], function (i, test) { - - // Get correct name for test - var testName = (i === 0) ? test + "-" + "name" : test; - - $.each(vendorPrefixes, function (j, prefix) { - if (testElement.style[$.camelCase(prefix + testName)] !== undefined) { - props[test]["prefix"] = prefix; - return false; - } - }); - - // Set event and duration names for later use - props[test]["duration"] = - $.camelCase(props[test]["prefix"] + test + "-" + "duration"); - props[test]["event"] = - $.camelCase(props[test]["prefix"] + test + "-" + "end"); - - // All lower case if not a vendor prop - if (props[test]["prefix"] === "") { - props[test]["event"] = props[test]["event"].toLowerCase(); - } - }); - - // Remove the testElement - $(testElement).remove(); - - // Animation complete callback - $.fn.animationComplete = function (callback, type, fallbackTime) { - var timer, duration, - that = this, - eventBinding = function () { - - // Clear the timer so we don't call callback twice - clearTimeout(timer); - callback.apply(this, arguments); - }, - animationType = (!type || type === "animation") ? "animation" : "transition"; - - // If a fallback time was not passed set one - if (fallbackTime === undefined) { - - // Make sure the was not bound to document before checking .css - if ($(this).context !== document) { - - // Parse the durration since its in second multiple by 1000 for milliseconds - // Multiply by 3 to make sure we give the animation plenty of time. - duration = parseFloat( - $(this).css(props[animationType].duration) - ) * 3000; - } - - // If we could not read a duration use the default - if (duration === 0 || duration === undefined || isNaN(duration)) { - duration = $.fn.animationComplete.defaultDuration; - } - } - - // Sets up the fallback if event never comes - timer = setTimeout(function () { - $(that).off(props[animationType].event, eventBinding); - callback.apply(that); - }, duration); - - // Bind the event - return $(this).one(props[animationType].event, eventBinding); - }; - - // Allow default callback to be configured on mobileInit - $.fn.animationComplete.defaultDuration = 1000; - })(jQuery); - - (function ($, undefined) { - - function fitSegmentInsideSegment(windowSize, segmentSize, offset, desired) { - var returnValue = desired; - - if (windowSize < segmentSize) { - // Center segment if it's bigger than the window - returnValue = offset + (windowSize - segmentSize) / 2; - } else { - // Otherwise center it at the desired coordinate while keeping it completely inside the window - returnValue = Math.min(Math.max(offset, desired - segmentSize / 2), offset + windowSize - segmentSize); - } - - return returnValue; - } - - function getWindowCoordinates(theWindow) { - return { - x: theWindow.scrollLeft(), - y: theWindow.scrollTop(), - cx: (theWindow[0].innerWidth || theWindow.width()), - cy: (theWindow[0].innerHeight || theWindow.height()) - }; - } - - // non-UA-based IE version check by James Padolsey, modified by jdalton - from http://gist.github.com/527683 - // allows for inclusion of IE 6+, including Windows Mobile 7 - $.extend($.mobile, { browser: {} }); - $.mobile.browser.oldIE = (function () { - var v = 3, - div = document.createElement("div"), - a = div.all || []; - - do { - div.innerHTML = ""; - } while (a[0]); - - return v > 4 ? v : !v; - })(); - - $.widget("mobile.popup", { - options: { - wrapperClass: null, - theme: null, - overlayTheme: null, - shadow: true, - corners: true, - transition: "none", - positionTo: "origin", - tolerance: null, - closeLinkSelector: "a[data-rel='back']", - closeLinkEvents: "click.popup", - navigateEvents: "navigate.popup", - closeEvents: "navigate.popup pagebeforechange.popup", - dismissible: true, - enhanced: false, - - // NOTE Windows Phone 7 has a scroll position caching issue that - // requires us to disable popup history management by default - // https://github.com/jquery/jquery-mobile/issues/4784 - // - // NOTE this option is modified in _create! - history: !$.mobile.browser.oldIE - }, - - // When the user depresses the mouse/finger on an element inside the popup while the popup is - // open, we ignore resize events for a short while. This prevents #6961. - _handleDocumentVmousedown: function (theEvent) { - if (this._isOpen && $.contains(this._ui.container[0], theEvent.target)) { - this._ignoreResizeEvents(); - } - }, - - _create: function () { - var theElement = this.element, - myId = theElement.attr("id"), - currentOptions = this.options; - - // We need to adjust the history option to be false if there's no AJAX nav. - // We can't do it in the option declarations because those are run before - // it is determined whether there shall be AJAX nav. - currentOptions.history = currentOptions.history && $.mobile.ajaxEnabled && $.mobile.hashListeningEnabled; - - this._on(this.document, { - "mousedown": "_handleDocumentVmousedown" - }); - - // Define instance variables - $.extend(this, { - _scrollTop: 0, - _page: theElement.parents("div[data-role='page']"), - _ui: null, - _fallbackTransition: "", - _currentTransition: false, - _prerequisites: null, - _isOpen: false, - _tolerance: null, - _resizeData: null, - _ignoreResizeTo: 0, - _orientationchangeInProgress: false - }); - - if (this._page.length === 0) { - this._page = $("body"); - } - - if (currentOptions.enhanced) { - this._ui = { - container: theElement.parent(), - screen: theElement.parent().prev(), - placeholder: $(this.document[0].getElementById(myId + "-placeholder")) - }; - } else { - this._ui = this._enhance(theElement, myId); - this._applyTransition(currentOptions.transition); - } - this - ._setTolerance(currentOptions.tolerance) - ._ui.focusElement = this._ui.container; - - // Event handlers - this._on(this._ui.screen, { "click": "_eatEventAndClose" }); - this._on(this.window, { - orientationchange: $.proxy(this, "_handleWindowOrientationchange"), - resize: $.proxy(this, "_handleWindowResize") - }); - this._on(this.document, { "focusin": "_handleDocumentFocusIn" }); - }, - - _delay: function (handler, delay) { - function handlerProxy() { - return (typeof handler === "string" ? instance[handler] : handler) - .apply(instance, arguments); - } - var instance = this; - return setTimeout(handlerProxy, delay || 0); - }, - - _enhance: function (theElement, myId) { - var currentOptions = this.options, - wrapperClass = currentOptions.wrapperClass, - ui = { - screen: $("
"), - placeholder: $("
"), - container: $("
") - }, - fragment = this.document[0].createDocumentFragment(); - - fragment.appendChild(ui.screen[0]); - fragment.appendChild(ui.container[0]); - - if (myId) { - ui.screen.attr("id", myId + "-screen"); - ui.container.attr("id", myId + "-popup"); - ui.placeholder - .attr("id", myId + "-placeholder") - .html(""); - } - - // Apply the proto - this._page[0].appendChild(fragment); - // Leave a placeholder where the element used to be - ui.placeholder.insertAfter(theElement); - theElement - .detach() - .addClass("ui-popup " + - this._themeClassFromOption("ui-body-", currentOptions.theme) + " " + - (currentOptions.shadow ? "ui-overlay-shadow " : "") + - (currentOptions.corners ? "ui-corner-all " : "")) - .appendTo(ui.container); - - return ui; - }, - - _eatEventAndClose: function (theEvent) { - theEvent.preventDefault(); - theEvent.stopImmediatePropagation(); - if (this.options.dismissible) { - this.close(); - } - return false; - }, - - // Make sure the screen covers the entire document - CSS is sometimes not - // enough to accomplish this. - _resizeScreen: function () { - var screen = this._ui.screen, - popupHeight = this._ui.container.outerHeight(true), - screenHeight = screen.removeAttr("style").height(), - - // Subtracting 1 here is necessary for an obscure Andrdoid 4.0 bug where - // the browser hangs if the screen covers the entire document :/ - documentHeight = this.document.height() - 1; - - if (screenHeight < documentHeight) { - screen.height(documentHeight); - } else if (popupHeight > screenHeight) { - screen.height(popupHeight); - } - }, - - _expectResizeEvent: function () { - var windowCoordinates = getWindowCoordinates(this.window); - - if (this._resizeData) { - if (windowCoordinates.x === this._resizeData.windowCoordinates.x && - windowCoordinates.y === this._resizeData.windowCoordinates.y && - windowCoordinates.cx === this._resizeData.windowCoordinates.cx && - windowCoordinates.cy === this._resizeData.windowCoordinates.cy) { - // timeout not refreshed - return false; - } else { - // clear existing timeout - it will be refreshed below - clearTimeout(this._resizeData.timeoutId); - } - } - - this._resizeData = { - timeoutId: this._delay("_resizeTimeout", 200), - windowCoordinates: windowCoordinates - }; - - return true; - }, - - _resizeTimeout: function () { - if (this._isOpen) { - if (!this._expectResizeEvent()) { - if (this._ui.container.hasClass("ui-popup-hidden")) { - // effectively rapid-open the popup while leaving the screen intact - this._ui.container.removeClass("ui-popup-hidden ui-popup-truncate"); - this.reposition({ positionTo: "window" }); - this._ignoreResizeEvents(); - } - - this._resizeScreen(); - this._resizeData = null; - this._orientationchangeInProgress = false; - } - } else { - this._resizeData = null; - this._orientationchangeInProgress = false; - } - }, - - _stopIgnoringResizeEvents: function () { - this._ignoreResizeTo = 0; - }, - - _ignoreResizeEvents: function () { - if (this._ignoreResizeTo) { - clearTimeout(this._ignoreResizeTo); - } - this._ignoreResizeTo = this._delay("_stopIgnoringResizeEvents", 1000); - }, - - _handleWindowResize: function (/* theEvent */) { - if (this._isOpen && this._ignoreResizeTo === 0) { - if ((this._expectResizeEvent() || this._orientationchangeInProgress) && - !this._ui.container.hasClass("ui-popup-hidden")) { - // effectively rapid-close the popup while leaving the screen intact - this._ui.container - .addClass("ui-popup-hidden ui-popup-truncate") - .removeAttr("style"); - } - } - }, - - _handleWindowOrientationchange: function (/* theEvent */) { - if (!this._orientationchangeInProgress && this._isOpen && this._ignoreResizeTo === 0) { - this._expectResizeEvent(); - this._orientationchangeInProgress = true; - } - }, - - // When the popup is open, attempting to focus on an element that is not a - // child of the popup will redirect focus to the popup - _handleDocumentFocusIn: function (theEvent) { - var target, - targetElement = theEvent.target, - ui = this._ui; - - if (!this._isOpen) { - return; - } - - if (targetElement !== ui.container[0]) { - target = $(targetElement); - if (!$.contains(ui.container[0], targetElement)) { - $(this.document[0].activeElement).one("focus", $.proxy(function () { - this._safelyBlur(targetElement); - }, this)); - ui.focusElement.focus(); - theEvent.preventDefault(); - theEvent.stopImmediatePropagation(); - return false; - } else if (ui.focusElement[0] === ui.container[0]) { - ui.focusElement = target; - } - } - - this._ignoreResizeEvents(); - }, - - _themeClassFromOption: function (prefix, value) { - return (value ? (value === "none" ? "" : (prefix + value)) : (prefix + "inherit")); - }, - - _applyTransition: function (value) { - if (value) { - this._ui.container.removeClass(this._fallbackTransition); - if (value !== "none") { - this._fallbackTransition = $.mobile._maybeDegradeTransition(value); - if (this._fallbackTransition === "none") { - this._fallbackTransition = ""; - } - this._ui.container.addClass(this._fallbackTransition); - } - } - - return this; - }, - - _setOptions: function (newOptions) { - var currentOptions = this.options, - theElement = this.element, - screen = this._ui.screen; - - if (newOptions.wrapperClass !== undefined) { - this._ui.container - .removeClass(currentOptions.wrapperClass) - .addClass(newOptions.wrapperClass); - } - - if (newOptions.theme !== undefined) { - theElement - .removeClass(this._themeClassFromOption("ui-body-", currentOptions.theme)) - .addClass(this._themeClassFromOption("ui-body-", newOptions.theme)); - } - - if (newOptions.overlayTheme !== undefined) { - screen - .removeClass(this._themeClassFromOption("ui-overlay-", currentOptions.overlayTheme)) - .addClass(this._themeClassFromOption("ui-overlay-", newOptions.overlayTheme)); - - if (this._isOpen) { - screen.addClass("in"); - } - } - - if (newOptions.shadow !== undefined) { - theElement.toggleClass("ui-overlay-shadow", newOptions.shadow); - } - - if (newOptions.corners !== undefined) { - theElement.toggleClass("ui-corner-all", newOptions.corners); - } - - if (newOptions.transition !== undefined) { - if (!this._currentTransition) { - this._applyTransition(newOptions.transition); - } - } - - if (newOptions.tolerance !== undefined) { - this._setTolerance(newOptions.tolerance); - } - - if (newOptions.disabled !== undefined) { - if (newOptions.disabled) { - this.close(); - } - } - - return this._super(newOptions); - }, - - _setTolerance: function (value) { - var tol = { t: 30, r: 15, b: 30, l: 15 }, - ar; - - if (value !== undefined) { - ar = String(value).split(","); - - $.each(ar, function (idx, val) { ar[idx] = parseInt(val, 10); }); - - switch (ar.length) { - // All values are to be the same - case 1: - if (!isNaN(ar[0])) { - tol.t = tol.r = tol.b = tol.l = ar[0]; - } - break; - - // The first value denotes top/bottom tolerance, and the second value denotes left/right tolerance - case 2: - if (!isNaN(ar[0])) { - tol.t = tol.b = ar[0]; - } - if (!isNaN(ar[1])) { - tol.l = tol.r = ar[1]; - } - break; - - // The array contains values in the order top, right, bottom, left - case 4: - if (!isNaN(ar[0])) { - tol.t = ar[0]; - } - if (!isNaN(ar[1])) { - tol.r = ar[1]; - } - if (!isNaN(ar[2])) { - tol.b = ar[2]; - } - if (!isNaN(ar[3])) { - tol.l = ar[3]; - } - break; - - default: - break; - } - } - - this._tolerance = tol; - return this; - }, - - _clampPopupWidth: function (infoOnly) { - var menuSize, - windowCoordinates = getWindowCoordinates(this.window), - // rectangle within which the popup must fit - rectangle = { - x: this._tolerance.l, - y: windowCoordinates.y + this._tolerance.t, - cx: windowCoordinates.cx - this._tolerance.l - this._tolerance.r, - cy: windowCoordinates.cy - this._tolerance.t - this._tolerance.b - }; - - if (!infoOnly) { - // Clamp the width of the menu before grabbing its size - this._ui.container.css("max-width", rectangle.cx); - } - - menuSize = { - cx: this._ui.container.outerWidth(true), - cy: this._ui.container.outerHeight(true) - }; - - return { rc: rectangle, menuSize: menuSize }; - }, - - _calculateFinalLocation: function (desired, clampInfo) { - var returnValue, - rectangle = clampInfo.rc, - menuSize = clampInfo.menuSize; - - // Center the menu over the desired coordinates, while not going outside - // the window tolerances. This will center wrt. the window if the popup is - // too large. - returnValue = { - left: fitSegmentInsideSegment(rectangle.cx, menuSize.cx, rectangle.x, desired.x), - top: fitSegmentInsideSegment(rectangle.cy, menuSize.cy, rectangle.y, desired.y) - }; - - // Make sure the top of the menu is visible - returnValue.top = Math.max(0, returnValue.top); - - // If the height of the menu is smaller than the height of the document - // align the bottom with the bottom of the document - - returnValue.top -= Math.min(returnValue.top, - Math.max(0, returnValue.top + menuSize.cy - this.document.height())); - - return returnValue; - }, - - // Try and center the overlay over the given coordinates - _placementCoords: function (desired) { - return this._calculateFinalLocation(desired, this._clampPopupWidth()); - }, - - _createPrerequisites: function (screenPrerequisite, containerPrerequisite, whenDone) { - var prerequisites, - self = this; - - // It is important to maintain both the local variable prerequisites and - // self._prerequisites. The local variable remains in the closure of the - // functions which call the callbacks passed in. The comparison between the - // local variable and self._prerequisites is necessary, because once a - // function has been passed to .animationComplete() it will be called next - // time an animation completes, even if that's not the animation whose end - // the function was supposed to catch (for example, if an abort happens - // during the opening animation, the .animationComplete handler is not - // called for that animation anymore, but the handler remains attached, so - // it is called the next time the popup is opened - making it stale. - // Comparing the local variable prerequisites to the widget-level variable - // self._prerequisites ensures that callbacks triggered by a stale - // .animationComplete will be ignored. - - prerequisites = { - screen: $.Deferred(), - container: $.Deferred() - }; - - prerequisites.screen.then(function () { - if (prerequisites === self._prerequisites) { - screenPrerequisite(); - } - }); - - prerequisites.container.then(function () { - if (prerequisites === self._prerequisites) { - containerPrerequisite(); - } - }); - - Promise.all([prerequisites.screen, prerequisites.container]).then(function () { - if (prerequisites === self._prerequisites) { - self._prerequisites = null; - whenDone(); - } - }); - - self._prerequisites = prerequisites; - }, - - _animate: function (args) { - // NOTE before removing the default animation of the screen - // this had an animate callback that would resolve the deferred - // now the deferred is resolved immediately - // TODO remove the dependency on the screen deferred - this._ui.screen - .removeClass(args.classToRemove) - .addClass(args.screenClassToAdd); - - args.prerequisites.screen.resolve(); - - if (args.transition && args.transition !== "none") { - if (args.applyTransition) { - this._applyTransition(args.transition); - } - if (this._fallbackTransition) { - this._ui.container - .addClass(args.containerClassToAdd) - .removeClass(args.classToRemove) - .animationComplete($.proxy(args.prerequisites.container, "resolve")); - return; - } - } - this._ui.container.removeClass(args.classToRemove); - args.prerequisites.container.resolve(); - }, - - // The desired coordinates passed in will be returned untouched if no reference element can be identified via - // desiredPosition.positionTo. Nevertheless, this function ensures that its return value always contains valid - // x and y coordinates by specifying the center middle of the window if the coordinates are absent. - // options: { x: coordinate, y: coordinate, positionTo: string: "origin", "window", or jQuery selector - _desiredCoords: function (openOptions) { - var offset, - dst = null, - windowCoordinates = getWindowCoordinates(this.window), - x = openOptions.x, - y = openOptions.y, - pTo = openOptions.positionTo; - - // Establish which element will serve as the reference - if (pTo && pTo !== "origin") { - if (pTo === "window") { - x = windowCoordinates.cx / 2 + windowCoordinates.x; - y = windowCoordinates.cy / 2 + windowCoordinates.y; - } else { - try { - dst = $(pTo); - } catch (err) { - dst = null; - } - if (dst) { - dst.filter(":visible"); - if (dst.length === 0) { - dst = null; - } - } - } - } - - // If an element was found, center over it - if (dst) { - offset = dst.offset(); - x = offset.left + dst.outerWidth() / 2; - y = offset.top + dst.outerHeight() / 2; - } - - // Make sure x and y are valid numbers - center over the window - if ($.type(x) !== "number" || isNaN(x)) { - x = windowCoordinates.cx / 2 + windowCoordinates.x; - } - if ($.type(y) !== "number" || isNaN(y)) { - y = windowCoordinates.cy / 2 + windowCoordinates.y; - } - - return { x: x, y: y }; - }, - - _reposition: function (openOptions) { - // We only care about position-related parameters for repositioning - openOptions = { - x: openOptions.x, - y: openOptions.y, - positionTo: openOptions.positionTo - }; - this._trigger("beforeposition", undefined, openOptions); - this._ui.container.offset(this._placementCoords(this._desiredCoords(openOptions))); - }, - - reposition: function (openOptions) { - if (this._isOpen) { - this._reposition(openOptions); - } - }, - - _safelyBlur: function (currentElement) { - if (currentElement !== this.window[0] && - currentElement.nodeName.toLowerCase() !== "body") { - $(currentElement).blur(); - } - }, - - _openPrerequisitesComplete: function () { - var id = this.element.attr("id"); - - this._ui.container.addClass("ui-popup-active"); - this._isOpen = true; - this._resizeScreen(); - - // Check to see if currElement is not a child of the container. If it's not, blur - if (!$.contains(this._ui.container[0], this.document[0].activeElement)) { - this._safelyBlur(this.document[0].activeElement); - } - this._ignoreResizeEvents(); - if (id) { - this.document.find("[aria-haspopup='true'][aria-owns='" + id + "']").attr("aria-expanded", true); - } - this._trigger("afteropen"); - }, - - _open: function (options) { - var openOptions = $.extend({}, this.options, options), - // TODO move blacklist to private method - androidBlacklist = (function () { - var ua = navigator.userAgent, - // Rendering engine is Webkit, and capture major version - wkmatch = ua.match(/AppleWebKit\/([0-9\.]+)/), - wkversion = !!wkmatch && wkmatch[1], - androidmatch = ua.match(/Android (\d+(?:\.\d+))/), - andversion = !!androidmatch && androidmatch[1], - chromematch = ua.indexOf("Chrome") > -1; - - // Platform is Android, WebKit version is greater than 534.13 ( Android 3.2.1 ) and not Chrome. - if (androidmatch !== null && andversion === "4.0" && wkversion && wkversion > 534.13 && !chromematch) { - return true; - } - return false; - }()); - - // Count down to triggering "popupafteropen" - we have two prerequisites: - // 1. The popup window animation completes (container()) - // 2. The screen opacity animation completes (screen()) - this._createPrerequisites( - $.noop, - $.noop, - $.proxy(this, "_openPrerequisitesComplete")); - - this._currentTransition = openOptions.transition; - this._applyTransition(openOptions.transition); - - this._ui.screen.removeClass("ui-screen-hidden"); - this._ui.container.removeClass("ui-popup-truncate"); - - // Give applications a chance to modify the contents of the container before it appears - this._reposition(openOptions); - - this._ui.container.removeClass("ui-popup-hidden"); - - if (this.options.overlayTheme && androidBlacklist) { - /* TODO: The native browser on Android 4.0.X ("Ice Cream Sandwich") suffers from an issue where the popup overlay appears to be z-indexed above the popup itself when certain other styles exist on the same page -- namely, any element set to `position: fixed` and certain types of input. These issues are reminiscent of previously uncovered bugs in older versions of Android's native browser: https://github.com/scottjehl/Device-Bugs/issues/3 - This fix closes the following bugs ( I use "closes" with reluctance, and stress that this issue should be revisited as soon as possible ): - https://github.com/jquery/jquery-mobile/issues/4816 - https://github.com/jquery/jquery-mobile/issues/4844 - https://github.com/jquery/jquery-mobile/issues/4874 - */ - - // TODO sort out why this._page isn't working - this.element.closest(".ui-page").addClass("ui-popup-open"); - } - this._animate({ - additionalCondition: true, - transition: openOptions.transition, - classToRemove: "", - screenClassToAdd: "in", - containerClassToAdd: "in", - applyTransition: false, - prerequisites: this._prerequisites - }); - }, - - _closePrerequisiteScreen: function () { - this._ui.screen - .removeClass("out") - .addClass("ui-screen-hidden"); - }, - - _closePrerequisiteContainer: function () { - this._ui.container - .removeClass("reverse out") - .addClass("ui-popup-hidden ui-popup-truncate") - .removeAttr("style"); - }, - - _closePrerequisitesDone: function () { - var container = this._ui.container, - id = this.element.attr("id"); - - // remove the global mutex for popups - $.mobile.popup.active = undefined; - - // Blur elements inside the container, including the container - $(":focus", container[0]).add(container[0]).blur(); - - if (id) { - this.document.find("[aria-haspopup='true'][aria-owns='" + id + "']").attr("aria-expanded", false); - } - - // alert users that the popup is closed - this._trigger("afterclose"); - }, - - _close: function (immediate) { - this._ui.container.removeClass("ui-popup-active"); - this._page.removeClass("ui-popup-open"); - - this._isOpen = false; - - // Count down to triggering "popupafterclose" - we have two prerequisites: - // 1. The popup window reverse animation completes (container()) - // 2. The screen opacity animation completes (screen()) - this._createPrerequisites( - $.proxy(this, "_closePrerequisiteScreen"), - $.proxy(this, "_closePrerequisiteContainer"), - $.proxy(this, "_closePrerequisitesDone")); - - this._animate({ - additionalCondition: this._ui.screen.hasClass("in"), - transition: (immediate ? "none" : (this._currentTransition)), - classToRemove: "in", - screenClassToAdd: "out", - containerClassToAdd: "reverse out", - applyTransition: true, - prerequisites: this._prerequisites - }); - }, - - _unenhance: function () { - if (this.options.enhanced) { - return; - } - - // Put the element back to where the placeholder was and remove the "ui-popup" class - this._setOptions({ theme: $.mobile.popup.prototype.options.theme }); - this.element - // Cannot directly insertAfter() - we need to detach() first, because - // insertAfter() will do nothing if the payload div was not attached - // to the DOM at the time the widget was created, and so the payload - // will remain inside the container even after we call insertAfter(). - // If that happens and we remove the container a few lines below, we - // will cause an infinite recursion - #5244 - .detach() - .insertAfter(this._ui.placeholder) - .removeClass("ui-popup ui-overlay-shadow ui-corner-all ui-body-inherit"); - this._ui.screen.remove(); - this._ui.container.remove(); - this._ui.placeholder.remove(); - }, - - _destroy: function () { - if ($.mobile.popup.active === this) { - this.element.one("popupafterclose", $.proxy(this, "_unenhance")); - this.close(); - } else { - this._unenhance(); - } - - return this; - }, - - _closePopup: function (theEvent, data) { - var parsedDst, toUrl, - currentOptions = this.options, - immediate = false; - - if ((theEvent && theEvent.isDefaultPrevented()) || $.mobile.popup.active !== this) { - return; - } - - // restore location on screen - window.scrollTo(0, this._scrollTop); - - if (theEvent && theEvent.type === "pagebeforechange" && data) { - // Determine whether we need to rapid-close the popup, or whether we can - // take the time to run the closing transition - if (typeof data.toPage === "string") { - parsedDst = data.toPage; - } else { - parsedDst = data.toPage.data("url"); - } - parsedDst = $.mobile.path.parseUrl(parsedDst); - toUrl = parsedDst.pathname + parsedDst.search + parsedDst.hash; - - if (this._myUrl !== $.mobile.path.makeUrlAbsolute(toUrl)) { - // Going to a different page - close immediately - immediate = true; - } else { - theEvent.preventDefault(); - } - } - - // remove nav bindings - this.window.off(currentOptions.closeEvents); - // unbind click handlers added when history is disabled - this.element.off(currentOptions.closeLinkEvents, currentOptions.closeLinkSelector); - - this._close(immediate); - }, - - // any navigation event after a popup is opened should close the popup - // NOTE the pagebeforechange is bound to catch navigation events that don't - // alter the url (eg, dialogs from popups) - _bindContainerClose: function () { - this.window - .on(this.options.closeEvents, $.proxy(this, "_closePopup")); - }, - - widget: function () { - return this._ui.container; - }, - - // TODO no clear deliniation of what should be here and - // what should be in _open. Seems to be "visual" vs "history" for now - open: function (options) { - var url, hashkey, activePage, currentIsDialog, hasHash, urlHistory, - self = this, - currentOptions = this.options; - - // make sure open is idempotent - if ($.mobile.popup.active || currentOptions.disabled) { - return this; - } - - // set the global popup mutex - $.mobile.popup.active = this; - this._scrollTop = this.window.scrollTop(); - - // if history alteration is disabled close on navigate events - // and leave the url as is - if (!(currentOptions.history)) { - self._open(options); - self._bindContainerClose(); - - // When histoy is disabled we have to grab the data-rel - // back link clicks so we can close the popup instead of - // relying on history to do it for us - self.element - .on(currentOptions.closeLinkEvents, currentOptions.closeLinkSelector, function (theEvent) { - self.close(); - theEvent.preventDefault(); - }); - - return this; - } - - // cache some values for min/readability - urlHistory = $.mobile.navigate.history; - hashkey = $.mobile.dialogHashKey; - activePage = $.mobile.activePage; - currentIsDialog = (activePage ? activePage.hasClass("ui-dialog") : false); - this._myUrl = url = urlHistory.getActive().url; - hasHash = (url.indexOf(hashkey) > -1) && !currentIsDialog && (urlHistory.activeIndex > 0); - - if (hasHash) { - self._open(options); - self._bindContainerClose(); - return this; - } - - // if the current url has no dialog hash key proceed as normal - // otherwise, if the page is a dialog simply tack on the hash key - if (url.indexOf(hashkey) === -1 && !currentIsDialog) { - url = url + (url.indexOf("#") > -1 ? hashkey : "#" + hashkey); - } else { - url = $.mobile.path.parseLocation().hash + hashkey; - } - - // swallow the the initial navigation event, and bind for the next - this.window.one("beforenavigate", function (theEvent) { - theEvent.preventDefault(); - self._open(options); - self._bindContainerClose(); - }); - - this.urlAltered = true; - $.mobile.navigate(url, { role: "dialog" }); - - return this; - }, - - close: function () { - // make sure close is idempotent - if ($.mobile.popup.active !== this) { - return this; - } - - this._scrollTop = this.window.scrollTop(); - - if (this.options.history && this.urlAltered) { - $.mobile.pageContainer.pagecontainer("back"); - this.urlAltered = false; - } else { - // simulate the nav bindings having fired - this._closePopup(); - } - - return this; - } - }); - - // TODO this can be moved inside the widget - $.mobile.popup.handleLink = function ($link) { - var offset, - path = $.mobile.path, - - // NOTE make sure to get only the hash from the href because ie7 (wp7) - // returns the absolute href in this case ruining the element selection - popup = $(path.hashToSelector(path.parseUrl($link.attr("href")).hash)).first(); - - if (popup.length > 0 && popup.data("mobile-popup")) { - offset = $link.offset(); - popup.popup("open", { - x: offset.left + $link.outerWidth() / 2, - y: offset.top + $link.outerHeight() / 2, - transition: $link.data("transition"), - positionTo: $link.data("position-to") - }); - } - - //remove after delay - setTimeout(function () { - $link.removeClass($.mobile.activeBtnClass); - }, 300); - }; - - // TODO move inside _create - $(document).on("pagebeforechange", function (theEvent, data) { - if (data.options.role === "popup") { - $.mobile.popup.handleLink(data.options.link); - theEvent.preventDefault(); - } - }); - - })(jQuery); - - - (function ($, undefined) { - - var ieHack = ($.mobile.browser.oldIE && $.mobile.browser.oldIE <= 8), - uiTemplate = $( - "
" + - "
" + - "
" + - "
" - ); - - function getArrow() { - var clone = uiTemplate.clone(), - gd = clone.eq(0), - ct = clone.eq(1), - ar = ct.children(); - - return { arEls: ct.add(gd), gd: gd, ct: ct, ar: ar }; - } - - $.widget("mobile.popup", $.mobile.popup, { - options: { - - arrow: "" - }, - - _create: function () { - var ar, - ret = this._super(); - - if (this.options.arrow) { - this._ui.arrow = ar = this._addArrow(); - } - - return ret; - }, - - _addArrow: function () { - var theme, - opts = this.options, - ar = getArrow(); - - theme = this._themeClassFromOption("ui-body-", opts.theme); - ar.ar.addClass(theme + (opts.shadow ? " ui-overlay-shadow" : "")); - ar.arEls.hide().appendTo(this.element); - - return ar; - }, - - _unenhance: function () { - var ar = this._ui.arrow; - - if (ar) { - ar.arEls.remove(); - } - - return this._super(); - }, - - // Pretend to show an arrow described by @p and @dir and calculate the - // distance from the desired point. If a best-distance is passed in, return - // the minimum of the one passed in and the one calculated. - _tryAnArrow: function (p, dir, desired, s, best) { - var result, r, diff, desiredForArrow = {}, tip = {}; - - // If the arrow has no wiggle room along the edge of the popup, it cannot - // be displayed along the requested edge without it sticking out. - if (s.arFull[p.dimKey] > s.guideDims[p.dimKey]) { - return best; - } - - desiredForArrow[p.fst] = desired[p.fst] + - (s.arHalf[p.oDimKey] + s.menuHalf[p.oDimKey]) * p.offsetFactor - - s.contentBox[p.fst] + (s.clampInfo.menuSize[p.oDimKey] - s.contentBox[p.oDimKey]) * p.arrowOffsetFactor; - desiredForArrow[p.snd] = desired[p.snd]; - - result = s.result || this._calculateFinalLocation(desiredForArrow, s.clampInfo); - r = { x: result.left, y: result.top }; - - tip[p.fst] = r[p.fst] + s.contentBox[p.fst] + p.tipOffset; - tip[p.snd] = Math.max(result[p.prop] + s.guideOffset[p.prop] + s.arHalf[p.dimKey], - Math.min(result[p.prop] + s.guideOffset[p.prop] + s.guideDims[p.dimKey] - s.arHalf[p.dimKey], - desired[p.snd])); - - diff = Math.abs(desired.x - tip.x) + Math.abs(desired.y - tip.y); - if (!best || diff < best.diff) { - // Convert tip offset to coordinates inside the popup - tip[p.snd] -= s.arHalf[p.dimKey] + result[p.prop] + s.contentBox[p.snd]; - best = { dir: dir, diff: diff, result: result, posProp: p.prop, posVal: tip[p.snd] }; - } - - return best; - }, - - _getPlacementState: function (clamp) { - var offset, gdOffset, - ar = this._ui.arrow, - state = { - clampInfo: this._clampPopupWidth(!clamp), - arFull: { cx: ar.ct.width(), cy: ar.ct.height() }, - guideDims: { cx: ar.gd.width(), cy: ar.gd.height() }, - guideOffset: ar.gd.offset() - }; - - offset = this.element.offset(); - - ar.gd.css({ left: 0, top: 0, right: 0, bottom: 0 }); - gdOffset = ar.gd.offset(); - state.contentBox = { - x: gdOffset.left - offset.left, - y: gdOffset.top - offset.top, - cx: ar.gd.width(), - cy: ar.gd.height() - }; - ar.gd.removeAttr("style"); - - // The arrow box moves between guideOffset and guideOffset + guideDims - arFull - state.guideOffset = { left: state.guideOffset.left - offset.left, top: state.guideOffset.top - offset.top }; - state.arHalf = { cx: state.arFull.cx / 2, cy: state.arFull.cy / 2 }; - state.menuHalf = { cx: state.clampInfo.menuSize.cx / 2, cy: state.clampInfo.menuSize.cy / 2 }; - - return state; - }, - - _placementCoords: function (desired) { - var state, best, params, elOffset, bgRef, - optionValue = this.options.arrow, - ar = this._ui.arrow; - - if (!ar) { - return this._super(desired); - } - - ar.arEls.show(); - - bgRef = {}; - state = this._getPlacementState(true); - params = { - "l": { fst: "x", snd: "y", prop: "top", dimKey: "cy", oDimKey: "cx", offsetFactor: 1, tipOffset: -state.arHalf.cx, arrowOffsetFactor: 0 }, - "r": { fst: "x", snd: "y", prop: "top", dimKey: "cy", oDimKey: "cx", offsetFactor: -1, tipOffset: state.arHalf.cx + state.contentBox.cx, arrowOffsetFactor: 1 }, - "b": { fst: "y", snd: "x", prop: "left", dimKey: "cx", oDimKey: "cy", offsetFactor: -1, tipOffset: state.arHalf.cy + state.contentBox.cy, arrowOffsetFactor: 1 }, - "t": { fst: "y", snd: "x", prop: "left", dimKey: "cx", oDimKey: "cy", offsetFactor: 1, tipOffset: -state.arHalf.cy, arrowOffsetFactor: 0 } - }; - - // Try each side specified in the options to see on which one the arrow - // should be placed such that the distance between the tip of the arrow and - // the desired coordinates is the shortest. - $.each((optionValue === true ? "l,t,r,b" : optionValue).split(","), - $.proxy(function (key, value) { - best = this._tryAnArrow(params[value], value, desired, state, best); - }, this)); - - // Could not place the arrow along any of the edges - behave as if showing - // the arrow was turned off. - if (!best) { - ar.arEls.hide(); - return this._super(desired); - } - - // Move the arrow into place - ar.ct - .removeClass("ui-popup-arrow-l ui-popup-arrow-t ui-popup-arrow-r ui-popup-arrow-b") - .addClass("ui-popup-arrow-" + best.dir) - .removeAttr("style").css(best.posProp, best.posVal) - .show(); - - // Do not move/size the background div on IE, because we use the arrow div for background as well. - if (!ieHack) { - elOffset = this.element.offset(); - bgRef[params[best.dir].fst] = ar.ct.offset(); - bgRef[params[best.dir].snd] = { - left: elOffset.left + state.contentBox.x, - top: elOffset.top + state.contentBox.y - }; - } - - return best.result; - }, - - _setOptions: function (opts) { - var newTheme, - oldTheme = this.options.theme, - ar = this._ui.arrow, - ret = this._super(opts); - - if (opts.arrow !== undefined) { - if (!ar && opts.arrow) { - this._ui.arrow = this._addArrow(); - - // Important to return here so we don't set the same options all over - // again below. - return; - } else if (ar && !opts.arrow) { - ar.arEls.remove(); - this._ui.arrow = null; - } - } - - // Reassign with potentially new arrow - ar = this._ui.arrow; - - if (ar) { - if (opts.theme !== undefined) { - oldTheme = this._themeClassFromOption("ui-body-", oldTheme); - newTheme = this._themeClassFromOption("ui-body-", opts.theme); - ar.ar.removeClass(oldTheme).addClass(newTheme); - } - - if (opts.shadow !== undefined) { - ar.ar.toggleClass("ui-overlay-shadow", opts.shadow); - } - } - - return ret; - }, - - _destroy: function () { - var ar = this._ui.arrow; - - if (ar) { - ar.arEls.remove(); - } - - return this._super(); - } - }); - - })(jQuery); -}); \ No newline at end of file +define(["jqmwidget"],function(){!function($,undefined){var props={animation:{},transition:{}},testElement=document.createElement("a"),vendorPrefixes=["","webkit-","moz-","o-"];$.each(["animation","transition"],function(i,test){var testName=0===i?test+"-name":test;$.each(vendorPrefixes,function(j,prefix){if(testElement.style[$.camelCase(prefix+testName)]!==undefined)return props[test].prefix=prefix,!1}),props[test].duration=$.camelCase(props[test].prefix+test+"-duration"),props[test].event=$.camelCase(props[test].prefix+test+"-end"),""===props[test].prefix&&(props[test].event=props[test].event.toLowerCase())}),$(testElement).remove(),$.fn.animationComplete=function(callback,type,fallbackTime){var timer,duration,that=this,eventBinding=function(){clearTimeout(timer),callback.apply(this,arguments)},animationType=type&&"animation"!==type?"transition":"animation";return fallbackTime===undefined&&($(this).context!==document&&(duration=3e3*parseFloat($(this).css(props[animationType].duration))),(0===duration||duration===undefined||isNaN(duration))&&(duration=$.fn.animationComplete.defaultDuration)),timer=setTimeout(function(){$(that).off(props[animationType].event,eventBinding),callback.apply(that)},duration),$(this).one(props[animationType].event,eventBinding)},$.fn.animationComplete.defaultDuration=1e3}(jQuery),function($,undefined){function fitSegmentInsideSegment(windowSize,segmentSize,offset,desired){var returnValue=desired;return returnValue=windowSize
";while(a[0]);return v>4?v:!v}(),$.widget("mobile.popup",{options:{wrapperClass:null,theme:null,overlayTheme:null,shadow:!0,corners:!0,transition:"none",positionTo:"origin",tolerance:null,closeLinkSelector:"a[data-rel='back']",closeLinkEvents:"click.popup",navigateEvents:"navigate.popup",closeEvents:"navigate.popup pagebeforechange.popup",dismissible:!0,enhanced:!1,history:!$.mobile.browser.oldIE},_handleDocumentVmousedown:function(theEvent){this._isOpen&&$.contains(this._ui.container[0],theEvent.target)&&this._ignoreResizeEvents()},_create:function(){var theElement=this.element,myId=theElement.attr("id"),currentOptions=this.options;currentOptions.history=currentOptions.history&&$.mobile.ajaxEnabled&&$.mobile.hashListeningEnabled,this._on(this.document,{mousedown:"_handleDocumentVmousedown"}),$.extend(this,{_scrollTop:0,_page:theElement.parents("div[data-role='page']"),_ui:null,_fallbackTransition:"",_currentTransition:!1,_prerequisites:null,_isOpen:!1,_tolerance:null,_resizeData:null,_ignoreResizeTo:0,_orientationchangeInProgress:!1}),0===this._page.length&&(this._page=$("body")),currentOptions.enhanced?this._ui={container:theElement.parent(),screen:theElement.parent().prev(),placeholder:$(this.document[0].getElementById(myId+"-placeholder"))}:(this._ui=this._enhance(theElement,myId),this._applyTransition(currentOptions.transition)),this._setTolerance(currentOptions.tolerance)._ui.focusElement=this._ui.container,this._on(this._ui.screen,{click:"_eatEventAndClose"}),this._on(this.window,{orientationchange:$.proxy(this,"_handleWindowOrientationchange"),resize:$.proxy(this,"_handleWindowResize")}),this._on(this.document,{focusin:"_handleDocumentFocusIn"})},_delay:function(handler,delay){function handlerProxy(){return("string"==typeof handler?instance[handler]:handler).apply(instance,arguments)}var instance=this;return setTimeout(handlerProxy,delay||0)},_enhance:function(theElement,myId){var currentOptions=this.options,wrapperClass=currentOptions.wrapperClass,ui={screen:$("
"),placeholder:$("
"),container:$("
")},fragment=this.document[0].createDocumentFragment();return fragment.appendChild(ui.screen[0]),fragment.appendChild(ui.container[0]),myId&&(ui.screen.attr("id",myId+"-screen"),ui.container.attr("id",myId+"-popup"),ui.placeholder.attr("id",myId+"-placeholder").html("")),this._page[0].appendChild(fragment),ui.placeholder.insertAfter(theElement),theElement.detach().addClass("ui-popup "+this._themeClassFromOption("ui-body-",currentOptions.theme)+" "+(currentOptions.shadow?"ui-overlay-shadow ":"")+(currentOptions.corners?"ui-corner-all ":"")).appendTo(ui.container),ui},_eatEventAndClose:function(theEvent){return theEvent.preventDefault(),theEvent.stopImmediatePropagation(),this.options.dismissible&&this.close(),!1},_resizeScreen:function(){var screen=this._ui.screen,popupHeight=this._ui.container.outerHeight(!0),screenHeight=screen.removeAttr("style").height(),documentHeight=this.document.height()-1;screenHeightscreenHeight&&screen.height(popupHeight)},_expectResizeEvent:function(){var windowCoordinates=getWindowCoordinates(this.window);if(this._resizeData){if(windowCoordinates.x===this._resizeData.windowCoordinates.x&&windowCoordinates.y===this._resizeData.windowCoordinates.y&&windowCoordinates.cx===this._resizeData.windowCoordinates.cx&&windowCoordinates.cy===this._resizeData.windowCoordinates.cy)return!1;clearTimeout(this._resizeData.timeoutId)}return this._resizeData={timeoutId:this._delay("_resizeTimeout",200),windowCoordinates:windowCoordinates},!0},_resizeTimeout:function(){this._isOpen?this._expectResizeEvent()||(this._ui.container.hasClass("ui-popup-hidden")&&(this._ui.container.removeClass("ui-popup-hidden ui-popup-truncate"),this.reposition({positionTo:"window"}),this._ignoreResizeEvents()),this._resizeScreen(),this._resizeData=null,this._orientationchangeInProgress=!1):(this._resizeData=null,this._orientationchangeInProgress=!1)},_stopIgnoringResizeEvents:function(){this._ignoreResizeTo=0},_ignoreResizeEvents:function(){this._ignoreResizeTo&&clearTimeout(this._ignoreResizeTo),this._ignoreResizeTo=this._delay("_stopIgnoringResizeEvents",1e3)},_handleWindowResize:function(){this._isOpen&&0===this._ignoreResizeTo&&(!this._expectResizeEvent()&&!this._orientationchangeInProgress||this._ui.container.hasClass("ui-popup-hidden")||this._ui.container.addClass("ui-popup-hidden ui-popup-truncate").removeAttr("style"))},_handleWindowOrientationchange:function(){!this._orientationchangeInProgress&&this._isOpen&&0===this._ignoreResizeTo&&(this._expectResizeEvent(),this._orientationchangeInProgress=!0)},_handleDocumentFocusIn:function(theEvent){var target,targetElement=theEvent.target,ui=this._ui;if(this._isOpen){if(targetElement!==ui.container[0]){if(target=$(targetElement),!$.contains(ui.container[0],targetElement))return $(this.document[0].activeElement).one("focus",$.proxy(function(){this._safelyBlur(targetElement)},this)),ui.focusElement.focus(),theEvent.preventDefault(),theEvent.stopImmediatePropagation(),!1;ui.focusElement[0]===ui.container[0]&&(ui.focusElement=target)}this._ignoreResizeEvents()}},_themeClassFromOption:function(prefix,value){return value?"none"===value?"":prefix+value:prefix+"inherit"},_applyTransition:function(value){return value&&(this._ui.container.removeClass(this._fallbackTransition),"none"!==value&&(this._fallbackTransition=$.mobile._maybeDegradeTransition(value),"none"===this._fallbackTransition&&(this._fallbackTransition=""),this._ui.container.addClass(this._fallbackTransition))),this},_setOptions:function(newOptions){var currentOptions=this.options,theElement=this.element,screen=this._ui.screen;return newOptions.wrapperClass!==undefined&&this._ui.container.removeClass(currentOptions.wrapperClass).addClass(newOptions.wrapperClass),newOptions.theme!==undefined&&theElement.removeClass(this._themeClassFromOption("ui-body-",currentOptions.theme)).addClass(this._themeClassFromOption("ui-body-",newOptions.theme)),newOptions.overlayTheme!==undefined&&(screen.removeClass(this._themeClassFromOption("ui-overlay-",currentOptions.overlayTheme)).addClass(this._themeClassFromOption("ui-overlay-",newOptions.overlayTheme)),this._isOpen&&screen.addClass("in")),newOptions.shadow!==undefined&&theElement.toggleClass("ui-overlay-shadow",newOptions.shadow),newOptions.corners!==undefined&&theElement.toggleClass("ui-corner-all",newOptions.corners),newOptions.transition!==undefined&&(this._currentTransition||this._applyTransition(newOptions.transition)),newOptions.tolerance!==undefined&&this._setTolerance(newOptions.tolerance),newOptions.disabled!==undefined&&newOptions.disabled&&this.close(),this._super(newOptions)},_setTolerance:function(value){var ar,tol={t:30,r:15,b:30,l:15};if(value!==undefined)switch(ar=String(value).split(","),$.each(ar,function(idx,val){ar[idx]=parseInt(val,10)}),ar.length){case 1:isNaN(ar[0])||(tol.t=tol.r=tol.b=tol.l=ar[0]);break;case 2:isNaN(ar[0])||(tol.t=tol.b=ar[0]),isNaN(ar[1])||(tol.l=tol.r=ar[1]);break;case 4:isNaN(ar[0])||(tol.t=ar[0]),isNaN(ar[1])||(tol.r=ar[1]),isNaN(ar[2])||(tol.b=ar[2]),isNaN(ar[3])||(tol.l=ar[3])}return this._tolerance=tol,this},_clampPopupWidth:function(infoOnly){var menuSize,windowCoordinates=getWindowCoordinates(this.window),rectangle={x:this._tolerance.l,y:windowCoordinates.y+this._tolerance.t,cx:windowCoordinates.cx-this._tolerance.l-this._tolerance.r,cy:windowCoordinates.cy-this._tolerance.t-this._tolerance.b};return infoOnly||this._ui.container.css("max-width",rectangle.cx),menuSize={cx:this._ui.container.outerWidth(!0),cy:this._ui.container.outerHeight(!0)},{rc:rectangle,menuSize:menuSize}},_calculateFinalLocation:function(desired,clampInfo){var returnValue,rectangle=clampInfo.rc,menuSize=clampInfo.menuSize;return returnValue={left:fitSegmentInsideSegment(rectangle.cx,menuSize.cx,rectangle.x,desired.x),top:fitSegmentInsideSegment(rectangle.cy,menuSize.cy,rectangle.y,desired.y)},returnValue.top=Math.max(0,returnValue.top),returnValue.top-=Math.min(returnValue.top,Math.max(0,returnValue.top+menuSize.cy-this.document.height())),returnValue},_placementCoords:function(desired){return this._calculateFinalLocation(desired,this._clampPopupWidth())},_createPrerequisites:function(screenPrerequisite,containerPrerequisite,whenDone){var prerequisites,self=this;prerequisites={screen:$.Deferred(),container:$.Deferred()},prerequisites.screen.then(function(){prerequisites===self._prerequisites&&screenPrerequisite()}),prerequisites.container.then(function(){prerequisites===self._prerequisites&&containerPrerequisite()}),Promise.all([prerequisites.screen,prerequisites.container]).then(function(){prerequisites===self._prerequisites&&(self._prerequisites=null,whenDone())}),self._prerequisites=prerequisites},_animate:function(args){return this._ui.screen.removeClass(args.classToRemove).addClass(args.screenClassToAdd),args.prerequisites.screen.resolve(),args.transition&&"none"!==args.transition&&(args.applyTransition&&this._applyTransition(args.transition),this._fallbackTransition)?void this._ui.container.addClass(args.containerClassToAdd).removeClass(args.classToRemove).animationComplete($.proxy(args.prerequisites.container,"resolve")):(this._ui.container.removeClass(args.classToRemove),void args.prerequisites.container.resolve())},_desiredCoords:function(openOptions){var offset,dst=null,windowCoordinates=getWindowCoordinates(this.window),x=openOptions.x,y=openOptions.y,pTo=openOptions.positionTo;if(pTo&&"origin"!==pTo)if("window"===pTo)x=windowCoordinates.cx/2+windowCoordinates.x,y=windowCoordinates.cy/2+windowCoordinates.y;else{try{dst=$(pTo)}catch(err){dst=null}dst&&(dst.filter(":visible"),0===dst.length&&(dst=null))}return dst&&(offset=dst.offset(),x=offset.left+dst.outerWidth()/2,y=offset.top+dst.outerHeight()/2),("number"!==$.type(x)||isNaN(x))&&(x=windowCoordinates.cx/2+windowCoordinates.x),("number"!==$.type(y)||isNaN(y))&&(y=windowCoordinates.cy/2+windowCoordinates.y),{x:x,y:y}},_reposition:function(openOptions){openOptions={x:openOptions.x,y:openOptions.y,positionTo:openOptions.positionTo},this._trigger("beforeposition",undefined,openOptions),this._ui.container.offset(this._placementCoords(this._desiredCoords(openOptions)))},reposition:function(openOptions){this._isOpen&&this._reposition(openOptions)},_safelyBlur:function(currentElement){currentElement!==this.window[0]&&"body"!==currentElement.nodeName.toLowerCase()&&$(currentElement).blur()},_openPrerequisitesComplete:function(){var id=this.element.attr("id");this._ui.container.addClass("ui-popup-active"),this._isOpen=!0,this._resizeScreen(),$.contains(this._ui.container[0],this.document[0].activeElement)||this._safelyBlur(this.document[0].activeElement),this._ignoreResizeEvents(),id&&this.document.find("[aria-haspopup='true'][aria-owns='"+id+"']").attr("aria-expanded",!0),this._trigger("afteropen")},_open:function(options){var openOptions=$.extend({},this.options,options),androidBlacklist=function(){var ua=navigator.userAgent,wkmatch=ua.match(/AppleWebKit\/([0-9\.]+)/),wkversion=!!wkmatch&&wkmatch[1],androidmatch=ua.match(/Android (\d+(?:\.\d+))/),andversion=!!androidmatch&&androidmatch[1],chromematch=ua.indexOf("Chrome")>-1;return!(!(null!==androidmatch&&"4.0"===andversion&&wkversion&&wkversion>534.13)||chromematch)}();this._createPrerequisites($.noop,$.noop,$.proxy(this,"_openPrerequisitesComplete")),this._currentTransition=openOptions.transition,this._applyTransition(openOptions.transition),this._ui.screen.removeClass("ui-screen-hidden"),this._ui.container.removeClass("ui-popup-truncate"),this._reposition(openOptions),this._ui.container.removeClass("ui-popup-hidden"),this.options.overlayTheme&&androidBlacklist&&this.element.closest(".ui-page").addClass("ui-popup-open"),this._animate({additionalCondition:!0,transition:openOptions.transition,classToRemove:"",screenClassToAdd:"in",containerClassToAdd:"in",applyTransition:!1,prerequisites:this._prerequisites})},_closePrerequisiteScreen:function(){this._ui.screen.removeClass("out").addClass("ui-screen-hidden")},_closePrerequisiteContainer:function(){this._ui.container.removeClass("reverse out").addClass("ui-popup-hidden ui-popup-truncate").removeAttr("style")},_closePrerequisitesDone:function(){var container=this._ui.container,id=this.element.attr("id");$.mobile.popup.active=undefined,$(":focus",container[0]).add(container[0]).blur(),id&&this.document.find("[aria-haspopup='true'][aria-owns='"+id+"']").attr("aria-expanded",!1),this._trigger("afterclose")},_close:function(immediate){this._ui.container.removeClass("ui-popup-active"),this._page.removeClass("ui-popup-open"),this._isOpen=!1,this._createPrerequisites($.proxy(this,"_closePrerequisiteScreen"),$.proxy(this,"_closePrerequisiteContainer"),$.proxy(this,"_closePrerequisitesDone")),this._animate({additionalCondition:this._ui.screen.hasClass("in"),transition:immediate?"none":this._currentTransition,classToRemove:"in",screenClassToAdd:"out",containerClassToAdd:"reverse out",applyTransition:!0,prerequisites:this._prerequisites})},_unenhance:function(){this.options.enhanced||(this._setOptions({theme:$.mobile.popup.prototype.options.theme}),this.element.detach().insertAfter(this._ui.placeholder).removeClass("ui-popup ui-overlay-shadow ui-corner-all ui-body-inherit"),this._ui.screen.remove(),this._ui.container.remove(),this._ui.placeholder.remove())},_destroy:function(){return $.mobile.popup.active===this?(this.element.one("popupafterclose",$.proxy(this,"_unenhance")),this.close()):this._unenhance(),this},_closePopup:function(theEvent,data){var parsedDst,toUrl,currentOptions=this.options,immediate=!1;theEvent&&theEvent.isDefaultPrevented()||$.mobile.popup.active!==this||(window.scrollTo(0,this._scrollTop),theEvent&&"pagebeforechange"===theEvent.type&&data&&(parsedDst="string"==typeof data.toPage?data.toPage:data.toPage.data("url"),parsedDst=$.mobile.path.parseUrl(parsedDst),toUrl=parsedDst.pathname+parsedDst.search+parsedDst.hash,this._myUrl!==$.mobile.path.makeUrlAbsolute(toUrl)?immediate=!0:theEvent.preventDefault()),this.window.off(currentOptions.closeEvents),this.element.off(currentOptions.closeLinkEvents,currentOptions.closeLinkSelector),this._close(immediate))},_bindContainerClose:function(){this.window.on(this.options.closeEvents,$.proxy(this,"_closePopup"))},widget:function(){return this._ui.container},open:function(options){var url,hashkey,activePage,currentIsDialog,hasHash,urlHistory,self=this,currentOptions=this.options;return $.mobile.popup.active||currentOptions.disabled?this:($.mobile.popup.active=this,this._scrollTop=this.window.scrollTop(),currentOptions.history?(urlHistory=$.mobile.navigate.history,hashkey=$.mobile.dialogHashKey,activePage=$.mobile.activePage,currentIsDialog=!!activePage&&activePage.hasClass("ui-dialog"),this._myUrl=url=urlHistory.getActive().url,(hasHash=url.indexOf(hashkey)>-1&&!currentIsDialog&&urlHistory.activeIndex>0)?(self._open(options),self._bindContainerClose(),this):(url.indexOf(hashkey)!==-1||currentIsDialog?url=$.mobile.path.parseLocation().hash+hashkey:url+=url.indexOf("#")>-1?hashkey:"#"+hashkey,this.window.one("beforenavigate",function(theEvent){theEvent.preventDefault(),self._open(options),self._bindContainerClose()}),this.urlAltered=!0,$.mobile.navigate(url,{role:"dialog"}),this)):(self._open(options),self._bindContainerClose(),self.element.on(currentOptions.closeLinkEvents,currentOptions.closeLinkSelector,function(theEvent){self.close(),theEvent.preventDefault()}),this))},close:function(){return $.mobile.popup.active!==this?this:(this._scrollTop=this.window.scrollTop(),this.options.history&&this.urlAltered?($.mobile.pageContainer.pagecontainer("back"),this.urlAltered=!1):this._closePopup(),this)}}),$.mobile.popup.handleLink=function($link){var offset,path=$.mobile.path,popup=$(path.hashToSelector(path.parseUrl($link.attr("href")).hash)).first();popup.length>0&&popup.data("mobile-popup")&&(offset=$link.offset(),popup.popup("open",{x:offset.left+$link.outerWidth()/2,y:offset.top+$link.outerHeight()/2,transition:$link.data("transition"),positionTo:$link.data("position-to")})),setTimeout(function(){$link.removeClass($.mobile.activeBtnClass)},300)},$(document).on("pagebeforechange",function(theEvent,data){"popup"===data.options.role&&($.mobile.popup.handleLink(data.options.link),theEvent.preventDefault())})}(jQuery),function($,undefined){function getArrow(){var clone=uiTemplate.clone(),gd=clone.eq(0),ct=clone.eq(1),ar=ct.children();return{arEls:ct.add(gd),gd:gd,ct:ct,ar:ar}}var ieHack=$.mobile.browser.oldIE&&$.mobile.browser.oldIE<=8,uiTemplate=$("
");$.widget("mobile.popup",$.mobile.popup,{options:{arrow:""},_create:function(){var ar,ret=this._super();return this.options.arrow&&(this._ui.arrow=ar=this._addArrow()),ret},_addArrow:function(){var theme,opts=this.options,ar=getArrow();return theme=this._themeClassFromOption("ui-body-",opts.theme),ar.ar.addClass(theme+(opts.shadow?" ui-overlay-shadow":"")),ar.arEls.hide().appendTo(this.element),ar},_unenhance:function(){var ar=this._ui.arrow;return ar&&ar.arEls.remove(),this._super()},_tryAnArrow:function(p,dir,desired,s,best){var result,r,diff,desiredForArrow={},tip={};return s.arFull[p.dimKey]>s.guideDims[p.dimKey]?best:(desiredForArrow[p.fst]=desired[p.fst]+(s.arHalf[p.oDimKey]+s.menuHalf[p.oDimKey])*p.offsetFactor-s.contentBox[p.fst]+(s.clampInfo.menuSize[p.oDimKey]-s.contentBox[p.oDimKey])*p.arrowOffsetFactor,desiredForArrow[p.snd]=desired[p.snd],result=s.result||this._calculateFinalLocation(desiredForArrow,s.clampInfo),r={x:result.left,y:result.top},tip[p.fst]=r[p.fst]+s.contentBox[p.fst]+p.tipOffset,tip[p.snd]=Math.max(result[p.prop]+s.guideOffset[p.prop]+s.arHalf[p.dimKey],Math.min(result[p.prop]+s.guideOffset[p.prop]+s.guideDims[p.dimKey]-s.arHalf[p.dimKey],desired[p.snd])),diff=Math.abs(desired.x-tip.x)+Math.abs(desired.y-tip.y),(!best||diff/**/body .ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child { - height: 15px; - border-width: 1px; -} -html >/**/body .ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track:first-child { - height: 12px; -} - -/* Hide the second label (the first is moved outside the div) */ -div.ui-rangeslider label { - position: absolute !important; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px,1px,1px,1px); -} -.ui-field-contain .ui-rangeslider input.ui-slider-input, -.ui-field-contain .ui-rangeslider.ui-mini input.ui-slider-input, -.ui-field-contain .ui-rangeslider .ui-rangeslider-sliders, -.ui-field-contain .ui-rangeslider.ui-mini .ui-rangeslider-sliders { - margin-top: 0; - margin-bottom: 0; -} - - - - - -div.ui-slider { - height: 30px; - margin: .5em 0; - padding: 0; - -ms-touch-action: pan-y pinch-zoom double-tap-zoom; -} -div.ui-slider:before, -div.ui-slider:after { - content: ""; - display: table; -} -div.ui-slider:after { - clear: both; -} -input.ui-slider-input { - display: none; - float: left; - font-size: 14px; - font-weight: bold; - margin: 0; - padding: 4px; - width: 40px; - height: 20px; - line-height: 20px; - border-width: 1px; - border-style: solid; - outline: 0; - text-align: center; - vertical-align: text-bottom; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -.ui-slider-input::-webkit-outer-spin-button, -.ui-slider-input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; -} -.ui-slider-track { - position: relative; - overflow: visible; - border-width: 1px; - border-style: solid; - height: 15px; - margin: 0 15px 0 0; - top: 6px; -} -.ui-slider-track.ui-mini { - height: 12px; - top: 8px; -} -.ui-slider-track .ui-slider-bg { - height: 100%; -} -/* High level of specificity to override button margins in grids */ -.ui-slider-track .ui-btn.ui-slider-handle { - position: absolute; - z-index: 1; - top: 50%; - width: 28px; - height: 28px; - margin: -15px 0 0 -15px; - outline: 0; - padding: 0; -} -.ui-slider-track.ui-mini .ui-slider-handle { - height: 14px; - width: 14px; - margin: -8px 0 0 -8px; -} -select.ui-slider-switch { - position: absolute !important; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px,1px,1px,1px); -} -div.ui-slider-switch { - display: inline-block; - height: 32px; - width: 5.8em; - top: 0; -} -/* reset the clearfix */ -div.ui-slider-switch:before, -div.ui-slider-switch:after { - display: none; - clear: none; -} -div.ui-slider-switch.ui-mini { - height: 29px; - top: 0; -} -.ui-slider-inneroffset { - margin: 0 16px; - position: relative; - z-index: 1; -} -.ui-slider-switch.ui-mini .ui-slider-inneroffset { - margin: 0 15px 0 14px; -} -.ui-slider-switch .ui-btn.ui-slider-handle { - margin: 1px 0 0 -15px; -} -.ui-slider-switch.ui-mini .ui-slider-handle { - width: 25px; - height: 25px; - margin: 1px 0 0 -13px; - padding: 0; -} -.ui-slider-handle-snapping { - -webkit-transition: left 70ms linear; - -moz-transition: left 70ms linear; - transition: left 70ms linear; -} -.ui-slider-switch .ui-slider-label { - position: absolute; - text-align: center; - width: 100%; - overflow: hidden; - font-size: 16px; - top: 0; - line-height: 2; - min-height: 100%; - white-space: nowrap; - cursor: pointer; -} -.ui-slider-switch.ui-mini .ui-slider-label { - font-size: 14px; -} -.ui-slider-switch .ui-slider-label-a { - z-index: 1; - left: 0; - text-indent: -1.5em; -} -.ui-slider-switch .ui-slider-label-b { - z-index: 0; - right: 0; - text-indent: 1.5em; -} -/* The corner radii for ui-slider-switch/track can be specified in theme CSS. The bg and handle inherits. */ -.ui-slider-track .ui-slider-bg, -.ui-slider-switch .ui-slider-label, -.ui-slider-switch .ui-slider-inneroffset, -.ui-slider-handle { - -webkit-border-radius: inherit; - border-radius: inherit; -} -.ui-field-contain div.ui-slider-switch { - margin: 0; -} -/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */ -.ui-field-contain div.ui-slider-switch, -.ui-field-contain.ui-hide-label div.ui-slider-switch, -html .ui-popup .ui-field-contain div.ui-slider-switch { - display: inline-block; - width: 5.8em; -} - - -/* slider tooltip ------------------------------------------------------------------------------------------------------------*/ - -.ui-slider-popup { - width: 64px; - height: 64px; - font-size: 36px; - padding-top: 14px; - opacity: 0.8; -} - -.ui-slider-popup { - position: absolute !important; - text-align: center; - z-index: 100; -} - -.ui-slider-track .ui-btn.ui-slider-handle { - font-size: .9em; - line-height: 30px; -} - - - -/* Active slider track */ -.ui-page-theme-a .ui-slider-track .ui-btn-active, -html .ui-bar-a .ui-slider-track .ui-btn-active, -html .ui-body-a .ui-slider-track .ui-btn-active, -html body .ui-group-theme-a .ui-slider-track .ui-btn-active, -html body div.ui-slider-track.ui-body-a .ui-btn-active { - background-color: #3388cc /*{a-active-background-color}*/; - border-color: #3388cc /*{a-active-border}*/; - color: #fff /*{a-active-color}*/; - text-shadow: 0 /*{a-active-shadow-x}*/ 1px /*{a-active-shadow-y}*/ 0 /*{a-active-shadow-radius}*/ #005599 /*{a-active-shadow-color}*/; -} - -/* Active slider track */ -.ui-page-theme-b .ui-slider-track .ui-btn-active, -html .ui-bar-b .ui-slider-track .ui-btn-active, -html .ui-body-b .ui-slider-track .ui-btn-active, -html body .ui-group-theme-b .ui-slider-track .ui-btn-active, -html body div.ui-slider-track.ui-body-b .ui-btn-active { - background-color: #22aadd /*{b-active-background-color}*/; - border-color: #22aadd /*{b-active-border}*/; - color: #fff /*{b-active-color}*/; - text-shadow: 0 /*{b-active-shadow-x}*/ 1px /*{b-active-shadow-y}*/ 0 /*{b-active-shadow-radius}*/ #0088bb /*{b-active-shadow-color}*/; -} +.ui-rangeslider:after,div.ui-slider:after{clear:both}.ui-rangeslider{margin:.5em 0}.ui-rangeslider:after,.ui-rangeslider:before{content:"";display:table}.ui-rangeslider .ui-slider-input.ui-rangeslider-last{float:right}.ui-rangeslider .ui-rangeslider-sliders{position:relative;overflow:visible;height:30px;margin:0 68px}.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track{position:absolute;top:6px;right:0;left:0;margin:0}.ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track{top:8px}.ui-rangeslider .ui-slider-track:first-child .ui-slider-bg{display:none}.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child{background:0 0;border-width:0;height:0}html>body .ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child{height:15px;border-width:1px}html>body .ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track:first-child{height:12px}div.ui-rangeslider label{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}.ui-field-contain .ui-rangeslider .ui-rangeslider-sliders,.ui-field-contain .ui-rangeslider input.ui-slider-input,.ui-field-contain .ui-rangeslider.ui-mini .ui-rangeslider-sliders,.ui-field-contain .ui-rangeslider.ui-mini input.ui-slider-input{margin-top:0;margin-bottom:0}div.ui-slider{height:30px;margin:.5em 0;padding:0;-ms-touch-action:pan-y pinch-zoom double-tap-zoom}div.ui-slider:after,div.ui-slider:before{content:"";display:table}input.ui-slider-input{display:none;float:left;font-size:14px;font-weight:700;margin:0;padding:4px;width:40px;height:20px;line-height:20px;border-width:1px;border-style:solid;outline:0;text-align:center;vertical-align:text-bottom;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-box-sizing:content-box;box-sizing:content-box}.ui-slider-input::-webkit-inner-spin-button,.ui-slider-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.ui-slider-track{position:relative;overflow:visible;border-width:1px;border-style:solid;height:15px;margin:0 15px 0 0;top:6px}.ui-slider-track.ui-mini{height:12px;top:8px}.ui-slider-track .ui-slider-bg{height:100%}.ui-slider-track .ui-btn.ui-slider-handle{position:absolute;z-index:1;top:50%;width:28px;height:28px;margin:-15px 0 0 -15px;outline:0;padding:0}.ui-slider-track.ui-mini .ui-slider-handle{height:14px;width:14px;margin:-8px 0 0 -8px}select.ui-slider-switch{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}div.ui-slider-switch{display:inline-block;height:32px;width:5.8em;top:0}div.ui-slider-switch:after,div.ui-slider-switch:before{display:none;clear:none}div.ui-slider-switch.ui-mini{height:29px;top:0}.ui-slider-inneroffset{margin:0 16px;position:relative;z-index:1}.ui-slider-switch.ui-mini .ui-slider-inneroffset{margin:0 15px 0 14px}.ui-slider-switch .ui-btn.ui-slider-handle{margin:1px 0 0 -15px}.ui-slider-switch.ui-mini .ui-slider-handle{width:25px;height:25px;margin:1px 0 0 -13px;padding:0}.ui-slider-handle-snapping{-webkit-transition:left 70ms linear;-o-transition:left 70ms linear;transition:left 70ms linear}.ui-slider-switch .ui-slider-label{position:absolute;text-align:center;width:100%;overflow:hidden;font-size:16px;top:0;line-height:2;min-height:100%;white-space:nowrap;cursor:pointer}.ui-slider-switch.ui-mini .ui-slider-label{font-size:14px}.ui-slider-switch .ui-slider-label-a{z-index:1;left:0;text-indent:-1.5em}.ui-slider-switch .ui-slider-label-b{z-index:0;right:0;text-indent:1.5em}.ui-slider-handle,.ui-slider-switch .ui-slider-inneroffset,.ui-slider-switch .ui-slider-label,.ui-slider-track .ui-slider-bg{-webkit-border-radius:inherit;border-radius:inherit}.ui-field-contain div.ui-slider-switch{margin:0}.ui-field-contain div.ui-slider-switch,.ui-field-contain.ui-hide-label div.ui-slider-switch,html .ui-popup .ui-field-contain div.ui-slider-switch{display:inline-block;width:5.8em}.ui-slider-popup{width:64px;height:64px;font-size:36px;padding-top:14px;opacity:.8;position:absolute!important;text-align:center;z-index:100}.ui-slider-track .ui-btn.ui-slider-handle{font-size:.9em;line-height:30px}.ui-page-theme-a .ui-slider-track .ui-btn-active,html .ui-bar-a .ui-slider-track .ui-btn-active,html .ui-body-a .ui-slider-track .ui-btn-active,html body .ui-group-theme-a .ui-slider-track .ui-btn-active,html body div.ui-slider-track.ui-body-a .ui-btn-active{background-color:#38c;border-color:#38c;color:#fff;text-shadow:0 1px 0 #059}.ui-page-theme-b .ui-slider-track .ui-btn-active,html .ui-bar-b .ui-slider-track .ui-btn-active,html .ui-body-b .ui-slider-track .ui-btn-active,html body .ui-group-theme-b .ui-slider-track .ui-btn-active,html body div.ui-slider-track.ui-body-b .ui-btn-active{background-color:#2ad;border-color:#2ad;color:#fff;text-shadow:0 1px 0 #08b} \ No newline at end of file diff --git a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.slider.js b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.slider.js index 6b9cee55c6..98f7073bbc 100644 --- a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.slider.js +++ b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.slider.js @@ -1,1027 +1 @@ -define(['jqmwidget'], function () { - - var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/; - - $.extend($.mobile, { - - // Namespace used framework-wide for data-attrs. Default is no namespace - - // Retrieve an attribute from an element and perform some massaging of the value - - getAttribute: function (element, key) { - var data; - - element = element.jquery ? element[0] : element; - - if (element && element.getAttribute) { - data = element.getAttribute("data-" + key); - } - - // Copied from core's src/data.js:dataAttr() - // Convert from a string to a proper data type - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test(data) ? JSON.parse(data) : - data; - } catch (err) { } - - return data; - } - - }); - - /*! - * jQuery UI Core c0ab71056b936627e8a7821f03c044aec6280a40 - * http://jqueryui.com - * - * Copyright 2013 jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/category/ui-core/ - */ - (function ($, undefined) { - - // $.ui might exist from components with no dependencies, e.g., $.ui.position - $.ui = $.ui || {}; - - $.extend($.ui, { - version: "c0ab71056b936627e8a7821f03c044aec6280a40", - - keyCode: { - BACKSPACE: 8, - COMMA: 188, - DELETE: 46, - DOWN: 40, - END: 35, - ENTER: 13, - ESCAPE: 27, - HOME: 36, - LEFT: 37, - PAGE_DOWN: 34, - PAGE_UP: 33, - PERIOD: 190, - RIGHT: 39, - SPACE: 32, - TAB: 9, - UP: 38 - } - }); - - // deprecated - $.ui.ie = !!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()); - - })(jQuery); - - $.widget("mobile.slider", $.extend({ - initSelector: "input[type='range']:not([data-role='none'])", - - widgetEventPrefix: "slide", - - options: { - theme: null, - trackTheme: null, - corners: true, - mini: false, - highlight: false - }, - - _create: function () { - - // TODO: Each of these should have comments explain what they're for - var self = this, - control = this.element, - trackTheme = this.options.trackTheme || $.mobile.getAttribute(control[0], "theme"), - trackThemeClass = trackTheme ? " ui-bar-" + trackTheme : " ui-bar-inherit", - cornerClass = (this.options.corners || control.data("corners")) ? " ui-corner-all" : "", - miniClass = (this.options.mini || control.data("mini")) ? " ui-mini" : "", - cType = control[0].nodeName.toLowerCase(), - isToggleSwitch = (cType === "select"), - isRangeslider = control.parent().is("[data-role='rangeslider']"), - selectClass = (isToggleSwitch) ? "ui-slider-switch" : "", - controlID = control.attr("id"), - $label = $("[for='" + controlID + "']"), - labelID = $label.attr("id") || controlID + "-label", - min = !isToggleSwitch ? parseFloat(control.attr("min")) : 0, - max = !isToggleSwitch ? parseFloat(control.attr("max")) : control.find("option").length - 1, - step = window.parseFloat(control.attr("step") || 1), - domHandle = document.createElement("a"), - handle = $(domHandle), - domSlider = document.createElement("div"), - slider = $(domSlider), - valuebg = this.options.highlight && !isToggleSwitch ? (function () { - var bg = document.createElement("div"); - bg.className = "ui-slider-bg " + $.mobile.activeBtnClass; - return $(bg).prependTo(slider); - })() : false, - options, - wrapper, - j, length, - i, optionsCount, origTabIndex, - side, activeClass, sliderImg; - - $label.attr("id", labelID); - this.isToggleSwitch = isToggleSwitch; - - domHandle.setAttribute("href", "#"); - domSlider.setAttribute("role", "application"); - domSlider.className = [this.isToggleSwitch ? "ui-slider ui-slider-track ui-shadow-inset " : "ui-slider-track ui-shadow-inset ", selectClass, trackThemeClass, cornerClass, miniClass].join(""); - domHandle.className = "ui-slider-handle"; - domSlider.appendChild(domHandle); - - handle.attr({ - "role": "slider", - "aria-valuemin": min, - "aria-valuemax": max, - "aria-valuenow": this._value(), - "aria-valuetext": this._value(), - "title": this._value(), - "aria-labelledby": labelID - }); - - $.extend(this, { - slider: slider, - handle: handle, - control: control, - type: cType, - step: step, - max: max, - min: min, - valuebg: valuebg, - isRangeslider: isRangeslider, - dragging: false, - beforeStart: null, - userModified: false, - mouseMoved: false - }); - - if (isToggleSwitch) { - // TODO: restore original tabindex (if any) in a destroy method - origTabIndex = control.attr("tabindex"); - if (origTabIndex) { - handle.attr("tabindex", origTabIndex); - } - control.attr("tabindex", "-1").focus(function () { - $(this).blur(); - handle.focus(); - }); - - wrapper = document.createElement("div"); - wrapper.className = "ui-slider-inneroffset"; - - for (j = 0, length = domSlider.childNodes.length; j < length; j++) { - wrapper.appendChild(domSlider.childNodes[j]); - } - - domSlider.appendChild(wrapper); - - // slider.wrapInner( "
" ); - - // make the handle move with a smooth transition - handle.addClass("ui-slider-handle-snapping"); - - options = control.find("option"); - - for (i = 0, optionsCount = options.length; i < optionsCount; i++) { - side = !i ? "b" : "a"; - activeClass = !i ? "" : " " + $.mobile.activeBtnClass; - sliderImg = document.createElement("span"); - - sliderImg.className = ["ui-slider-label ui-slider-label-", side, activeClass].join(""); - sliderImg.setAttribute("role", "img"); - sliderImg.appendChild(document.createTextNode(options[i].innerHTML)); - $(sliderImg).prependTo(slider); - } - - self._labels = $(".ui-slider-label", slider); - - } - - // monitor the input for updated values - control.addClass(isToggleSwitch ? "ui-slider-switch" : "ui-slider-input"); - - this._on(control, { - "change": "_controlChange", - "keyup": "_controlKeyup", - "blur": "_controlBlur", - "mouseup": "_controlVMouseUp" - }); - - slider.on("mousedown", $.proxy(this._sliderVMouseDown, this)) - .on("click", false); - - // We have to instantiate a new function object for the unbind to work properly - // since the method itself is defined in the prototype (causing it to unbind everything) - this._on(document, { "mousemove": "_preventDocumentDrag" }); - this._on(slider.add(document), { "mouseup": "_sliderVMouseUp" }); - - slider.insertAfter(control); - - // wrap in a div for styling purposes - if (!isToggleSwitch && !isRangeslider) { - wrapper = this.options.mini ? "
" : "
"; - - control.add(slider).wrapAll(wrapper); - } - - // bind the handle event callbacks and set the context to the widget instance - this._on(this.handle, { - "mousedown": "_handleVMouseDown", - "keydown": "_handleKeydown", - "keyup": "_handleKeyup" - }); - - this.handle.on("click", false); - - //this._handleFormReset(); - - this.refresh(undefined, undefined, true); - }, - - _setOptions: function (options) { - if (options.theme !== undefined) { - this._setTheme(options.theme); - } - - if (options.trackTheme !== undefined) { - this._setTrackTheme(options.trackTheme); - } - - if (options.corners !== undefined) { - this._setCorners(options.corners); - } - - if (options.mini !== undefined) { - this._setMini(options.mini); - } - - if (options.highlight !== undefined) { - this._setHighlight(options.highlight); - } - - if (options.disabled !== undefined) { - this._setDisabled(options.disabled); - } - this._super(options); - }, - - _controlChange: function (event) { - // if the user dragged the handle, the "change" event was triggered from inside refresh(); don't call refresh() again - if (this._trigger("controlchange", event) === false) { - return false; - } - if (!this.mouseMoved) { - this.refresh(this._value(), true); - } - }, - - _controlKeyup: function (/* event */) { // necessary? - this.refresh(this._value(), true, true); - }, - - _controlBlur: function (/* event */) { - this.refresh(this._value(), true); - }, - - // it appears the clicking the up and down buttons in chrome on - // range/number inputs doesn't trigger a change until the field is - // blurred. Here we check thif the value has changed and refresh - _controlVMouseUp: function (/* event */) { - this._checkedRefresh(); - }, - - // NOTE force focus on handle - _handleVMouseDown: function (/* event */) { - this.handle.focus(); - }, - - _handleKeydown: function (event) { - var index = this._value(); - if (this.options.disabled) { - return; - } - - // In all cases prevent the default and mark the handle as active - switch (event.keyCode) { - case $.ui.keyCode.HOME: - case $.ui.keyCode.END: - case $.ui.keyCode.PAGE_UP: - case $.ui.keyCode.PAGE_DOWN: - case $.ui.keyCode.UP: - case $.ui.keyCode.RIGHT: - case $.ui.keyCode.DOWN: - case $.ui.keyCode.LEFT: - event.preventDefault(); - - if (!this._keySliding) { - this._keySliding = true; - this.handle.addClass("ui-state-active"); /* TODO: We don't use this class for styling. Do we need to add it? */ - } - - break; - } - - // move the slider according to the keypress - switch (event.keyCode) { - case $.ui.keyCode.HOME: - this.refresh(this.min); - break; - case $.ui.keyCode.END: - this.refresh(this.max); - break; - case $.ui.keyCode.PAGE_UP: - case $.ui.keyCode.UP: - case $.ui.keyCode.RIGHT: - this.refresh(index + this.step); - break; - case $.ui.keyCode.PAGE_DOWN: - case $.ui.keyCode.DOWN: - case $.ui.keyCode.LEFT: - this.refresh(index - this.step); - break; - } - }, // remove active mark - - _handleKeyup: function (/* event */) { - if (this._keySliding) { - this._keySliding = false; - this.handle.removeClass("ui-state-active"); /* See comment above. */ - } - }, - - _sliderVMouseDown: function (event) { - // NOTE: we don't do this in refresh because we still want to - // support programmatic alteration of disabled inputs - if (this.options.disabled || !(event.which === 1 || event.which === 0 || event.which === undefined)) { - return false; - } - if (this._trigger("beforestart", event) === false) { - return false; - } - this.dragging = true; - this.userModified = false; - this.mouseMoved = false; - - if (this.isToggleSwitch) { - this.beforeStart = this.element[0].selectedIndex; - } - - this.refresh(event); - this._trigger("start"); - return false; - }, - - _sliderVMouseUp: function () { - if (this.dragging) { - this.dragging = false; - - if (this.isToggleSwitch) { - // make the handle move with a smooth transition - this.handle.addClass("ui-slider-handle-snapping"); - - if (this.mouseMoved) { - // this is a drag, change the value only if user dragged enough - if (this.userModified) { - this.refresh(this.beforeStart === 0 ? 1 : 0); - } else { - this.refresh(this.beforeStart); - } - } else { - // this is just a click, change the value - this.refresh(this.beforeStart === 0 ? 1 : 0); - } - } - - this.mouseMoved = false; - this._trigger("stop"); - return false; - } - }, - - _preventDocumentDrag: function (event) { - // NOTE: we don't do this in refresh because we still want to - // support programmatic alteration of disabled inputs - if (this._trigger("drag", event) === false) { - return false; - } - if (this.dragging && !this.options.disabled) { - - // this.mouseMoved must be updated before refresh() because it will be used in the control "change" event - this.mouseMoved = true; - - if (this.isToggleSwitch) { - // make the handle move in sync with the mouse - this.handle.removeClass("ui-slider-handle-snapping"); - } - - this.refresh(event); - - // only after refresh() you can calculate this.userModified - this.userModified = this.beforeStart !== this.element[0].selectedIndex; - return false; - } - }, - - _checkedRefresh: function () { - if (this.value !== this._value()) { - this.refresh(this._value()); - } - }, - - _value: function () { - return this.isToggleSwitch ? this.element[0].selectedIndex : parseFloat(this.element.val()); - }, - - _reset: function () { - this.refresh(undefined, false, true); - }, - - refresh: function (val, isfromControl, preventInputUpdate) { - // NOTE: we don't return here because we want to support programmatic - // alteration of the input value, which should still update the slider - - var self = this, - parentTheme = $.mobile.getAttribute(this.element[0], "theme"), - theme = this.options.theme || parentTheme, - themeClass = theme ? " ui-btn-" + theme : "", - trackTheme = this.options.trackTheme || parentTheme, - trackThemeClass = trackTheme ? " ui-bar-" + trackTheme : " ui-bar-inherit", - cornerClass = this.options.corners ? " ui-corner-all" : "", - miniClass = this.options.mini ? " ui-mini" : "", - left, width, data, tol, - pxStep, percent, - control, isInput, optionElements, min, max, step, - newval, valModStep, alignValue, percentPerStep, - handlePercent, aPercent, bPercent, - valueChanged; - - self.slider[0].className = [this.isToggleSwitch ? "ui-slider ui-slider-switch ui-slider-track ui-shadow-inset" : "ui-slider-track ui-shadow-inset", trackThemeClass, cornerClass, miniClass].join(""); - if (this.options.disabled || this.element.prop("disabled")) { - this.disable(); - } - - // set the stored value for comparison later - this.value = this._value(); - if (this.options.highlight && !this.isToggleSwitch && this.slider.find(".ui-slider-bg").length === 0) { - this.valuebg = (function () { - var bg = document.createElement("div"); - bg.className = "ui-slider-bg " + $.mobile.activeBtnClass; - return $(bg).prependTo(self.slider); - })(); - } - this.handle.addClass("ui-btn" + themeClass + " ui-shadow"); - - control = this.element; - isInput = !this.isToggleSwitch; - optionElements = isInput ? [] : control.find("option"); - min = isInput ? parseFloat(control.attr("min")) : 0; - max = isInput ? parseFloat(control.attr("max")) : optionElements.length - 1; - step = (isInput && parseFloat(control.attr("step")) > 0) ? parseFloat(control.attr("step")) : 1; - - if (typeof val === "object") { - data = val; - // a slight tolerance helped get to the ends of the slider - tol = 8; - - left = this.slider.offset().left; - width = this.slider.width(); - pxStep = width / ((max - min) / step); - if (!this.dragging || - data.pageX < left - tol || - data.pageX > left + width + tol) { - return; - } - if (pxStep > 1) { - percent = ((data.pageX - left) / width) * 100; - } else { - percent = Math.round(((data.pageX - left) / width) * 100); - } - } else { - if (val == null) { - val = isInput ? parseFloat(control.val() || 0) : control[0].selectedIndex; - } - percent = (parseFloat(val) - min) / (max - min) * 100; - } - - if (isNaN(percent)) { - return; - } - - newval = (percent / 100) * (max - min) + min; - - //from jQuery UI slider, the following source will round to the nearest step - valModStep = (newval - min) % step; - alignValue = newval - valModStep; - - if (Math.abs(valModStep) * 2 >= step) { - alignValue += (valModStep > 0) ? step : (-step); - } - - percentPerStep = 100 / ((max - min) / step); - // Since JavaScript has problems with large floats, round - // the final value to 5 digits after the decimal point (see jQueryUI: #4124) - newval = parseFloat(alignValue.toFixed(5)); - - if (typeof pxStep === "undefined") { - pxStep = width / ((max - min) / step); - } - if (pxStep > 1 && isInput) { - percent = (newval - min) * percentPerStep * (1 / step); - } - if (percent < 0) { - percent = 0; - } - - if (percent > 100) { - percent = 100; - } - - if (newval < min) { - newval = min; - } - - if (newval > max) { - newval = max; - } - - this.handle.css("left", percent + "%"); - - this.handle[0].setAttribute("aria-valuenow", isInput ? newval : optionElements.eq(newval).attr("value")); - - this.handle[0].setAttribute("aria-valuetext", isInput ? newval : optionElements.eq(newval).text()); - - this.handle[0].setAttribute("title", isInput ? newval : optionElements.eq(newval).text()); - - if (this.valuebg) { - this.valuebg.css("width", percent + "%"); - } - - // drag the label widths - if (this._labels) { - handlePercent = this.handle.width() / this.slider.width() * 100; - aPercent = percent && handlePercent + (100 - handlePercent) * percent / 100; - bPercent = percent === 100 ? 0 : Math.min(handlePercent + 100 - aPercent, 100); - - this._labels.each(function () { - var ab = $(this).hasClass("ui-slider-label-a"); - $(this).width((ab ? aPercent : bPercent) + "%"); - }); - } - - if (!preventInputUpdate) { - valueChanged = false; - - // update control"s value - if (isInput) { - valueChanged = parseFloat(control.val()) !== newval; - control.val(newval); - } else { - valueChanged = control[0].selectedIndex !== newval; - control[0].selectedIndex = newval; - } - if (this._trigger("beforechange", val) === false) { - return false; - } - if (!isfromControl && valueChanged) { - control.trigger("change"); - } - } - }, - - _setHighlight: function (value) { - value = !!value; - if (value) { - this.options.highlight = !!value; - this.refresh(); - } else if (this.valuebg) { - this.valuebg.remove(); - this.valuebg = false; - } - }, - - _setTheme: function (value) { - this.handle - .removeClass("ui-btn-" + this.options.theme) - .addClass("ui-btn-" + value); - - var currentTheme = this.options.theme ? this.options.theme : "inherit", - newTheme = value ? value : "inherit"; - - this.control - .removeClass("ui-body-" + currentTheme) - .addClass("ui-body-" + newTheme); - }, - - _setTrackTheme: function (value) { - var currentTrackTheme = this.options.trackTheme ? this.options.trackTheme : "inherit", - newTrackTheme = value ? value : "inherit"; - - this.slider - .removeClass("ui-body-" + currentTrackTheme) - .addClass("ui-body-" + newTrackTheme); - }, - - _setMini: function (value) { - value = !!value; - if (!this.isToggleSwitch && !this.isRangeslider) { - this.slider.parent().toggleClass("ui-mini", value); - this.element.toggleClass("ui-mini", value); - } - this.slider.toggleClass("ui-mini", value); - }, - - _setCorners: function (value) { - this.slider.toggleClass("ui-corner-all", value); - - if (!this.isToggleSwitch) { - this.control.toggleClass("ui-corner-all", value); - } - }, - - _setDisabled: function (value) { - value = !!value; - this.element.prop("disabled", value); - this.slider - .toggleClass("ui-state-disabled", value) - .attr("aria-disabled", value); - - this.element.toggleClass("ui-state-disabled", value); - } - - }, $.mobile.behaviors.formReset)); - - $.widget("mobile.rangeslider", $.extend({ - - options: { - theme: null, - trackTheme: null, - corners: true, - mini: false, - highlight: true - }, - - _create: function () { - var $el = this.element, - elClass = this.options.mini ? "ui-rangeslider ui-mini" : "ui-rangeslider", - _inputFirst = $el.find("input").first(), - _inputLast = $el.find("input").last(), - _label = $el.find("label").first(), - _sliderWidgetFirst = $.data(_inputFirst.get(0), "mobile-slider") || - $.data(_inputFirst.slider().get(0), "mobile-slider"), - _sliderWidgetLast = $.data(_inputLast.get(0), "mobile-slider") || - $.data(_inputLast.slider().get(0), "mobile-slider"), - _sliderFirst = _sliderWidgetFirst.slider, - _sliderLast = _sliderWidgetLast.slider, - firstHandle = _sliderWidgetFirst.handle, - _sliders = $("
").appendTo($el); - - _inputFirst.addClass("ui-rangeslider-first"); - _inputLast.addClass("ui-rangeslider-last"); - $el.addClass(elClass); - - _sliderFirst.appendTo(_sliders); - _sliderLast.appendTo(_sliders); - _label.insertBefore($el); - firstHandle.prependTo(_sliderLast); - - $.extend(this, { - _inputFirst: _inputFirst, - _inputLast: _inputLast, - _sliderFirst: _sliderFirst, - _sliderLast: _sliderLast, - _label: _label, - _targetVal: null, - _sliderTarget: false, - _sliders: _sliders, - _proxy: false - }); - - this.refresh(); - this._on(this.element.find("input.ui-slider-input"), { - "slidebeforestart": "_slidebeforestart", - "slidestop": "_slidestop", - "slidedrag": "_slidedrag", - "slidebeforechange": "_change", - "blur": "_change", - "keyup": "_change" - }); - this._on({ - "mousedown": "_change" - }); - this._on(this.element.closest("form"), { - "reset": "_handleReset" - }); - this._on(firstHandle, { - "mousedown": "_dragFirstHandle" - }); - }, - _handleReset: function () { - var self = this; - //we must wait for the stack to unwind before updateing other wise sliders will not have updated yet - setTimeout(function () { - self._updateHighlight(); - }, 0); - }, - - _dragFirstHandle: function (event) { - //if the first handle is dragged send the event to the first slider - $.data(this._inputFirst.get(0), "mobile-slider").dragging = true; - $.data(this._inputFirst.get(0), "mobile-slider").refresh(event); - $.data(this._inputFirst.get(0), "mobile-slider")._trigger("start"); - return false; - }, - - _slidedrag: function (event) { - var first = $(event.target).is(this._inputFirst), - otherSlider = (first) ? this._inputLast : this._inputFirst; - - this._sliderTarget = false; - //if the drag was initiated on an extreme and the other handle is focused send the events to - //the closest handle - if ((this._proxy === "first" && first) || (this._proxy === "last" && !first)) { - $.data(otherSlider.get(0), "mobile-slider").dragging = true; - $.data(otherSlider.get(0), "mobile-slider").refresh(event); - return false; - } - }, - - _slidestop: function (event) { - var first = $(event.target).is(this._inputFirst); - - this._proxy = false; - //this stops dragging of the handle and brings the active track to the front - //this makes clicks on the track go the the last handle used - this.element.find("input").trigger("mouseup"); - this._sliderFirst.css("z-index", first ? 1 : ""); - }, - - _slidebeforestart: function (event) { - this._sliderTarget = false; - //if the track is the target remember this and the original value - if ($(event.originalEvent.target).hasClass("ui-slider-track")) { - this._sliderTarget = true; - this._targetVal = $(event.target).val(); - } - }, - - _setOptions: function (options) { - if (options.theme !== undefined) { - this._setTheme(options.theme); - } - - if (options.trackTheme !== undefined) { - this._setTrackTheme(options.trackTheme); - } - - if (options.mini !== undefined) { - this._setMini(options.mini); - } - - if (options.highlight !== undefined) { - this._setHighlight(options.highlight); - } - - if (options.disabled !== undefined) { - this._setDisabled(options.disabled); - } - - this._super(options); - this.refresh(); - }, - - refresh: function () { - var $el = this.element, - o = this.options; - - if (this._inputFirst.is(":disabled") || this._inputLast.is(":disabled")) { - this.options.disabled = true; - } - - $el.find("input").slider({ - theme: o.theme, - trackTheme: o.trackTheme, - disabled: o.disabled, - corners: o.corners, - mini: o.mini, - highlight: o.highlight - }).slider("refresh"); - this._updateHighlight(); - }, - - _change: function (event) { - if (event.type === "keyup") { - this._updateHighlight(); - return false; - } - - var self = this, - min = parseFloat(this._inputFirst.val(), 10), - max = parseFloat(this._inputLast.val(), 10), - first = $(event.target).hasClass("ui-rangeslider-first"), - thisSlider = first ? this._inputFirst : this._inputLast, - otherSlider = first ? this._inputLast : this._inputFirst; - - if ((this._inputFirst.val() > this._inputLast.val() && event.type === "mousedown" && !$(event.target).hasClass("ui-slider-handle"))) { - thisSlider.blur(); - } else if (event.type === "mousedown") { - return; - } - if (min > max && !this._sliderTarget) { - //this prevents min from being greater then max - thisSlider.val(first ? max : min).slider("refresh"); - this._trigger("normalize"); - } else if (min > max) { - //this makes it so clicks on the target on either extreme go to the closest handle - thisSlider.val(this._targetVal).slider("refresh"); - - //You must wait for the stack to unwind so first slider is updated before updating second - setTimeout(function () { - otherSlider.val(first ? min : max).slider("refresh"); - $.data(otherSlider.get(0), "mobile-slider").handle.focus(); - self._sliderFirst.css("z-index", first ? "" : 1); - self._trigger("normalize"); - }, 0); - this._proxy = (first) ? "first" : "last"; - } - //fixes issue where when both _sliders are at min they cannot be adjusted - if (min === max) { - $.data(thisSlider.get(0), "mobile-slider").handle.css("z-index", 1); - $.data(otherSlider.get(0), "mobile-slider").handle.css("z-index", 0); - } else { - $.data(otherSlider.get(0), "mobile-slider").handle.css("z-index", ""); - $.data(thisSlider.get(0), "mobile-slider").handle.css("z-index", ""); - } - - this._updateHighlight(); - - if (min >= max) { - return false; - } - }, - - _updateHighlight: function () { - var min = parseInt($.data(this._inputFirst.get(0), "mobile-slider").handle.get(0).style.left, 10), - max = parseInt($.data(this._inputLast.get(0), "mobile-slider").handle.get(0).style.left, 10), - width = (max - min); - - this.element.find(".ui-slider-bg").css({ - "margin-left": min + "%", - "width": width + "%" - }); - }, - - _setTheme: function (value) { - this._inputFirst.slider("option", "theme", value); - this._inputLast.slider("option", "theme", value); - }, - - _setTrackTheme: function (value) { - this._inputFirst.slider("option", "trackTheme", value); - this._inputLast.slider("option", "trackTheme", value); - }, - - _setMini: function (value) { - this._inputFirst.slider("option", "mini", value); - this._inputLast.slider("option", "mini", value); - this.element.toggleClass("ui-mini", !!value); - }, - - _setHighlight: function (value) { - this._inputFirst.slider("option", "highlight", value); - this._inputLast.slider("option", "highlight", value); - }, - - _setDisabled: function (value) { - this._inputFirst.prop("disabled", value); - this._inputLast.prop("disabled", value); - }, - - _destroy: function () { - this._label.prependTo(this.element); - this.element.removeClass("ui-rangeslider ui-mini"); - this._inputFirst.after(this._sliderFirst); - this._inputLast.after(this._sliderLast); - this._sliders.remove(); - this.element.find("input").removeClass("ui-rangeslider-first ui-rangeslider-last").slider("destroy"); - } - - }, $.mobile.behaviors.formReset)); - - var popup; - - function getPopup() { - if (!popup) { - popup = $("
", { - "class": "ui-slider-popup ui-shadow ui-corner-all" - }); - } - return popup.clone(); - } - - $.widget("mobile.slider", $.mobile.slider, { - options: { - popupEnabled: false, - showValue: false - }, - - _create: function () { - this._super(); - - $.extend(this, { - _currentValue: null, - _popup: null, - _popupVisible: false - }); - - this._setOption("popupEnabled", this.options.popupEnabled); - - this._on(this.handle, { "mousedown": "_showPopup" }); - this._on(this.slider.add(this.document), { "mouseup": "_hidePopup" }); - this._refresh(); - }, - - // position the popup centered 5px above the handle - _positionPopup: function () { - var dstOffset = this.handle.offset(); - - this._popup.offset({ - left: dstOffset.left + (this.handle.width() - this._popup.width()) / 2, - top: dstOffset.top - this._popup.outerHeight() - 5 - }); - }, - - _setOption: function (key, value) { - this._super(key, value); - - if (key === "showValue") { - this.handle.html(value && !this.options.mini ? this._value() : ""); - } else if (key === "popupEnabled") { - if (value && !this._popup) { - this._popup = getPopup() - .addClass("ui-body-" + (this.options.theme || "a")) - .hide() - .insertBefore(this.element); - } - } - }, - - // show value on the handle and in popup - refresh: function () { - this._super.apply(this, arguments); - this._refresh(); - }, - - _refresh: function () { - var o = this.options, newValue; - - if (o.popupEnabled) { - // remove the title attribute from the handle (which is - // responsible for the annoying tooltip); NB we have - // to do it here as the jqm slider sets it every time - // the slider's value changes :( - this.handle.removeAttr("title"); - } - - newValue = this._value(); - if (newValue === this._currentValue) { - return; - } - this._currentValue = newValue; - - if (o.popupEnabled && this._popup) { - this._positionPopup(); - this._popup.html(newValue); - } - - if (o.showValue && !this.options.mini) { - this.handle.html(newValue); - } - }, - - _showPopup: function () { - if (this.options.popupEnabled && !this._popupVisible) { - this.handle.html(""); - this._popup.show(); - this._positionPopup(); - this._popupVisible = true; - } - }, - - _hidePopup: function () { - var o = this.options; - - if (o.popupEnabled && this._popupVisible) { - if (o.showValue && !o.mini) { - this.handle.html(this._value()); - } - this._popup.hide(); - this._popupVisible = false; - } - } - }); - -}); \ No newline at end of file +define(["jqmwidget"],function(){function getPopup(){return popup||(popup=$("
",{class:"ui-slider-popup ui-shadow ui-corner-all"})),popup.clone()}var rbrace=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/;$.extend($.mobile,{getAttribute:function(element,key){var data;element=element.jquery?element[0]:element,element&&element.getAttribute&&(data=element.getAttribute("data-"+key));try{data="true"===data||"false"!==data&&("null"===data?null:+data+""===data?+data:rbrace.test(data)?JSON.parse(data):data)}catch(err){}return data}}),function($,undefined){$.ui=$.ui||{},$.extend($.ui,{version:"c0ab71056b936627e8a7821f03c044aec6280a40",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),$.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase())}(jQuery),$.widget("mobile.slider",$.extend({initSelector:"input[type='range']:not([data-role='none'])",widgetEventPrefix:"slide",options:{theme:null,trackTheme:null,corners:!0,mini:!1,highlight:!1},_create:function(){var options,wrapper,j,length,i,optionsCount,origTabIndex,side,activeClass,sliderImg,self=this,control=this.element,trackTheme=this.options.trackTheme||$.mobile.getAttribute(control[0],"theme"),trackThemeClass=trackTheme?" ui-bar-"+trackTheme:" ui-bar-inherit",cornerClass=this.options.corners||control.data("corners")?" ui-corner-all":"",miniClass=this.options.mini||control.data("mini")?" ui-mini":"",cType=control[0].nodeName.toLowerCase(),isToggleSwitch="select"===cType,isRangeslider=control.parent().is("[data-role='rangeslider']"),selectClass=isToggleSwitch?"ui-slider-switch":"",controlID=control.attr("id"),$label=$("[for='"+controlID+"']"),labelID=$label.attr("id")||controlID+"-label",min=isToggleSwitch?0:parseFloat(control.attr("min")),max=isToggleSwitch?control.find("option").length-1:parseFloat(control.attr("max")),step=window.parseFloat(control.attr("step")||1),domHandle=document.createElement("a"),handle=$(domHandle),domSlider=document.createElement("div"),slider=$(domSlider),valuebg=!(!this.options.highlight||isToggleSwitch)&&function(){var bg=document.createElement("div");return bg.className="ui-slider-bg "+$.mobile.activeBtnClass,$(bg).prependTo(slider)}();if($label.attr("id",labelID),this.isToggleSwitch=isToggleSwitch,domHandle.setAttribute("href","#"),domSlider.setAttribute("role","application"),domSlider.className=[this.isToggleSwitch?"ui-slider ui-slider-track ui-shadow-inset ":"ui-slider-track ui-shadow-inset ",selectClass,trackThemeClass,cornerClass,miniClass].join(""),domHandle.className="ui-slider-handle",domSlider.appendChild(domHandle),handle.attr({role:"slider","aria-valuemin":min,"aria-valuemax":max,"aria-valuenow":this._value(),"aria-valuetext":this._value(),title:this._value(),"aria-labelledby":labelID}),$.extend(this,{slider:slider,handle:handle,control:control,type:cType,step:step,max:max,min:min,valuebg:valuebg,isRangeslider:isRangeslider,dragging:!1,beforeStart:null,userModified:!1,mouseMoved:!1}),isToggleSwitch){for(origTabIndex=control.attr("tabindex"),origTabIndex&&handle.attr("tabindex",origTabIndex),control.attr("tabindex","-1").focus(function(){$(this).blur(),handle.focus()}),wrapper=document.createElement("div"),wrapper.className="ui-slider-inneroffset",j=0,length=domSlider.childNodes.length;j":"
",control.add(slider).wrapAll(wrapper)),this._on(this.handle,{mousedown:"_handleVMouseDown",keydown:"_handleKeydown",keyup:"_handleKeyup"}),this.handle.on("click",!1),this.refresh(void 0,void 0,!0)},_setOptions:function(options){void 0!==options.theme&&this._setTheme(options.theme),void 0!==options.trackTheme&&this._setTrackTheme(options.trackTheme),void 0!==options.corners&&this._setCorners(options.corners),void 0!==options.mini&&this._setMini(options.mini),void 0!==options.highlight&&this._setHighlight(options.highlight),void 0!==options.disabled&&this._setDisabled(options.disabled),this._super(options)},_controlChange:function(event){return this._trigger("controlchange",event)!==!1&&void(this.mouseMoved||this.refresh(this._value(),!0))},_controlKeyup:function(){this.refresh(this._value(),!0,!0)},_controlBlur:function(){this.refresh(this._value(),!0)},_controlVMouseUp:function(){this._checkedRefresh()},_handleVMouseDown:function(){this.handle.focus()},_handleKeydown:function(event){var index=this._value();if(!this.options.disabled){switch(event.keyCode){case $.ui.keyCode.HOME:case $.ui.keyCode.END:case $.ui.keyCode.PAGE_UP:case $.ui.keyCode.PAGE_DOWN:case $.ui.keyCode.UP:case $.ui.keyCode.RIGHT:case $.ui.keyCode.DOWN:case $.ui.keyCode.LEFT:event.preventDefault(),this._keySliding||(this._keySliding=!0,this.handle.addClass("ui-state-active"))}switch(event.keyCode){case $.ui.keyCode.HOME:this.refresh(this.min);break;case $.ui.keyCode.END:this.refresh(this.max);break;case $.ui.keyCode.PAGE_UP:case $.ui.keyCode.UP:case $.ui.keyCode.RIGHT:this.refresh(index+this.step);break;case $.ui.keyCode.PAGE_DOWN:case $.ui.keyCode.DOWN:case $.ui.keyCode.LEFT:this.refresh(index-this.step)}}},_handleKeyup:function(){this._keySliding&&(this._keySliding=!1,this.handle.removeClass("ui-state-active"))},_sliderVMouseDown:function(event){return!(this.options.disabled||1!==event.which&&0!==event.which&&void 0!==event.which)&&(this._trigger("beforestart",event)!==!1&&(this.dragging=!0,this.userModified=!1,this.mouseMoved=!1,this.isToggleSwitch&&(this.beforeStart=this.element[0].selectedIndex),this.refresh(event),this._trigger("start"),!1))},_sliderVMouseUp:function(){if(this.dragging)return this.dragging=!1,this.isToggleSwitch&&(this.handle.addClass("ui-slider-handle-snapping"),this.mouseMoved?this.userModified?this.refresh(0===this.beforeStart?1:0):this.refresh(this.beforeStart):this.refresh(0===this.beforeStart?1:0)),this.mouseMoved=!1,this._trigger("stop"),!1},_preventDocumentDrag:function(event){return this._trigger("drag",event)!==!1&&(this.dragging&&!this.options.disabled?(this.mouseMoved=!0,this.isToggleSwitch&&this.handle.removeClass("ui-slider-handle-snapping"),this.refresh(event),this.userModified=this.beforeStart!==this.element[0].selectedIndex,!1):void 0)},_checkedRefresh:function(){this.value!==this._value()&&this.refresh(this._value())},_value:function(){return this.isToggleSwitch?this.element[0].selectedIndex:parseFloat(this.element.val())},_reset:function(){this.refresh(void 0,!1,!0)},refresh:function(val,isfromControl,preventInputUpdate){var left,width,data,tol,pxStep,percent,control,isInput,optionElements,min,max,step,newval,valModStep,alignValue,percentPerStep,handlePercent,aPercent,bPercent,valueChanged,self=this,parentTheme=$.mobile.getAttribute(this.element[0],"theme"),theme=this.options.theme||parentTheme,themeClass=theme?" ui-btn-"+theme:"",trackTheme=this.options.trackTheme||parentTheme,trackThemeClass=trackTheme?" ui-bar-"+trackTheme:" ui-bar-inherit",cornerClass=this.options.corners?" ui-corner-all":"",miniClass=this.options.mini?" ui-mini":"";if(self.slider[0].className=[this.isToggleSwitch?"ui-slider ui-slider-switch ui-slider-track ui-shadow-inset":"ui-slider-track ui-shadow-inset",trackThemeClass,cornerClass,miniClass].join(""),(this.options.disabled||this.element.prop("disabled"))&&this.disable(),this.value=this._value(),this.options.highlight&&!this.isToggleSwitch&&0===this.slider.find(".ui-slider-bg").length&&(this.valuebg=function(){var bg=document.createElement("div");return bg.className="ui-slider-bg "+$.mobile.activeBtnClass,$(bg).prependTo(self.slider)}()),this.handle.addClass("ui-btn"+themeClass+" ui-shadow"),control=this.element,isInput=!this.isToggleSwitch,optionElements=isInput?[]:control.find("option"),min=isInput?parseFloat(control.attr("min")):0,max=isInput?parseFloat(control.attr("max")):optionElements.length-1,step=isInput&&parseFloat(control.attr("step"))>0?parseFloat(control.attr("step")):1,"object"==typeof val){if(data=val,tol=8,left=this.slider.offset().left,width=this.slider.width(),pxStep=width/((max-min)/step),!this.dragging||data.pageXleft+width+tol)return;percent=pxStep>1?(data.pageX-left)/width*100:Math.round((data.pageX-left)/width*100)}else null==val&&(val=isInput?parseFloat(control.val()||0):control[0].selectedIndex),percent=(parseFloat(val)-min)/(max-min)*100;if(!isNaN(percent)&&(newval=percent/100*(max-min)+min,valModStep=(newval-min)%step,alignValue=newval-valModStep,2*Math.abs(valModStep)>=step&&(alignValue+=valModStep>0?step:-step),percentPerStep=100/((max-min)/step),newval=parseFloat(alignValue.toFixed(5)),"undefined"==typeof pxStep&&(pxStep=width/((max-min)/step)),pxStep>1&&isInput&&(percent=(newval-min)*percentPerStep*(1/step)),percent<0&&(percent=0),percent>100&&(percent=100),newvalmax&&(newval=max),this.handle.css("left",percent+"%"),this.handle[0].setAttribute("aria-valuenow",isInput?newval:optionElements.eq(newval).attr("value")),this.handle[0].setAttribute("aria-valuetext",isInput?newval:optionElements.eq(newval).text()),this.handle[0].setAttribute("title",isInput?newval:optionElements.eq(newval).text()),this.valuebg&&this.valuebg.css("width",percent+"%"),this._labels&&(handlePercent=this.handle.width()/this.slider.width()*100,aPercent=percent&&handlePercent+(100-handlePercent)*percent/100,bPercent=100===percent?0:Math.min(handlePercent+100-aPercent,100),this._labels.each(function(){var ab=$(this).hasClass("ui-slider-label-a");$(this).width((ab?aPercent:bPercent)+"%")})),!preventInputUpdate)){if(valueChanged=!1,isInput?(valueChanged=parseFloat(control.val())!==newval,control.val(newval)):(valueChanged=control[0].selectedIndex!==newval,control[0].selectedIndex=newval),this._trigger("beforechange",val)===!1)return!1;!isfromControl&&valueChanged&&control.trigger("change")}},_setHighlight:function(value){value=!!value,value?(this.options.highlight=!!value,this.refresh()):this.valuebg&&(this.valuebg.remove(),this.valuebg=!1)},_setTheme:function(value){this.handle.removeClass("ui-btn-"+this.options.theme).addClass("ui-btn-"+value);var currentTheme=this.options.theme?this.options.theme:"inherit",newTheme=value?value:"inherit";this.control.removeClass("ui-body-"+currentTheme).addClass("ui-body-"+newTheme)},_setTrackTheme:function(value){var currentTrackTheme=this.options.trackTheme?this.options.trackTheme:"inherit",newTrackTheme=value?value:"inherit";this.slider.removeClass("ui-body-"+currentTrackTheme).addClass("ui-body-"+newTrackTheme)},_setMini:function(value){value=!!value,this.isToggleSwitch||this.isRangeslider||(this.slider.parent().toggleClass("ui-mini",value),this.element.toggleClass("ui-mini",value)),this.slider.toggleClass("ui-mini",value)},_setCorners:function(value){this.slider.toggleClass("ui-corner-all",value),this.isToggleSwitch||this.control.toggleClass("ui-corner-all",value)},_setDisabled:function(value){value=!!value,this.element.prop("disabled",value),this.slider.toggleClass("ui-state-disabled",value).attr("aria-disabled",value),this.element.toggleClass("ui-state-disabled",value)}},$.mobile.behaviors.formReset)),$.widget("mobile.rangeslider",$.extend({options:{theme:null,trackTheme:null,corners:!0,mini:!1,highlight:!0},_create:function(){var $el=this.element,elClass=this.options.mini?"ui-rangeslider ui-mini":"ui-rangeslider",_inputFirst=$el.find("input").first(),_inputLast=$el.find("input").last(),_label=$el.find("label").first(),_sliderWidgetFirst=$.data(_inputFirst.get(0),"mobile-slider")||$.data(_inputFirst.slider().get(0),"mobile-slider"),_sliderWidgetLast=$.data(_inputLast.get(0),"mobile-slider")||$.data(_inputLast.slider().get(0),"mobile-slider"),_sliderFirst=_sliderWidgetFirst.slider,_sliderLast=_sliderWidgetLast.slider,firstHandle=_sliderWidgetFirst.handle,_sliders=$("
").appendTo($el);_inputFirst.addClass("ui-rangeslider-first"),_inputLast.addClass("ui-rangeslider-last"),$el.addClass(elClass),_sliderFirst.appendTo(_sliders),_sliderLast.appendTo(_sliders),_label.insertBefore($el),firstHandle.prependTo(_sliderLast),$.extend(this,{_inputFirst:_inputFirst,_inputLast:_inputLast,_sliderFirst:_sliderFirst,_sliderLast:_sliderLast,_label:_label,_targetVal:null,_sliderTarget:!1,_sliders:_sliders,_proxy:!1}),this.refresh(),this._on(this.element.find("input.ui-slider-input"),{slidebeforestart:"_slidebeforestart",slidestop:"_slidestop",slidedrag:"_slidedrag",slidebeforechange:"_change",blur:"_change",keyup:"_change"}),this._on({mousedown:"_change"}),this._on(this.element.closest("form"),{reset:"_handleReset"}),this._on(firstHandle,{mousedown:"_dragFirstHandle"})},_handleReset:function(){var self=this;setTimeout(function(){self._updateHighlight()},0)},_dragFirstHandle:function(event){return $.data(this._inputFirst.get(0),"mobile-slider").dragging=!0,$.data(this._inputFirst.get(0),"mobile-slider").refresh(event),$.data(this._inputFirst.get(0),"mobile-slider")._trigger("start"),!1},_slidedrag:function(event){var first=$(event.target).is(this._inputFirst),otherSlider=first?this._inputLast:this._inputFirst;if(this._sliderTarget=!1,"first"===this._proxy&&first||"last"===this._proxy&&!first)return $.data(otherSlider.get(0),"mobile-slider").dragging=!0,$.data(otherSlider.get(0),"mobile-slider").refresh(event),!1},_slidestop:function(event){var first=$(event.target).is(this._inputFirst);this._proxy=!1,this.element.find("input").trigger("mouseup"),this._sliderFirst.css("z-index",first?1:"")},_slidebeforestart:function(event){this._sliderTarget=!1,$(event.originalEvent.target).hasClass("ui-slider-track")&&(this._sliderTarget=!0,this._targetVal=$(event.target).val())},_setOptions:function(options){void 0!==options.theme&&this._setTheme(options.theme),void 0!==options.trackTheme&&this._setTrackTheme(options.trackTheme),void 0!==options.mini&&this._setMini(options.mini),void 0!==options.highlight&&this._setHighlight(options.highlight),void 0!==options.disabled&&this._setDisabled(options.disabled),this._super(options),this.refresh()},refresh:function(){var $el=this.element,o=this.options;(this._inputFirst.is(":disabled")||this._inputLast.is(":disabled"))&&(this.options.disabled=!0),$el.find("input").slider({theme:o.theme,trackTheme:o.trackTheme,disabled:o.disabled,corners:o.corners,mini:o.mini,highlight:o.highlight}).slider("refresh"),this._updateHighlight()},_change:function(event){if("keyup"===event.type)return this._updateHighlight(),!1;var self=this,min=parseFloat(this._inputFirst.val(),10),max=parseFloat(this._inputLast.val(),10),first=$(event.target).hasClass("ui-rangeslider-first"),thisSlider=first?this._inputFirst:this._inputLast,otherSlider=first?this._inputLast:this._inputFirst;if(this._inputFirst.val()>this._inputLast.val()&&"mousedown"===event.type&&!$(event.target).hasClass("ui-slider-handle"))thisSlider.blur();else if("mousedown"===event.type)return;return min>max&&!this._sliderTarget?(thisSlider.val(first?max:min).slider("refresh"),this._trigger("normalize")):min>max&&(thisSlider.val(this._targetVal).slider("refresh"),setTimeout(function(){otherSlider.val(first?min:max).slider("refresh"),$.data(otherSlider.get(0),"mobile-slider").handle.focus(),self._sliderFirst.css("z-index",first?"":1),self._trigger("normalize")},0),this._proxy=first?"first":"last"),min===max?($.data(thisSlider.get(0),"mobile-slider").handle.css("z-index",1),$.data(otherSlider.get(0),"mobile-slider").handle.css("z-index",0)):($.data(otherSlider.get(0),"mobile-slider").handle.css("z-index",""),$.data(thisSlider.get(0),"mobile-slider").handle.css("z-index","")),this._updateHighlight(),!(min>=max)&&void 0},_updateHighlight:function(){var min=parseInt($.data(this._inputFirst.get(0),"mobile-slider").handle.get(0).style.left,10),max=parseInt($.data(this._inputLast.get(0),"mobile-slider").handle.get(0).style.left,10),width=max-min;this.element.find(".ui-slider-bg").css({"margin-left":min+"%",width:width+"%"})},_setTheme:function(value){this._inputFirst.slider("option","theme",value),this._inputLast.slider("option","theme",value)},_setTrackTheme:function(value){this._inputFirst.slider("option","trackTheme",value),this._inputLast.slider("option","trackTheme",value)},_setMini:function(value){this._inputFirst.slider("option","mini",value),this._inputLast.slider("option","mini",value),this.element.toggleClass("ui-mini",!!value)},_setHighlight:function(value){this._inputFirst.slider("option","highlight",value),this._inputLast.slider("option","highlight",value)},_setDisabled:function(value){this._inputFirst.prop("disabled",value),this._inputLast.prop("disabled",value)},_destroy:function(){this._label.prependTo(this.element),this.element.removeClass("ui-rangeslider ui-mini"),this._inputFirst.after(this._sliderFirst),this._inputLast.after(this._sliderLast),this._sliders.remove(),this.element.find("input").removeClass("ui-rangeslider-first ui-rangeslider-last").slider("destroy")}},$.mobile.behaviors.formReset));var popup;$.widget("mobile.slider",$.mobile.slider,{options:{popupEnabled:!1,showValue:!1},_create:function(){this._super(),$.extend(this,{_currentValue:null,_popup:null,_popupVisible:!1}),this._setOption("popupEnabled",this.options.popupEnabled),this._on(this.handle,{mousedown:"_showPopup"}),this._on(this.slider.add(this.document),{mouseup:"_hidePopup"}),this._refresh()},_positionPopup:function(){var dstOffset=this.handle.offset();this._popup.offset({left:dstOffset.left+(this.handle.width()-this._popup.width())/2,top:dstOffset.top-this._popup.outerHeight()-5})},_setOption:function(key,value){this._super(key,value),"showValue"===key?this.handle.html(value&&!this.options.mini?this._value():""):"popupEnabled"===key&&value&&!this._popup&&(this._popup=getPopup().addClass("ui-body-"+(this.options.theme||"a")).hide().insertBefore(this.element))},refresh:function(){this._super.apply(this,arguments),this._refresh()},_refresh:function(){var newValue,o=this.options;o.popupEnabled&&this.handle.removeAttr("title"),newValue=this._value(),newValue!==this._currentValue&&(this._currentValue=newValue,o.popupEnabled&&this._popup&&(this._positionPopup(),this._popup.html(newValue)),o.showValue&&!this.options.mini&&this.handle.html(newValue))},_showPopup:function(){this.options.popupEnabled&&!this._popupVisible&&(this.handle.html(""),this._popup.show(),this._positionPopup(),this._popupVisible=!0)},_hidePopup:function(){var o=this.options;o.popupEnabled&&this._popupVisible&&(o.showValue&&!o.mini&&this.handle.html(this._value()),this._popup.hide(),this._popupVisible=!1)}})}); \ No newline at end of file diff --git a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.table.css b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.table.css index 86ae3c64c2..3a3c912345 100644 --- a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.table.css +++ b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.table.css @@ -1,163 +1 @@ -.ui-block-a, -.ui-block-b, -.ui-block-c, -.ui-block-d, -.ui-block-e { - margin: 0; - padding: 0; - border: 0; - float: left; - min-height: 1px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -/* force new row */ -.ui-block-a { - clear: left; -} -li.ui-block-a, -li.ui-block-b, -li.ui-block-c, -li.ui-block-d, -li.ui-block-e { - margin-left: 0; - margin-right: 0; - padding: 0; - list-style: none; -} -/* No margin in grids for 100% width button elements until we can use max-width: fill-available; */ -[class*="ui-block-"] > button.ui-btn { - margin-right: 0; - margin-left: 0; -} -[class*="ui-block-"] > .ui-btn, -[class*="ui-block-"] > .ui-select, -[class*="ui-block-"] > .ui-checkbox, -[class*="ui-block-"] > .ui-radio, -[class*="ui-block-"] > button.ui-btn-inline, -[class*="ui-block-"] > button.ui-btn-icon-notext { - margin-right: .3125em; - margin-left: .3125em; -} - -/* preset breakpoint to switch to stacked grid styles below 35em (560px) */ -@media (max-width: 35em) { - .ui-responsive > .ui-block-a, - .ui-responsive > .ui-block-b, - .ui-responsive > .ui-block-c, - .ui-responsive > .ui-block-d, - .ui-responsive > .ui-block-e { - width: 100%; - float: none; - } -} - -.ui-table { - border: 0; - border-collapse: collapse; - padding: 0; - width: 100%; -} -.ui-table th, -.ui-table td { - line-height: 1.5em; - text-align: left; - padding: .4em .5em; - vertical-align:top; -} -.ui-table th .ui-btn, -.ui-table td .ui-btn { - line-height: normal; -} -.ui-table th { - font-weight: bold; -} -.ui-table caption { - text-align: left; - margin-bottom: 1.4em; - opacity: .5; -} - - -/* - Styles for the table columntoggle mode -*/ -.ui-table-reflow td .ui-table-cell-label, -.ui-table-reflow th .ui-table-cell-label { - display: none; -} - -/* Mobile first styles: Begin with the stacked presentation at narrow widths */ -@media only all { - /* Hide the table headers */ - .ui-table-reflow thead td, - .ui-table-reflow thead th { - display: none; - } - /* Show the table cells as a block level element */ - .ui-table-reflow td, - .ui-table-reflow th { - text-align: left; - display: block; - } - /* Add a fair amount of top margin to visually separate each row when stacked */ - .ui-table-reflow tbody th { - margin-top: 3em; - } - /* Make the label elements a percentage width */ - .ui-table-reflow td .ui-table-cell-label, - .ui-table-reflow th .ui-table-cell-label { - padding: .4em; - min-width: 30%; - display: inline-block; - margin: -.4em 1em -.4em -.4em; - } - /* For grouped headers, have a different style to visually separate the levels by classing the first label in each col group */ - .ui-table-reflow th .ui-table-cell-label-top, - .ui-table-reflow td .ui-table-cell-label-top { - display: block; - padding: .4em 0; - margin: .4em 0; - text-transform: uppercase; - font-size: .9em; - font-weight: normal; - } -} - - -/* Breakpoint to show as a standard table at 560px (35em x 16px) or wider */ -@media ( min-width: 35em ) { - - /* Show the table header rows */ - .ui-table-reflow.ui-responsive td, - .ui-table-reflow.ui-responsive th, - .ui-table-reflow.ui-responsive tbody th, - .ui-table-reflow.ui-responsive tbody td, - .ui-table-reflow.ui-responsive thead td, - .ui-table-reflow.ui-responsive thead th { - display: table-cell; - margin: 0; - } - - /* Hide the labels in each cell */ - .ui-table-reflow.ui-responsive td .ui-table-cell-label, - .ui-table-reflow.ui-responsive th .ui-table-cell-label { - display: none; - } -} - - -/* Hack to make IE9 and WP7.5 treat cells like block level elements, scoped to ui-responsive class */ -/* Applied in a max-width media query up to the table layout breakpoint so we don't need to negate this*/ -@media ( max-width: 35em ) { - .ui-table-reflow.ui-responsive td, - .ui-table-reflow.ui-responsive th { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - clear: left; - } -} \ No newline at end of file +.ui-block-a,.ui-block-b,.ui-block-c,.ui-block-d,.ui-block-e{margin:0;padding:0;border:0;float:left;min-height:1px;-webkit-box-sizing:border-box;box-sizing:border-box}.ui-block-a{clear:left}li.ui-block-a,li.ui-block-b,li.ui-block-c,li.ui-block-d,li.ui-block-e{margin-left:0;margin-right:0;padding:0;list-style:none}[class*=ui-block-]>button.ui-btn{margin-right:0;margin-left:0}[class*=ui-block-]>.ui-btn,[class*=ui-block-]>.ui-checkbox,[class*=ui-block-]>.ui-radio,[class*=ui-block-]>.ui-select,[class*=ui-block-]>button.ui-btn-icon-notext,[class*=ui-block-]>button.ui-btn-inline{margin-right:.3125em;margin-left:.3125em}.ui-table{border:0;border-collapse:collapse;padding:0;width:100%}.ui-table td,.ui-table th{line-height:1.5em;text-align:left;padding:.4em .5em;vertical-align:top}.ui-table td .ui-btn,.ui-table th .ui-btn{line-height:normal}.ui-table th{font-weight:700}.ui-table caption{text-align:left;margin-bottom:1.4em;opacity:.5}.ui-table-reflow td .ui-table-cell-label,.ui-table-reflow th .ui-table-cell-label{display:none}@media only all{.ui-table-reflow thead td,.ui-table-reflow thead th{display:none}.ui-table-reflow td,.ui-table-reflow th{text-align:left;display:block}.ui-table-reflow tbody th{margin-top:3em}.ui-table-reflow td .ui-table-cell-label,.ui-table-reflow th .ui-table-cell-label{padding:.4em;min-width:30%;display:inline-block;margin:-.4em 1em -.4em -.4em}.ui-table-reflow td .ui-table-cell-label-top,.ui-table-reflow th .ui-table-cell-label-top{display:block;padding:.4em 0;margin:.4em 0;text-transform:uppercase;font-size:.9em;font-weight:400}}@media (min-width:35em){.ui-table-reflow.ui-responsive tbody td,.ui-table-reflow.ui-responsive tbody th,.ui-table-reflow.ui-responsive td,.ui-table-reflow.ui-responsive th,.ui-table-reflow.ui-responsive thead td,.ui-table-reflow.ui-responsive thead th{display:table-cell;margin:0}.ui-table-reflow.ui-responsive td .ui-table-cell-label,.ui-table-reflow.ui-responsive th .ui-table-cell-label{display:none}}@media (max-width:35em){.ui-responsive>.ui-block-a,.ui-responsive>.ui-block-b,.ui-responsive>.ui-block-c,.ui-responsive>.ui-block-d,.ui-responsive>.ui-block-e{width:100%;float:none}.ui-table-reflow.ui-responsive td,.ui-table-reflow.ui-responsive th{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;float:left;clear:left}} \ No newline at end of file diff --git a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.table.js b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.table.js index db3c6f9111..e4eb0e4f8a 100644 --- a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.table.js +++ b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.table.js @@ -1,191 +1 @@ -define(['jqmwidget'], function () { - - var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/; - - $.extend($.mobile, { - - // Namespace used framework-wide for data-attrs. Default is no namespace - - // Retrieve an attribute from an element and perform some massaging of the value - - getAttribute: function (element, key) { - var data; - - element = element.jquery ? element[0] : element; - - if (element && element.getAttribute) { - data = element.getAttribute("data-" + key); - } - - // Copied from core's src/data.js:dataAttr() - // Convert from a string to a proper data type - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test(data) ? JSON.parse(data) : - data; - } catch (err) { } - - return data; - } - - }); - - - $.widget("mobile.table", { - options: { - enhanced: false - }, - - _create: function () { - if (!this.options.enhanced) { - this.element.addClass("ui-table"); - } - - // extend here, assign on refresh > _setHeaders - $.extend(this, { - - // Expose headers and allHeaders properties on the widget - // headers references the THs within the first TR in the table - headers: undefined, - - // allHeaders references headers, plus all THs in the thead, which may - // include several rows, or not - allHeaders: undefined - }); - - this._refresh(true); - }, - - _setHeaders: function () { - var trs = this.element.find("thead tr"); - - this.headers = this.element.find("tr:eq(0)").children(); - this.allHeaders = this.headers.add(trs.children()); - }, - - refresh: function () { - this._refresh(); - }, - - rebuild: $.noop, - - _refresh: function ( /* create */) { - var table = this.element, - trs = table.find("thead tr"); - - // updating headers on refresh (fixes #5880) - this._setHeaders(); - - // Iterate over the trs - trs.each(function () { - var columnCount = 0; - - // Iterate over the children of the tr - $(this).children().each(function () { - var span = parseInt(this.getAttribute("colspan"), 10), - selector = ":nth-child(" + (columnCount + 1) + ")", - j; - - this.setAttribute("data-colstart", columnCount + 1); - - if (span) { - for (j = 0; j < span - 1; j++) { - columnCount++; - selector += ", :nth-child(" + (columnCount + 1) + ")"; - } - } - - // Store "cells" data on header as a reference to all cells in the - // same column as this TH - $(this).data("cells", table.find("tr").not(trs.eq(0)).not(this).children(selector)); - - columnCount++; - }); - }); - } - }); - - - $.widget("mobile.table", $.mobile.table, { - options: { - mode: "reflow" - }, - - _create: function () { - this._super(); - - // If it's not reflow mode, return here. - if (this.options.mode !== "reflow") { - return; - } - - if (!this.options.enhanced) { - this.element.addClass("ui-table-reflow"); - - this._updateReflow(); - } - }, - - rebuild: function () { - this._super(); - - if (this.options.mode === "reflow") { - this._refresh(false); - } - }, - - _refresh: function (create) { - this._super(create); - if (!create && this.options.mode === "reflow") { - this._updateReflow(); - } - }, - - _updateReflow: function () { - var table = this, - opts = this.options; - - // get headers in reverse order so that top-level headers are appended last - $(table.allHeaders.get().reverse()).each(function () { - var cells = $(this).data("cells"), - colstart = $.mobile.getAttribute(this, "colstart"), - hierarchyClass = cells.not(this).filter("thead th").length && " ui-table-cell-label-top", - contents = $(this).clone().contents(), - iteration, filter; - - if (contents.length > 0) { - - if (hierarchyClass) { - iteration = parseInt(this.getAttribute("colspan"), 10); - filter = ""; - - if (iteration) { - filter = "td:nth-child(" + iteration + "n + " + (colstart) + ")"; - } - - table._addLabels(cells.filter(filter), - "ui-table-cell-label" + hierarchyClass, contents); - } else { - table._addLabels(cells, "ui-table-cell-label", contents); - } - - } - }); - }, - - _addLabels: function (cells, label, contents) { - if (contents.length === 1 && contents[0].nodeName.toLowerCase() === "abbr") { - contents = contents.eq(0).attr("title"); - } - // .not fixes #6006 - cells - .not(":has(b." + label + ")") - .prepend($("").append(contents)); - } - }); - -}); \ No newline at end of file +define(["jqmwidget"],function(){var rbrace=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/;$.extend($.mobile,{getAttribute:function(element,key){var data;element=element.jquery?element[0]:element,element&&element.getAttribute&&(data=element.getAttribute("data-"+key));try{data="true"===data||"false"!==data&&("null"===data?null:+data+""===data?+data:rbrace.test(data)?JSON.parse(data):data)}catch(err){}return data}}),$.widget("mobile.table",{options:{enhanced:!1},_create:function(){this.options.enhanced||this.element.addClass("ui-table"),$.extend(this,{headers:void 0,allHeaders:void 0}),this._refresh(!0)},_setHeaders:function(){var trs=this.element.find("thead tr");this.headers=this.element.find("tr:eq(0)").children(),this.allHeaders=this.headers.add(trs.children())},refresh:function(){this._refresh()},rebuild:$.noop,_refresh:function(){var table=this.element,trs=table.find("thead tr");this._setHeaders(),trs.each(function(){var columnCount=0;$(this).children().each(function(){var j,span=parseInt(this.getAttribute("colspan"),10),selector=":nth-child("+(columnCount+1)+")";if(this.setAttribute("data-colstart",columnCount+1),span)for(j=0;j0&&(hierarchyClass?(iteration=parseInt(this.getAttribute("colspan"),10),filter="",iteration&&(filter="td:nth-child("+iteration+"n + "+colstart+")"),table._addLabels(cells.filter(filter),"ui-table-cell-label"+hierarchyClass,contents)):table._addLabels(cells,"ui-table-cell-label",contents))})},_addLabels:function(cells,label,contents){1===contents.length&&"abbr"===contents[0].nodeName.toLowerCase()&&(contents=contents.eq(0).attr("title")),cells.not(":has(b."+label+")").prepend($("").append(contents))}})}); \ No newline at end of file diff --git a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.widget.js b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.widget.js index 8436382e96..abf355496e 100644 --- a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.widget.js +++ b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.widget.js @@ -1,614 +1 @@ -define(['jQuery'], function () { - - jQuery.mobile = {}; - - (function ($, window, undefined) { - - function parentWithClass(elem, className) { - - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - - if (!elem) { - return null; - } - } - - return elem; - } - - $.extend($.mobile, { - - // Place to store various widget extensions - behaviors: {} - }); - - // plugins - $.fn.extend({ - // Enhance child elements - enhanceWithin: function () { - var index, - widgetElements = {}, - that = this; - - // Enhance widgets - $.each($.mobile.widgets, function (name, constructor) { - - // If initSelector not false find elements - if (constructor.initSelector) { - - // Filter elements that should not be enhanced based on parents - var elements = that[0].querySelectorAll(constructor.initSelector); - - // Enhance whatever is left - if (elements.length > 0) { - widgetElements[constructor.prototype.widgetName] = $(elements); - } - } - }); - - for (index in widgetElements) { - widgetElements[index][index](); - } - - return this; - } - }); - - })(jQuery, this); - - jQuery.mobile.widgets = {}; - - // plugins - $.fn.extend({ - // Enhance child elements - enhanceWithin: function () { - var index, - widgetElements = {}, - that = this; - - // Enhance widgets - $.each($.mobile.widgets, function (name, constructor) { - - // If initSelector not false find elements - if (constructor.initSelector) { - - // Filter elements that should not be enhanced based on parents - var elements = that[0].querySelectorAll(constructor.initSelector); - - // Enhance whatever is left - if (elements.length > 0) { - widgetElements[constructor.prototype.widgetName] = $(elements); - } - } - }); - - for (index in widgetElements) { - widgetElements[index][index](); - } - - return this; - } - }); - - // For backcompat remove in 1.5 - jQuery(document).on("create", function (event) { - jQuery(event.target).enhanceWithin(); - }); - - /*! - * jQuery UI Widget c0ab71056b936627e8a7821f03c044aec6280a40 - * http://jqueryui.com - * - * Copyright 2013 jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/jQuery.widget/ - */ - (function ($, undefined) { - - var uuid = 0, - slice = Array.prototype.slice, - _cleanData = $.cleanData; - $.cleanData = function (elems) { - for (var i = 0, elem; (elem = elems[i]) != null; i++) { - try { - $(elem).triggerHandler("remove"); - // http://bugs.jquery.com/ticket/8235 - } catch (e) { } - } - _cleanData(elems); - }; - - $.widget = function (name, base, prototype) { - var fullName, existingConstructor, constructor, basePrototype, - // proxiedPrototype allows the provided prototype to remain unmodified - // so that it can be used as a mixin for multiple widgets (#8876) - proxiedPrototype = {}, - namespace = name.split(".")[0]; - - name = name.split(".")[1]; - fullName = namespace + "-" + name; - - if (!prototype) { - prototype = base; - base = $.Widget; - } - - // create selector for plugin - $.expr[":"][fullName.toLowerCase()] = function (elem) { - return !!$.data(elem, fullName); - }; - - $[namespace] = $[namespace] || {}; - existingConstructor = $[namespace][name]; - constructor = $[namespace][name] = function (options, element) { - // allow instantiation without "new" keyword - if (!this._createWidget) { - return new constructor(options, element); - } - - // allow instantiation without initializing for simple inheritance - // must use "new" keyword (the code above always passes args) - if (arguments.length) { - this._createWidget(options, element); - } - }; - // extend with the existing constructor to carry over any static properties - $.extend(constructor, existingConstructor, { - version: prototype.version, - // copy the object used to create the prototype in case we need to - // redefine the widget later - _proto: $.extend({}, prototype), - // track widgets that inherit from this widget in case this widget is - // redefined after a widget inherits from it - _childConstructors: [] - }); - - basePrototype = new base(); - // we need to make the options hash a property directly on the new instance - // otherwise we'll modify the options hash on the prototype that we're - // inheriting from - basePrototype.options = $.widget.extend({}, basePrototype.options); - $.each(prototype, function (prop, value) { - if (!$.isFunction(value)) { - proxiedPrototype[prop] = value; - return; - } - proxiedPrototype[prop] = (function () { - var _super = function () { - return base.prototype[prop].apply(this, arguments); - }, - _superApply = function (args) { - return base.prototype[prop].apply(this, args); - }; - return function () { - var __super = this._super, - __superApply = this._superApply, - returnValue; - - this._super = _super; - this._superApply = _superApply; - - returnValue = value.apply(this, arguments); - - this._super = __super; - this._superApply = __superApply; - - return returnValue; - }; - })(); - }); - constructor.prototype = $.widget.extend(basePrototype, { - // TODO: remove support for widgetEventPrefix - // always use the name + a colon as the prefix, e.g., draggable:start - // don't prefix for widgets that aren't DOM-based - widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name - }, proxiedPrototype, { - constructor: constructor, - namespace: namespace, - widgetName: name, - widgetFullName: fullName - }); - - // If this widget is being redefined then we need to find all widgets that - // are inheriting from it and redefine all of them so that they inherit from - // the new version of this widget. We're essentially trying to replace one - // level in the prototype chain. - if (existingConstructor) { - $.each(existingConstructor._childConstructors, function (i, child) { - var childPrototype = child.prototype; - - // redefine the child widget using the same prototype that was - // originally used, but inherit from the new version of the base - $.widget(childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto); - }); - // remove the list of existing child constructors from the old constructor - // so the old child constructors can be garbage collected - delete existingConstructor._childConstructors; - } else { - base._childConstructors.push(constructor); - } - - $.widget.bridge(name, constructor); - - return constructor; - }; - - $.widget.extend = function (target) { - var input = slice.call(arguments, 1), - inputIndex = 0, - inputLength = input.length, - key, - value; - for (; inputIndex < inputLength; inputIndex++) { - for (key in input[inputIndex]) { - value = input[inputIndex][key]; - if (input[inputIndex].hasOwnProperty(key) && value !== undefined) { - // Clone objects - if ($.isPlainObject(value)) { - target[key] = $.isPlainObject(target[key]) ? - $.widget.extend({}, target[key], value) : - // Don't extend strings, arrays, etc. with objects - $.widget.extend({}, value); - // Copy everything else by reference - } else { - target[key] = value; - } - } - } - } - return target; - }; - - $.widget.bridge = function (name, object) { - - var fullName = object.prototype.widgetFullName || name; - $.fn[name] = function (options) { - var isMethodCall = typeof options === "string", - args = slice.call(arguments, 1), - returnValue = this; - - // allow multiple hashes to be passed on init - options = !isMethodCall && args.length ? - $.widget.extend.apply(null, [options].concat(args)) : - options; - - if (isMethodCall) { - this.each(function () { - var methodValue, - instance = $.data(this, fullName); - if (options === "instance") { - returnValue = instance; - return false; - } - if (!instance) { - return $.error("cannot call methods on " + name + " prior to initialization; " + - "attempted to call method '" + options + "'"); - } - if (!$.isFunction(instance[options]) || options.charAt(0) === "_") { - return $.error("no such method '" + options + "' for " + name + " widget instance"); - } - methodValue = instance[options].apply(instance, args); - if (methodValue !== instance && methodValue !== undefined) { - returnValue = methodValue && methodValue.jquery ? - returnValue.pushStack(methodValue.get()) : - methodValue; - return false; - } - }); - } else { - this.each(function () { - var instance = $.data(this, fullName); - if (instance) { - instance.option(options || {})._init(); - } else { - $.data(this, fullName, new object(options, this)); - } - }); - } - - return returnValue; - }; - }; - - $.Widget = function ( /* options, element */) { }; - $.Widget._childConstructors = []; - - $.Widget.prototype = { - widgetName: "widget", - widgetEventPrefix: "", - defaultElement: "
", - options: { - disabled: false, - - // callbacks - create: null - }, - _createWidget: function (options, element) { - element = $(element || this.defaultElement || this)[0]; - this.element = $(element); - this.uuid = uuid++; - this.eventNamespace = "." + this.widgetName + this.uuid; - this.options = $.widget.extend({}, - this.options, - this._getCreateOptions(), - options); - - this.bindings = $(); - this.hoverable = $(); - this.focusable = $(); - - if (element !== this) { - $.data(element, this.widgetFullName, this); - this._on(true, this.element, { - remove: function (event) { - if (event.target === element) { - this.destroy(); - } - } - }); - this.document = $(element.style ? - // element within the document - element.ownerDocument : - // element is window or document - element.document || element); - this.window = $(this.document[0].defaultView || this.document[0].parentWindow); - } - - this._create(); - this._trigger("create", null, this._getCreateEventData()); - this._init(); - }, - _getCreateOptions: $.noop, - _getCreateEventData: $.noop, - _create: $.noop, - _init: $.noop, - - destroy: function () { - this._destroy(); - // we can probably remove the unbind calls in 2.0 - // all event bindings should go through this._on() - this.element - .unbind(this.eventNamespace) - .removeData(this.widgetFullName) - // support: jquery <1.6.3 - // http://bugs.jquery.com/ticket/9413 - .removeData($.camelCase(this.widgetFullName)); - this.widget() - .unbind(this.eventNamespace) - .removeAttr("aria-disabled") - .removeClass( - this.widgetFullName + "-disabled " + - "ui-state-disabled"); - - // clean up events and states - this.bindings.unbind(this.eventNamespace); - this.hoverable.removeClass("ui-state-hover"); - this.focusable.removeClass("ui-state-focus"); - }, - _destroy: $.noop, - - widget: function () { - return this.element; - }, - - option: function (key, value) { - var options = key, - parts, - curOption, - i; - - if (arguments.length === 0) { - // don't return a reference to the internal hash - return $.widget.extend({}, this.options); - } - - if (typeof key === "string") { - // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } - options = {}; - parts = key.split("."); - key = parts.shift(); - if (parts.length) { - curOption = options[key] = $.widget.extend({}, this.options[key]); - for (i = 0; i < parts.length - 1; i++) { - curOption[parts[i]] = curOption[parts[i]] || {}; - curOption = curOption[parts[i]]; - } - key = parts.pop(); - if (value === undefined) { - return curOption[key] === undefined ? null : curOption[key]; - } - curOption[key] = value; - } else { - if (value === undefined) { - return this.options[key] === undefined ? null : this.options[key]; - } - options[key] = value; - } - } - - this._setOptions(options); - - return this; - }, - _setOptions: function (options) { - var key; - - for (key in options) { - this._setOption(key, options[key]); - } - - return this; - }, - _setOption: function (key, value) { - this.options[key] = value; - - if (key === "disabled") { - this.widget() - .toggleClass(this.widgetFullName + "-disabled", !!value); - this.hoverable.removeClass("ui-state-hover"); - this.focusable.removeClass("ui-state-focus"); - } - - return this; - }, - - enable: function () { - return this._setOptions({ disabled: false }); - }, - disable: function () { - return this._setOptions({ disabled: true }); - }, - - _on: function (suppressDisabledCheck, element, handlers) { - var delegateElement, - instance = this; - - // no suppressDisabledCheck flag, shuffle arguments - if (typeof suppressDisabledCheck !== "boolean") { - handlers = element; - element = suppressDisabledCheck; - suppressDisabledCheck = false; - } - - // no element argument, shuffle and use this.element - if (!handlers) { - handlers = element; - element = this.element; - delegateElement = this.widget(); - } else { - // accept selectors, DOM elements - element = delegateElement = $(element); - this.bindings = this.bindings.add(element); - } - - $.each(handlers, function (event, handler) { - function handlerProxy() { - // allow widgets to customize the disabled handling - // - disabled as an array instead of boolean - // - disabled class as method for disabling individual parts - if (!suppressDisabledCheck && - (instance.options.disabled === true || - $(this).hasClass("ui-state-disabled"))) { - return; - } - return (typeof handler === "string" ? instance[handler] : handler) - .apply(instance, arguments); - } - - // copy the guid so direct unbinding works - if (typeof handler !== "string") { - handlerProxy.guid = handler.guid = - handler.guid || handlerProxy.guid || $.guid++; - } - - var match = event.match(/^(\w+)\s*(.*)$/), - eventName = match[1] + instance.eventNamespace, - selector = match[2]; - if (selector) { - delegateElement.on(eventName, selector, handlerProxy); - } else { - element.on(eventName, handlerProxy); - } - }); - }, - - _off: function (element, eventName) { - eventName = (eventName || "").split(" ").join(this.eventNamespace + " ") + this.eventNamespace; - element.off(eventName).off(eventName); - }, - - _trigger: function (type, event, data) { - var prop, orig, - callback = this.options[type]; - - data = data || {}; - event = $.Event(event); - event.type = (type === this.widgetEventPrefix ? - type : - this.widgetEventPrefix + type).toLowerCase(); - // the original event may come from any element - // so we need to reset the target on the new event - event.target = this.element[0]; - - // copy original event properties over to the new event - orig = event.originalEvent; - if (orig) { - for (prop in orig) { - if (!(prop in event)) { - event[prop] = orig[prop]; - } - } - } - - this.element[0].dispatchEvent(new CustomEvent(event.type, { - bubbles: true, - detail: { - data: data, - originalEvent: event - } - })); - - //this.element.trigger(event, data); - return !($.isFunction(callback) && - callback.apply(this.element[0], [event].concat(data)) === false || - event.isDefaultPrevented()); - } - }; - - })(jQuery); - - (function ($, undefined) { - - $.extend($.Widget.prototype, { - _getCreateOptions: function () { - - var option, value, - elem = this.element[0], - options = {}; - - // - if (!this.element.data("defaults")) { - for (option in this.options) { - - value = this.element.data(option); - - if (value != null) { - options[option] = value; - } - } - } - - return options; - } - }); - - })(jQuery); - - (function ($, undefined) { - - - var originalWidget = $.widget; - - $.widget = (function (orig) { - return function () { - var constructor = orig.apply(this, arguments), - name = constructor.prototype.widgetName; - - constructor.initSelector = ((constructor.prototype.initSelector !== undefined) ? - constructor.prototype.initSelector : "*[data-role='" + name + "']:not([data-role='none'])"); - - $.mobile.widgets[name] = constructor; - - return constructor; - }; - })($.widget); - - // Make sure $.widget still has bridge and extend methods - $.extend($.widget, originalWidget); - - })(jQuery); - -}); \ No newline at end of file +define(["jQuery"],function(){jQuery.mobile={},function($,window,undefined){$.extend($.mobile,{behaviors:{}}),$.fn.extend({enhanceWithin:function(){var index,widgetElements={},that=this;$.each($.mobile.widgets,function(name,constructor){if(constructor.initSelector){var elements=that[0].querySelectorAll(constructor.initSelector);elements.length>0&&(widgetElements[constructor.prototype.widgetName]=$(elements))}});for(index in widgetElements)widgetElements[index][index]();return this}})}(jQuery,this),jQuery.mobile.widgets={},$.fn.extend({enhanceWithin:function(){var index,widgetElements={},that=this;$.each($.mobile.widgets,function(name,constructor){if(constructor.initSelector){var elements=that[0].querySelectorAll(constructor.initSelector);elements.length>0&&(widgetElements[constructor.prototype.widgetName]=$(elements))}});for(index in widgetElements)widgetElements[index][index]();return this}}),jQuery(document).on("create",function(event){jQuery(event.target).enhanceWithin()}),function($,undefined){var uuid=0,slice=Array.prototype.slice,_cleanData=$.cleanData;$.cleanData=function(elems){for(var elem,i=0;null!=(elem=elems[i]);i++)try{$(elem).triggerHandler("remove")}catch(e){}_cleanData(elems)},$.widget=function(name,base,prototype){var fullName,existingConstructor,constructor,basePrototype,proxiedPrototype={},namespace=name.split(".")[0];return name=name.split(".")[1],fullName=namespace+"-"+name,prototype||(prototype=base,base=$.Widget),$.expr[":"][fullName.toLowerCase()]=function(elem){return!!$.data(elem,fullName)},$[namespace]=$[namespace]||{},existingConstructor=$[namespace][name],constructor=$[namespace][name]=function(options,element){return this._createWidget?void(arguments.length&&this._createWidget(options,element)):new constructor(options,element)},$.extend(constructor,existingConstructor,{version:prototype.version,_proto:$.extend({},prototype),_childConstructors:[]}),basePrototype=new base,basePrototype.options=$.widget.extend({},basePrototype.options),$.each(prototype,function(prop,value){return $.isFunction(value)?void(proxiedPrototype[prop]=function(){var _super=function(){return base.prototype[prop].apply(this,arguments)},_superApply=function(args){return base.prototype[prop].apply(this,args)};return function(){var returnValue,__super=this._super,__superApply=this._superApply;return this._super=_super,this._superApply=_superApply,returnValue=value.apply(this,arguments),this._super=__super,this._superApply=__superApply,returnValue}}()):void(proxiedPrototype[prop]=value)}),constructor.prototype=$.widget.extend(basePrototype,{widgetEventPrefix:existingConstructor?basePrototype.widgetEventPrefix||name:name},proxiedPrototype,{constructor:constructor,namespace:namespace,widgetName:name,widgetFullName:fullName}),existingConstructor?($.each(existingConstructor._childConstructors,function(i,child){var childPrototype=child.prototype;$.widget(childPrototype.namespace+"."+childPrototype.widgetName,constructor,child._proto)}),delete existingConstructor._childConstructors):base._childConstructors.push(constructor),$.widget.bridge(name,constructor),constructor},$.widget.extend=function(target){for(var key,value,input=slice.call(arguments,1),inputIndex=0,inputLength=input.length;inputIndex",options:{disabled:!1,create:null},_createWidget:function(options,element){element=$(element||this.defaultElement||this)[0],this.element=$(element),this.uuid=uuid++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=$.widget.extend({},this.options,this._getCreateOptions(),options),this.bindings=$(),this.hoverable=$(),this.focusable=$(),element!==this&&($.data(element,this.widgetFullName,this),this._on(!0,this.element,{remove:function(event){event.target===element&&this.destroy()}}),this.document=$(element.style?element.ownerDocument:element.document||element),this.window=$(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:$.noop,_getCreateEventData:$.noop,_create:$.noop,_init:$.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData($.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:$.noop,widget:function(){return this.element},option:function(key,value){var parts,curOption,i,options=key;if(0===arguments.length)return $.widget.extend({},this.options);if("string"==typeof key)if(options={},parts=key.split("."),key=parts.shift(),parts.length){for(curOption=options[key]=$.widget.extend({},this.options[key]),i=0;i .jstree-ocl { - cursor: default; -} -.jstree .jstree-open > .jstree-children { - display: block; -} -.jstree .jstree-closed > .jstree-children, -.jstree .jstree-leaf > .jstree-children { - display: none; -} -.jstree-anchor > .jstree-themeicon { - margin-right: 2px; -} -.jstree-no-icons .jstree-themeicon, -.jstree-anchor > .jstree-themeicon-hidden { - display: none; -} -.jstree-rtl .jstree-anchor { - padding: 0 1px 0 4px; -} -.jstree-rtl .jstree-anchor > .jstree-themeicon { - margin-left: 2px; - margin-right: 0; -} -.jstree-rtl .jstree-node { - margin-left: 0; -} -.jstree-rtl .jstree-container-ul > .jstree-node { - margin-right: 0; -} -.jstree-wholerow-ul { - position: relative; - display: inline-block; - min-width: 100%; -} -.jstree-wholerow-ul .jstree-leaf > .jstree-ocl { - cursor: pointer; -} -.jstree-wholerow-ul .jstree-anchor, -.jstree-wholerow-ul .jstree-icon { - position: relative; -} -.jstree-wholerow-ul .jstree-wholerow { - width: 100%; - cursor: pointer; - position: absolute; - left: 0; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.vakata-context { - display: none; -} -.vakata-context, -.vakata-context ul { - margin: 0; - padding: 2px; - position: absolute; - background: #f5f5f5; - border: 1px solid #979797; - -moz-box-shadow: 5px 5px 4px -4px #666666; - -webkit-box-shadow: 2px 2px 2px #999999; - box-shadow: 2px 2px 2px #999999; -} -.vakata-context ul { - list-style: none; - left: 100%; - margin-top: -2.7em; - margin-left: -4px; -} -.vakata-context .vakata-context-right ul { - left: auto; - right: 100%; - margin-left: auto; - margin-right: -4px; -} -.vakata-context li { - list-style: none; - display: inline; -} -.vakata-context li > a { - display: block; - padding: 0 2em 0 2em; - text-decoration: none; - width: auto; - color: black; - white-space: nowrap; - line-height: 2.4em; - -moz-text-shadow: 1px 1px 0 white; - -webkit-text-shadow: 1px 1px 0 white; - text-shadow: 1px 1px 0 white; - -moz-border-radius: 1px; - -webkit-border-radius: 1px; - border-radius: 1px; -} -.vakata-context li > a:hover { - position: relative; - background-color: #e8eff7; - -moz-box-shadow: 0 0 2px #0a6aa1; - -webkit-box-shadow: 0 0 2px #0a6aa1; - box-shadow: 0 0 2px #0a6aa1; -} -.vakata-context li > a.vakata-context-parent { - background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw=="); - background-position: right center; - background-repeat: no-repeat; -} -.vakata-context li > a:focus { - outline: 0; -} -.vakata-context .vakata-context-hover > a { - position: relative; - background-color: #e8eff7; - -moz-box-shadow: 0 0 2px #0a6aa1; - -webkit-box-shadow: 0 0 2px #0a6aa1; - box-shadow: 0 0 2px #0a6aa1; -} -.vakata-context .vakata-context-separator > a, -.vakata-context .vakata-context-separator > a:hover { - background: white; - border: 0; - border-top: 1px solid #e2e3e3; - height: 1px; - min-height: 1px; - max-height: 1px; - padding: 0; - margin: 0 0 0 2.4em; - border-left: 1px solid #e0e0e0; - -moz-text-shadow: 0 0 0 transparent; - -webkit-text-shadow: 0 0 0 transparent; - text-shadow: 0 0 0 transparent; - -moz-box-shadow: 0 0 0 transparent; - -webkit-box-shadow: 0 0 0 transparent; - box-shadow: 0 0 0 transparent; - -moz-border-radius: 0; - -webkit-border-radius: 0; - border-radius: 0; -} -.vakata-context .vakata-contextmenu-disabled a, -.vakata-context .vakata-contextmenu-disabled a:hover { - color: silver; - background-color: transparent; - border: 0; - box-shadow: 0 0 0; -} -.vakata-context li > a > i { - text-decoration: none; - display: inline-block; - width: 2.4em; - height: 2.4em; - background: transparent; - margin: 0 0 0 -2em; - vertical-align: top; - text-align: center; - line-height: 2.4em; -} -.vakata-context li > a > i:empty { - width: 2.4em; - line-height: 2.4em; -} -.vakata-context li > a .vakata-contextmenu-sep { - display: inline-block; - width: 1px; - height: 2.4em; - background: white; - margin: 0 0.5em 0 0; - border-left: 1px solid #e2e3e3; -} -.vakata-context .vakata-contextmenu-shortcut { - color: silver; - opacity: 0.5; - display: none; -} -.vakata-context-rtl ul { - left: auto; - right: 100%; - margin-left: auto; - margin-right: -4px; -} -.vakata-context-rtl li > a.vakata-context-parent { - background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7"); - background-position: left center; - background-repeat: no-repeat; -} -.vakata-context-rtl .vakata-context-separator > a { - margin: 0 2.4em 0 0; - border-left: 0; - border-right: 1px solid #e2e3e3; -} -.vakata-context-rtl .vakata-context-left ul { - right: auto; - left: 100%; - margin-left: -4px; - margin-right: auto; -} -.vakata-context-rtl li > a > i { - margin: 0 -2em 0 0; -} -.vakata-context-rtl li > a .vakata-contextmenu-sep { - margin: 0 0 0 0.5em; - border-left-color: white; - background: #e2e3e3; -} -#jstree-marker { - position: absolute; - top: 0; - left: 0; - margin: -5px 0 0 0; - padding: 0; - border-right: 0; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid; - width: 0; - height: 0; - font-size: 0; - line-height: 0; -} -#jstree-dnd { - line-height: 16px; - margin: 0; - padding: 4px; -} -#jstree-dnd .jstree-icon, -#jstree-dnd .jstree-copy { - display: inline-block; - text-decoration: none; - margin: 0 2px 0 0; - padding: 0; - width: 16px; - height: 16px; -} -#jstree-dnd .jstree-ok { - background: green; -} -#jstree-dnd .jstree-er { - background: red; -} -#jstree-dnd .jstree-copy { - margin: 0 2px 0 2px; -} -.jstree-default .jstree-node, -.jstree-default .jstree-icon { - background-repeat: no-repeat; - background-color: transparent; -} -.jstree-default .jstree-anchor, -.jstree-default .jstree-wholerow { - transition: background-color 0.15s, box-shadow 0.15s; -} -.jstree-default .jstree-hovered { - background: #e7f4f9; - border-radius: 2px; - box-shadow: inset 0 0 1px #cccccc; -} -.jstree-default .jstree-clicked { - background: #beebff; - border-radius: 2px; - box-shadow: inset 0 0 1px #999999; -} -.jstree-default .jstree-no-icons .jstree-anchor > .jstree-themeicon { - display: none; -} -.jstree-default .jstree-disabled { - background: transparent; - color: #666666; -} -.jstree-default .jstree-disabled.jstree-hovered { - background: transparent; - box-shadow: none; -} -.jstree-default .jstree-disabled.jstree-clicked { - background: #efefef; -} -.jstree-default .jstree-disabled > .jstree-icon { - opacity: 0.8; - filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); - /* Firefox 10+ */ - filter: gray; - /* IE6-9 */ - -webkit-filter: grayscale(100%); - /* Chrome 19+ & Safari 6+ */ -} -.jstree-default .jstree-search { - font-style: italic; - color: #8b0000; - font-weight: bold; -} -.jstree-default .jstree-no-checkboxes .jstree-checkbox { - display: none !important; -} -.jstree-default.jstree-checkbox-no-clicked .jstree-clicked { - background: transparent; - box-shadow: none; -} -.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered { - background: #e7f4f9; -} -.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked { - background: transparent; -} -.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered { - background: #e7f4f9; -} -.jstree-default > .jstree-striped { - background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat; -} -.jstree-default > .jstree-wholerow-ul .jstree-hovered, -.jstree-default > .jstree-wholerow-ul .jstree-clicked { - background: transparent; - box-shadow: none; - border-radius: 0; -} -.jstree-default .jstree-wholerow { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.jstree-default .jstree-wholerow-hovered { - background: #e7f4f9; -} -.jstree-default .jstree-wholerow-clicked { - background: #beebff; - background: -moz-linear-gradient(top, #beebff 0%, #a8e4ff 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #beebff), color-stop(100%, #a8e4ff)); - background: -webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%); - background: -o-linear-gradient(top, #beebff 0%, #a8e4ff 100%); - background: -ms-linear-gradient(top, #beebff 0%, #a8e4ff 100%); - background: linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%); - /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='@color1', endColorstr='@color2',GradientType=0 );*/ -} -.jstree-default .jstree-node { - min-height: 24px; - line-height: 24px; - margin-left: 24px; - min-width: 24px; -} -.jstree-default .jstree-anchor { - line-height: 24px; - height: 24px; -} -.jstree-default .jstree-icon { - width: 24px; - height: 24px; - line-height: 24px; -} -.jstree-default .jstree-icon:empty { - width: 24px; - height: 24px; - line-height: 24px; -} -.jstree-default.jstree-rtl .jstree-node { - margin-right: 24px; -} -.jstree-default .jstree-wholerow { - height: 24px; -} -.jstree-default .jstree-node, -.jstree-default .jstree-icon { - background-image: url("32px.png"); -} -.jstree-default .jstree-node { - background-position: -292px -4px; - background-repeat: repeat-y; -} -.jstree-default .jstree-last { - background: transparent; -} -.jstree-default .jstree-open > .jstree-ocl { - background-position: -132px -4px; -} -.jstree-default .jstree-closed > .jstree-ocl { - background-position: -100px -4px; -} -.jstree-default .jstree-leaf > .jstree-ocl { - background-position: -68px -4px; -} -.jstree-default .jstree-themeicon { - background-position: -260px -4px; -} -.jstree-default > .jstree-no-dots .jstree-node, -.jstree-default > .jstree-no-dots .jstree-leaf > .jstree-ocl { - background: transparent; -} -.jstree-default > .jstree-no-dots .jstree-open > .jstree-ocl { - background-position: -36px -4px; -} -.jstree-default > .jstree-no-dots .jstree-closed > .jstree-ocl { - background-position: -4px -4px; -} -.jstree-default .jstree-disabled { - background: transparent; -} -.jstree-default .jstree-disabled.jstree-hovered { - background: transparent; -} -.jstree-default .jstree-disabled.jstree-clicked { - background: #efefef; -} -.jstree-default .jstree-checkbox { - background-position: -164px -4px; -} -.jstree-default .jstree-checkbox:hover { - background-position: -164px -36px; -} -.jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, -.jstree-default .jstree-checked > .jstree-checkbox { - background-position: -228px -4px; -} -.jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, -.jstree-default .jstree-checked > .jstree-checkbox:hover { - background-position: -228px -36px; -} -.jstree-default .jstree-anchor > .jstree-undetermined { - background-position: -196px -4px; -} -.jstree-default .jstree-anchor > .jstree-undetermined:hover { - background-position: -196px -36px; -} -.jstree-default > .jstree-striped { - background-size: auto 48px; -} -.jstree-default.jstree-rtl .jstree-node { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); - background-position: 100% 1px; - background-repeat: repeat-y; -} -.jstree-default.jstree-rtl .jstree-last { - background: transparent; -} -.jstree-default.jstree-rtl .jstree-open > .jstree-ocl { - background-position: -132px -36px; -} -.jstree-default.jstree-rtl .jstree-closed > .jstree-ocl { - background-position: -100px -36px; -} -.jstree-default.jstree-rtl .jstree-leaf > .jstree-ocl { - background-position: -68px -36px; -} -.jstree-default.jstree-rtl > .jstree-no-dots .jstree-node, -.jstree-default.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { - background: transparent; -} -.jstree-default.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { - background-position: -36px -36px; -} -.jstree-default.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { - background-position: -4px -36px; -} -.jstree-default .jstree-themeicon-custom { - background-color: transparent; - background-image: none; - background-position: 0 0; -} -.jstree-default > .jstree-container-ul .jstree-loading > .jstree-ocl { - background: url("throbber.gif") center center no-repeat; -} -.jstree-default .jstree-file { - background: url("32px.png") -100px -68px no-repeat; -} -.jstree-default .jstree-folder { - background: url("32px.png") -260px -4px no-repeat; -} -.jstree-default > .jstree-container-ul > .jstree-node { - margin-left: 0; - margin-right: 0; -} -#jstree-dnd.jstree-default { - line-height: 24px; - padding: 0 4px; -} -#jstree-dnd.jstree-default .jstree-ok, -#jstree-dnd.jstree-default .jstree-er { - background-image: url("32px.png"); - background-repeat: no-repeat; - background-color: transparent; -} -#jstree-dnd.jstree-default i { - background: transparent; - width: 24px; - height: 24px; - line-height: 24px; -} -#jstree-dnd.jstree-default .jstree-ok { - background-position: -4px -68px; -} -#jstree-dnd.jstree-default .jstree-er { - background-position: -36px -68px; -} -.jstree-default.jstree-rtl .jstree-node { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); -} -.jstree-default.jstree-rtl .jstree-last { - background: transparent; -} -.jstree-default-small .jstree-node { - min-height: 18px; - line-height: 18px; - margin-left: 18px; - min-width: 18px; -} -.jstree-default-small .jstree-anchor { - line-height: 18px; - height: 18px; -} -.jstree-default-small .jstree-icon { - width: 18px; - height: 18px; - line-height: 18px; -} -.jstree-default-small .jstree-icon:empty { - width: 18px; - height: 18px; - line-height: 18px; -} -.jstree-default-small.jstree-rtl .jstree-node { - margin-right: 18px; -} -.jstree-default-small .jstree-wholerow { - height: 18px; -} -.jstree-default-small .jstree-node, -.jstree-default-small .jstree-icon { - background-image: url("32px.png"); -} -.jstree-default-small .jstree-node { - background-position: -295px -7px; - background-repeat: repeat-y; -} -.jstree-default-small .jstree-last { - background: transparent; -} -.jstree-default-small .jstree-open > .jstree-ocl { - background-position: -135px -7px; -} -.jstree-default-small .jstree-closed > .jstree-ocl { - background-position: -103px -7px; -} -.jstree-default-small .jstree-leaf > .jstree-ocl { - background-position: -71px -7px; -} -.jstree-default-small .jstree-themeicon { - background-position: -263px -7px; -} -.jstree-default-small > .jstree-no-dots .jstree-node, -.jstree-default-small > .jstree-no-dots .jstree-leaf > .jstree-ocl { - background: transparent; -} -.jstree-default-small > .jstree-no-dots .jstree-open > .jstree-ocl { - background-position: -39px -7px; -} -.jstree-default-small > .jstree-no-dots .jstree-closed > .jstree-ocl { - background-position: -7px -7px; -} -.jstree-default-small .jstree-disabled { - background: transparent; -} -.jstree-default-small .jstree-disabled.jstree-hovered { - background: transparent; -} -.jstree-default-small .jstree-disabled.jstree-clicked { - background: #efefef; -} -.jstree-default-small .jstree-checkbox { - background-position: -167px -7px; -} -.jstree-default-small .jstree-checkbox:hover { - background-position: -167px -39px; -} -.jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, -.jstree-default-small .jstree-checked > .jstree-checkbox { - background-position: -231px -7px; -} -.jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, -.jstree-default-small .jstree-checked > .jstree-checkbox:hover { - background-position: -231px -39px; -} -.jstree-default-small .jstree-anchor > .jstree-undetermined { - background-position: -199px -7px; -} -.jstree-default-small .jstree-anchor > .jstree-undetermined:hover { - background-position: -199px -39px; -} -.jstree-default-small > .jstree-striped { - background-size: auto 36px; -} -.jstree-default-small.jstree-rtl .jstree-node { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); - background-position: 100% 1px; - background-repeat: repeat-y; -} -.jstree-default-small.jstree-rtl .jstree-last { - background: transparent; -} -.jstree-default-small.jstree-rtl .jstree-open > .jstree-ocl { - background-position: -135px -39px; -} -.jstree-default-small.jstree-rtl .jstree-closed > .jstree-ocl { - background-position: -103px -39px; -} -.jstree-default-small.jstree-rtl .jstree-leaf > .jstree-ocl { - background-position: -71px -39px; -} -.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-node, -.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { - background: transparent; -} -.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { - background-position: -39px -39px; -} -.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { - background-position: -7px -39px; -} -.jstree-default-small .jstree-themeicon-custom { - background-color: transparent; - background-image: none; - background-position: 0 0; -} -.jstree-default-small > .jstree-container-ul .jstree-loading > .jstree-ocl { - background: url("throbber.gif") center center no-repeat; -} -.jstree-default-small .jstree-file { - background: url("32px.png") -103px -71px no-repeat; -} -.jstree-default-small .jstree-folder { - background: url("32px.png") -263px -7px no-repeat; -} -.jstree-default-small > .jstree-container-ul > .jstree-node { - margin-left: 0; - margin-right: 0; -} -#jstree-dnd.jstree-default-small { - line-height: 18px; - padding: 0 4px; -} -#jstree-dnd.jstree-default-small .jstree-ok, -#jstree-dnd.jstree-default-small .jstree-er { - background-image: url("32px.png"); - background-repeat: no-repeat; - background-color: transparent; -} -#jstree-dnd.jstree-default-small i { - background: transparent; - width: 18px; - height: 18px; - line-height: 18px; -} -#jstree-dnd.jstree-default-small .jstree-ok { - background-position: -7px -71px; -} -#jstree-dnd.jstree-default-small .jstree-er { - background-position: -39px -71px; -} -.jstree-default-small.jstree-rtl .jstree-node { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); -} -.jstree-default-small.jstree-rtl .jstree-last { - background: transparent; -} -.jstree-default-large .jstree-node { - min-height: 32px; - line-height: 32px; - margin-left: 32px; - min-width: 32px; -} -.jstree-default-large .jstree-anchor { - line-height: 32px; - height: 32px; -} -.jstree-default-large .jstree-icon { - width: 32px; - height: 32px; - line-height: 32px; -} -.jstree-default-large .jstree-icon:empty { - width: 32px; - height: 32px; - line-height: 32px; -} -.jstree-default-large.jstree-rtl .jstree-node { - margin-right: 32px; -} -.jstree-default-large .jstree-wholerow { - height: 32px; -} -.jstree-default-large .jstree-node, -.jstree-default-large .jstree-icon { - background-image: url("32px.png"); -} -.jstree-default-large .jstree-node { - background-position: -288px 0px; - background-repeat: repeat-y; -} -.jstree-default-large .jstree-last { - background: transparent; -} -.jstree-default-large .jstree-open > .jstree-ocl { - background-position: -128px 0px; -} -.jstree-default-large .jstree-closed > .jstree-ocl { - background-position: -96px 0px; -} -.jstree-default-large .jstree-leaf > .jstree-ocl { - background-position: -64px 0px; -} -.jstree-default-large .jstree-themeicon { - background-position: -256px 0px; -} -.jstree-default-large > .jstree-no-dots .jstree-node, -.jstree-default-large > .jstree-no-dots .jstree-leaf > .jstree-ocl { - background: transparent; -} -.jstree-default-large > .jstree-no-dots .jstree-open > .jstree-ocl { - background-position: -32px 0px; -} -.jstree-default-large > .jstree-no-dots .jstree-closed > .jstree-ocl { - background-position: 0px 0px; -} -.jstree-default-large .jstree-disabled { - background: transparent; -} -.jstree-default-large .jstree-disabled.jstree-hovered { - background: transparent; -} -.jstree-default-large .jstree-disabled.jstree-clicked { - background: #efefef; -} -.jstree-default-large .jstree-checkbox { - background-position: -160px 0px; -} -.jstree-default-large .jstree-checkbox:hover { - background-position: -160px -32px; -} -.jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, -.jstree-default-large .jstree-checked > .jstree-checkbox { - background-position: -224px 0px; -} -.jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, -.jstree-default-large .jstree-checked > .jstree-checkbox:hover { - background-position: -224px -32px; -} -.jstree-default-large .jstree-anchor > .jstree-undetermined { - background-position: -192px 0px; -} -.jstree-default-large .jstree-anchor > .jstree-undetermined:hover { - background-position: -192px -32px; -} -.jstree-default-large > .jstree-striped { - background-size: auto 64px; -} -.jstree-default-large.jstree-rtl .jstree-node { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); - background-position: 100% 1px; - background-repeat: repeat-y; -} -.jstree-default-large.jstree-rtl .jstree-last { - background: transparent; -} -.jstree-default-large.jstree-rtl .jstree-open > .jstree-ocl { - background-position: -128px -32px; -} -.jstree-default-large.jstree-rtl .jstree-closed > .jstree-ocl { - background-position: -96px -32px; -} -.jstree-default-large.jstree-rtl .jstree-leaf > .jstree-ocl { - background-position: -64px -32px; -} -.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-node, -.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { - background: transparent; -} -.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { - background-position: -32px -32px; -} -.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { - background-position: 0px -32px; -} -.jstree-default-large .jstree-themeicon-custom { - background-color: transparent; - background-image: none; - background-position: 0 0; -} -.jstree-default-large > .jstree-container-ul .jstree-loading > .jstree-ocl { - background: url("throbber.gif") center center no-repeat; -} -.jstree-default-large .jstree-file { - background: url("32px.png") -96px -64px no-repeat; -} -.jstree-default-large .jstree-folder { - background: url("32px.png") -256px 0px no-repeat; -} -.jstree-default-large > .jstree-container-ul > .jstree-node { - margin-left: 0; - margin-right: 0; -} -#jstree-dnd.jstree-default-large { - line-height: 32px; - padding: 0 4px; -} -#jstree-dnd.jstree-default-large .jstree-ok, -#jstree-dnd.jstree-default-large .jstree-er { - background-image: url("32px.png"); - background-repeat: no-repeat; - background-color: transparent; -} -#jstree-dnd.jstree-default-large i { - background: transparent; - width: 32px; - height: 32px; - line-height: 32px; -} -#jstree-dnd.jstree-default-large .jstree-ok { - background-position: 0px -64px; -} -#jstree-dnd.jstree-default-large .jstree-er { - background-position: -32px -64px; -} -.jstree-default-large.jstree-rtl .jstree-node { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); -} -.jstree-default-large.jstree-rtl .jstree-last { - background: transparent; -} -@media (max-width: 768px) { - #jstree-dnd.jstree-dnd-responsive { - line-height: 40px; - font-weight: bold; - text-shadow: 1px 1px white; - } - #jstree-dnd.jstree-dnd-responsive > i { - background: transparent; - width: 40px; - height: 40px; - } - #jstree-dnd.jstree-dnd-responsive > .jstree-ok { - background-image: url("40px.png"); - background-position: 0 -200px; - background-size: 120px 240px; - } - #jstree-dnd.jstree-dnd-responsive > .jstree-er { - background-image: url("40px.png"); - background-position: -40px -200px; - background-size: 120px 240px; - } - #jstree-marker.jstree-dnd-responsive { - border-left-width: 10px; - border-top-width: 10px; - border-bottom-width: 10px; - margin-top: -10px; - } -} -@media (max-width: 768px) { - .jstree-default-responsive { - /* - .jstree-open > .jstree-ocl, - .jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; } - */ - } - .jstree-default-responsive .jstree-icon { - background-image: url("40px.png"); - } - .jstree-default-responsive .jstree-node, - .jstree-default-responsive .jstree-leaf > .jstree-ocl { - background: transparent; - } - .jstree-default-responsive .jstree-node { - min-height: 40px; - line-height: 40px; - margin-left: 40px; - min-width: 40px; - white-space: nowrap; - } - .jstree-default-responsive .jstree-anchor { - line-height: 40px; - height: 40px; - } - .jstree-default-responsive .jstree-icon, - .jstree-default-responsive .jstree-icon:empty { - width: 40px; - height: 40px; - line-height: 40px; - } - .jstree-default-responsive > .jstree-container-ul > .jstree-node { - margin-left: 0; - } - .jstree-default-responsive.jstree-rtl .jstree-node { - margin-left: 0; - margin-right: 40px; - } - .jstree-default-responsive.jstree-rtl .jstree-container-ul > .jstree-node { - margin-right: 0; - } - .jstree-default-responsive .jstree-ocl, - .jstree-default-responsive .jstree-themeicon, - .jstree-default-responsive .jstree-checkbox { - background-size: 120px 240px; - } - .jstree-default-responsive .jstree-leaf > .jstree-ocl { - background: transparent; - } - .jstree-default-responsive .jstree-open > .jstree-ocl { - background-position: 0 0px !important; - } - .jstree-default-responsive .jstree-closed > .jstree-ocl { - background-position: 0 -40px !important; - } - .jstree-default-responsive.jstree-rtl .jstree-closed > .jstree-ocl { - background-position: -40px 0px !important; - } - .jstree-default-responsive .jstree-themeicon { - background-position: -40px -40px; - } - .jstree-default-responsive .jstree-checkbox, - .jstree-default-responsive .jstree-checkbox:hover { - background-position: -40px -80px; - } - .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, - .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, - .jstree-default-responsive .jstree-checked > .jstree-checkbox, - .jstree-default-responsive .jstree-checked > .jstree-checkbox:hover { - background-position: 0 -80px; - } - .jstree-default-responsive .jstree-anchor > .jstree-undetermined, - .jstree-default-responsive .jstree-anchor > .jstree-undetermined:hover { - background-position: 0 -120px; - } - .jstree-default-responsive .jstree-anchor { - font-weight: bold; - text-shadow: 1px 1px white; - } - .jstree-default-responsive > .jstree-striped { - background: transparent; - } - .jstree-default-responsive .jstree-wholerow { - border-top: 1px solid rgba(255, 255, 255, 0.7); - border-bottom: 1px solid rgba(64, 64, 64, 0.2); - background: #ebebeb; - height: 40px; - } - .jstree-default-responsive .jstree-wholerow-hovered { - background: #e7f4f9; - } - .jstree-default-responsive .jstree-wholerow-clicked { - background: #beebff; - } - .jstree-default-responsive .jstree-children .jstree-last > .jstree-wholerow { - box-shadow: inset 0 -6px 3px -5px #666666; - } - .jstree-default-responsive .jstree-children .jstree-open > .jstree-wholerow { - box-shadow: inset 0 6px 3px -5px #666666; - border-top: 0; - } - .jstree-default-responsive .jstree-children .jstree-open + .jstree-open { - box-shadow: none; - } - .jstree-default-responsive .jstree-node, - .jstree-default-responsive .jstree-icon, - .jstree-default-responsive .jstree-node > .jstree-ocl, - .jstree-default-responsive .jstree-themeicon, - .jstree-default-responsive .jstree-checkbox { - background-image: url("40px.png"); - background-size: 120px 240px; - } - .jstree-default-responsive .jstree-node { - background-position: -80px 0; - background-repeat: repeat-y; - } - .jstree-default-responsive .jstree-last { - background: transparent; - } - .jstree-default-responsive .jstree-leaf > .jstree-ocl { - background-position: -40px -120px; - } - .jstree-default-responsive .jstree-last > .jstree-ocl { - background-position: -40px -160px; - } - .jstree-default-responsive .jstree-themeicon-custom { - background-color: transparent; - background-image: none; - background-position: 0 0; - } - .jstree-default-responsive .jstree-file { - background: url("40px.png") 0 -160px no-repeat; - background-size: 120px 240px; - } - .jstree-default-responsive .jstree-folder { - background: url("40px.png") -40px -40px no-repeat; - background-size: 120px 240px; - } - .jstree-default-responsive > .jstree-container-ul > .jstree-node { - margin-left: 0; - margin-right: 0; - } -} +.jstree-anchor,.jstree-node{white-space:nowrap}.jstree-anchor:focus,.vakata-context li>a:focus{outline:0}.jstree-children,.jstree-container-ul,.jstree-node{display:block;margin:0;padding:0;list-style-type:none;list-style-image:none}.jstree-anchor,.jstree-icon,.jstree-icon:empty{display:inline-block;margin:0;vertical-align:top}.jstree-anchor{padding:0 4px 0 1px}.jstree-anchor,.jstree-anchor:active,.jstree-anchor:hover,.jstree-anchor:link,.jstree-anchor:visited{text-decoration:none;color:inherit}.jstree-icon,.jstree-icon:empty{text-decoration:none;padding:0;text-align:center}.jstree-ocl{cursor:pointer}.jstree-leaf>.jstree-ocl{cursor:default}.jstree .jstree-open>.jstree-children{display:block}.jstree .jstree-closed>.jstree-children,.jstree .jstree-leaf>.jstree-children,.jstree-anchor>.jstree-themeicon-hidden,.jstree-no-icons .jstree-themeicon{display:none}.jstree-anchor>.jstree-themeicon{margin-right:2px}.jstree-rtl .jstree-anchor{padding:0 1px 0 4px}.jstree-rtl .jstree-anchor>.jstree-themeicon{margin-left:2px;margin-right:0}.jstree-rtl .jstree-node{margin-left:0}.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-wholerow-ul{position:relative;display:inline-block;min-width:100%}.jstree-wholerow-ul .jstree-leaf>.jstree-ocl{cursor:pointer}.jstree-wholerow-ul .jstree-anchor,.jstree-wholerow-ul .jstree-icon{position:relative}.jstree-wholerow-ul .jstree-wholerow{width:100%;cursor:pointer;position:absolute;left:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vakata-context{display:none}.vakata-context,.vakata-context ul{margin:0;padding:2px;position:absolute;background:#f5f5f5;border:1px solid #979797;-webkit-box-shadow:2px 2px 2px #999;box-shadow:2px 2px 2px #999}.vakata-context ul{list-style:none;left:100%;margin-top:-2.7em;margin-left:-4px}.vakata-context .vakata-context-right ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context li{list-style:none;display:inline}.vakata-context li>a{display:block;padding:0 2em;text-decoration:none;width:auto;color:#000;white-space:nowrap;line-height:2.4em;-moz-text-shadow:1px 1px 0 #fff;-webkit-text-shadow:1px 1px 0 #fff;text-shadow:1px 1px 0 #fff;-webkit-border-radius:1px;border-radius:1px}.vakata-context li>a>i,.vakata-context li>a>i:empty{width:2.4em;line-height:2.4em}.vakata-context li>a:hover{position:relative;background-color:#e8eff7;-webkit-box-shadow:0 0 2px #0a6aa1;box-shadow:0 0 2px #0a6aa1}.vakata-context li>a.vakata-context-parent{background-image:url(data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==);background-position:right center;background-repeat:no-repeat}.vakata-context .vakata-context-hover>a{position:relative;background-color:#e8eff7;-webkit-box-shadow:0 0 2px #0a6aa1;box-shadow:0 0 2px #0a6aa1}.vakata-context .vakata-context-separator>a,.vakata-context .vakata-context-separator>a:hover{background:#fff;border:0;border-top:1px solid #e2e3e3;height:1px;min-height:1px;max-height:1px;padding:0;margin:0 0 0 2.4em;border-left:1px solid #e0e0e0;-moz-text-shadow:0 0 0 transparent;-webkit-text-shadow:0 0 0 transparent;text-shadow:0 0 0 transparent;-webkit-box-shadow:0 0 0 transparent;box-shadow:0 0 0 transparent;-webkit-border-radius:0;border-radius:0}.vakata-context .vakata-contextmenu-disabled a,.vakata-context .vakata-contextmenu-disabled a:hover{color:silver;background-color:transparent;border:0;-webkit-box-shadow:0 0 0;box-shadow:0 0 0}.vakata-context li>a>i{text-decoration:none;display:inline-block;height:2.4em;background:0 0;margin:0 0 0 -2em;vertical-align:top;text-align:center}.vakata-context li>a .vakata-contextmenu-sep{display:inline-block;width:1px;height:2.4em;background:#fff;margin:0 .5em 0 0;border-left:1px solid #e2e3e3}.vakata-context .vakata-contextmenu-shortcut{color:silver;opacity:.5;display:none}.vakata-context-rtl ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context-rtl li>a.vakata-context-parent{background-image:url(data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7);background-position:left center;background-repeat:no-repeat}.vakata-context-rtl .vakata-context-separator>a{margin:0 2.4em 0 0;border-left:0;border-right:1px solid #e2e3e3}.vakata-context-rtl .vakata-context-left ul{right:auto;left:100%;margin-left:-4px;margin-right:auto}.vakata-context-rtl li>a>i{margin:0 -2em 0 0}.vakata-context-rtl li>a .vakata-contextmenu-sep{margin:0 0 0 .5em;border-left-color:#fff;background:#e2e3e3}#jstree-marker{position:absolute;top:0;left:0;margin:-5px 0 0;padding:0;border-right:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid;width:0;height:0;font-size:0;line-height:0}#jstree-dnd{line-height:16px;margin:0;padding:4px}#jstree-dnd .jstree-copy,#jstree-dnd .jstree-icon{display:inline-block;text-decoration:none;margin:0 2px 0 0;padding:0;width:16px;height:16px}#jstree-dnd .jstree-ok{background:green}#jstree-dnd .jstree-er{background:red}#jstree-dnd .jstree-copy{margin:0 2px}.jstree-default .jstree-icon,.jstree-default .jstree-node{background-repeat:no-repeat;background-color:transparent}.jstree-default .jstree-anchor,.jstree-default .jstree-wholerow{-webkit-transition:background-color .15s,-webkit-box-shadow .15s;-o-transition:background-color .15s,box-shadow .15s;transition:background-color .15s,box-shadow .15s}.jstree-default .jstree-hovered{background:#e7f4f9;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:inset 0 0 1px #ccc;box-shadow:inset 0 0 1px #ccc}.jstree-default .jstree-clicked{background:#beebff;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:inset 0 0 1px #999;box-shadow:inset 0 0 1px #999}.jstree-default .jstree-no-icons .jstree-anchor>.jstree-themeicon{display:none}.jstree-default .jstree-disabled{color:#666}.jstree-default .jstree-disabled.jstree-hovered{-webkit-box-shadow:none;box-shadow:none}.jstree-default .jstree-disabled>.jstree-icon{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default .jstree-search{font-style:italic;color:#8b0000;font-weight:700}.jstree-default .jstree-no-checkboxes .jstree-checkbox{display:none!important}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked{background:0 0;-webkit-box-shadow:none;box-shadow:none}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered{background:#e7f4f9}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked{background:0 0}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered{background:#e7f4f9}.jstree-default>.jstree-striped{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==) left top}.jstree-default>.jstree-wholerow-ul .jstree-clicked,.jstree-default>.jstree-wholerow-ul .jstree-hovered{background:0 0;-webkit-box-shadow:none;box-shadow:none;-webkit-border-radius:0;border-radius:0}.jstree-default .jstree-wholerow{-webkit-box-sizing:border-box;box-sizing:border-box;height:24px}.jstree-default .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default .jstree-wholerow-clicked{background:#beebff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#beebff),color-stop(100%,#a8e4ff));background:-webkit-linear-gradient(top,#beebff 0,#a8e4ff 100%);background:-o-linear-gradient(top,#beebff 0,#a8e4ff 100%);background:-webkit-gradient(linear,left top,left bottom,from(#beebff),to(#a8e4ff));background:linear-gradient(to bottom,#beebff 0,#a8e4ff 100%)}.jstree-default .jstree-node{min-height:24px;line-height:24px;margin-left:24px;min-width:24px;background-position:-292px -4px;background-repeat:repeat-y}.jstree-default .jstree-anchor{line-height:24px;height:24px}.jstree-default .jstree-icon,.jstree-default .jstree-icon:empty{width:24px;height:24px;line-height:24px}.jstree-default .jstree-icon,.jstree-default .jstree-node{background-image:url(32px.png)}.jstree-default .jstree-last{background:0 0}.jstree-default .jstree-open>.jstree-ocl{background-position:-132px -4px}.jstree-default .jstree-closed>.jstree-ocl{background-position:-100px -4px}.jstree-default .jstree-leaf>.jstree-ocl{background-position:-68px -4px}.jstree-default .jstree-themeicon{background-position:-260px -4px}.jstree-default>.jstree-no-dots .jstree-leaf>.jstree-ocl,.jstree-default>.jstree-no-dots .jstree-node{background:0 0}.jstree-default>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -4px}.jstree-default>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -4px}.jstree-default .jstree-disabled,.jstree-default .jstree-disabled.jstree-hovered{background:0 0}.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default .jstree-checkbox{background-position:-164px -4px}.jstree-default .jstree-checkbox:hover{background-position:-164px -36px}.jstree-default .jstree-checked>.jstree-checkbox,.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox{background-position:-228px -4px}.jstree-default .jstree-checked>.jstree-checkbox:hover,.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover{background-position:-228px -36px}.jstree-default .jstree-anchor>.jstree-undetermined{background-position:-196px -4px}.jstree-default .jstree-anchor>.jstree-undetermined:hover{background-position:-196px -36px}.jstree-default>.jstree-striped{-webkit-background-size:auto 48px;background-size:auto 48px}.jstree-default.jstree-rtl .jstree-node{margin-right:24px;background-position:100% 1px;background-repeat:repeat-y}.jstree-default.jstree-rtl .jstree-open>.jstree-ocl{background-position:-132px -36px}.jstree-default.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-100px -36px}.jstree-default.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-68px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl,.jstree-default.jstree-rtl>.jstree-no-dots .jstree-node{background:0 0}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -36px}.jstree-default .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url(throbber.gif) center center no-repeat}.jstree-default .jstree-file{background:url(32px.png) -100px -68px no-repeat}.jstree-default .jstree-folder{background:url(32px.png) -260px -4px no-repeat}.jstree-default>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default{line-height:24px;padding:0 4px}#jstree-dnd.jstree-default .jstree-er,#jstree-dnd.jstree-default .jstree-ok{background-image:url(32px.png);background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default i{background:0 0;width:24px;height:24px;line-height:24px}#jstree-dnd.jstree-default .jstree-ok{background-position:-4px -68px}#jstree-dnd.jstree-default .jstree-er{background-position:-36px -68px}.jstree-default.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==)}.jstree-default.jstree-rtl .jstree-last{background:0 0}.jstree-default-small .jstree-node{min-height:18px;line-height:18px;margin-left:18px;min-width:18px;background-position:-295px -7px;background-repeat:repeat-y}.jstree-default-small .jstree-anchor{line-height:18px;height:18px}.jstree-default-small .jstree-icon,.jstree-default-small .jstree-icon:empty{width:18px;height:18px;line-height:18px}.jstree-default-small .jstree-wholerow{height:18px}.jstree-default-small .jstree-icon,.jstree-default-small .jstree-node{background-image:url(32px.png)}.jstree-default-small .jstree-last{background:0 0}.jstree-default-small .jstree-open>.jstree-ocl{background-position:-135px -7px}.jstree-default-small .jstree-closed>.jstree-ocl{background-position:-103px -7px}.jstree-default-small .jstree-leaf>.jstree-ocl{background-position:-71px -7px}.jstree-default-small .jstree-themeicon{background-position:-263px -7px}.jstree-default-small>.jstree-no-dots .jstree-leaf>.jstree-ocl,.jstree-default-small>.jstree-no-dots .jstree-node{background:0 0}.jstree-default-small>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -7px}.jstree-default-small>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -7px}.jstree-default-small .jstree-disabled,.jstree-default-small .jstree-disabled.jstree-hovered{background:0 0}.jstree-default-small .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-small .jstree-checkbox{background-position:-167px -7px}.jstree-default-small .jstree-checkbox:hover{background-position:-167px -39px}.jstree-default-small .jstree-checked>.jstree-checkbox,.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox{background-position:-231px -7px}.jstree-default-small .jstree-checked>.jstree-checkbox:hover,.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover{background-position:-231px -39px}.jstree-default-small .jstree-anchor>.jstree-undetermined{background-position:-199px -7px}.jstree-default-small .jstree-anchor>.jstree-undetermined:hover{background-position:-199px -39px}.jstree-default-small>.jstree-striped{-webkit-background-size:auto 36px;background-size:auto 36px}.jstree-default-small.jstree-rtl .jstree-node{margin-right:18px;background-position:100% 1px;background-repeat:repeat-y}.jstree-default-small.jstree-rtl .jstree-open>.jstree-ocl{background-position:-135px -39px}.jstree-default-small.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-103px -39px}.jstree-default-small.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-71px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl,.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-node{background:0 0}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -39px}.jstree-default-small .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-small>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url(throbber.gif) center center no-repeat}.jstree-default-small .jstree-file{background:url(32px.png) -103px -71px no-repeat}.jstree-default-small .jstree-folder{background:url(32px.png) -263px -7px no-repeat}.jstree-default-small>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-small{line-height:18px;padding:0 4px}#jstree-dnd.jstree-default-small .jstree-er,#jstree-dnd.jstree-default-small .jstree-ok{background-image:url(32px.png);background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-small i{background:0 0;width:18px;height:18px;line-height:18px}#jstree-dnd.jstree-default-small .jstree-ok{background-position:-7px -71px}#jstree-dnd.jstree-default-small .jstree-er{background-position:-39px -71px}.jstree-default-small.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==)}.jstree-default-small.jstree-rtl .jstree-last{background:0 0}.jstree-default-large .jstree-node{min-height:32px;line-height:32px;margin-left:32px;min-width:32px;background-position:-288px 0;background-repeat:repeat-y}.jstree-default-large .jstree-anchor{line-height:32px;height:32px}.jstree-default-large .jstree-icon,.jstree-default-large .jstree-icon:empty{width:32px;height:32px;line-height:32px}.jstree-default-large .jstree-wholerow{height:32px}.jstree-default-large .jstree-icon,.jstree-default-large .jstree-node{background-image:url(32px.png)}.jstree-default-large .jstree-last{background:0 0}.jstree-default-large .jstree-open>.jstree-ocl{background-position:-128px 0}.jstree-default-large .jstree-closed>.jstree-ocl{background-position:-96px 0}.jstree-default-large .jstree-leaf>.jstree-ocl{background-position:-64px 0}.jstree-default-large .jstree-themeicon{background-position:-256px 0}.jstree-default-large>.jstree-no-dots .jstree-leaf>.jstree-ocl,.jstree-default-large>.jstree-no-dots .jstree-node{background:0 0}.jstree-default-large>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px 0}.jstree-default-large>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 0}.jstree-default-large .jstree-disabled,.jstree-default-large .jstree-disabled.jstree-hovered{background:0 0}.jstree-default-large .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-large .jstree-checkbox{background-position:-160px 0}.jstree-default-large .jstree-checkbox:hover{background-position:-160px -32px}.jstree-default-large .jstree-checked>.jstree-checkbox,.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox{background-position:-224px 0}.jstree-default-large .jstree-checked>.jstree-checkbox:hover,.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover{background-position:-224px -32px}.jstree-default-large .jstree-anchor>.jstree-undetermined{background-position:-192px 0}.jstree-default-large .jstree-anchor>.jstree-undetermined:hover{background-position:-192px -32px}.jstree-default-large>.jstree-striped{-webkit-background-size:auto 64px;background-size:auto 64px}.jstree-default-large.jstree-rtl .jstree-node{margin-right:32px;background-position:100% 1px;background-repeat:repeat-y}.jstree-default-large.jstree-rtl .jstree-open>.jstree-ocl{background-position:-128px -32px}.jstree-default-large.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-96px -32px}.jstree-default-large.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-64px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl,.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-node{background:0 0}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 -32px}.jstree-default-large .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-large>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url(throbber.gif) center center no-repeat}.jstree-default-large .jstree-file{background:url(32px.png) -96px -64px no-repeat}.jstree-default-large .jstree-folder{background:url(32px.png) -256px 0 no-repeat}.jstree-default-large>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-large{line-height:32px;padding:0 4px}#jstree-dnd.jstree-default-large .jstree-er,#jstree-dnd.jstree-default-large .jstree-ok{background-image:url(32px.png);background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-large i{background:0 0;width:32px;height:32px;line-height:32px}#jstree-dnd.jstree-default-large .jstree-ok{background-position:0 -64px}#jstree-dnd.jstree-default-large .jstree-er{background-position:-32px -64px}.jstree-default-large.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==)}.jstree-default-large.jstree-rtl .jstree-last{background:0 0}@media (max-width:768px){#jstree-dnd.jstree-dnd-responsive{line-height:40px;font-weight:700;text-shadow:1px 1px #fff}#jstree-dnd.jstree-dnd-responsive>i{background:0 0;width:40px;height:40px}#jstree-dnd.jstree-dnd-responsive>.jstree-ok{background-image:url(40px.png);background-position:0 -200px;-webkit-background-size:120px 240px;background-size:120px 240px}#jstree-dnd.jstree-dnd-responsive>.jstree-er{background-image:url(40px.png);background-position:-40px -200px;-webkit-background-size:120px 240px;background-size:120px 240px}#jstree-marker.jstree-dnd-responsive{border-left-width:10px;border-top-width:10px;border-bottom-width:10px;margin-top:-10px}.jstree-default-responsive .jstree-leaf>.jstree-ocl,.jstree-default-responsive .jstree-node{background:0 0}.jstree-default-responsive .jstree-node{min-height:40px;line-height:40px;margin-left:40px;min-width:40px;white-space:nowrap}.jstree-default-responsive .jstree-anchor{line-height:40px;height:40px;font-weight:700;text-shadow:1px 1px #fff}.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-icon:empty{width:40px;height:40px;line-height:40px}.jstree-default-responsive.jstree-rtl .jstree-node{margin-left:0;margin-right:40px}.jstree-default-responsive.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-default-responsive .jstree-checkbox,.jstree-default-responsive .jstree-ocl,.jstree-default-responsive .jstree-themeicon{-webkit-background-size:120px 240px;background-size:120px 240px}.jstree-default-responsive .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-responsive .jstree-open>.jstree-ocl{background-position:0 0!important}.jstree-default-responsive .jstree-closed>.jstree-ocl{background-position:0 -40px!important}.jstree-default-responsive.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-40px 0!important}.jstree-default-responsive .jstree-themeicon{background-position:-40px -40px}.jstree-default-responsive .jstree-checkbox,.jstree-default-responsive .jstree-checkbox:hover{background-position:-40px -80px}.jstree-default-responsive .jstree-checked>.jstree-checkbox,.jstree-default-responsive .jstree-checked>.jstree-checkbox:hover,.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover{background-position:0 -80px}.jstree-default-responsive .jstree-anchor>.jstree-undetermined,.jstree-default-responsive .jstree-anchor>.jstree-undetermined:hover{background-position:0 -120px}.jstree-default-responsive>.jstree-striped{background:0 0}.jstree-default-responsive .jstree-wholerow{border-top:1px solid rgba(255,255,255,.7);border-bottom:1px solid rgba(64,64,64,.2);background:#ebebeb;height:40px}.jstree-default-responsive .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default-responsive .jstree-wholerow-clicked{background:#beebff}.jstree-default-responsive .jstree-children .jstree-last>.jstree-wholerow{-webkit-box-shadow:inset 0 -6px 3px -5px #666;box-shadow:inset 0 -6px 3px -5px #666}.jstree-default-responsive .jstree-children .jstree-open>.jstree-wholerow{-webkit-box-shadow:inset 0 6px 3px -5px #666;box-shadow:inset 0 6px 3px -5px #666;border-top:0}.jstree-default-responsive .jstree-children .jstree-open+.jstree-open{-webkit-box-shadow:none;box-shadow:none}.jstree-default-responsive .jstree-checkbox,.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-node>.jstree-ocl,.jstree-default-responsive .jstree-themeicon{background-image:url(40px.png);-webkit-background-size:120px 240px;background-size:120px 240px}.jstree-default-responsive .jstree-node{background-position:-80px 0;background-repeat:repeat-y}.jstree-default-responsive .jstree-last{background:0 0}.jstree-default-responsive .jstree-leaf>.jstree-ocl{background-position:-40px -120px}.jstree-default-responsive .jstree-last>.jstree-ocl{background-position:-40px -160px}.jstree-default-responsive .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-responsive .jstree-file{background:url(40px.png) 0 -160px no-repeat;-webkit-background-size:120px 240px;background-size:120px 240px}.jstree-default-responsive .jstree-folder{background:url(40px.png) -40px -40px no-repeat;-webkit-background-size:120px 240px;background-size:120px 240px}.jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}} \ No newline at end of file diff --git a/dashboard-ui/thirdparty/paper-button-style.css b/dashboard-ui/thirdparty/paper-button-style.css index 015404e45e..a111cc7f26 100644 --- a/dashboard-ui/thirdparty/paper-button-style.css +++ b/dashboard-ui/thirdparty/paper-button-style.css @@ -1,91 +1 @@ -.ui-body-b .raised { - background: rgba(170,170,190, .4); - color: #fff; -} - -.ui-body-a .raised { - background: #3388cc; - color: #fff; -} - -.ui-body-a .button-submit { - background: #52B54B; - color: #fff; -} - -.ui-body-a .button-cancel { - background: #fff; - color: inherit; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); -} - -.ui-body-b .button-submit { - background: #52B54B; - color: #fff; -} - -.ui-body-a .button-accent, .ui-body-b .button-accent { - background: #52B54B; - color: #fff; -} - -.button-accent-flat { - color: #52B54B !important; -} - -button.emby-button.raised.more { - background: #3388cc; - color: #fff; -} - -.emby-button > span { - vertical-align: middle; -} - -.clearButton { - background: transparent; - border: 0; - padding: 0; - cursor: pointer; - outline: none; - color: inherit; - width: 100%; - vertical-align: middle; - font-family: inherit; - font-weight: inherit; -} - -.clearLink { - text-decoration: none; - font-weight: inherit !important; - vertical-align: middle; - color: inherit !important; -} - -button.emby-button.mini:not(.fab) { - padding: 0.5em 0.7em; -} - -.ui-body-b .paperListLabel, .ui-body-b .fieldDescription, .ui-body-b .selectLabelUnfocused, .ui-body-b .inputLabelUnfocused, .ui-body-b .textareaLabelUnfocused { - color: #ccc; -} - -.ui-body-b .paperList { - background-color: #2b2b2b; -} - -.ui-body-a div.formDialogHeader { - background-color: #52B54B; - color: #fff; -} - -.ui-body-a div.formDialogFooter { - background-color: #f0f0f0; - border-top: 1px solid #ddd; - color: inherit; -} - -.ui-body-a .formDialogHeader a { - color: #fff !important; - text-transform: uppercase; -} +.clearButton,.clearLink,.emby-button>span{vertical-align:middle}.ui-body-b .raised{background:rgba(170,170,190,.4);color:#fff}.ui-body-a .raised{background:#38c;color:#fff}.ui-body-a .button-submit{background:#52B54B;color:#fff}.ui-body-a .button-cancel{background:#fff;color:inherit;-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.ui-body-a .button-accent,.ui-body-b .button-accent,.ui-body-b .button-submit{background:#52B54B;color:#fff}.button-accent-flat{color:#52B54B!important}button.emby-button.raised.more{background:#38c;color:#fff}.clearButton{background:0 0;border:0;padding:0;cursor:pointer;outline:0;color:inherit;width:100%;font-family:inherit;font-weight:inherit}.clearLink{text-decoration:none;font-weight:inherit!important;color:inherit!important}button.emby-button.mini:not(.fab){padding:.5em .7em}.ui-body-b .fieldDescription,.ui-body-b .inputLabelUnfocused,.ui-body-b .paperListLabel,.ui-body-b .selectLabelUnfocused,.ui-body-b .textareaLabelUnfocused{color:#ccc}.ui-body-b .paperList{background-color:#2b2b2b}.ui-body-a div.formDialogHeader{background-color:#52B54B;color:#fff}.ui-body-a div.formDialogFooter{background-color:#f0f0f0;border-top:1px solid #ddd;color:inherit}.ui-body-a .formDialogHeader a{color:#fff!important;text-transform:uppercase} \ No newline at end of file From 0d09b37cbb7b536bc6c4436e263b16bcda6a15cc Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 27 Jan 2017 23:14:25 -0500 Subject: [PATCH 08/19] update nav drawer --- .../jquery/external/sizzle/dist/sizzle.js | 1 - .../jquery/external/sizzle/dist/sizzle.min.js | 3 --- dashboard-ui/components/navdrawer/navdrawer.js | 2 +- dashboard-ui/css/dashboard.css | 2 +- dashboard-ui/css/librarybrowser.css | 2 +- dashboard-ui/css/librarymenu.css | 2 +- dashboard-ui/index.html | 10 ++++------ dashboard-ui/scripts/librarymenu.js | 2 +- dashboard-ui/serviceworker.js | 2 +- 9 files changed, 10 insertions(+), 16 deletions(-) delete mode 100644 dashboard-ui/bower_components/jquery/external/sizzle/dist/sizzle.js delete mode 100644 dashboard-ui/bower_components/jquery/external/sizzle/dist/sizzle.min.js diff --git a/dashboard-ui/bower_components/jquery/external/sizzle/dist/sizzle.js b/dashboard-ui/bower_components/jquery/external/sizzle/dist/sizzle.js deleted file mode 100644 index 56d59c136a..0000000000 --- a/dashboard-ui/bower_components/jquery/external/sizzle/dist/sizzle.js +++ /dev/null @@ -1 +0,0 @@ -!function(window){function Sizzle(selector,context,results,seed){var m,i,elem,nid,match,groups,newSelector,newContext=context&&context.ownerDocument,nodeType=context?context.nodeType:9;if(results=results||[],"string"!=typeof selector||!selector||1!==nodeType&&9!==nodeType&&11!==nodeType)return results;if(!seed&&((context?context.ownerDocument||context:preferredDoc)!==document&&setDocument(context),context=context||document,documentIsHTML)){if(11!==nodeType&&(match=rquickExpr.exec(selector)))if(m=match[1]){if(9===nodeType){if(!(elem=context.getElementById(m)))return results;if(elem.id===m)return results.push(elem),results}else if(newContext&&(elem=newContext.getElementById(m))&&contains(context,elem)&&elem.id===m)return results.push(elem),results}else{if(match[2])return push.apply(results,context.getElementsByTagName(selector)),results;if((m=match[3])&&support.getElementsByClassName&&context.getElementsByClassName)return push.apply(results,context.getElementsByClassName(m)),results}if(support.qsa&&!compilerCache[selector+" "]&&(!rbuggyQSA||!rbuggyQSA.test(selector))){if(1!==nodeType)newContext=context,newSelector=selector;else if("object"!==context.nodeName.toLowerCase()){for((nid=context.getAttribute("id"))?nid=nid.replace(rcssescape,fcssescape):context.setAttribute("id",nid=expando),groups=tokenize(selector),i=groups.length;i--;)groups[i]="#"+nid+" "+toSelector(groups[i]);newSelector=groups.join(","),newContext=rsibling.test(selector)&&testContext(context.parentNode)||context}if(newSelector)try{return push.apply(results,newContext.querySelectorAll(newSelector)),results}catch(qsaError){}finally{nid===expando&&context.removeAttribute("id")}}}return select(selector.replace(rtrim,"$1"),context,results,seed)}function createCache(){function cache(key,value){return keys.push(key+" ")>Expr.cacheLength&&delete cache[keys.shift()],cache[key+" "]=value}var keys=[];return cache}function markFunction(fn){return fn[expando]=!0,fn}function assert(fn){var el=document.createElement("fieldset");try{return!!fn(el)}catch(e){return!1}finally{el.parentNode&&el.parentNode.removeChild(el),el=null}}function addHandle(attrs,handler){for(var arr=attrs.split("|"),i=arr.length;i--;)Expr.attrHandle[arr[i]]=handler}function siblingCheck(a,b){var cur=b&&a,diff=cur&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(diff)return diff;if(cur)for(;cur=cur.nextSibling;)if(cur===b)return-1;return a?1:-1}function createInputPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return"input"===name&&elem.type===type}}function createButtonPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return("input"===name||"button"===name)&&elem.type===type}}function createDisabledPseudo(disabled){return function(elem){return"form"in elem?elem.parentNode&&elem.disabled===!1?"label"in elem?"label"in elem.parentNode?elem.parentNode.disabled===disabled:elem.disabled===disabled:elem.isDisabled===disabled||elem.isDisabled!==!disabled&&disabledAncestor(elem)===disabled:elem.disabled===disabled:"label"in elem&&elem.disabled===disabled}}function createPositionalPseudo(fn){return markFunction(function(argument){return argument=+argument,markFunction(function(seed,matches){for(var j,matchIndexes=fn([],seed.length,argument),i=matchIndexes.length;i--;)seed[j=matchIndexes[i]]&&(seed[j]=!(matches[j]=seed[j]))})})}function testContext(context){return context&&"undefined"!=typeof context.getElementsByTagName&&context}function setFilters(){}function toSelector(tokens){for(var i=0,len=tokens.length,selector="";i1?function(elem,context,xml){for(var i=matchers.length;i--;)if(!matchers[i](elem,context,xml))return!1;return!0}:matchers[0]}function multipleContexts(selector,contexts,results){for(var i=0,len=contexts.length;i-1&&(seed[temp]=!(results[temp]=elem))}}else matcherOut=condense(matcherOut===results?matcherOut.splice(preexisting,matcherOut.length):matcherOut),postFinder?postFinder(null,results,matcherOut,xml):push.apply(results,matcherOut)})}function matcherFromTokens(tokens){for(var checkContext,matcher,j,len=tokens.length,leadingRelative=Expr.relative[tokens[0].type],implicitRelative=leadingRelative||Expr.relative[" "],i=leadingRelative?1:0,matchContext=addCombinator(function(elem){return elem===checkContext},implicitRelative,!0),matchAnyContext=addCombinator(function(elem){return indexOf(checkContext,elem)>-1},implicitRelative,!0),matchers=[function(elem,context,xml){var ret=!leadingRelative&&(xml||context!==outermostContext)||((checkContext=context).nodeType?matchContext(elem,context,xml):matchAnyContext(elem,context,xml));return checkContext=null,ret}];i1&&elementMatcher(matchers),i>1&&toSelector(tokens.slice(0,i-1).concat({value:" "===tokens[i-2].type?"*":""})).replace(rtrim,"$1"),matcher,i0,byElement=elementMatchers.length>0,superMatcher=function(seed,context,xml,results,outermost){var elem,j,matcher,matchedCount=0,i="0",unmatched=seed&&[],setMatched=[],contextBackup=outermostContext,elems=seed||byElement&&Expr.find.TAG("*",outermost),dirrunsUnique=dirruns+=null==contextBackup?1:Math.random()||.1,len=elems.length;for(outermost&&(outermostContext=context===document||context||outermost);i!==len&&null!=(elem=elems[i]);i++){if(byElement&&elem){for(j=0,context||elem.ownerDocument===document||(setDocument(elem),xml=!documentIsHTML);matcher=elementMatchers[j++];)if(matcher(elem,context||document,xml)){results.push(elem);break}outermost&&(dirruns=dirrunsUnique)}bySet&&((elem=!matcher&&elem)&&matchedCount--,seed&&unmatched.push(elem))}if(matchedCount+=i,bySet&&i!==matchedCount){for(j=0;matcher=setMatchers[j++];)matcher(unmatched,setMatched,context,xml);if(seed){if(matchedCount>0)for(;i--;)unmatched[i]||setMatched[i]||(setMatched[i]=pop.call(results));setMatched=condense(setMatched)}push.apply(results,setMatched),outermost&&!seed&&setMatched.length>0&&matchedCount+setMatchers.length>1&&Sizzle.uniqueSort(results)}return outermost&&(dirruns=dirrunsUnique,outermostContext=contextBackup),unmatched};return bySet?markFunction(superMatcher):superMatcher}var i,support,Expr,getText,isXML,tokenize,compile,select,outermostContext,sortInput,hasDuplicate,setDocument,document,docElem,documentIsHTML,rbuggyQSA,rbuggyMatches,matches,contains,expando="sizzle"+1*new Date,preferredDoc=window.document,dirruns=0,done=0,classCache=createCache(),tokenCache=createCache(),compilerCache=createCache(),sortOrder=function(a,b){return a===b&&(hasDuplicate=!0),0},hasOwn={}.hasOwnProperty,arr=[],pop=arr.pop,push_native=arr.push,push=arr.push,slice=arr.slice,indexOf=function(list,elem){for(var i=0,len=list.length;i+~]|"+whitespace+")"+whitespace+"*"),rattributeQuotes=new RegExp("="+whitespace+"*([^\\]'\"]*?)"+whitespace+"*\\]","g"),rpseudo=new RegExp(pseudos),ridentifier=new RegExp("^"+identifier+"$"),matchExpr={ID:new RegExp("^#("+identifier+")"),CLASS:new RegExp("^\\.("+identifier+")"),TAG:new RegExp("^("+identifier+"|[*])"),ATTR:new RegExp("^"+attributes),PSEUDO:new RegExp("^"+pseudos),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+whitespace+"*(even|odd|(([+-]|)(\\d*)n|)"+whitespace+"*(?:([+-]|)"+whitespace+"*(\\d+)|))"+whitespace+"*\\)|)","i"),bool:new RegExp("^(?:"+booleans+")$","i"),needsContext:new RegExp("^"+whitespace+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+whitespace+"*((?:-\\d)?\\d*)"+whitespace+"*\\)|)(?=[^-]|$)","i")},rinputs=/^(?:input|select|textarea|button)$/i,rheader=/^h\d$/i,rnative=/^[^{]+\{\s*\[native \w/,rquickExpr=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,rsibling=/[+~]/,runescape=new RegExp("\\\\([\\da-f]{1,6}"+whitespace+"?|("+whitespace+")|.)","ig"),funescape=function(_,escaped,escapedWhitespace){var high="0x"+escaped-65536;return high!==high||escapedWhitespace?escaped:high<0?String.fromCharCode(high+65536):String.fromCharCode(high>>10|55296,1023&high|56320)},rcssescape=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,fcssescape=function(ch,asCodePoint){return asCodePoint?"\0"===ch?"�":ch.slice(0,-1)+"\\"+ch.charCodeAt(ch.length-1).toString(16)+" ":"\\"+ch},unloadHandler=function(){setDocument()},disabledAncestor=addCombinator(function(elem){return elem.disabled===!0&&("form"in elem||"label"in elem)},{dir:"parentNode",next:"legend"});try{push.apply(arr=slice.call(preferredDoc.childNodes),preferredDoc.childNodes),arr[preferredDoc.childNodes.length].nodeType}catch(e){push={apply:arr.length?function(target,els){push_native.apply(target,slice.call(els))}:function(target,els){for(var j=target.length,i=0;target[j++]=els[i++];);target.length=j-1}}}support=Sizzle.support={},isXML=Sizzle.isXML=function(elem){var documentElement=elem&&(elem.ownerDocument||elem).documentElement;return!!documentElement&&"HTML"!==documentElement.nodeName},setDocument=Sizzle.setDocument=function(node){var hasCompare,subWindow,doc=node?node.ownerDocument||node:preferredDoc;return doc!==document&&9===doc.nodeType&&doc.documentElement?(document=doc,docElem=document.documentElement,documentIsHTML=!isXML(document),preferredDoc!==document&&(subWindow=document.defaultView)&&subWindow.top!==subWindow&&(subWindow.addEventListener?subWindow.addEventListener("unload",unloadHandler,!1):subWindow.attachEvent&&subWindow.attachEvent("onunload",unloadHandler)),support.attributes=assert(function(el){return el.className="i",!el.getAttribute("className")}),support.getElementsByTagName=assert(function(el){return el.appendChild(document.createComment("")),!el.getElementsByTagName("*").length}),support.getElementsByClassName=rnative.test(document.getElementsByClassName),support.getById=assert(function(el){return docElem.appendChild(el).id=expando,!document.getElementsByName||!document.getElementsByName(expando).length}),support.getById?(Expr.filter.ID=function(id){var attrId=id.replace(runescape,funescape);return function(elem){return elem.getAttribute("id")===attrId}},Expr.find.ID=function(id,context){if("undefined"!=typeof context.getElementById&&documentIsHTML){var elem=context.getElementById(id);return elem?[elem]:[]}}):(Expr.filter.ID=function(id){var attrId=id.replace(runescape,funescape);return function(elem){var node="undefined"!=typeof elem.getAttributeNode&&elem.getAttributeNode("id");return node&&node.value===attrId}},Expr.find.ID=function(id,context){if("undefined"!=typeof context.getElementById&&documentIsHTML){var node,i,elems,elem=context.getElementById(id);if(elem){if(node=elem.getAttributeNode("id"),node&&node.value===id)return[elem];for(elems=context.getElementsByName(id),i=0;elem=elems[i++];)if(node=elem.getAttributeNode("id"),node&&node.value===id)return[elem]}return[]}}),Expr.find.TAG=support.getElementsByTagName?function(tag,context){return"undefined"!=typeof context.getElementsByTagName?context.getElementsByTagName(tag):support.qsa?context.querySelectorAll(tag):void 0}:function(tag,context){var elem,tmp=[],i=0,results=context.getElementsByTagName(tag);if("*"===tag){for(;elem=results[i++];)1===elem.nodeType&&tmp.push(elem);return tmp}return results},Expr.find.CLASS=support.getElementsByClassName&&function(className,context){if("undefined"!=typeof context.getElementsByClassName&&documentIsHTML)return context.getElementsByClassName(className)},rbuggyMatches=[],rbuggyQSA=[],(support.qsa=rnative.test(document.querySelectorAll))&&(assert(function(el){docElem.appendChild(el).innerHTML="",el.querySelectorAll("[msallowcapture^='']").length&&rbuggyQSA.push("[*^$]="+whitespace+"*(?:''|\"\")"),el.querySelectorAll("[selected]").length||rbuggyQSA.push("\\["+whitespace+"*(?:value|"+booleans+")"),el.querySelectorAll("[id~="+expando+"-]").length||rbuggyQSA.push("~="),el.querySelectorAll(":checked").length||rbuggyQSA.push(":checked"),el.querySelectorAll("a#"+expando+"+*").length||rbuggyQSA.push(".#.+[+~]")}),assert(function(el){el.innerHTML="";var input=document.createElement("input");input.setAttribute("type","hidden"),el.appendChild(input).setAttribute("name","D"),el.querySelectorAll("[name=d]").length&&rbuggyQSA.push("name"+whitespace+"*[*^$|!~]?="),2!==el.querySelectorAll(":enabled").length&&rbuggyQSA.push(":enabled",":disabled"),docElem.appendChild(el).disabled=!0,2!==el.querySelectorAll(":disabled").length&&rbuggyQSA.push(":enabled",":disabled"),el.querySelectorAll("*,:x"),rbuggyQSA.push(",.*:")})),(support.matchesSelector=rnative.test(matches=docElem.matches||docElem.webkitMatchesSelector||docElem.mozMatchesSelector||docElem.oMatchesSelector||docElem.msMatchesSelector))&&assert(function(el){support.disconnectedMatch=matches.call(el,"*"),matches.call(el,"[s!='']:x"),rbuggyMatches.push("!=",pseudos)}),rbuggyQSA=rbuggyQSA.length&&new RegExp(rbuggyQSA.join("|")),rbuggyMatches=rbuggyMatches.length&&new RegExp(rbuggyMatches.join("|")),hasCompare=rnative.test(docElem.compareDocumentPosition),contains=hasCompare||rnative.test(docElem.contains)?function(a,b){var adown=9===a.nodeType?a.documentElement:a,bup=b&&b.parentNode;return a===bup||!(!bup||1!==bup.nodeType||!(adown.contains?adown.contains(bup):a.compareDocumentPosition&&16&a.compareDocumentPosition(bup)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},sortOrder=hasCompare?function(a,b){if(a===b)return hasDuplicate=!0,0;var compare=!a.compareDocumentPosition-!b.compareDocumentPosition;return compare?compare:(compare=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&compare||!support.sortDetached&&b.compareDocumentPosition(a)===compare?a===document||a.ownerDocument===preferredDoc&&contains(preferredDoc,a)?-1:b===document||b.ownerDocument===preferredDoc&&contains(preferredDoc,b)?1:sortInput?indexOf(sortInput,a)-indexOf(sortInput,b):0:4&compare?-1:1)}:function(a,b){if(a===b)return hasDuplicate=!0,0;var cur,i=0,aup=a.parentNode,bup=b.parentNode,ap=[a],bp=[b];if(!aup||!bup)return a===document?-1:b===document?1:aup?-1:bup?1:sortInput?indexOf(sortInput,a)-indexOf(sortInput,b):0;if(aup===bup)return siblingCheck(a,b);for(cur=a;cur=cur.parentNode;)ap.unshift(cur);for(cur=b;cur=cur.parentNode;)bp.unshift(cur);for(;ap[i]===bp[i];)i++;return i?siblingCheck(ap[i],bp[i]):ap[i]===preferredDoc?-1:bp[i]===preferredDoc?1:0},document):document},Sizzle.matches=function(expr,elements){return Sizzle(expr,null,null,elements)},Sizzle.matchesSelector=function(elem,expr){if((elem.ownerDocument||elem)!==document&&setDocument(elem),expr=expr.replace(rattributeQuotes,"='$1']"),support.matchesSelector&&documentIsHTML&&!compilerCache[expr+" "]&&(!rbuggyMatches||!rbuggyMatches.test(expr))&&(!rbuggyQSA||!rbuggyQSA.test(expr)))try{var ret=matches.call(elem,expr);if(ret||support.disconnectedMatch||elem.document&&11!==elem.document.nodeType)return ret}catch(e){}return Sizzle(expr,document,null,[elem]).length>0},Sizzle.contains=function(context,elem){return(context.ownerDocument||context)!==document&&setDocument(context),contains(context,elem)},Sizzle.attr=function(elem,name){(elem.ownerDocument||elem)!==document&&setDocument(elem);var fn=Expr.attrHandle[name.toLowerCase()],val=fn&&hasOwn.call(Expr.attrHandle,name.toLowerCase())?fn(elem,name,!documentIsHTML):void 0;return void 0!==val?val:support.attributes||!documentIsHTML?elem.getAttribute(name):(val=elem.getAttributeNode(name))&&val.specified?val.value:null},Sizzle.escape=function(sel){return(sel+"").replace(rcssescape,fcssescape)},Sizzle.error=function(msg){throw new Error("Syntax error, unrecognized expression: "+msg)},Sizzle.uniqueSort=function(results){var elem,duplicates=[],j=0,i=0;if(hasDuplicate=!support.detectDuplicates,sortInput=!support.sortStable&&results.slice(0),results.sort(sortOrder),hasDuplicate){for(;elem=results[i++];)elem===results[i]&&(j=duplicates.push(i));for(;j--;)results.splice(duplicates[j],1)}return sortInput=null,results},getText=Sizzle.getText=function(elem){var node,ret="",i=0,nodeType=elem.nodeType;if(nodeType){if(1===nodeType||9===nodeType||11===nodeType){if("string"==typeof elem.textContent)return elem.textContent;for(elem=elem.firstChild;elem;elem=elem.nextSibling)ret+=getText(elem)}else if(3===nodeType||4===nodeType)return elem.nodeValue}else for(;node=elem[i++];)ret+=getText(node);return ret},Expr=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:matchExpr,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(match){return match[1]=match[1].replace(runescape,funescape),match[3]=(match[3]||match[4]||match[5]||"").replace(runescape,funescape),"~="===match[2]&&(match[3]=" "+match[3]+" "),match.slice(0,4)},CHILD:function(match){return match[1]=match[1].toLowerCase(),"nth"===match[1].slice(0,3)?(match[3]||Sizzle.error(match[0]),match[4]=+(match[4]?match[5]+(match[6]||1):2*("even"===match[3]||"odd"===match[3])),match[5]=+(match[7]+match[8]||"odd"===match[3])):match[3]&&Sizzle.error(match[0]),match},PSEUDO:function(match){var excess,unquoted=!match[6]&&match[2];return matchExpr.CHILD.test(match[0])?null:(match[3]?match[2]=match[4]||match[5]||"":unquoted&&rpseudo.test(unquoted)&&(excess=tokenize(unquoted,!0))&&(excess=unquoted.indexOf(")",unquoted.length-excess)-unquoted.length)&&(match[0]=match[0].slice(0,excess),match[2]=unquoted.slice(0,excess)),match.slice(0,3))}},filter:{TAG:function(nodeNameSelector){var nodeName=nodeNameSelector.replace(runescape,funescape).toLowerCase();return"*"===nodeNameSelector?function(){return!0}:function(elem){return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName}},CLASS:function(className){var pattern=classCache[className+" "];return pattern||(pattern=new RegExp("(^|"+whitespace+")"+className+"("+whitespace+"|$)"))&&classCache(className,function(elem){return pattern.test("string"==typeof elem.className&&elem.className||"undefined"!=typeof elem.getAttribute&&elem.getAttribute("class")||"")})},ATTR:function(name,operator,check){return function(elem){var result=Sizzle.attr(elem,name);return null==result?"!="===operator:!operator||(result+="","="===operator?result===check:"!="===operator?result!==check:"^="===operator?check&&0===result.indexOf(check):"*="===operator?check&&result.indexOf(check)>-1:"$="===operator?check&&result.slice(-check.length)===check:"~="===operator?(" "+result.replace(rwhitespace," ")+" ").indexOf(check)>-1:"|="===operator&&(result===check||result.slice(0,check.length+1)===check+"-"))}},CHILD:function(type,what,argument,first,last){var simple="nth"!==type.slice(0,3),forward="last"!==type.slice(-4),ofType="of-type"===what;return 1===first&&0===last?function(elem){return!!elem.parentNode}:function(elem,context,xml){var cache,uniqueCache,outerCache,node,nodeIndex,start,dir=simple!==forward?"nextSibling":"previousSibling",parent=elem.parentNode,name=ofType&&elem.nodeName.toLowerCase(),useCache=!xml&&!ofType,diff=!1;if(parent){if(simple){for(;dir;){for(node=elem;node=node[dir];)if(ofType?node.nodeName.toLowerCase()===name:1===node.nodeType)return!1;start=dir="only"===type&&!start&&"nextSibling"}return!0}if(start=[forward?parent.firstChild:parent.lastChild],forward&&useCache){for(node=parent,outerCache=node[expando]||(node[expando]={}),uniqueCache=outerCache[node.uniqueID]||(outerCache[node.uniqueID]={}),cache=uniqueCache[type]||[],nodeIndex=cache[0]===dirruns&&cache[1],diff=nodeIndex&&cache[2],node=nodeIndex&&parent.childNodes[nodeIndex];node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop();)if(1===node.nodeType&&++diff&&node===elem){uniqueCache[type]=[dirruns,nodeIndex,diff];break}}else if(useCache&&(node=elem,outerCache=node[expando]||(node[expando]={}),uniqueCache=outerCache[node.uniqueID]||(outerCache[node.uniqueID]={}),cache=uniqueCache[type]||[],nodeIndex=cache[0]===dirruns&&cache[1],diff=nodeIndex),diff===!1)for(;(node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())&&((ofType?node.nodeName.toLowerCase()!==name:1!==node.nodeType)||!++diff||(useCache&&(outerCache=node[expando]||(node[expando]={}),uniqueCache=outerCache[node.uniqueID]||(outerCache[node.uniqueID]={}),uniqueCache[type]=[dirruns,diff]),node!==elem)););return diff-=last,diff===first||diff%first===0&&diff/first>=0}}},PSEUDO:function(pseudo,argument){var args,fn=Expr.pseudos[pseudo]||Expr.setFilters[pseudo.toLowerCase()]||Sizzle.error("unsupported pseudo: "+pseudo);return fn[expando]?fn(argument):fn.length>1?(args=[pseudo,pseudo,"",argument],Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())?markFunction(function(seed,matches){for(var idx,matched=fn(seed,argument),i=matched.length;i--;)idx=indexOf(seed,matched[i]),seed[idx]=!(matches[idx]=matched[i])}):function(elem){return fn(elem,0,args)}):fn}},pseudos:{not:markFunction(function(selector){var input=[],results=[],matcher=compile(selector.replace(rtrim,"$1"));return matcher[expando]?markFunction(function(seed,matches,context,xml){for(var elem,unmatched=matcher(seed,null,xml,[]),i=seed.length;i--;)(elem=unmatched[i])&&(seed[i]=!(matches[i]=elem))}):function(elem,context,xml){return input[0]=elem,matcher(input,null,xml,results),input[0]=null,!results.pop()}}),has:markFunction(function(selector){return function(elem){return Sizzle(selector,elem).length>0}}),contains:markFunction(function(text){return text=text.replace(runescape,funescape),function(elem){return(elem.textContent||elem.innerText||getText(elem)).indexOf(text)>-1}}),lang:markFunction(function(lang){return ridentifier.test(lang||"")||Sizzle.error("unsupported lang: "+lang),lang=lang.replace(runescape,funescape).toLowerCase(),function(elem){var elemLang;do if(elemLang=documentIsHTML?elem.lang:elem.getAttribute("xml:lang")||elem.getAttribute("lang"))return elemLang=elemLang.toLowerCase(),elemLang===lang||0===elemLang.indexOf(lang+"-");while((elem=elem.parentNode)&&1===elem.nodeType);return!1}}),target:function(elem){var hash=window.location&&window.location.hash;return hash&&hash.slice(1)===elem.id},root:function(elem){return elem===docElem},focus:function(elem){return elem===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex)},enabled:createDisabledPseudo(!1),disabled:createDisabledPseudo(!0),checked:function(elem){var nodeName=elem.nodeName.toLowerCase();return"input"===nodeName&&!!elem.checked||"option"===nodeName&&!!elem.selected},selected:function(elem){return elem.parentNode&&elem.parentNode.selectedIndex,elem.selected===!0},empty:function(elem){for(elem=elem.firstChild;elem;elem=elem.nextSibling)if(elem.nodeType<6)return!1;return!0},parent:function(elem){return!Expr.pseudos.empty(elem)},header:function(elem){return rheader.test(elem.nodeName)},input:function(elem){return rinputs.test(elem.nodeName)},button:function(elem){var name=elem.nodeName.toLowerCase();return"input"===name&&"button"===elem.type||"button"===name},text:function(elem){var attr;return"input"===elem.nodeName.toLowerCase()&&"text"===elem.type&&(null==(attr=elem.getAttribute("type"))||"text"===attr.toLowerCase())},first:createPositionalPseudo(function(){return[0]}),last:createPositionalPseudo(function(matchIndexes,length){return[length-1]}),eq:createPositionalPseudo(function(matchIndexes,length,argument){return[argument<0?argument+length:argument]}),even:createPositionalPseudo(function(matchIndexes,length){for(var i=0;i=0;)matchIndexes.push(i);return matchIndexes}),gt:createPositionalPseudo(function(matchIndexes,length,argument){for(var i=argument<0?argument+length:argument;++i2&&"ID"===(token=tokens[0]).type&&9===context.nodeType&&documentIsHTML&&Expr.relative[tokens[1].type]){if(context=(Expr.find.ID(token.matches[0].replace(runescape,funescape),context)||[])[0],!context)return results;compiled&&(context=context.parentNode),selector=selector.slice(tokens.shift().value.length)}for(i=matchExpr.needsContext.test(selector)?0:tokens.length;i--&&(token=tokens[i],!Expr.relative[type=token.type]);)if((find=Expr.find[type])&&(seed=find(token.matches[0].replace(runescape,funescape),rsibling.test(tokens[0].type)&&testContext(context.parentNode)||context))){if(tokens.splice(i,1),selector=seed.length&&toSelector(tokens),!selector)return push.apply(results,seed),results;break}}return(compiled||compile(selector,match))(seed,context,!documentIsHTML,results,!context||rsibling.test(selector)&&testContext(context.parentNode)||context),results},support.sortStable=expando.split("").sort(sortOrder).join("")===expando,support.detectDuplicates=!!hasDuplicate,setDocument(),support.sortDetached=assert(function(el){return 1&el.compareDocumentPosition(document.createElement("fieldset"))}),assert(function(el){return el.innerHTML="","#"===el.firstChild.getAttribute("href")})||addHandle("type|href|height|width",function(elem,name,isXML){if(!isXML)return elem.getAttribute(name,"type"===name.toLowerCase()?1:2)}),support.attributes&&assert(function(el){return el.innerHTML="",el.firstChild.setAttribute("value",""),""===el.firstChild.getAttribute("value")})||addHandle("value",function(elem,name,isXML){if(!isXML&&"input"===elem.nodeName.toLowerCase())return elem.defaultValue}),assert(function(el){return null==el.getAttribute("disabled")})||addHandle(booleans,function(elem,name,isXML){var val;if(!isXML)return elem[name]===!0?name.toLowerCase():(val=elem.getAttributeNode(name))&&val.specified?val.value:null});var _sizzle=window.Sizzle;Sizzle.noConflict=function(){return window.Sizzle===Sizzle&&(window.Sizzle=_sizzle),Sizzle},"function"==typeof define&&define.amd?define(function(){return Sizzle}):"undefined"!=typeof module&&module.exports?module.exports=Sizzle:window.Sizzle=Sizzle}(window); \ No newline at end of file diff --git a/dashboard-ui/bower_components/jquery/external/sizzle/dist/sizzle.min.js b/dashboard-ui/bower_components/jquery/external/sizzle/dist/sizzle.min.js deleted file mode 100644 index be032788b6..0000000000 --- a/dashboard-ui/bower_components/jquery/external/sizzle/dist/sizzle.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Sizzle v2.3.3 | (c) jQuery Foundation, Inc. | jquery.org/license */ -!function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null});var Aa=a.Sizzle;ga.noConflict=function(){return a.Sizzle===ga&&(a.Sizzle=Aa),ga},"function"==typeof define&&define.amd?define(function(){return ga}):"undefined"!=typeof module&&module.exports?module.exports=ga:a.Sizzle=ga}(window); -//# sourceMappingURL=sizzle.min.map \ No newline at end of file diff --git a/dashboard-ui/components/navdrawer/navdrawer.js b/dashboard-ui/components/navdrawer/navdrawer.js index 4ac90cb4aa..3b598c55fc 100644 --- a/dashboard-ui/components/navdrawer/navdrawer.js +++ b/dashboard-ui/components/navdrawer/navdrawer.js @@ -1 +1 @@ -define(["browser","css!./navdrawer","scrollStyles"],function(browser){"use strict";return function(options){function onPanStart(ev){options.target.classList.remove("transition"),options.target.classList.add("open"),velocity=Math.abs(ev.velocity)}function onPanMove(ev){velocity=Math.abs(ev.velocity);var isOpen=self.visible;isOpen&&!draggingX&&ev.deltaX>0&&(draggingY=!0),draggingX||draggingY||isOpen&&!(Math.abs(ev.deltaX)>=10)?draggingY||(draggingY=!0):(draggingX=!0,scrollContainer.addEventListener("scroll",disableEvent),self.showMask()),draggingX&&(newPos=currentPos+ev.deltaX,self.changeMenuPos())}function onPanEnd(ev){options.target.classList.add("transition"),scrollContainer.removeEventListener("scroll",disableEvent),draggingX=!1,draggingY=!1,currentPos=ev.deltaX,self.checkMenuState(ev.deltaX,ev.deltaY)}function initEdgeSwipe(Hammer){options.disableEdgeSwipe}function disableEvent(e){e.preventDefault(),e.stopPropagation()}function initWithHammer(Hammer){Hammer&&(menuHammer=Hammer(options.target,null)),self.initElements(Hammer),Hammer&&(self.touchStartMenu(),self.touchEndMenu(),self.eventStartMask(),self.eventEndMask(),initEdgeSwipe(Hammer)),options.disableMask||self.clickMaskClose()}var self,defaults,mask,maskHammer,menuHammer,newPos=0,currentPos=0,startPoint=0,countStart=0,velocity=0;options.target.classList.add("transition");var draggingX,draggingY,scrollContainer=options.target.querySelector(".scrollContainer");scrollContainer.classList.add("smoothScrollY");var TouchMenuLA=function(){self=this,defaults={width:260,handleSize:30,disableMask:!1,maxMaskOpacity:.5},this.isVisible=!1,this.initialize()};return TouchMenuLA.prototype.initElements=function(Hammer){options.target.classList.add("touch-menu-la"),options.target.style.width=options.width+"px",options.target.style.left=-options.width+"px",options.disableMask||(mask=document.createElement("div"),mask.className="tmla-mask",document.body.appendChild(mask),Hammer&&(maskHammer=new Hammer(mask,null)))},TouchMenuLA.prototype.touchStartMenu=function(){menuHammer.on("panstart",function(ev){onPanStart(ev)}),menuHammer.on("panmove",function(ev){onPanMove(ev)})},TouchMenuLA.prototype.animateToPosition=function(pos){requestAnimationFrame(function(){pos?options.target.style.transform="translate3d("+pos+"px, 0, 0)":options.target.style.transform="none"})},TouchMenuLA.prototype.changeMenuPos=function(){newPos<=options.width&&this.animateToPosition(newPos)},TouchMenuLA.prototype.touchEndMenu=function(){menuHammer.on("panend pancancel",onPanEnd)},TouchMenuLA.prototype.clickMaskClose=function(){mask.addEventListener("click",function(){self.close()})},TouchMenuLA.prototype.checkMenuState=function(deltaX,deltaY){velocity>=1?deltaX>=-80||Math.abs(deltaY)>=70?self.open():self.close():newPos>=100?self.open():self.close()},TouchMenuLA.prototype.open=function(){this.animateToPosition(options.width),currentPos=options.width,this.isVisible=!0,options.target.classList.add("open"),self.showMask(),self.invoke(options.onChange)},TouchMenuLA.prototype.close=function(){this.animateToPosition(0),currentPos=0,self.isVisible=!1,options.target.classList.remove("open"),self.hideMask(),self.invoke(options.onChange)},TouchMenuLA.prototype.toggle=function(){self.isVisible?self.close():self.open()},TouchMenuLA.prototype.eventStartMask=function(){maskHammer.on("panstart panmove",function(ev){ev.center.x<=options.width&&self.isVisible&&(countStart++,1==countStart&&(startPoint=ev.deltaX),ev.deltaX<0&&(draggingX=!0,newPos=ev.deltaX-startPoint+options.width,self.changeMenuPos(),velocity=Math.abs(ev.velocity)))})},TouchMenuLA.prototype.eventEndMask=function(){maskHammer.on("panend pancancel",function(ev){self.checkMenuState(ev.deltaX),countStart=0})},TouchMenuLA.prototype.showMask=function(){mask.classList.add("backdrop")},TouchMenuLA.prototype.hideMask=function(){mask.classList.remove("backdrop")},TouchMenuLA.prototype.invoke=function(fn){fn&&fn.apply(self)},TouchMenuLA.prototype.initialize=function(){options=Object.assign(defaults,options||{}),browser.edge&&(options.disableEdgeSwipe=!0),browser.touch?require(["hammer"],initWithHammer):initWithHammer()},new TouchMenuLA}}); \ No newline at end of file +define(["browser","css!./navdrawer","scrollStyles"],function(browser){"use strict";return function(options){function onPanStart(ev){options.target.classList.remove("transition"),options.target.classList.add("open"),velocity=Math.abs(ev.velocity)}function onPanMove(ev){velocity=Math.abs(ev.velocity);var isOpen=self.visible;isOpen&&!draggingX&&ev.deltaX>0&&(draggingY=!0),draggingX||draggingY||isOpen&&!(Math.abs(ev.deltaX)>=10)?draggingY||(draggingY=!0):(draggingX=!0,scrollContainer.addEventListener("scroll",disableEvent),self.showMask()),draggingX&&(newPos=currentPos+ev.deltaX,self.changeMenuPos())}function onPanEnd(ev){options.target.classList.add("transition"),scrollContainer.removeEventListener("scroll",disableEvent),draggingX=!1,draggingY=!1,currentPos=ev.deltaX,self.checkMenuState(ev.deltaX,ev.deltaY)}function initEdgeSwipe(Hammer){options.disableEdgeSwipe||require(["hammer-main"],initEdgeSwipeInternal)}function initEdgeSwipeInternal(edgeHammer){var isPeeking=!1;edgeHammer.on("panstart panmove",function(ev){if(isPeeking)onPanMove(ev);else{var srcEvent=ev.srcEvent,clientX=srcEvent.clientX;if(!clientX){var touches=srcEvent.touches;touches&&touches.length&&(clientX=touches[0].clientX)}clientX<=options.handleSize&&(isPeeking=!0,onPanStart(ev))}}),edgeHammer.on("panend pancancel",function(ev){isPeeking&&(isPeeking=!1,onPanEnd(ev))}),self.edgeHammer=edgeHammer}function disableEvent(e){e.preventDefault(),e.stopPropagation()}function initWithHammer(Hammer){Hammer&&(menuHammer=Hammer(options.target,null)),self.initElements(Hammer),Hammer&&(self.touchStartMenu(),self.touchEndMenu(),self.eventStartMask(),self.eventEndMask(),initEdgeSwipe(Hammer)),options.disableMask||self.clickMaskClose()}var self,defaults,mask,maskHammer,menuHammer,newPos=0,currentPos=0,startPoint=0,countStart=0,velocity=0;options.target.classList.add("transition");var draggingX,draggingY,scrollContainer=options.target.querySelector(".scrollContainer");scrollContainer.classList.add("smoothScrollY");var TouchMenuLA=function(){self=this,defaults={width:260,handleSize:30,disableMask:!1,maxMaskOpacity:.5},this.isVisible=!1,this.initialize()};return TouchMenuLA.prototype.initElements=function(Hammer){options.target.classList.add("touch-menu-la"),options.target.style.width=options.width+"px",options.target.style.left=-options.width+"px",options.disableMask||(mask=document.createElement("div"),mask.className="tmla-mask",document.body.appendChild(mask),Hammer&&(maskHammer=new Hammer(mask,null)))},TouchMenuLA.prototype.touchStartMenu=function(){menuHammer.on("panstart",function(ev){onPanStart(ev)}),menuHammer.on("panmove",function(ev){onPanMove(ev)})},TouchMenuLA.prototype.animateToPosition=function(pos){requestAnimationFrame(function(){pos?options.target.style.transform="translate3d("+pos+"px, 0, 0)":options.target.style.transform="none"})},TouchMenuLA.prototype.changeMenuPos=function(){newPos<=options.width&&this.animateToPosition(newPos)},TouchMenuLA.prototype.touchEndMenu=function(){menuHammer.on("panend pancancel",onPanEnd)},TouchMenuLA.prototype.clickMaskClose=function(){mask.addEventListener("click",function(){self.close()})},TouchMenuLA.prototype.checkMenuState=function(deltaX,deltaY){velocity>=1?deltaX>=-80||Math.abs(deltaY)>=70?self.open():self.close():newPos>=100?self.open():self.close()},TouchMenuLA.prototype.open=function(){this.animateToPosition(options.width),currentPos=options.width,this.isVisible=!0,options.target.classList.add("open"),self.showMask(),self.invoke(options.onChange)},TouchMenuLA.prototype.close=function(){this.animateToPosition(0),currentPos=0,self.isVisible=!1,options.target.classList.remove("open"),self.hideMask(),self.invoke(options.onChange)},TouchMenuLA.prototype.toggle=function(){self.isVisible?self.close():self.open()},TouchMenuLA.prototype.eventStartMask=function(){maskHammer.on("panstart panmove",function(ev){ev.center.x<=options.width&&self.isVisible&&(countStart++,1==countStart&&(startPoint=ev.deltaX),ev.deltaX<0&&(draggingX=!0,newPos=ev.deltaX-startPoint+options.width,self.changeMenuPos(),velocity=Math.abs(ev.velocity)))})},TouchMenuLA.prototype.eventEndMask=function(){maskHammer.on("panend pancancel",function(ev){self.checkMenuState(ev.deltaX),countStart=0})},TouchMenuLA.prototype.showMask=function(){mask.classList.add("backdrop")},TouchMenuLA.prototype.hideMask=function(){mask.classList.remove("backdrop")},TouchMenuLA.prototype.invoke=function(fn){fn&&fn.apply(self)},TouchMenuLA.prototype.initialize=function(){options=Object.assign(defaults,options||{}),browser.edge&&(options.disableEdgeSwipe=!0),browser.touch?require(["hammer"],initWithHammer):initWithHammer()},new TouchMenuLA}}); \ No newline at end of file diff --git a/dashboard-ui/css/dashboard.css b/dashboard-ui/css/dashboard.css index 92ba21be09..d6776afe2a 100644 --- a/dashboard-ui/css/dashboard.css +++ b/dashboard-ui/css/dashboard.css @@ -1 +1 @@ -.dashboardFooter{margin-top:50px;text-align:center}.dashboardFooter a{text-decoration:none;font-weight:400;margin:0 .7em}.dashboardFooter .appLinks a{margin:.25em}.dashboardFooter .appLinks img{height:16px}progress{appearance:none;-moz-appearance:none;-webkit-appearance:none;border:2px solid #ccc;-webkit-border-radius:4px;border-radius:4px;margin:0;background:#ccc!important}progress[role]:after{background-image:none}progress::-webkit-progress-bar{background:#ccc}progress::-moz-progress-bar{border-radius:5px;background-image:-moz-linear-gradient(center bottom,#2bc253 37%,#54f054 69%)}progress::-webkit-progress-value{-webkit-border-radius:5px;border-radius:5px;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#2bc253),color-stop(1,#54f054));background-image:-webkit-linear-gradient(center bottom,#2bc253 37%,#54f054 69%)}progress[aria-valuenow]:before{-webkit-border-radius:5px;border-radius:5px;background-image:-o-linear-gradient(center bottom,#2bc253 37%,#54f054 69%)}.localnav{margin-bottom:30px!important}@media all and (min-width:800px){.type-interior>.ui-content,.type-interior>.ui-panel-content-wrap>.ui-content{padding-right:0;padding-left:0;padding-top:0;overflow:hidden}}.dashboardDocument .btnCast,.dashboardDocument .dashboardEntryHeaderButton,.dashboardDocument .headerSelectedPlayer,.dashboardDocument .headerVoiceButton,.dashboardDocument .lnkManageServer,.dashboardDocument .lnkMySync{display:none!important}.adminDrawer{background:#fff!important}.adminDrawer .sidebarLink{color:#333!important}.adminDrawer .sidebarHeader{color:#666!important;font-weight:500!important}.adminDrawer .sidebarLink:hover{color:#00897B!important}.adminDrawer .sidebarLink.selectedSidebarLink{background:#52B54B!important;color:#fff!important}.adminDrawerLogo{padding:1.5em 1em 1.2em;border-bottom:1px solid #e0e0e0;margin-bottom:1em;display:block}.adminDrawerLogo img{height:30px}@media all and (max-width:640px){.dashboardDocument .headerAppsButton{display:none}}.ui-body-a a{color:#388E3C;font-weight:500}div[data-role=controlgroup] a[data-role=button]{display:inline-block!important;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-border-radius:0;border-radius:0}div[data-role=controlgroup] a[data-role=button]:first-child{-webkit-border-bottom-left-radius:.3125em;border-bottom-left-radius:.3125em;-webkit-border-top-left-radius:.3125em;border-top-left-radius:.3125em}div[data-role=controlgroup] a[data-role=button]:last-child{-webkit-border-bottom-right-radius:.3125em;border-bottom-right-radius:.3125em;-webkit-border-top-right-radius:.3125em;border-top-right-radius:.3125em}div[data-role=controlgroup] a[data-role=button]+a[data-role=button]{border-left-width:0!important;margin:0 0 0 -3px!important}div[data-role=controlgroup] a.ui-btn-active{background:#38c!important;color:#fff!important}.header .imageLink{display:inline-block}.header .imageLink img{height:28px;vertical-align:middle}.ulForm{margin:-1em -1em 20px!important}.ulForm li:not(.ui-li-divider){background:0 0;border:0!important}.popup .ulForm{margin-bottom:0!important}.content-primary{padding-top:70px}.withTabs .content-primary{padding-top:115px}.mainDrawerPanel:not([narrow]) .content-primary{padding-top:90px;padding-bottom:3em}@media all and (min-width:800px){.mainDrawerPanel:not([narrow]) .content-primary{padding-right:1.5em;padding-left:1.5em}}@media all and (min-width:1200px){.mainDrawerPanel:not([narrow]) .content-primary{padding-left:2em}}.mainDrawerPanel:not([narrow]) .withTabs .content-primary{padding-top:125px!important}.mainDrawerPanel:not([narrow]) .content-primary ul:first-child{margin-top:0}@media all and (max-width:1439px){.dashboardHomeRightColumn{margin-top:1em}}.dashboardContent{margin-top:-10px}.dashboardHomeRightColumn{vertical-align:top}@media all and (min-width:1440px){.dashboardHomeLeftColumn{width:600px;display:inline-block;vertical-align:top}.dashboardHomeRightColumn{vertical-align:top}.firstDashboardHomeRightColumn{display:inline-block;width:440px;margin-left:2em;min-width:300px}}@media all and (min-width:1580px){.dashboardHomeRightColumn{display:inline-block;margin-left:1em;width:300px;min-width:300px}}.activeSession:not(.playingSession) .sessionNowPlayingContent,.supporterMembershipDisabled .tabSupporterMembership{display:none}@media all and (min-width:1680px){.dashboardHomeRightColumn{width:350px;min-width:350px}}@media all and (min-width:1880px){.dashboardHomeRightColumn{max-width:440px;margin-left:2em;min-width:440px}}.premiumBanner img{position:absolute;text-align:right;top:0;right:0;width:60px;height:60px}.wizardContent{max-width:800px;padding:.5em 2em 1em;margin:0 auto;background:#fff}.sessionAppInfo,.sessionNowPlayingInfo{padding:.5em;overflow:hidden}.wizardNavigation{text-align:right}.wizardContent form{max-width:100%}.wizardContent h2 img{height:35px;vertical-align:middle;margin-right:.5em;position:relative;top:-3px}.scheduledTaskPaperIconItem{outline:0!important}@media all and (min-width:420px){.activeSession{width:50%!important}}.sessionNowPlayingContent{-webkit-background-size:cover;background-size:cover;background-repeat:no-repeat;background-position:center center;position:absolute;top:0;left:0;right:0;bottom:0}.sessionNowPlayingInnerContent{background-color:rgba(0,0,0,.6);position:absolute;top:0;left:0;right:0;bottom:0;color:#fff;font-weight:400}.sessionAppName{vertical-align:top;max-width:200px}.sessionNowPlayingInfo{position:absolute;left:0;bottom:11px;max-width:150px;-o-text-overflow:ellipsis;text-overflow:ellipsis}.sessionAppInfo img{max-width:32px;max-height:32px;margin-right:5px}.activeSession .playbackProgress{position:absolute;right:0;bottom:0;left:0;height:7px;width:100%;opacity:.95}.activeSession:not(.playingSession) .sessionNowPlayingInnerContent{background-color:#fff;color:#000}.activeSession:not(.playingSession) .sessionNowPlayingInfo{bottom:0}.sessionNowPlayingTime{color:#fff;position:absolute;right:10px;bottom:19px}.sessionNowPlayingStreamInfo{white-space:nowrap;font-size:90%}.activeSession .transcodingProgress{right:0;bottom:0;left:0;height:5px;width:100%;opacity:.9;z-index:999;position:absolute}.playbackProgress,.transcodingProgress{appearance:none;-moz-appearance:none;-webkit-appearance:none;margin:0 5px 0 0;height:14px;border:0 solid #222;-webkit-border-radius:0;border-radius:0;width:50px;background:#000!important}.playbackProgress::-webkit-progress-bar,.transcodingProgress::-webkit-progress-bar{background:#000}.transcodingSession .playbackProgress{bottom:5px}.transcodingProgress::-moz-progress-bar{border-radius:0;background-image:-moz-linear-gradient(center bottom,#dd4919 37%,#dd4919 69%)!important}.transcodingProgress::-webkit-progress-value{-webkit-border-radius:0;border-radius:0;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#dd4919),color-stop(1,#dd4919))!important;background-image:-webkit-linear-gradient(center bottom,#dd4919 37%,#dd4919 69%)!important}.transcodingProgress[aria-valuenow]:before{-webkit-border-radius:0;border-radius:0;background-image:-o-linear-gradient(center bottom,#dd4919 37%,#dd4919 69%)!important}.playbackProgress::-moz-progress-bar{border-radius:0;background-image:none;background-color:#52B54B}.playbackProgress::-webkit-progress-value{-webkit-border-radius:0;border-radius:0;background-image:none;background-color:#52B54B}.playbackProgress[aria-valuenow]:before{-webkit-border-radius:0;border-radius:0;background-image:none;background-color:#52B54B}@media all and (max-width:550px){.sessionAppName{max-width:160px}}@media all and (max-width:500px){.sessionAppName{max-width:150px}}.disabledUser{-webkit-filter:grayscale(100%);filter:grayscale(100%)}.disabledUserBanner{margin:0 0 2em}.appLinks a{text-decoration:none!important}.appLinks a+a{margin-left:5px}.appLinks img{height:36px}a[data-role=button]{-webkit-font-smoothing:antialiased;-webkit-user-select:none;-webkit-background-clip:padding-box;-webkit-border-radius:.3125em;border-radius:.3125em;border:1px solid #ddd!important;color:#333!important;cursor:pointer!important;font-family:inherit!important;font-size:inherit!important;font-weight:500!important;margin:0 .25em!important;display:inline-block;padding:.8em 1em;text-align:center;text-decoration:none!important;background:#f6f6f6!important;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.15);box-shadow:0 1px 3px rgba(0,0,0,.15)} \ No newline at end of file +.dashboardFooter{margin-top:50px;text-align:center}.dashboardFooter a{text-decoration:none;font-weight:400;margin:0 .7em}.dashboardFooter .appLinks a{margin:.25em}.dashboardFooter .appLinks img{height:16px}progress{appearance:none;-moz-appearance:none;-webkit-appearance:none;border:2px solid #ccc;-webkit-border-radius:4px;border-radius:4px;margin:0;background:#ccc!important}progress[role]:after{background-image:none}progress::-webkit-progress-bar{background:#ccc}progress::-moz-progress-bar{border-radius:5px;background-image:-moz-linear-gradient(center bottom,#2bc253 37%,#54f054 69%)}progress::-webkit-progress-value{-webkit-border-radius:5px;border-radius:5px;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#2bc253),color-stop(1,#54f054));background-image:-webkit-linear-gradient(center bottom,#2bc253 37%,#54f054 69%)}progress[aria-valuenow]:before{-webkit-border-radius:5px;border-radius:5px;background-image:-o-linear-gradient(center bottom,#2bc253 37%,#54f054 69%)}.localnav{margin-bottom:30px!important}@media all and (min-width:800px){.type-interior>.ui-content,.type-interior>.ui-panel-content-wrap>.ui-content{padding-right:0;padding-left:0;padding-top:0;overflow:hidden}}.dashboardDocument .btnCast,.dashboardDocument .dashboardEntryHeaderButton,.dashboardDocument .headerSelectedPlayer,.dashboardDocument .headerVoiceButton,.dashboardDocument .lnkManageServer,.dashboardDocument .lnkMySync{display:none!important}.adminDrawer{background:#fff!important}.adminDrawer .sidebarLink{color:#333!important}.adminDrawer .sidebarHeader{color:#666!important;font-weight:500!important}.adminDrawer .sidebarLink:hover{color:#00897B!important}.adminDrawer .sidebarLink.selectedSidebarLink{background:#52B54B!important;color:#fff!important}.adminDrawerLogo{padding:1.5em 1em 1.2em;border-bottom:1px solid #e0e0e0;margin-bottom:1em;display:block}.adminDrawerLogo img{height:30px}@media all and (max-width:640px){.dashboardDocument .headerAppsButton{display:none}}.ui-body-a a{color:#388E3C;font-weight:500}div[data-role=controlgroup] a[data-role=button]{display:inline-block!important;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-border-radius:0;border-radius:0}div[data-role=controlgroup] a[data-role=button]:first-child{-webkit-border-bottom-left-radius:.3125em;border-bottom-left-radius:.3125em;-webkit-border-top-left-radius:.3125em;border-top-left-radius:.3125em}div[data-role=controlgroup] a[data-role=button]:last-child{-webkit-border-bottom-right-radius:.3125em;border-bottom-right-radius:.3125em;-webkit-border-top-right-radius:.3125em;border-top-right-radius:.3125em}div[data-role=controlgroup] a[data-role=button]+a[data-role=button]{border-left-width:0!important;margin:0 0 0 -3px!important}div[data-role=controlgroup] a.ui-btn-active{background:#38c!important;color:#fff!important}.header .imageLink{display:inline-block}.header .imageLink img{height:28px;vertical-align:middle}.ulForm{margin:-1em -1em 20px!important}.ulForm li:not(.ui-li-divider){background:0 0;border:0!important}.popup .ulForm{margin-bottom:0!important}.content-primary{padding-top:90px;padding-bottom:3em}@media all and (min-width:800px){.content-primary{padding-right:1.5em;padding-left:1.5em}}@media all and (min-width:1200px){.content-primary{padding-left:2em}}.withTabs .content-primary{padding-top:125px!important}.content-primary ul:first-child{margin-top:0}@media all and (max-width:1439px){.dashboardHomeRightColumn{margin-top:1em}}.dashboardContent{margin-top:-10px}.dashboardHomeRightColumn{vertical-align:top}@media all and (min-width:1440px){.dashboardHomeLeftColumn{width:600px;display:inline-block;vertical-align:top}.dashboardHomeRightColumn{vertical-align:top}.firstDashboardHomeRightColumn{display:inline-block;width:440px;margin-left:2em;min-width:300px}}@media all and (min-width:1580px){.dashboardHomeRightColumn{display:inline-block;margin-left:1em;width:300px;min-width:300px}}.activeSession:not(.playingSession) .sessionNowPlayingContent,.supporterMembershipDisabled .tabSupporterMembership{display:none}@media all and (min-width:1680px){.dashboardHomeRightColumn{width:350px;min-width:350px}}@media all and (min-width:1880px){.dashboardHomeRightColumn{max-width:440px;margin-left:2em;min-width:440px}}.premiumBanner img{position:absolute;text-align:right;top:0;right:0;width:60px;height:60px}.wizardContent{max-width:800px;padding:.5em 2em 1em;margin:0 auto;background:#fff}.sessionAppInfo,.sessionNowPlayingInfo{padding:.5em;overflow:hidden}.wizardNavigation{text-align:right}.wizardContent form{max-width:100%}.wizardContent h2 img{height:35px;vertical-align:middle;margin-right:.5em;position:relative;top:-3px}.scheduledTaskPaperIconItem{outline:0!important}@media all and (min-width:420px){.activeSession{width:50%!important}}.sessionNowPlayingContent{-webkit-background-size:cover;background-size:cover;background-repeat:no-repeat;background-position:center center;position:absolute;top:0;left:0;right:0;bottom:0}.sessionNowPlayingInnerContent{background-color:rgba(0,0,0,.6);position:absolute;top:0;left:0;right:0;bottom:0;color:#fff;font-weight:400}.sessionAppName{vertical-align:top;max-width:200px}.sessionNowPlayingInfo{position:absolute;left:0;bottom:11px;max-width:150px;-o-text-overflow:ellipsis;text-overflow:ellipsis}.sessionAppInfo img{max-width:32px;max-height:32px;margin-right:5px}.activeSession .playbackProgress{position:absolute;right:0;bottom:0;left:0;height:7px;width:100%;opacity:.95}.activeSession:not(.playingSession) .sessionNowPlayingInnerContent{background-color:#fff;color:#000}.activeSession:not(.playingSession) .sessionNowPlayingInfo{bottom:0}.sessionNowPlayingTime{color:#fff;position:absolute;right:10px;bottom:19px}.sessionNowPlayingStreamInfo{white-space:nowrap;font-size:90%}.activeSession .transcodingProgress{right:0;bottom:0;left:0;height:5px;width:100%;opacity:.9;z-index:999;position:absolute}.playbackProgress,.transcodingProgress{appearance:none;-moz-appearance:none;-webkit-appearance:none;margin:0 5px 0 0;height:14px;border:0 solid #222;-webkit-border-radius:0;border-radius:0;width:50px;background:#000!important}.playbackProgress::-webkit-progress-bar,.transcodingProgress::-webkit-progress-bar{background:#000}.transcodingSession .playbackProgress{bottom:5px}.transcodingProgress::-moz-progress-bar{border-radius:0;background-image:-moz-linear-gradient(center bottom,#dd4919 37%,#dd4919 69%)!important}.transcodingProgress::-webkit-progress-value{-webkit-border-radius:0;border-radius:0;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#dd4919),color-stop(1,#dd4919))!important;background-image:-webkit-linear-gradient(center bottom,#dd4919 37%,#dd4919 69%)!important}.transcodingProgress[aria-valuenow]:before{-webkit-border-radius:0;border-radius:0;background-image:-o-linear-gradient(center bottom,#dd4919 37%,#dd4919 69%)!important}.playbackProgress::-moz-progress-bar{border-radius:0;background-image:none;background-color:#52B54B}.playbackProgress::-webkit-progress-value{-webkit-border-radius:0;border-radius:0;background-image:none;background-color:#52B54B}.playbackProgress[aria-valuenow]:before{-webkit-border-radius:0;border-radius:0;background-image:none;background-color:#52B54B}@media all and (max-width:550px){.sessionAppName{max-width:160px}}@media all and (max-width:500px){.sessionAppName{max-width:150px}}.disabledUser{-webkit-filter:grayscale(100%);filter:grayscale(100%)}.disabledUserBanner{margin:0 0 2em}.appLinks a{text-decoration:none!important}.appLinks a+a{margin-left:5px}.appLinks img{height:36px}a[data-role=button]{-webkit-font-smoothing:antialiased;-webkit-user-select:none;-webkit-background-clip:padding-box;-webkit-border-radius:.3125em;border-radius:.3125em;border:1px solid #ddd!important;color:#333!important;cursor:pointer!important;font-family:inherit!important;font-size:inherit!important;font-weight:500!important;margin:0 .25em!important;display:inline-block;padding:.8em 1em;text-align:center;text-decoration:none!important;background:#f6f6f6!important;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.15);box-shadow:0 1px 3px rgba(0,0,0,.15)} \ No newline at end of file diff --git a/dashboard-ui/css/librarybrowser.css b/dashboard-ui/css/librarybrowser.css index 1f6fb0a508..051555569a 100644 --- a/dashboard-ui/css/librarybrowser.css +++ b/dashboard-ui/css/librarybrowser.css @@ -1 +1 @@ -.itemTag,.ui-body-b{color:#fff!important}.itemName,.itemTag{font-weight:400!important}.detailSectionHeader,.itemMiscInfo{-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden}.alphabetPicker,.itemLinks,.listPaging,.posterRibbon,.viewSettings{text-align:center}.hidingAnimatedTab{visibility:hidden}.headerArrowImage{height:20px;margin-left:.5em}.background-theme-b .backgroundContainer,.dialog.background-theme-b{background-color:#121314}.background-theme-b .backgroundContainer.withBackdrop{background-color:rgba(6,6,6,.94)!important;background:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.99)),color-stop(rgba(0,0,0,.94)),to(rgba(0,0,0,.5)))!important;background:-webkit-linear-gradient(left,rgba(0,0,0,.99),rgba(0,0,0,.94),rgba(0,0,0,.5))!important;background:-o-linear-gradient(left,rgba(0,0,0,.99),rgba(0,0,0,.94),rgba(0,0,0,.5))!important;background:linear-gradient(to right,rgba(0,0,0,.99),rgba(0,0,0,.94),rgba(0,0,0,.5))!important}.pageWithAbsoluteTabs{background-color:transparent!important}.backdropContainer{position:fixed;top:0;left:0;right:0;bottom:0;z-index:-1}.libraryPage .header{padding-bottom:0}.pageTabContent{contain:style}.libraryPage>.ui-content{padding-top:10px}.pageWithAbsoluteTabs .pageTabContent{padding-top:2.6em}.flexPageTabContent.is-active{display:-webkit-box!important;display:-webkit-flex!important;display:flex!important}@media all and (max-width:600px){.libraryPage>.ui-content{padding-left:.5em!important;padding-right:.5em!important}}.listHeader{margin:.25em 0;padding-left:2px;line-height:1.25em;line-height:initial}@media all and (max-width:500px){.listHeader{padding-left:5px}}.listHeader+button{margin-left:2em}.ehsContent,.ehsContent .pageTabContent{margin:0 auto}.homePageSection{margin-bottom:3.6em}.sectionHeaderButton{vertical-align:middle;margin:0 0 .25em 1.5em;position:relative;top:8px}.viewPanelTabs{margin-bottom:2em}@media all and (min-width:800px){.hiddenSectionOnNonMobile{display:none}}.ehsContent .pageTabContent,.ehsContent:not(.fullWidth){width:98%}@media all and (min-width:1200px){.paddedItemsContainer{padding:0 .8em}.ehsContent .pageTabContent,.ehsContent:not(.fullWidth){width:96%}}.homePageSection h1{padding-left:.55em}.homePageSection .itemsContainer{padding-left:.7em;padding-right:.7em}@media all and (min-width:1200px){.homePageSection h1{padding-left:2.2vw}.homePageSection .itemsContainer{padding-left:2vw;padding-right:2vw}}.viewSettings{margin:0 0 .25em}.viewControls+.listTopPaging{margin-left:.5em!important}.criticReview{margin:1.5em 0;background:#222;padding:.8em .8em .8em 55px;-webkit-border-radius:5px;border-radius:5px;position:relative}.criticReview:first-child{margin-top:.5em}.criticReview img{width:30px}.criticRatingScore{margin-bottom:.5em}.itemTag{display:inline-block;background-color:#333;-webkit-border-radius:4px;border-radius:4px;padding:5px 7px;margin:0 5px 5px 0;text-decoration:none}.detailSectionHeader,.detailUserDataIcons{display:-webkit-box;display:-webkit-flex;-webkit-box-align:center}.itemOverview{white-space:pre-wrap}a.itemTag:hover{background-color:#2489ce}.itemLinks{padding:0}.itemLinks p{margin:.5em 0}.reviewLink,.reviewerName{margin-top:.5em}.reviewerName{color:#ccc}.reviewDate{margin-left:1em}.reviewScore{position:absolute;left:.8em}span.itemCommunityRating:not(:empty)+.userDataIcons{margin-left:1.25em}.itemBackdrop{-webkit-background-size:cover;background-size:cover;background-position:center 15%;background-repeat:no-repeat;height:45vh;position:relative}.noSecondaryNavPage .itemBackdrop{margin-top:-50px}.noBackdrop{background:#181818;height:170px!important}.withBackdrop+.mainDrawerPanel .noBackdrop{background-color:transparent}.itemBackdropContent{position:absolute;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.7);min-height:120px}.noBackdrop .itemBackdropContent{background-color:transparent}.desktopMiscInfoContainer{position:absolute;bottom:10px}.detailUserDataIcons{display:flex;-webkit-align-items:center;align-items:center}.detailImageContainer{margin-right:2em;width:280px;-webkit-flex-shrink:0;flex-shrink:0}.detailPagePrimaryContent{position:relative;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}.detailLogo{width:300px;height:70px;position:absolute;top:13.5%;right:19.5%;background-repeat:no-repeat;background-position:center center;-webkit-background-size:contain;background-size:contain}@media all and (max-width:1400px){.detailLogo{right:5%}}@media all and (max-width:1100px){.detailLogo{display:none}}.itemDetailImage{border:1px solid transparent;width:100%}.thumbDetailImageContainer{width:400px}.itemDetailImage.loaded{-webkit-box-shadow:0 0 20px #000;box-shadow:0 0 20px #000;border:1px solid #222}.itemDetailGalleryLink img:hover{-webkit-box-shadow:0 0 20px 3px #52B54B;box-shadow:0 0 20px 3px #52B54B}@media all and (max-width:800px){.detailPageContent{position:relative}.detailImageContainer{position:absolute;top:-90px;left:5%;width:auto}.itemDetailImage{height:120px;width:auto!important}.btnPlaySimple{display:none!important}}@media all and (min-width:800px){.itemBackdrop{display:none}.detailPagePrimaryContainer{display:-webkit-box;display:-webkit-flex;display:flex;margin-bottom:3.6em}}@media all and (max-width:1200px){.detailLogo{right:2%}.lnkSibling{display:none!important}}.parentName{display:block;margin-bottom:.5em}.emby-button.detailFloatingButton{width:56px!important;height:56px!important;bottom:-28px;position:absolute;right:5%;background-color:#52B54B!important;z-index:1}.emby-button.btnFloatingRecord{background-color:#c33!important}@media all and (max-width:800px){.parentName{margin-bottom:1em}.itemBackdropContent{min-height:0}}@media all and (min-width:500px){.mobileDetails{display:none}}@media all and (max-width:500px){.desktopDetails{display:none!important}}.itemName{margin:.5em 0}.empty{margin:0}.detailSection{vertical-align:top;margin-bottom:3em}.detailCollapsibleSection:not(.hide)+.detailCollapsibleSection{margin-top:-2em}.detailPageCollabsible{margin-top:0}.detailSection h1{margin-bottom:.25em;position:relative}.detailSectionHeader{-webkit-background-clip:border-box;background-clip:border-box;padding:0 0 .25em .25em;background-color:transparent;-webkit-border-radius:0;border-radius:0;white-space:nowrap;position:relative;margin:1.5em 0 1em;display:flex;-webkit-align-items:center;align-items:center}.detailSectionHeader>h1{margin:0}.detailSectionHeaderButton{margin-left:1em}.mainDetailButtons{padding:.5em 0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-flex-wrap:wrap;flex-wrap:wrap}.mainDetailButtons button,.recordingFields button{margin-left:0;margin-right:.5em;-webkit-flex-shrink:0;flex-shrink:0}.mainDetailButtons.hide+.recordingFields{margin-top:1.5em!important}.mainDetailButtons>.raised{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}@media all and (min-width:400px){.mainDetailButtons>.raised{padding-left:1.5em;padding-right:1.5em}}.detailImageProgressContainer{position:absolute;bottom:4px;right:1px;left:1px;text-align:center}.listTopPaging,.viewControls{display:inline-block}@media all and (max-width:800px){.editorMenuLink{display:none}}.itemMiscInfo{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-webkit-align-items:center;align-items:center}@media all and (max-width:500px){.mobileDetails .itemMiscInfo{text-align:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.itemMiscInfo .endsAt{display:none}}.detailPageContent{border-spacing:0;border-collapse:collapse;padding:3em 3% 0}@media all and (min-width:750px){.detailPageContent{padding:3em 3% 0}}@media all and (min-width:1200px){.detailPageContent{padding:3em 5% 0}}.detailPageParentLink{font-weight:inherit!important}.mediaInfoContent{line-height:1.5em}.mediaInfoStream{margin:1em 3em 1em 0;display:inline-block;color:#bbb;vertical-align:top}.mediaInfoStreamType{display:block;color:#fff;margin-bottom:1em}.mediaInfoAttribute{color:#fff;display:inline-block}.mediaInfoLabel{color:#aaa;margin-right:1em;display:inline-block}.posterRibbon{display:block;position:absolute;top:5px;right:5px;padding:5px 6px;-webkit-border-radius:10px;border-radius:10px;color:#fff;background:#008fbb;background:rgba(0,143,187,.8);line-height:initial}.offlinePosterRibbon{background:rgba(248,58,34,.8)}.unairedPosterRibbon{background:rgba(255,106,0,.8)}.missingPosterRibbon{background:rgba(248,58,34,.8)}.recordingProgressBar::-moz-progress-bar{background-color:#c33}.recordingProgressBar::-webkit-progress-value{background-color:#c33}.recordingProgressBar[aria-valuenow]:before{background-color:#c33}.timelineHeader{margin-bottom:.25em;line-height:1.25em;line-height:initial}.itemsContainer{margin:0 auto}.alphabetPicker{position:fixed;right:0;bottom:0;font-size:90%;display:none;line-height:1}.layout-desktop .absolutePageTabContent .alphabetPicker{right:20px}@media all and (max-height:500px){.alphabetPicker{display:none!important}}@media all and (min-height:500px){.itemsContainerWithAlphaPicker{margin-right:20px}.absolutePageTabContent .itemsContainerWithAlphaPicker{margin-right:30px}.alphabetPicker{bottom:5px}}@media all and (min-width:1200px){.absolutePageTabContent .itemsContainerWithAlphaPicker,.itemsContainerWithAlphaPicker{margin-right:0}}@media all and (max-height:700px){.alphaPicker-vertical .alphaPickerButton{padding-top:1px!important;padding-bottom:1px!important}}@media all and (max-height:600px){.alphaPicker-vertical .alphaPickerButton{padding-top:0!important;padding-bottom:0!important}}@media all and (max-height:530px){.alphabetPicker{font-size:80%}}@media all and (max-height:480px){.alphabetPicker{font-size:76%}}@media all and (min-height:900px){.alphabetPicker{bottom:120px}}@media all and (min-height:1000px){.alphabetPicker{bottom:200px}}@media all and (max-width:1200px){.listViewUserDataButtons{display:none!important}}.userProfileSettingsForm{max-width:700px}@media all and (max-width:700px){.userProfileSettingsForm .detailSection{margin-left:.5em;margin-right:.5em}}@media all and (max-width:800px){.detailsHiddenOnMobile{display:none}}#criticReviewsContent.hiddenScrollX{white-space:nowrap}#criticReviewsContent.hiddenScrollX .paperList{min-width:240px;width:90%;max-width:500px;display:inline-block;vertical-align:top;margin:0 4px 0 0}.btnSyncComplete{background:#673AB7!important}.btnSyncComplete i{-webkit-border-radius:1000px;border-radius:1000px}.bulletSeparator{margin:0 .35em}.mediaInfoIcons{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;margin:1.5em 0 1em;-webkit-flex-wrap:wrap;flex-wrap:wrap}.mediaInfoText{padding:.3em .5em!important;margin-right:.5em;margin-bottom:.5em;font-size:94%!important}.mediaInfoText-upper{text-transform:uppercase} \ No newline at end of file +.itemTag,.ui-body-b{color:#fff!important}.itemName,.itemTag{font-weight:400!important}.detailSectionHeader,.itemMiscInfo{-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden}.alphabetPicker,.itemLinks,.listPaging,.posterRibbon,.viewSettings{text-align:center}.hidingAnimatedTab{visibility:hidden}.headerArrowImage{height:20px;margin-left:.5em}.background-theme-b .backgroundContainer,.dialog.background-theme-b{background-color:#121314}.background-theme-b .backgroundContainer.withBackdrop{background-color:rgba(6,6,6,.94)!important;background:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.99)),color-stop(rgba(0,0,0,.94)),to(rgba(0,0,0,.5)))!important;background:-webkit-linear-gradient(left,rgba(0,0,0,.99),rgba(0,0,0,.94),rgba(0,0,0,.5))!important;background:-o-linear-gradient(left,rgba(0,0,0,.99),rgba(0,0,0,.94),rgba(0,0,0,.5))!important;background:linear-gradient(to right,rgba(0,0,0,.99),rgba(0,0,0,.94),rgba(0,0,0,.5))!important}.pageWithAbsoluteTabs{background-color:transparent!important}.backdropContainer{position:fixed;top:0;left:0;right:0;bottom:0;z-index:-1}.libraryPage .header{padding-bottom:0}.pageTabContent{contain:style}.libraryPage>.ui-content{padding-top:10px}.pageWithAbsoluteTabs .pageTabContent{padding-top:2.6em}.flexPageTabContent.is-active{display:-webkit-box!important;display:-webkit-flex!important;display:flex!important}@media all and (max-width:600px){.libraryPage>.ui-content{padding-left:.5em!important;padding-right:.5em!important}}.listHeader{margin:.25em 0;padding-left:2px;line-height:1.25em;line-height:initial}@media all and (max-width:500px){.listHeader{padding-left:5px}}.listHeader+button{margin-left:2em}.ehsContent,.ehsContent .pageTabContent{margin:0 auto}.homePageSection{margin-bottom:3.6em}.sectionHeaderButton{vertical-align:middle;margin:0 0 .25em 1.5em;position:relative;top:8px}.viewPanelTabs{margin-bottom:2em}@media all and (min-width:800px){.hiddenSectionOnNonMobile{display:none}}.ehsContent .pageTabContent,.ehsContent:not(.fullWidth){width:98%}@media all and (min-width:1200px){.paddedItemsContainer{padding:0 .8em}.ehsContent .pageTabContent,.ehsContent:not(.fullWidth){width:96%}}.homePageSection h1{padding-left:.55em}.homePageSection .itemsContainer{padding-left:.7em;padding-right:.7em}@media all and (min-width:1200px){.homePageSection h1{padding-left:2.2vw}.homePageSection .itemsContainer{padding-left:2vw;padding-right:2vw}}.viewSettings{margin:0 0 .25em}.viewControls+.listTopPaging{margin-left:.5em!important}.criticReview{margin:1.5em 0;background:#222;padding:.8em .8em .8em 55px;-webkit-border-radius:5px;border-radius:5px;position:relative}.criticReview:first-child{margin-top:.5em}.criticReview img{width:30px}.criticRatingScore{margin-bottom:.5em}.itemTag{display:inline-block;background-color:#333;-webkit-border-radius:4px;border-radius:4px;padding:5px 7px;margin:0 5px 5px 0;text-decoration:none}.detailSectionHeader,.detailUserDataIcons{display:-webkit-box;display:-webkit-flex;-webkit-box-align:center}.itemOverview{white-space:pre-wrap}a.itemTag:hover{background-color:#2489ce}.itemLinks{padding:0}.itemLinks p{margin:.5em 0}.reviewLink,.reviewerName{margin-top:.5em}.reviewerName{color:#ccc}.reviewDate{margin-left:1em}.reviewScore{position:absolute;left:.8em}span.itemCommunityRating:not(:empty)+.userDataIcons{margin-left:1.25em}.itemBackdrop{-webkit-background-size:cover;background-size:cover;background-position:center 15%;background-repeat:no-repeat;height:45vh;position:relative}.noSecondaryNavPage .itemBackdrop{margin-top:-50px}.noBackdrop{background:#181818;height:170px!important}.itemBackdropContent{position:absolute;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.7);min-height:120px}.noBackdrop .itemBackdropContent{background-color:transparent}.desktopMiscInfoContainer{position:absolute;bottom:10px}.detailUserDataIcons{display:flex;-webkit-align-items:center;align-items:center}.detailImageContainer{margin-right:2em;width:280px;-webkit-flex-shrink:0;flex-shrink:0}.detailPagePrimaryContent{position:relative;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}.detailLogo{width:300px;height:70px;position:absolute;top:13.5%;right:19.5%;background-repeat:no-repeat;background-position:center center;-webkit-background-size:contain;background-size:contain}@media all and (max-width:1400px){.detailLogo{right:5%}}@media all and (max-width:1100px){.detailLogo{display:none}}.itemDetailImage{border:1px solid transparent;width:100%}.thumbDetailImageContainer{width:400px}.itemDetailImage.loaded{-webkit-box-shadow:0 0 20px #000;box-shadow:0 0 20px #000;border:1px solid #222}.itemDetailGalleryLink img:hover{-webkit-box-shadow:0 0 20px 3px #52B54B;box-shadow:0 0 20px 3px #52B54B}@media all and (max-width:800px){.detailPageContent{position:relative}.detailImageContainer{position:absolute;top:-90px;left:5%;width:auto}.itemDetailImage{height:120px;width:auto!important}.btnPlaySimple{display:none!important}}@media all and (min-width:800px){.itemBackdrop{display:none}.detailPagePrimaryContainer{display:-webkit-box;display:-webkit-flex;display:flex;margin-bottom:3.6em}}@media all and (max-width:1200px){.detailLogo{right:2%}.lnkSibling{display:none!important}}.parentName{display:block;margin-bottom:.5em}.emby-button.detailFloatingButton{width:56px!important;height:56px!important;bottom:-28px;position:absolute;right:5%;background-color:#52B54B!important;z-index:1}.emby-button.btnFloatingRecord{background-color:#c33!important}@media all and (max-width:800px){.parentName{margin-bottom:1em}.itemBackdropContent{min-height:0}}@media all and (min-width:500px){.mobileDetails{display:none}}@media all and (max-width:500px){.desktopDetails{display:none!important}}.itemName{margin:.5em 0}.empty{margin:0}.detailSection{vertical-align:top;margin-bottom:3em}.detailCollapsibleSection:not(.hide)+.detailCollapsibleSection{margin-top:-2em}.detailPageCollabsible{margin-top:0}.detailSection h1{margin-bottom:.25em;position:relative}.detailSectionHeader{-webkit-background-clip:border-box;background-clip:border-box;padding:0 0 .25em .25em;background-color:transparent;-webkit-border-radius:0;border-radius:0;white-space:nowrap;position:relative;margin:1.5em 0 1em;display:flex;-webkit-align-items:center;align-items:center}.detailSectionHeader>h1{margin:0}.detailSectionHeaderButton{margin-left:1em}.mainDetailButtons{padding:.5em 0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-flex-wrap:wrap;flex-wrap:wrap}.mainDetailButtons button,.recordingFields button{margin-left:0;margin-right:.5em;-webkit-flex-shrink:0;flex-shrink:0}.mainDetailButtons.hide+.recordingFields{margin-top:1.5em!important}.mainDetailButtons>.raised{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}@media all and (min-width:400px){.mainDetailButtons>.raised{padding-left:1.5em;padding-right:1.5em}}.detailImageProgressContainer{position:absolute;bottom:4px;right:1px;left:1px;text-align:center}.listTopPaging,.viewControls{display:inline-block}@media all and (max-width:800px){.editorMenuLink{display:none}}.itemMiscInfo{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-webkit-align-items:center;align-items:center}@media all and (max-width:500px){.mobileDetails .itemMiscInfo{text-align:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.itemMiscInfo .endsAt{display:none}}.detailPageContent{border-spacing:0;border-collapse:collapse;padding:3em 3% 0}@media all and (min-width:750px){.detailPageContent{padding:3em 3% 0}}@media all and (min-width:1200px){.detailPageContent{padding:3em 5% 0}}.detailPageParentLink{font-weight:inherit!important}.mediaInfoContent{line-height:1.5em}.mediaInfoStream{margin:1em 3em 1em 0;display:inline-block;color:#bbb;vertical-align:top}.mediaInfoStreamType{display:block;color:#fff;margin-bottom:1em}.mediaInfoAttribute{color:#fff;display:inline-block}.mediaInfoLabel{color:#aaa;margin-right:1em;display:inline-block}.posterRibbon{display:block;position:absolute;top:5px;right:5px;padding:5px 6px;-webkit-border-radius:10px;border-radius:10px;color:#fff;background:#008fbb;background:rgba(0,143,187,.8);line-height:initial}.offlinePosterRibbon{background:rgba(248,58,34,.8)}.unairedPosterRibbon{background:rgba(255,106,0,.8)}.missingPosterRibbon{background:rgba(248,58,34,.8)}.recordingProgressBar::-moz-progress-bar{background-color:#c33}.recordingProgressBar::-webkit-progress-value{background-color:#c33}.recordingProgressBar[aria-valuenow]:before{background-color:#c33}.timelineHeader{margin-bottom:.25em;line-height:1.25em;line-height:initial}.itemsContainer{margin:0 auto}.alphabetPicker{position:fixed;right:0;bottom:0;font-size:90%;display:none;line-height:1}.layout-desktop .absolutePageTabContent .alphabetPicker{right:20px}@media all and (max-height:500px){.alphabetPicker{display:none!important}}@media all and (min-height:500px){.itemsContainerWithAlphaPicker{margin-right:20px}.absolutePageTabContent .itemsContainerWithAlphaPicker{margin-right:30px}.alphabetPicker{bottom:5px}}@media all and (min-width:1200px){.absolutePageTabContent .itemsContainerWithAlphaPicker,.itemsContainerWithAlphaPicker{margin-right:0}}@media all and (max-height:700px){.alphaPicker-vertical .alphaPickerButton{padding-top:1px!important;padding-bottom:1px!important}}@media all and (max-height:600px){.alphaPicker-vertical .alphaPickerButton{padding-top:0!important;padding-bottom:0!important}}@media all and (max-height:530px){.alphabetPicker{font-size:80%}}@media all and (max-height:480px){.alphabetPicker{font-size:76%}}@media all and (min-height:900px){.alphabetPicker{bottom:120px}}@media all and (min-height:1000px){.alphabetPicker{bottom:200px}}@media all and (max-width:1200px){.listViewUserDataButtons{display:none!important}}.userProfileSettingsForm{max-width:700px}@media all and (max-width:700px){.userProfileSettingsForm .detailSection{margin-left:.5em;margin-right:.5em}}@media all and (max-width:800px){.detailsHiddenOnMobile{display:none}}#criticReviewsContent.hiddenScrollX{white-space:nowrap}#criticReviewsContent.hiddenScrollX .paperList{min-width:240px;width:90%;max-width:500px;display:inline-block;vertical-align:top;margin:0 4px 0 0}.btnSyncComplete{background:#673AB7!important}.btnSyncComplete i{-webkit-border-radius:1000px;border-radius:1000px}.bulletSeparator{margin:0 .35em}.mediaInfoIcons{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;margin:1.5em 0 1em;-webkit-flex-wrap:wrap;flex-wrap:wrap}.mediaInfoText{padding:.3em .5em!important;margin-right:.5em;margin-bottom:.5em;font-size:94%!important}.mediaInfoText-upper{text-transform:uppercase} \ No newline at end of file diff --git a/dashboard-ui/css/librarymenu.css b/dashboard-ui/css/librarymenu.css index 5f4dfc3cd6..6e54475968 100644 --- a/dashboard-ui/css/librarymenu.css +++ b/dashboard-ui/css/librarymenu.css @@ -1 +1 @@ -.headerUserImage,.viewMenuBar paper-icon-button,.viewMenuLink{vertical-align:middle}.libraryPage{padding-top:50px!important}.libraryPage:not(.noSecondaryNavPage){padding-top:95px!important}.pageWithAbsoluteTabs:not(.noSecondaryNavPage){padding-top:98px!important}.absolutePageTabContent{position:absolute;left:0;right:0;bottom:0;z-index:1;margin:0!important;top:102px!important;-webkit-transition:-webkit-transform .2s ease-out;-o-transition:transform .2s ease-out;transition:transform .2s ease-out}.absolutePageTabContent.headroomUnpinned{-webkit-transform:translateY(-92px);transform:translateY(-92px);bottom:-92px!important}.pageTabContent:not(.is-active){display:none!important}.sidebarDivider{height:1px;background:#eaeaea;margin:.5em 0}.headerUserImage{-webkit-background-size:contain;background-size:contain;background-repeat:no-repeat;background-position:center center;-webkit-border-radius:1000px;border-radius:1000px;display:inline-block}.headerUserButtonRound img{-webkit-border-radius:1000px;border-radius:1000px}.headerButton{-webkit-flex-shrink:0;flex-shrink:0}.menuArrow{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAbklEQ…yGDxkLaBtENI9kPMk0gaoW0Dyj0aWowFLYNYzWB6MWMAAAq1H3+Mhu2hQAAAAASUVORK5CYII=);height:24px;width:24px;display:inline-block}.hideMainDrawer .mainDrawerButton{display:none}.libraryMenuButtonText{text-decoration:none;display:-webkit-inline-box;display:-webkit-inline-flex;display:inline-flex;vertical-align:middle;padding-left:0!important;cursor:default;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;-webkit-box-align:center;-webkit-align-items:center;align-items:center;margin:0 0 0 .5em;-webkit-flex-shrink:1;flex-shrink:1}.libraryViewNav,.viewMenuBar{z-index:999;display:-webkit-box;display:-webkit-flex}.viewMenuBar{position:fixed;right:0;left:0;top:0;border:0;height:50px;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}.hiddenViewMenuBar .viewMenuBar{display:none}.libraryViewNav{overflow:hidden;text-transform:uppercase;white-space:nowrap;padding:0;display:flex;display:block;text-align:center;margin:0 auto;-webkit-box-align:center;-webkit-align-items:center;align-items:center;font-size:13px}.ui-body-b .libraryViewNav{position:fixed;right:0;left:0;top:50px}.libraryViewNav.bottom{top:auto!important;bottom:0}.ui-body-b .libraryViewNav,.viewMenuBar{background-color:#222326;color:#fff}.viewMenuBar .primaryIcons{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;width:100%;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.dashboardDocument{font-size:13px}.dashboardDocument .viewMenuBar{height:auto}.dashboardDocument .viewMenuBar .primaryIcons{padding:.7em 0}.dashboardDocument.withTallToolbar .primaryIcons{padding-bottom:0}.viewMenuBarTabs{width:100%}.viewMenuBarTabs .paperTabLink{padding-left:1.5em;padding-right:1.5em}.viewMenuBar.semiTransparent{background-color:rgba(15,15,15,.3)}.viewMenuLink{text-decoration:none;color:#eee!important;padding:7px .5em 6px;display:inline-block}.viewMenuLink:hover{color:#fff}.viewMenuLink:hover img{opacity:.5}.viewMenuLink img{height:24px;vertical-align:top}.viewMenuSecondary{margin-left:auto;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.selectedMediaFolder{background-color:#f2f2f2!important}.ui-panel.ui-body-b{background-color:#1D1D20}@media all and (max-width:800px){.editorViewMenu{display:none}}.sidebarLink{display:block;text-decoration:none;color:#111!important;font-weight:400!important;vertical-align:middle;padding:1em 0 1em 2.4em}.sidebarLink:hover{background:#f2f2f2}.sidebarLink.selectedSidebarLink{background:#f2f2f2!important}.sidebarHeader{padding-left:1.4em;margin:1.2em 0 .7em;color:#666}body:not(.dashboardDocument) .btnNotifications{display:none!important}.darkDrawer{background-color:#1C1C1F!important}.darkDrawer .sidebarLink,.darkDrawer .sidebarLinkText{color:#fff!important}.darkDrawer .sidebarHeader{color:#bbb!important}.darkDrawer .sidebarDivider{background:#262626!important}.darkDrawer .sidebarLink:hover{background:#252528}.darkDrawer .selectedMediaFolder,.darkDrawer .sidebarLink.selectedSidebarLink{background:#252528!important;color:#52B54B!important}body:not(.dashboardDocument) .headerAppsButton{display:none}.mainDrawer-scrollContainer{padding-bottom:10vh}.dashboardDocument .mainDrawerPanelContent{-webkit-transition:left ease-in-out .3s,padding ease-in-out .3s;-o-transition:left ease-in-out .3s,padding ease-in-out .3s;transition:left ease-in-out .3s,padding ease-in-out .3s;position:absolute;top:0;right:0;bottom:0;left:0}@media all and (min-width:640px){.dashboardDocument .adminDrawerLogo,.dashboardDocument .mainDrawerButton,.dashboardDocument .tmla-mask{display:none!important}.mainDrawerPanel .viewMenuBarTabs{width:auto;padding-left:272px}.viewMenuBarTabs .libraryViewNav{text-align:left!important}.dashboardDocument .sidebarLink{padding:.7em 0 .7em 2.4em}.dashboardDocument .mainDrawer{z-index:inherit!important;left:0!important;top:0!important;-webkit-transform:none!important;transform:none!important}.dashboardDocument .mainDrawer-scrollContainer{margin-top:50px!important}.dashboardDocument.withTallToolbar .mainDrawer-scrollContainer{margin-top:98px!important}.dashboardDocument .mainDrawerPanelContent{position:absolute;top:0;right:0;bottom:0;left:260px}.dashboardDocument .darkDrawer{background-color:rgba(28,28,31,.3)!important}} \ No newline at end of file +.headerUserImage,.viewMenuBar paper-icon-button,.viewMenuLink{vertical-align:middle}.libraryPage{padding-top:50px!important}.libraryPage:not(.noSecondaryNavPage){padding-top:95px!important}.pageWithAbsoluteTabs:not(.noSecondaryNavPage){padding-top:98px!important}.absolutePageTabContent{position:absolute;left:0;right:0;bottom:0;z-index:1;margin:0!important;top:102px!important;-webkit-transition:-webkit-transform .2s ease-out;-o-transition:transform .2s ease-out;transition:transform .2s ease-out}.absolutePageTabContent.headroomUnpinned{-webkit-transform:translateY(-92px);transform:translateY(-92px);bottom:-92px!important}.pageTabContent:not(.is-active){display:none!important}.sidebarDivider{height:1px;background:#eaeaea;margin:.5em 0}.headerUserImage{-webkit-background-size:contain;background-size:contain;background-repeat:no-repeat;background-position:center center;-webkit-border-radius:1000px;border-radius:1000px;display:inline-block}.headerUserButtonRound img{-webkit-border-radius:1000px;border-radius:1000px}.headerButton{-webkit-flex-shrink:0;flex-shrink:0}.menuArrow{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAbklEQ…yGDxkLaBtENI9kPMk0gaoW0Dyj0aWowFLYNYzWB6MWMAAAq1H3+Mhu2hQAAAAASUVORK5CYII=);height:24px;width:24px;display:inline-block}.hideMainDrawer .mainDrawerButton{display:none}.libraryMenuButtonText{text-decoration:none;display:-webkit-inline-box;display:-webkit-inline-flex;display:inline-flex;vertical-align:middle;padding-left:0!important;cursor:default;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;-webkit-box-align:center;-webkit-align-items:center;align-items:center;margin:0 0 0 .5em;-webkit-flex-shrink:1;flex-shrink:1}.libraryViewNav,.viewMenuBar{z-index:999;display:-webkit-box;display:-webkit-flex}.viewMenuBar{position:fixed;right:0;left:0;top:0;border:0;height:50px;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}.hiddenViewMenuBar .viewMenuBar{display:none}.libraryViewNav{overflow:hidden;text-transform:uppercase;white-space:nowrap;padding:0;display:flex;display:block;text-align:center;margin:0 auto;-webkit-box-align:center;-webkit-align-items:center;align-items:center;font-size:13px}.ui-body-b .libraryViewNav{position:fixed;right:0;left:0;top:50px}.libraryViewNav.bottom{top:auto!important;bottom:0}.ui-body-b .libraryViewNav,.viewMenuBar{background-color:#222326;color:#fff}.viewMenuBar .primaryIcons{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;width:100%;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.dashboardDocument{font-size:13px}.dashboardDocument .viewMenuBar{height:auto}.dashboardDocument .viewMenuBar .primaryIcons{padding:.7em 0}.dashboardDocument.withTallToolbar .primaryIcons{padding-bottom:0}.viewMenuBarTabs{width:100%}.viewMenuBarTabs .paperTabLink{padding-left:1.5em;padding-right:1.5em}.viewMenuBar.semiTransparent{background-color:rgba(15,15,15,.3)}.viewMenuLink{text-decoration:none;color:#eee!important;padding:7px .5em 6px;display:inline-block}.viewMenuLink:hover{color:#fff}.viewMenuLink:hover img{opacity:.5}.viewMenuLink img{height:24px;vertical-align:top}.viewMenuSecondary{margin-left:auto;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.selectedMediaFolder{background-color:#f2f2f2!important}.ui-panel.ui-body-b{background-color:#1D1D20}@media all and (max-width:800px){.editorViewMenu{display:none}}.sidebarLink{display:block;text-decoration:none;color:#111!important;font-weight:400!important;vertical-align:middle;padding:1em 0 1em 2.4em}.sidebarLink:hover{background:#f2f2f2}.sidebarLink.selectedSidebarLink{background:#f2f2f2!important}.sidebarHeader{padding-left:1.4em;margin:1.2em 0 .7em;color:#666}body:not(.dashboardDocument) .btnNotifications{display:none!important}.darkDrawer{background-color:#1C1C1F!important}.darkDrawer .sidebarLink,.darkDrawer .sidebarLinkText{color:#fff!important}.darkDrawer .sidebarHeader{color:#bbb!important}.darkDrawer .sidebarDivider{background:#262626!important}.darkDrawer .sidebarLink:hover{background:#252528}.darkDrawer .selectedMediaFolder,.darkDrawer .sidebarLink.selectedSidebarLink{background:#252528!important;color:#52B54B!important}body:not(.dashboardDocument) .headerAppsButton{display:none}.mainDrawer-scrollContainer{padding-bottom:10vh}.dashboardDocument .mainDrawerPanelContent{-webkit-transition:left ease-in-out .3s,padding ease-in-out .3s;-o-transition:left ease-in-out .3s,padding ease-in-out .3s;transition:left ease-in-out .3s,padding ease-in-out .3s;position:absolute;top:0;right:0;bottom:0;left:0}@media all and (min-width:640px){.dashboardDocument .adminDrawerLogo,.dashboardDocument .mainDrawerButton,.dashboardDocument .tmla-mask{display:none!important}.viewMenuBarTabs{width:auto;padding-left:272px}.viewMenuBarTabs .libraryViewNav{text-align:left!important}.dashboardDocument .sidebarLink{padding:.7em 0 .7em 2.4em}.dashboardDocument .mainDrawer{z-index:inherit!important;left:0!important;top:0!important;-webkit-transform:none!important;transform:none!important}.dashboardDocument .mainDrawer-scrollContainer{margin-top:50px!important}.dashboardDocument.withTallToolbar .mainDrawer-scrollContainer{margin-top:98px!important}.dashboardDocument .mainDrawerPanelContent{position:absolute;top:0;right:0;bottom:0;left:260px}.dashboardDocument .darkDrawer{background-color:rgba(28,28,31,.3)!important}} \ No newline at end of file diff --git a/dashboard-ui/index.html b/dashboard-ui/index.html index 27c4358021..ce8a2d4247 100644 --- a/dashboard-ui/index.html +++ b/dashboard-ui/index.html @@ -18,12 +18,10 @@
-
-
-
-
-
-
+
+
+
+
\ No newline at end of file diff --git a/dashboard-ui/scripts/librarymenu.js b/dashboard-ui/scripts/librarymenu.js index f00af2c59d..fe20471a63 100644 --- a/dashboard-ui/scripts/librarymenu.js +++ b/dashboard-ui/scripts/librarymenu.js @@ -1 +1 @@ -define(["layoutManager","viewManager","libraryBrowser","embyRouter","playbackManager","paper-icon-button-light","material-icons","scrollStyles"],function(layoutManager,viewManager,libraryBrowser,embyRouter,playbackManager){"use strict";function renderHeader(){var html="";html+='
';var backIcon=browserInfo.safari?"chevron_left":"";html+='",html+='',html+='',html+='

'+Globalize.translate("ButtonHome")+"

",html+='
',html+='',html+='',html+='',html+='',html+='',html+='',browserInfo.mobile||(html+=''),html+="
",html+="
",html+='
',html+="
";var viewMenuBar=document.createElement("div");viewMenuBar.classList.add("viewMenuBar"),viewMenuBar.innerHTML=html,document.querySelector(".skinHeader").appendChild(viewMenuBar),lazyLoadViewMenuBarImages(),bindMenuEvents()}function lazyLoadViewMenuBarImages(){require(["imageLoader"],function(imageLoader){imageLoader.lazyChildren(document.querySelector(".viewMenuBar"))})}function onBackClick(){embyRouter.back()}function updateUserInHeader(user){var header=document.querySelector(".viewMenuBar");if(header){var hasImage,headerUserButton=header.querySelector(".headerUserButton");if(user&&user.name&&user.imageUrl){var userButtonHeight=26,url=user.imageUrl;user.supportsImageParams&&(url+="&height="+Math.round(userButtonHeight*Math.max(window.devicePixelRatio||1,2))),headerUserButton&&(updateHeaderUserButton(headerUserButton,url),hasImage=!0)}headerUserButton&&!hasImage&&updateHeaderUserButton(headerUserButton,null),user&&updateLocalUser(user.localUser),requiresUserRefresh=!1}}function updateHeaderUserButton(headerUserButton,src){src?(headerUserButton.classList.add("headerUserButtonRound"),headerUserButton.classList.remove("autoSize"),headerUserButton.innerHTML=''):(headerUserButton.classList.remove("headerUserButtonRound"),headerUserButton.classList.add("autoSize"),headerUserButton.innerHTML='person')}function updateLocalUser(user){var header=document.querySelector(".viewMenuBar"),headerSearchButton=header.querySelector(".headerSearchButton"),btnCast=header.querySelector(".btnCast"),dashboardEntryHeaderButton=header.querySelector(".dashboardEntryHeaderButton");user?(btnCast.classList.remove("hide"),headerSearchButton&&headerSearchButton.classList.remove("hide"),dashboardEntryHeaderButton&&(user.Policy.IsAdministrator?dashboardEntryHeaderButton.classList.remove("hide"):dashboardEntryHeaderButton.classList.add("hide")),require(["apphost"],function(apphost){apphost.supports("voiceinput")?header.querySelector(".headerVoiceButton").classList.add("hide"):header.querySelector(".headerVoiceButton").classList.add("hide")})):(btnCast.classList.add("hide"),header.querySelector(".headerVoiceButton").classList.add("hide"),headerSearchButton&&headerSearchButton.classList.add("hide"),dashboardEntryHeaderButton&&dashboardEntryHeaderButton.classList.add("hide"))}function showVoice(){require(["voiceDialog"],function(voiceDialog){voiceDialog.showDialog()})}function showSearch(){Dashboard.navigate("search.html")}function onHeaderUserButtonClick(e){Dashboard.showUserFlyout(e.target)}function onHeaderAppsButtonClick(){Dashboard.navigate("home.html")}function bindMenuEvents(){mainDrawerButton=document.querySelector(".mainDrawerButton"),mainDrawerButton&&mainDrawerButton.addEventListener("click",toggleMainDrawer);var headerBackButton=document.querySelector(".headerBackButton");headerBackButton&&headerBackButton.addEventListener("click",onBackClick);var headerVoiceButton=document.querySelector(".headerVoiceButton");headerVoiceButton&&headerVoiceButton.addEventListener("click",showVoice);var headerSearchButton=document.querySelector(".headerSearchButton");headerSearchButton&&headerSearchButton.addEventListener("click",showSearch);var headerUserButton=document.querySelector(".headerUserButton");headerUserButton&&headerUserButton.addEventListener("click",onHeaderUserButtonClick);var headerAppsButton=document.querySelector(".headerAppsButton");headerAppsButton&&headerAppsButton.addEventListener("click",onHeaderAppsButtonClick);var viewMenuBar=document.querySelector(".viewMenuBar");initHeadRoom(viewMenuBar),viewMenuBar.querySelector(".btnNotifications").addEventListener("click",function(){Dashboard.navigate("notificationlist.html")});var btnCast=document.querySelector(".headerButton-btnCast");btnCast&&btnCast.addEventListener("click",onCastButtonClicked)}function onCastButtonClicked(){var btn=this;require(["playerSelectionMenu"],function(playerSelectionMenu){playerSelectionMenu.show(btn)})}function getItemHref(item,context){return libraryBrowser.getHref(item,context)}function toggleMainDrawer(){navDrawerInstance.isVisible?closeMainDrawer():openMainDrawer()}function openMainDrawer(){navDrawerInstance.open(),lastOpenTime=(new Date).getTime()}function onMainDrawerOpened(){browserInfo.mobile&&document.body.classList.add("bodyWithPopupOpen")}function closeMainDrawer(){navDrawerInstance.close()}function onMainDrawerSelect(e){navDrawerInstance.isVisible?onMainDrawerOpened():document.body.classList.remove("bodyWithPopupOpen")}function refreshLibraryInfoInDrawer(user,drawer){var html="";html+='
';var homeHref=window.ApiClient?"home.html":"selectserver.html?showuser=1";html+=''+Globalize.translate("ButtonHome")+"",html+=''+Globalize.translate("ButtonRemote")+"",html+='
',html+='
',html+="
";var localUser=user.localUser;localUser&&localUser.Policy.IsAdministrator&&(html+='
',html+='
',html+='
',html+=Globalize.translate("HeaderAdmin"),html+="
",html+=''+Globalize.translate("ButtonManageServer")+"",html+=''+Globalize.translate("MetadataManager")+"",browserInfo.mobile||(html+=''+Globalize.translate("ButtonReports")+""),html+="
"),html+='
',html+='
',user.localUser&&AppInfo.isNativeApp&&browserInfo.android&&(html+=''+Globalize.translate("ButtonSettings")+""),html+=''+Globalize.translate("ManageOfflineDownloads")+"",html+=''+Globalize.translate("SyncToOtherDevices")+"",Dashboard.isConnectMode()&&(html+=''+Globalize.translate("ButtonSelectServer")+""),user.localUser&&(html+=''+Globalize.translate("ButtonSignOut")+""),html+="
",navDrawerScrollContainer.innerHTML=html;var lnkManageServer=navDrawerScrollContainer.querySelector(".lnkManageServer");lnkManageServer&&lnkManageServer.addEventListener("click",onManageServerClicked)}function refreshDashboardInfoInDrawer(page,user){loadNavDrawer().then(function(){navDrawerScrollContainer.querySelector(".adminDrawerLogo")?updateDashboardMenuSelectedItem():createDashboardMenu(page)})}function updateDashboardMenuSelectedItem(){for(var links=navDrawerScrollContainer.querySelectorAll(".sidebarLink"),i=0,length=links.length;i',html+=Globalize.translate("HeaderMedia"),html+="
",html+=items.map(function(i){var icon="folder",color="inherit",itemId=i.Id;"channels"==i.CollectionType?itemId="channels":"livetv"==i.CollectionType&&(itemId="livetv"),"photos"==i.CollectionType?(icon="photo_library",color="#009688"):"music"==i.CollectionType||"musicvideos"==i.CollectionType?(icon="library_music",color="#FB8521"):"books"==i.CollectionType?(icon="library_books",color="#1AA1E1"):"playlists"==i.CollectionType?(icon="view_list",color="#795548"):"games"==i.CollectionType?(icon="games",color="#F44336"):"movies"==i.CollectionType?(icon="video_library",color="#CE5043"):"channels"==i.CollectionType||"Channel"==i.Type?(icon="videocam",color="#E91E63"):"tvshows"==i.CollectionType?(icon="tv",color="#4CAF50"):"livetv"==i.CollectionType&&(icon="live_tv",color="#293AAE"),icon=i.icon||icon;var onclick=i.onclick?" function(){"+i.onclick+"}":"null";return''+i.Name+""}).join(""),libraryMenuOptions.innerHTML=html;for(var elem=libraryMenuOptions,sidebarLinks=elem.querySelectorAll(".sidebarLink"),i=0,length=sidebarLinks.length;i200&&setTimeout(function(){closeMainDrawer(),setTimeout(function(){action?action():Dashboard.navigate(link.href)},getNavigateDelay())},50),event.stopPropagation(),event.preventDefault(),!1)},onLogoutClicked:function(){return(new Date).getTime()-lastOpenTime>200&&(closeMainDrawer(),setTimeout(function(){Dashboard.logout()},getNavigateDelay())),!1},onHardwareMenuButtonClick:function(){toggleMainDrawer()},onSettingsClicked:function(event){return 1!=event.which||(Dashboard.navigate("dashboard.html"),!1)},setTabs:function(type,selectedIndex,builder){var viewMenuBarTabs;return type?(viewMenuBarTabs=document.querySelector(".viewMenuBarTabs"),LibraryMenu.tabType||viewMenuBarTabs.classList.remove("hide"),void require(["emby-tabs","emby-button"],function(){if(LibraryMenu.tabType!=type){var index=0;return viewMenuBarTabs.innerHTML='
'+builder().map(function(t){var tabClass=selectedIndex==index?"emby-tab-button emby-tab-button-active":"emby-tab-button",tabHtml='";return index++,tabHtml}).join("")+"
",document.body.classList.add("withTallToolbar"),void(LibraryMenu.tabType=type)}viewMenuBarTabs.querySelector('[is="emby-tabs"]').selectedIndex(selectedIndex),LibraryMenu.tabType=type})):void(LibraryMenu.tabType&&(document.body.classList.remove("withTallToolbar"),viewMenuBarTabs=document.querySelector(".viewMenuBarTabs"),viewMenuBarTabs.innerHTML="",viewMenuBarTabs.classList.add("hide"),LibraryMenu.tabType=null))},setTitle:function(title){var html=title,page=viewManager.currentView();if(page){var helpUrl=page.getAttribute("data-helpurl");helpUrl&&(html+='")}var libraryMenuButtonText=document.querySelector(".libraryMenuButtonText");libraryMenuButtonText&&(libraryMenuButtonText.innerHTML=html),document.title=title||"Emby"},setTransparentMenu:function(transparent){var viewMenuBar=document.querySelector(".viewMenuBar");viewMenuBar&&(transparent?viewMenuBar.classList.add("semiTransparent"):viewMenuBar.classList.remove("semiTransparent"))}},pageClassOn("pagebeforeshow","page",function(e){var page=this;page.classList.contains("withTabs")||(LibraryMenu.setTabs(null),page.classList.contains("pageWithAbsoluteTabs")?document.body.classList.add("withTallToolbar"):document.body.classList.remove("withTallToolbar"))}),pageClassOn("pageshow","page",function(e){var page=this,isDashboardPage=page.classList.contains("type-interior");isDashboardPage?(mainDrawerButton&&mainDrawerButton.classList.remove("hide"),refreshDashboardInfoInDrawer(page)):(mainDrawerButton&&(enableLibraryNavDrawer?mainDrawerButton.classList.remove("hide"):mainDrawerButton.classList.add("hide")),(navDrawerElement&&navDrawerElement.classList.contains("adminDrawer")||!navDrawerElement&&enableLibraryNavDrawer)&&refreshLibraryDrawer()),setDrawerClass(page),updateViewMenuBar(page),e.detail.isRestored||window.scrollTo(0,0),updateTitle(page),updateBackButton(page),page.classList.contains("libraryPage")?(document.body.classList.add("libraryDocument"),document.body.classList.remove("dashboardDocument"),document.body.classList.remove("hideMainDrawer")):isDashboardPage?(document.body.classList.remove("libraryDocument"),document.body.classList.add("dashboardDocument"),document.body.classList.remove("hideMainDrawer")):(document.body.classList.remove("libraryDocument"),document.body.classList.remove("dashboardDocument"),document.body.classList.add("hideMainDrawer")),updateLibraryNavLinks(page)}),window.ApiClient&&initializeApiClient(window.ApiClient),renderHeader(),Events.on(ConnectionManager,"apiclientcreated",function(e,apiClient){initializeApiClient(apiClient)}),Events.on(ConnectionManager,"localusersignedin",function(e,user){setDrawerClass(),ConnectionManager.user(ConnectionManager.getApiClient(user.ServerId)).then(function(user){refreshLibraryDrawer(user),updateUserInHeader(user)})}),Events.on(ConnectionManager,"localusersignedout",updateUserInHeader),Events.on(playbackManager,"playerchange",updateCastIcon),setDrawerClass(),enableBottomTabs&&require(["appfooter-shared","dockedtabs"],function(footer,dockedtabs){new dockedtabs({appFooter:footer})}),LibraryMenu}); \ No newline at end of file +define(["layoutManager","viewManager","libraryBrowser","embyRouter","playbackManager","paper-icon-button-light","material-icons","scrollStyles"],function(layoutManager,viewManager,libraryBrowser,embyRouter,playbackManager){"use strict";function renderHeader(){var html="";html+='
';var backIcon=browserInfo.safari?"chevron_left":"";html+='",html+='',html+='',html+='

'+Globalize.translate("ButtonHome")+"

",html+='
',html+='',html+='',html+='',html+='',html+='',html+='',browserInfo.mobile||(html+=''),html+="
",html+="
",html+='
',html+="
";var viewMenuBar=document.createElement("div");viewMenuBar.classList.add("viewMenuBar"),viewMenuBar.innerHTML=html,document.querySelector(".skinHeader").appendChild(viewMenuBar),lazyLoadViewMenuBarImages(),bindMenuEvents()}function lazyLoadViewMenuBarImages(){require(["imageLoader"],function(imageLoader){imageLoader.lazyChildren(document.querySelector(".viewMenuBar"))})}function onBackClick(){embyRouter.back()}function updateUserInHeader(user){var header=document.querySelector(".viewMenuBar");if(header){var hasImage,headerUserButton=header.querySelector(".headerUserButton");if(user&&user.name&&user.imageUrl){var userButtonHeight=26,url=user.imageUrl;user.supportsImageParams&&(url+="&height="+Math.round(userButtonHeight*Math.max(window.devicePixelRatio||1,2))),headerUserButton&&(updateHeaderUserButton(headerUserButton,url),hasImage=!0)}headerUserButton&&!hasImage&&updateHeaderUserButton(headerUserButton,null),user&&updateLocalUser(user.localUser),requiresUserRefresh=!1}}function updateHeaderUserButton(headerUserButton,src){src?(headerUserButton.classList.add("headerUserButtonRound"),headerUserButton.classList.remove("autoSize"),headerUserButton.innerHTML=''):(headerUserButton.classList.remove("headerUserButtonRound"),headerUserButton.classList.add("autoSize"),headerUserButton.innerHTML='person')}function updateLocalUser(user){var header=document.querySelector(".viewMenuBar"),headerSearchButton=header.querySelector(".headerSearchButton"),btnCast=header.querySelector(".btnCast"),dashboardEntryHeaderButton=header.querySelector(".dashboardEntryHeaderButton");user?(btnCast.classList.remove("hide"),headerSearchButton&&headerSearchButton.classList.remove("hide"),dashboardEntryHeaderButton&&(user.Policy.IsAdministrator?dashboardEntryHeaderButton.classList.remove("hide"):dashboardEntryHeaderButton.classList.add("hide")),require(["apphost"],function(apphost){apphost.supports("voiceinput")?header.querySelector(".headerVoiceButton").classList.add("hide"):header.querySelector(".headerVoiceButton").classList.add("hide")})):(btnCast.classList.add("hide"),header.querySelector(".headerVoiceButton").classList.add("hide"),headerSearchButton&&headerSearchButton.classList.add("hide"),dashboardEntryHeaderButton&&dashboardEntryHeaderButton.classList.add("hide"))}function showVoice(){require(["voiceDialog"],function(voiceDialog){voiceDialog.showDialog()})}function showSearch(){Dashboard.navigate("search.html")}function onHeaderUserButtonClick(e){Dashboard.showUserFlyout(e.target)}function onHeaderAppsButtonClick(){Dashboard.navigate("home.html")}function bindMenuEvents(){mainDrawerButton=document.querySelector(".mainDrawerButton"),mainDrawerButton&&mainDrawerButton.addEventListener("click",toggleMainDrawer);var headerBackButton=document.querySelector(".headerBackButton");headerBackButton&&headerBackButton.addEventListener("click",onBackClick);var headerVoiceButton=document.querySelector(".headerVoiceButton");headerVoiceButton&&headerVoiceButton.addEventListener("click",showVoice);var headerSearchButton=document.querySelector(".headerSearchButton");headerSearchButton&&headerSearchButton.addEventListener("click",showSearch);var headerUserButton=document.querySelector(".headerUserButton");headerUserButton&&headerUserButton.addEventListener("click",onHeaderUserButtonClick);var headerAppsButton=document.querySelector(".headerAppsButton");headerAppsButton&&headerAppsButton.addEventListener("click",onHeaderAppsButtonClick);var viewMenuBar=document.querySelector(".viewMenuBar");initHeadRoom(viewMenuBar),viewMenuBar.querySelector(".btnNotifications").addEventListener("click",function(){Dashboard.navigate("notificationlist.html")});var btnCast=document.querySelector(".headerButton-btnCast");btnCast&&btnCast.addEventListener("click",onCastButtonClicked)}function onCastButtonClicked(){var btn=this;require(["playerSelectionMenu"],function(playerSelectionMenu){playerSelectionMenu.show(btn)})}function getItemHref(item,context){return libraryBrowser.getHref(item,context)}function toggleMainDrawer(){navDrawerInstance.isVisible?closeMainDrawer():openMainDrawer()}function openMainDrawer(){navDrawerInstance.open(),lastOpenTime=(new Date).getTime()}function onMainDrawerOpened(){browserInfo.mobile&&document.body.classList.add("bodyWithPopupOpen")}function closeMainDrawer(){navDrawerInstance.close()}function onMainDrawerSelect(e){navDrawerInstance.isVisible?onMainDrawerOpened():document.body.classList.remove("bodyWithPopupOpen")}function refreshLibraryInfoInDrawer(user,drawer){var html="";html+='
';var homeHref=window.ApiClient?"home.html":"selectserver.html?showuser=1";html+=''+Globalize.translate("ButtonHome")+"",html+=''+Globalize.translate("ButtonRemote")+"",html+='
',html+='
',html+="
";var localUser=user.localUser;localUser&&localUser.Policy.IsAdministrator&&(html+='
',html+='
',html+='
',html+=Globalize.translate("HeaderAdmin"),html+="
",html+=''+Globalize.translate("ButtonManageServer")+"",html+=''+Globalize.translate("MetadataManager")+"",browserInfo.mobile||(html+=''+Globalize.translate("ButtonReports")+""),html+="
"),html+='
',html+='
',user.localUser&&AppInfo.isNativeApp&&browserInfo.android&&(html+=''+Globalize.translate("ButtonSettings")+""),html+=''+Globalize.translate("ManageOfflineDownloads")+"",html+=''+Globalize.translate("SyncToOtherDevices")+"",Dashboard.isConnectMode()&&(html+=''+Globalize.translate("ButtonSelectServer")+""),user.localUser&&(html+=''+Globalize.translate("ButtonSignOut")+""),html+="
",navDrawerScrollContainer.innerHTML=html;var lnkManageServer=navDrawerScrollContainer.querySelector(".lnkManageServer");lnkManageServer&&lnkManageServer.addEventListener("click",onManageServerClicked),layoutManager.desktop&&navDrawerScrollContainer.classList.add("darkScroller")}function refreshDashboardInfoInDrawer(page,user){loadNavDrawer().then(function(){navDrawerScrollContainer.querySelector(".adminDrawerLogo")?updateDashboardMenuSelectedItem():createDashboardMenu(page)})}function updateDashboardMenuSelectedItem(){for(var links=navDrawerScrollContainer.querySelectorAll(".sidebarLink"),i=0,length=links.length;i',html+=Globalize.translate("HeaderMedia"),html+="
",html+=items.map(function(i){var icon="folder",color="inherit",itemId=i.Id;"channels"==i.CollectionType?itemId="channels":"livetv"==i.CollectionType&&(itemId="livetv"),"photos"==i.CollectionType?(icon="photo_library",color="#009688"):"music"==i.CollectionType||"musicvideos"==i.CollectionType?(icon="library_music",color="#FB8521"):"books"==i.CollectionType?(icon="library_books",color="#1AA1E1"):"playlists"==i.CollectionType?(icon="view_list",color="#795548"):"games"==i.CollectionType?(icon="games",color="#F44336"):"movies"==i.CollectionType?(icon="video_library",color="#CE5043"):"channels"==i.CollectionType||"Channel"==i.Type?(icon="videocam",color="#E91E63"):"tvshows"==i.CollectionType?(icon="tv",color="#4CAF50"):"livetv"==i.CollectionType&&(icon="live_tv",color="#293AAE"),icon=i.icon||icon;var onclick=i.onclick?" function(){"+i.onclick+"}":"null";return''+i.Name+""}).join(""),libraryMenuOptions.innerHTML=html;for(var elem=libraryMenuOptions,sidebarLinks=elem.querySelectorAll(".sidebarLink"),i=0,length=sidebarLinks.length;i200&&setTimeout(function(){closeMainDrawer(),setTimeout(function(){action?action():Dashboard.navigate(link.href)},getNavigateDelay())},50),event.stopPropagation(),event.preventDefault(),!1)},onLogoutClicked:function(){return(new Date).getTime()-lastOpenTime>200&&(closeMainDrawer(),setTimeout(function(){Dashboard.logout()},getNavigateDelay())),!1},onHardwareMenuButtonClick:function(){toggleMainDrawer()},onSettingsClicked:function(event){return 1!=event.which||(Dashboard.navigate("dashboard.html"),!1)},setTabs:function(type,selectedIndex,builder){var viewMenuBarTabs;return type?(viewMenuBarTabs=document.querySelector(".viewMenuBarTabs"),LibraryMenu.tabType||viewMenuBarTabs.classList.remove("hide"),void require(["emby-tabs","emby-button"],function(){if(LibraryMenu.tabType!=type){var index=0;return viewMenuBarTabs.innerHTML='
'+builder().map(function(t){var tabClass=selectedIndex==index?"emby-tab-button emby-tab-button-active":"emby-tab-button",tabHtml='";return index++,tabHtml}).join("")+"
",document.body.classList.add("withTallToolbar"),void(LibraryMenu.tabType=type)}viewMenuBarTabs.querySelector('[is="emby-tabs"]').selectedIndex(selectedIndex),LibraryMenu.tabType=type})):void(LibraryMenu.tabType&&(document.body.classList.remove("withTallToolbar"),viewMenuBarTabs=document.querySelector(".viewMenuBarTabs"),viewMenuBarTabs.innerHTML="",viewMenuBarTabs.classList.add("hide"),LibraryMenu.tabType=null))},setTitle:function(title){var html=title,page=viewManager.currentView();if(page){var helpUrl=page.getAttribute("data-helpurl");helpUrl&&(html+='")}var libraryMenuButtonText=document.querySelector(".libraryMenuButtonText");libraryMenuButtonText&&(libraryMenuButtonText.innerHTML=html),document.title=title||"Emby"},setTransparentMenu:function(transparent){var viewMenuBar=document.querySelector(".viewMenuBar");viewMenuBar&&(transparent?viewMenuBar.classList.add("semiTransparent"):viewMenuBar.classList.remove("semiTransparent"))}},pageClassOn("pagebeforeshow","page",function(e){var page=this;page.classList.contains("withTabs")||(LibraryMenu.setTabs(null),page.classList.contains("pageWithAbsoluteTabs")?document.body.classList.add("withTallToolbar"):document.body.classList.remove("withTallToolbar"))}),pageClassOn("pageshow","page",function(e){var page=this,isDashboardPage=page.classList.contains("type-interior");isDashboardPage?(mainDrawerButton&&mainDrawerButton.classList.remove("hide"),refreshDashboardInfoInDrawer(page)):(mainDrawerButton&&(enableLibraryNavDrawer?mainDrawerButton.classList.remove("hide"):mainDrawerButton.classList.add("hide")),(navDrawerElement&&navDrawerElement.classList.contains("adminDrawer")||!navDrawerElement&&enableLibraryNavDrawer)&&refreshLibraryDrawer()),setDrawerClass(page),updateViewMenuBar(page),e.detail.isRestored||window.scrollTo(0,0),updateTitle(page),updateBackButton(page),page.classList.contains("libraryPage")?(document.body.classList.add("libraryDocument"),document.body.classList.remove("dashboardDocument"),document.body.classList.remove("hideMainDrawer")):isDashboardPage?(document.body.classList.remove("libraryDocument"),document.body.classList.add("dashboardDocument"),document.body.classList.remove("hideMainDrawer")):(document.body.classList.remove("libraryDocument"),document.body.classList.remove("dashboardDocument"),document.body.classList.add("hideMainDrawer")),updateLibraryNavLinks(page)}),window.ApiClient&&initializeApiClient(window.ApiClient),renderHeader(),Events.on(ConnectionManager,"apiclientcreated",function(e,apiClient){initializeApiClient(apiClient)}),Events.on(ConnectionManager,"localusersignedin",function(e,user){setDrawerClass(),ConnectionManager.user(ConnectionManager.getApiClient(user.ServerId)).then(function(user){refreshLibraryDrawer(user),updateUserInHeader(user)})}),Events.on(ConnectionManager,"localusersignedout",updateUserInHeader),Events.on(playbackManager,"playerchange",updateCastIcon),setDrawerClass(),enableBottomTabs&&require(["appfooter-shared","dockedtabs"],function(footer,dockedtabs){new dockedtabs({appFooter:footer})}),LibraryMenu}); \ No newline at end of file diff --git a/dashboard-ui/serviceworker.js b/dashboard-ui/serviceworker.js index fba101b81f..99ceb2d6ca 100644 --- a/dashboard-ui/serviceworker.js +++ b/dashboard-ui/serviceworker.js @@ -1 +1 @@ -importScripts("bower_components/emby-webcomponents/serviceworker/notifications.js", "bower_components/emby-webcomponents/serviceworker/sync.js"); \ No newline at end of file +importScripts("bower_components/emby-webcomponents/serviceworker/notifications.js","bower_components/emby-webcomponents/serviceworker/sync.js"); \ No newline at end of file From c057c9a24cc5bb3c7c82d462612d0ac057e1e728 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 27 Jan 2017 23:23:06 -0500 Subject: [PATCH 09/19] fix merge conflicts --- .../htmlaudioplayer/plugin.js | 445 +--------------- dashboard-ui/scripts/editorsidebar.js | 483 +----------------- 2 files changed, 2 insertions(+), 926 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/htmlaudioplayer/plugin.js b/dashboard-ui/bower_components/emby-webcomponents/htmlaudioplayer/plugin.js index 7ba193ce96..15efc702d1 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/htmlaudioplayer/plugin.js +++ b/dashboard-ui/bower_components/emby-webcomponents/htmlaudioplayer/plugin.js @@ -1,444 +1 @@ -define(['events', 'browser', 'pluginManager', 'apphost', 'appSettings'], function (events, browser, pluginManager, appHost, appSettings) { - "use strict"; - - return function () { - - var self = this; - - self.name = 'Html Audio Player'; - self.type = 'mediaplayer'; - self.id = 'htmlaudioplayer'; - - // Let any players created by plugins take priority - self.priority = 1; - - var mediaElement; - var currentSrc; - var currentPlayOptions; - var started; - var _currentTime; - - function getSavedVolume() { - return appSettings.get("volume") || 1; - } - - function saveVolume(value) { - if (value) { - appSettings.set("volume", value); - } - } - - self.canPlayMediaType = function (mediaType) { - - return (mediaType || '').toLowerCase() === 'audio'; - }; - - self.getDeviceProfile = function () { - - return new Promise(function (resolve, reject) { - - require(['browserdeviceprofile'], function (profileBuilder) { - - var profile = profileBuilder({ - }); - resolve(profile); - }); - }); - }; - - self.currentSrc = function () { - return currentSrc; - }; - - self.play = function (options) { - - _currentTime = null; - started = false; - var elem = createMediaElement(); - - var val = options.url; - - var seconds = (options.playerStartPositionTicks || 0) / 10000000; - if (seconds) { - val += '#t=' + seconds; - } - - elem.crossOrigin = getCrossOriginValue(options.mediaSource); - elem.title = options.title; - - // Opera TV guidelines suggest using source elements, so let's do that if we have a valid mimeType - if (options.mimeType && browser.operaTv) { - - // Need to do this or we won't be able to restart a new stream - if (elem.currentSrc) { - elem.src = ''; - elem.removeAttribute('src'); - } - - elem.innerHTML = ''; - } else { - elem.src = val; - } - - currentSrc = val; - currentPlayOptions = options; - - return playWithPromise(elem); - }; - - function playWithPromise(elem) { - - try { - var promise = elem.play(); - if (promise && promise.then) { - // Chrome now returns a promise - return promise.catch(function (e) { - - var errorName = (e.name || '').toLowerCase(); - // safari uses aborterror - if (errorName === 'notallowederror' || - errorName === 'aborterror') { - // swallow this error because the user can still click the play button on the video element - return Promise.resolve(); - } - return Promise.reject(); - }); - } else { - return Promise.resolve(); - } - } catch (err) { - console.log('error calling video.play: ' + err); - return Promise.reject(); - } - } - - function getCrossOriginValue(mediaSource) { - - return 'anonymous'; - } - - // Save this for when playback stops, because querying the time at that point might return 0 - self.currentTime = function (val) { - - if (mediaElement) { - if (val != null) { - mediaElement.currentTime = val / 1000; - return; - } - - if (_currentTime) { - return _currentTime * 1000; - } - - return (mediaElement.currentTime || 0) * 1000; - } - }; - - self.duration = function (val) { - - if (mediaElement) { - var duration = mediaElement.duration; - if (duration && !isNaN(duration) && duration !== Number.POSITIVE_INFINITY && duration !== Number.NEGATIVE_INFINITY) { - return duration * 1000; - } - } - - return null; - }; - - function supportsFade() { - - if (browser.tv) { - // Not working on tizen. - // We could possibly enable on other tv's, but all smart tv browsers tend to be pretty primitive - return false; - } - - return true; - } - - self.stop = function (destroyPlayer) { - - cancelFadeTimeout(); - - var elem = mediaElement; - var src = currentSrc; - - if (elem && src) { - - if (!destroyPlayer || !supportsFade()) { - - if (!elem.paused) { - elem.pause(); - } - elem.src = ''; - elem.innerHTML = ''; - elem.removeAttribute("src"); - onEnded(); - return Promise.resolve(); - } - - var originalVolume = elem.volume; - - return fade(elem, elem.volume).then(function () { - if (!elem.paused) { - elem.pause(); - } - elem.src = ''; - elem.innerHTML = ''; - elem.removeAttribute("src"); - - elem.volume = originalVolume; - onEnded(); - }); - } - return Promise.resolve(); - }; - - self.destroy = function () { - - }; - - var fadeTimeout; - - function fade(elem, startingVolume) { - - // Need to record the starting volume on each pass rather than querying elem.volume - // This is due to iOS safari not allowing volume changes and always returning the system volume value - - var newVolume = Math.max(0, startingVolume - 0.15); - console.log('fading volume to ' + newVolume); - elem.volume = newVolume; - - if (newVolume <= 0) { - return Promise.resolve(); - } - - return new Promise(function (resolve, reject) { - - cancelFadeTimeout(); - - fadeTimeout = setTimeout(function () { - fade(elem, newVolume).then(resolve, reject); - }, 100); - }); - } - - function cancelFadeTimeout() { - var timeout = fadeTimeout; - if (timeout) { - clearTimeout(timeout); - fadeTimeout = null; - } - } - - self.pause = function () { - if (mediaElement) { - mediaElement.pause(); - } - }; - - // This is a retry after error - self.resume = function () { - if (mediaElement) { - mediaElement.play(); - } - }; - - self.unpause = function () { - if (mediaElement) { - mediaElement.play(); - } - }; - - self.paused = function () { - - if (mediaElement) { - return mediaElement.paused; - } - - return false; - }; - - self.setVolume = function (val) { - if (mediaElement) { - mediaElement.volume = val / 100; - } - }; - - self.getVolume = function () { - if (mediaElement) { - return mediaElement.volume * 100; - } - }; - - self.volumeUp = function () { - self.setVolume(Math.min(self.getVolume() + 2, 100)); - }; - - self.volumeDown = function () { - self.setVolume(Math.max(self.getVolume() - 2, 0)); - }; - - self.setMute = function (mute) { - - if (mediaElement) { - mediaElement.muted = mute; - } - }; - - self.isMuted = function () { - if (mediaElement) { - return mediaElement.muted; - } - return false; - }; - - function onEnded() { - - var stopInfo = { - src: currentSrc - }; - - events.trigger(self, 'stopped', [stopInfo]); - - _currentTime = null; - currentSrc = null; - currentPlayOptions = null; - } - - function onTimeUpdate() { - - // Get the player position + the transcoding offset - var time = this.currentTime; - _currentTime = time; - events.trigger(self, 'timeupdate'); - } - - function onVolumeChange() { - - if (!fadeTimeout) { - saveVolume(this.volume); - events.trigger(self, 'volumechange'); - } - } - - function onPlaying(e) { - - if (!started) { - started = true; - this.removeAttribute('controls'); - - seekOnPlaybackStart(e.target); - } - events.trigger(self, 'playing'); - } - - function seekOnPlaybackStart(element) { - - var seconds = (currentPlayOptions.playerStartPositionTicks || 0) / 10000000; - - if (seconds) { - var src = (self.currentSrc() || '').toLowerCase(); - - // Appending #t=xxx to the query string doesn't seem to work with HLS - // For plain video files, not all browsers support it either - if (!browser.chrome || src.indexOf('.m3u8') !== -1) { - - var delay = browser.safari ? 2500 : 0; - if (delay) { - setTimeout(function () { - element.currentTime = seconds; - }, delay); - } else { - element.currentTime = seconds; - } - } - } - } - - function onPause() { - events.trigger(self, 'pause'); - } - - function onError() { - - var errorCode = this.error ? this.error.code : ''; - errorCode = (errorCode || '').toString(); - console.log('Media element error code: ' + errorCode); - - var type; - - switch (errorCode) { - case 1: - // MEDIA_ERR_ABORTED - // This will trigger when changing media while something is playing - return; - case 2: - // MEDIA_ERR_NETWORK - type = 'network'; - break; - case 3: - // MEDIA_ERR_DECODE - break; - case 4: - // MEDIA_ERR_SRC_NOT_SUPPORTED - break; - } - - //events.trigger(self, 'error', [ - //{ - // type: type - //}]); - } - - function createMediaElement() { - - var elem = document.querySelector('.mediaPlayerAudio'); - - if (!elem) { - elem = document.createElement('audio'); - elem.classList.add('mediaPlayerAudio'); - elem.classList.add('hide'); - - document.body.appendChild(elem); - - elem.volume = getSavedVolume(); - - elem.addEventListener('timeupdate', onTimeUpdate); - elem.addEventListener('ended', onEnded); - elem.addEventListener('volumechange', onVolumeChange); - elem.addEventListener('pause', onPause); - elem.addEventListener('playing', onPlaying); - elem.addEventListener('error', onError); - } - - mediaElement = elem; - - return elem; - } - - function onDocumentClick() { - document.removeEventListener('click', onDocumentClick); - - var elem = document.createElement('audio'); - elem.classList.add('mediaPlayerAudio'); - elem.classList.add('hide'); - - document.body.appendChild(elem); - - elem.src = pluginManager.mapPath(self, 'blank.mp3'); - elem.play(); - - setTimeout(function () { - elem.src = ''; - elem.removeAttribute("src"); - }, 1000); - } - - // Mobile browsers don't allow autoplay, so this is a nice workaround - if (!appHost.supports('htmlaudioautoplay')) { - document.addEventListener('click', onDocumentClick); - } - }; -}); \ No newline at end of file +define(["events","browser","pluginManager","apphost","appSettings"],function(events,browser,pluginManager,appHost,appSettings){"use strict";return function(){function getSavedVolume(){return appSettings.get("volume")||1}function saveVolume(value){value&&appSettings.set("volume",value)}function playWithPromise(elem){try{var promise=elem.play();return promise&&promise.then?promise.catch(function(e){var errorName=(e.name||"").toLowerCase();return"notallowederror"===errorName||"aborterror"===errorName?Promise.resolve():Promise.reject()}):Promise.resolve()}catch(err){return console.log("error calling video.play: "+err),Promise.reject()}}function getCrossOriginValue(mediaSource){return"anonymous"}function supportsFade(){return!browser.tv}function fade(elem,startingVolume){var newVolume=Math.max(0,startingVolume-.15);return console.log("fading volume to "+newVolume),elem.volume=newVolume,newVolume<=0?Promise.resolve():new Promise(function(resolve,reject){cancelFadeTimeout(),fadeTimeout=setTimeout(function(){fade(elem,newVolume).then(resolve,reject)},100)})}function cancelFadeTimeout(){var timeout=fadeTimeout;timeout&&(clearTimeout(timeout),fadeTimeout=null)}function onEnded(){var stopInfo={src:currentSrc};events.trigger(self,"stopped",[stopInfo]),_currentTime=null,currentSrc=null,currentPlayOptions=null}function onTimeUpdate(){var time=this.currentTime;_currentTime=time,events.trigger(self,"timeupdate")}function onVolumeChange(){fadeTimeout||(saveVolume(this.volume),events.trigger(self,"volumechange"))}function onPlaying(e){started||(started=!0,this.removeAttribute("controls"),seekOnPlaybackStart(e.target)),events.trigger(self,"playing")}function seekOnPlaybackStart(element){var seconds=(currentPlayOptions.playerStartPositionTicks||0)/1e7;if(seconds){var src=(self.currentSrc()||"").toLowerCase();if(!browser.chrome||src.indexOf(".m3u8")!==-1){var delay=browser.safari?2500:0;delay?setTimeout(function(){element.currentTime=seconds},delay):element.currentTime=seconds}}}function onPause(){events.trigger(self,"pause")}function onError(){var errorCode=this.error?this.error.code:"";errorCode=(errorCode||"").toString(),console.log("Media element error code: "+errorCode);var type;switch(errorCode){case 1:return;case 2:type="network";break;case 3:break;case 4:}}function createMediaElement(){var elem=document.querySelector(".mediaPlayerAudio");return elem||(elem=document.createElement("audio"),elem.classList.add("mediaPlayerAudio"),elem.classList.add("hide"),document.body.appendChild(elem),elem.volume=getSavedVolume(),elem.addEventListener("timeupdate",onTimeUpdate),elem.addEventListener("ended",onEnded),elem.addEventListener("volumechange",onVolumeChange),elem.addEventListener("pause",onPause),elem.addEventListener("playing",onPlaying),elem.addEventListener("error",onError)),mediaElement=elem,elem}function onDocumentClick(){document.removeEventListener("click",onDocumentClick);var elem=document.createElement("audio");elem.classList.add("mediaPlayerAudio"),elem.classList.add("hide"),document.body.appendChild(elem),elem.src=pluginManager.mapPath(self,"blank.mp3"),elem.play(),setTimeout(function(){elem.src="",elem.removeAttribute("src")},1e3)}var self=this;self.name="Html Audio Player",self.type="mediaplayer",self.id="htmlaudioplayer",self.priority=1;var mediaElement,currentSrc,currentPlayOptions,started,_currentTime;self.canPlayMediaType=function(mediaType){return"audio"===(mediaType||"").toLowerCase()},self.getDeviceProfile=function(){return new Promise(function(resolve,reject){require(["browserdeviceprofile"],function(profileBuilder){var profile=profileBuilder({});resolve(profile)})})},self.currentSrc=function(){return currentSrc},self.play=function(options){_currentTime=null,started=!1;var elem=createMediaElement(),val=options.url,seconds=(options.playerStartPositionTicks||0)/1e7;return seconds&&(val+="#t="+seconds),elem.crossOrigin=getCrossOriginValue(options.mediaSource),elem.title=options.title,options.mimeType&&browser.operaTv?(elem.currentSrc&&(elem.src="",elem.removeAttribute("src")),elem.innerHTML=''):elem.src=val,currentSrc=val,currentPlayOptions=options,playWithPromise(elem)},self.currentTime=function(val){if(mediaElement)return null!=val?void(mediaElement.currentTime=val/1e3):_currentTime?1e3*_currentTime:1e3*(mediaElement.currentTime||0)},self.duration=function(val){if(mediaElement){var duration=mediaElement.duration;if(duration&&!isNaN(duration)&&duration!==Number.POSITIVE_INFINITY&&duration!==Number.NEGATIVE_INFINITY)return 1e3*duration}return null},self.stop=function(destroyPlayer){cancelFadeTimeout();var elem=mediaElement,src=currentSrc;if(elem&&src){if(!destroyPlayer||!supportsFade())return elem.paused||elem.pause(),elem.src="",elem.innerHTML="",elem.removeAttribute("src"),onEnded(),Promise.resolve();var originalVolume=elem.volume;return fade(elem,elem.volume).then(function(){elem.paused||elem.pause(),elem.src="",elem.innerHTML="",elem.removeAttribute("src"),elem.volume=originalVolume,onEnded()})}return Promise.resolve()},self.destroy=function(){};var fadeTimeout;self.pause=function(){mediaElement&&mediaElement.pause()},self.resume=function(){mediaElement&&mediaElement.play()},self.unpause=function(){mediaElement&&mediaElement.play()},self.paused=function(){return!!mediaElement&&mediaElement.paused},self.setVolume=function(val){mediaElement&&(mediaElement.volume=val/100)},self.getVolume=function(){if(mediaElement)return 100*mediaElement.volume},self.volumeUp=function(){self.setVolume(Math.min(self.getVolume()+2,100))},self.volumeDown=function(){self.setVolume(Math.max(self.getVolume()-2,0))},self.setMute=function(mute){mediaElement&&(mediaElement.muted=mute)},self.isMuted=function(){return!!mediaElement&&mediaElement.muted},appHost.supports("htmlaudioautoplay")||document.addEventListener("click",onDocumentClick)}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/editorsidebar.js b/dashboard-ui/scripts/editorsidebar.js index be3d853b7f..631eba0699 100644 --- a/dashboard-ui/scripts/editorsidebar.js +++ b/dashboard-ui/scripts/editorsidebar.js @@ -1,482 +1 @@ -define(['datetime', 'jQuery', 'material-icons'], function (datetime, $) { - 'use strict'; - - function getNode(item, folderState, selected) { - - var htmlName = getNodeInnerHtml(item); - - var node = { - id: item.Id, - text: htmlName, - - state: { - opened: item.IsFolder && folderState == 'open', - selected: selected - }, - - li_attr: { - serveritemtype: item.Type, - collectiontype: item.CollectionType - } - }; - - if (item.IsFolder) { - node.children = [ - { - text: 'Loading...', - icon: false - }]; - node.icon = false; - } - else { - node.icon = false; - } - - if (node.state.opened) { - node.li_attr.loadedFromServer = true; - } - - if (selected) { - selectedNodeId = item.Id; - } - - return node; - } - - function getNodeInnerHtml(item) { - - var name = item.Name; - - // Channel number - if (item.Number) { - name = item.Number + " - " + name; - } - if (item.IndexNumber != null && item.Type != "Season") { - name = item.IndexNumber + " - " + name; - } - - var cssClass = "editorNode"; - - if (item.LocationType == "Offline") { - cssClass += " offlineEditorNode"; - } - - var htmlName = "
"; - - if (item.LockData) { - htmlName += 'lock'; - } - - htmlName += name; - - if (!item.ImageTags || !item.ImageTags.Primary) { - htmlName += ''; - } - - if (!item.BackdropImageTags || !item.BackdropImageTags.length) { - if (item.Type !== "Episode" && item.Type !== "Season" && item.MediaType !== "Audio" && item.Type !== "TvChannel" && item.Type !== "MusicAlbum") { - htmlName += ''; - } - } - - if (!item.ImageTags || !item.ImageTags.Logo) { - if (item.Type == "Movie" || item.Type == "Trailer" || item.Type == "Series" || item.Type == "MusicArtist" || item.Type == "BoxSet") { - htmlName += ''; - } - } - - if (item.Type == "Episode" && item.LocationType == "Virtual") { - - try { - if (item.PremiereDate && (new Date().getTime() >= datetime.parseISO8601Date(item.PremiereDate, true).getTime())) { - htmlName += ''; - } - } catch (err) { - - } - - } - - htmlName += "
"; - - return htmlName; - } - - function loadChildrenOfRootNode(page, scope, callback) { - - ApiClient.getLiveTvChannels({ limit: 0 }).then(function (result) { - - var nodes = []; - - nodes.push({ - - id: 'MediaFolders', - text: Globalize.translate('HeaderMediaFolders'), - state: { - opened: true - }, - li_attr: { - itemtype: 'mediafolders', - loadedFromServer: true - }, - icon: false - }); - - if (result.TotalRecordCount) { - - nodes.push({ - - id: 'livetv', - text: Globalize.translate('HeaderLiveTV'), - state: { - opened: false - }, - li_attr: { - itemtype: 'livetv' - }, - children: [ - { - text: 'Loading...', - icon: false - }], - icon: false - }); - } - - callback.call(scope, nodes); - - nodesToLoad.push('MediaFolders'); - }); - } - - function loadLiveTvChannels(service, openItems, callback) { - - ApiClient.getLiveTvChannels({ - - ServiceName: service, - AddCurrentProgram: false - - }).then(function (result) { - - var nodes = result.Items.map(function (i) { - - var state = openItems.indexOf(i.Id) == -1 ? 'closed' : 'open'; - - return getNode(i, state, false); - - }); - - callback(nodes); - - }); - - } - - function loadMediaFolders(page, scope, openItems, callback) { - - ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders")).then(function (result) { - - var nodes = result.Items.map(function (n) { - - var state = openItems.indexOf(n.Id) == -1 ? 'closed' : 'open'; - - return getNode(n, state, false); - - }); - - callback.call(scope, nodes); - - for (var i = 0, length = nodes.length; i < length; i++) { - if (nodes[i].state.opened) { - - nodesToLoad.push(nodes[i].id); - } - } - - }); - - } - - function loadNode(page, scope, node, openItems, selectedId, currentUser, callback) { - - var id = node.id; - - if (id == '#') { - - loadChildrenOfRootNode(page, scope, callback); - return; - } - - if (id == 'livetv') { - - loadLiveTvChannels(id, openItems, callback); - return; - } - - if (id == 'MediaFolders') { - - loadMediaFolders(page, scope, openItems, callback); - return; - } - - var query = { - ParentId: id, - Fields: 'Settings' - }; - - var itemtype = node.li_attr.itemtype; - - if (itemtype != "Season" && itemtype != "Series") { - query.SortBy = "SortName"; - } - - ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { - - var nodes = result.Items.map(function (n) { - - var state = openItems.indexOf(n.Id) == -1 ? 'closed' : 'open'; - - return getNode(n, state, n.Id == selectedId); - - }); - - callback.call(scope, nodes); - - for (var i = 0, length = nodes.length; i < length; i++) { - if (nodes[i].state.opened) { - - nodesToLoad.push(nodes[i].id); - } - } - - }); - - } - - function scrollToNode(id) { - - var elem = $('#' + id)[0]; - - if (elem) { - // commenting out for now because it's causing the whole window to scroll in chrome - elem.scrollIntoView(); - } - } - - function initializeTree(page, currentUser, openItems, selectedId) { - - require(['jstree'], function () { - initializeTreeInternal(page, currentUser, openItems, selectedId); - }); - } - - function onNodeSelect(event, data) { - var node = data.node; - - var eventData = { - id: node.id, - itemType: node.li_attr.itemtype, - serverItemType: node.li_attr.serveritemtype, - collectionType: node.li_attr.collectiontype - }; - - if (eventData.itemType != 'livetv' && eventData.itemType != 'mediafolders') { - - // We'd like to prevent these from being editable but this removes the ability to perform a top level refresh - //if (eventData.serverItemType != 'UserView' && eventData.serverItemType != 'CollectionFolder' && !eventData.collectionType) - { - this.dispatchEvent(new CustomEvent('itemclicked', { - detail: eventData, - bubbles: true, - cancelable: false - })); - } - } - } - - function onNodeOpen(event, data) { - - var page = $(this).parents('.page')[0]; - var node = data.node; - - if (node.children && node.children) { - loadNodesToLoad(page, node); - } - - if (node.li_attr && node.id != '#' && !node.li_attr.loadedFromServer) { - - node.li_attr.loadedFromServer = true; - - $.jstree.reference(".libraryTree", page).load_node(node.id, loadNodeCallback); - } - } - - function onNodeLoad(event, data) { - - var page = $(this).parents('.page')[0]; - var node = data.node; - - if (node.children && node.children) { - loadNodesToLoad(page, node); - } - - if (node.li_attr && node.id != '#' && !node.li_attr.loadedFromServer) { - - node.li_attr.loadedFromServer = true; - - $.jstree.reference(".libraryTree", page).load_node(node.id, loadNodeCallback); - } - } - - function initializeTreeInternal(page, currentUser, openItems, selectedId) { - - nodesToLoad = []; - selectedNodeId = null; - - $.jstree.destroy(); - - $('.libraryTree', page).jstree({ - - "plugins": ["wholerow"], - - core: { - - check_callback: true, - data: function (node, callback) { - - loadNode(page, this, node, openItems, selectedId, currentUser, callback); - }, - - themes: { - variant: 'large' - } - } - - }).off('select_node.jstree', onNodeSelect).on('select_node.jstree', onNodeSelect).off('open_node.jstree', onNodeOpen).on('open_node.jstree', onNodeOpen).off('load_node.jstree', onNodeLoad).on('load_node.jstree', onNodeLoad); - } - - function loadNodesToLoad(page, node) { - - var children = node.children; - - for (var i = 0, length = children.length; i < length; i++) { - - var child = children[i]; - - if (nodesToLoad.indexOf(child) != -1) { - - nodesToLoad = nodesToLoad.filter(function (n) { - return n != child; - }); - - $.jstree.reference(".libraryTree", page).load_node(child, loadNodeCallback); - } - } - } - - function loadNodeCallback(node) { - - if (selectedNodeId && node.children && node.children.indexOf(selectedNodeId) != -1) { - - setTimeout(function () { - - scrollToNode(selectedNodeId); - }, 500); - } - } - - var nodesToLoad = []; - var selectedNodeId; - - function updateEditorNode(page, item) { - - var elem = $('#' + item.Id + '>a', page)[0]; - - if (elem == null) { - return; - } - - $('.editorNode', elem).remove(); - - $(elem).append(getNodeInnerHtml(item)); - - if (item.IsFolder) { - - var tree = jQuery.jstree._reference(".libraryTree"); - var currentNode = tree._get_node(null, false); - tree.refresh(currentNode); - } - } - - $(document).on('itemsaved', ".metadataEditorPage", function (e, item) { - - updateEditorNode(this, item); - - }).on('pagebeforeshow', ".metadataEditorPage", function () { - - require(['css!css/metadataeditor.css']); - - }).on('pagebeforeshow', ".metadataEditorPage", function () { - - var page = this; - - Dashboard.getCurrentUser().then(function (user) { - - var id = getCurrentItemId(); - - if (id) { - - ApiClient.getAncestorItems(id, user.Id).then(function (ancestors) { - - var ids = ancestors.map(function (i) { - return i.Id; - }); - - initializeTree(page, user, ids, id); - }); - - } else { - initializeTree(page, user, []); - } - - }); - - }).on('pagebeforehide', ".metadataEditorPage", function () { - - var page = this; - - $('.libraryTree', page).off('select_node.jstree', onNodeSelect).off('open_node.jstree', onNodeOpen).off('load_node.jstree', onNodeLoad); - - }); - - var itemId; - function setCurrentItemId(id) { - itemId = id; - } - - function getCurrentItemId() { - - if (itemId) { - return itemId; - } - - var url = window.location.hash || window.location.href; - - return getParameterByName('id', url); - } - - window.MetadataEditor = { - getItemPromise: function () { - var currentItemId = getCurrentItemId(); - - if (currentItemId) { - return ApiClient.getItem(Dashboard.getCurrentUserId(), currentItemId); - } - - return ApiClient.getRootFolder(Dashboard.getCurrentUserId()); - }, - getCurrentItemId: getCurrentItemId, - setCurrentItemId: setCurrentItemId - }; - -}); \ No newline at end of file +define(["datetime","jQuery","material-icons"],function(datetime,$){"use strict";function getNode(item,folderState,selected){var htmlName=getNodeInnerHtml(item),node={id:item.Id,text:htmlName,state:{opened:item.IsFolder&&"open"==folderState,selected:selected},li_attr:{serveritemtype:item.Type,collectiontype:item.CollectionType}};return item.IsFolder?(node.children=[{text:"Loading...",icon:!1}],node.icon=!1):node.icon=!1,node.state.opened&&(node.li_attr.loadedFromServer=!0),selected&&(selectedNodeId=item.Id),node}function getNodeInnerHtml(item){var name=item.Name;item.Number&&(name=item.Number+" - "+name),null!=item.IndexNumber&&"Season"!=item.Type&&(name=item.IndexNumber+" - "+name);var cssClass="editorNode";"Offline"==item.LocationType&&(cssClass+=" offlineEditorNode");var htmlName="
";if(item.LockData&&(htmlName+='lock'),htmlName+=name,item.ImageTags&&item.ImageTags.Primary||(htmlName+=''),item.BackdropImageTags&&item.BackdropImageTags.length||"Episode"!==item.Type&&"Season"!==item.Type&&"Audio"!==item.MediaType&&"TvChannel"!==item.Type&&"MusicAlbum"!==item.Type&&(htmlName+=''),item.ImageTags&&item.ImageTags.Logo||"Movie"!=item.Type&&"Trailer"!=item.Type&&"Series"!=item.Type&&"MusicArtist"!=item.Type&&"BoxSet"!=item.Type||(htmlName+=''),"Episode"==item.Type&&"Virtual"==item.LocationType)try{item.PremiereDate&&(new Date).getTime()>=datetime.parseISO8601Date(item.PremiereDate,!0).getTime()&&(htmlName+='')}catch(err){}return htmlName+="
"}function loadChildrenOfRootNode(page,scope,callback){ApiClient.getLiveTvChannels({limit:0}).then(function(result){var nodes=[];nodes.push({id:"MediaFolders",text:Globalize.translate("HeaderMediaFolders"),state:{opened:!0},li_attr:{itemtype:"mediafolders",loadedFromServer:!0},icon:!1}),result.TotalRecordCount&&nodes.push({id:"livetv",text:Globalize.translate("HeaderLiveTV"),state:{opened:!1},li_attr:{itemtype:"livetv"},children:[{text:"Loading...",icon:!1}],icon:!1}),callback.call(scope,nodes),nodesToLoad.push("MediaFolders")})}function loadLiveTvChannels(service,openItems,callback){ApiClient.getLiveTvChannels({ServiceName:service,AddCurrentProgram:!1}).then(function(result){var nodes=result.Items.map(function(i){var state=openItems.indexOf(i.Id)==-1?"closed":"open";return getNode(i,state,!1)});callback(nodes)})}function loadMediaFolders(page,scope,openItems,callback){ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders")).then(function(result){var nodes=result.Items.map(function(n){var state=openItems.indexOf(n.Id)==-1?"closed":"open";return getNode(n,state,!1)});callback.call(scope,nodes);for(var i=0,length=nodes.length;ia",page)[0];if(null!=elem&&($(".editorNode",elem).remove(),$(elem).append(getNodeInnerHtml(item)),item.IsFolder)){var tree=jQuery.jstree._reference(".libraryTree"),currentNode=tree._get_node(null,!1);tree.refresh(currentNode)}}function setCurrentItemId(id){itemId=id}function getCurrentItemId(){if(itemId)return itemId;var url=window.location.hash||window.location.href;return getParameterByName("id",url)}var selectedNodeId,nodesToLoad=[];$(document).on("itemsaved",".metadataEditorPage",function(e,item){updateEditorNode(this,item)}).on("pagebeforeshow",".metadataEditorPage",function(){require(["css!css/metadataeditor.css"])}).on("pagebeforeshow",".metadataEditorPage",function(){var page=this;Dashboard.getCurrentUser().then(function(user){var id=getCurrentItemId();id?ApiClient.getAncestorItems(id,user.Id).then(function(ancestors){var ids=ancestors.map(function(i){return i.Id});initializeTree(page,user,ids,id)}):initializeTree(page,user,[])})}).on("pagebeforehide",".metadataEditorPage",function(){var page=this;$(".libraryTree",page).off("select_node.jstree",onNodeSelect).off("open_node.jstree",onNodeOpen).off("load_node.jstree",onNodeLoad)});var itemId;window.MetadataEditor={getItemPromise:function(){var currentItemId=getCurrentItemId();return currentItemId?ApiClient.getItem(Dashboard.getCurrentUserId(),currentItemId):ApiClient.getRootFolder(Dashboard.getCurrentUserId())},getCurrentItemId:getCurrentItemId,setCurrentItemId:setCurrentItemId}}); \ No newline at end of file From 38ab72abf3127bc72dc4658c899591b9a80ba8cc Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 29 Jan 2017 18:46:52 -0500 Subject: [PATCH 10/19] add autoplay detection --- dashboard-ui/bower_components/emby-apiclient/apiclient.js | 2 +- .../emby-webcomponents/actionsheet/actionsheet.css | 2 +- .../emby-webcomponents/actionsheet/actionsheet.js | 2 +- .../bower_components/emby-webcomponents/chromecastplayer.js | 2 +- .../emby-webcomponents/playback/autoplaydetect.js | 1 + .../emby-webcomponents/playback/playbackmanager.js | 2 +- .../emby-webcomponents/playback/playersettingsmenu.js | 2 +- .../bower_components/emby-webcomponents/qualityoptions.js | 2 +- .../bower_components/emby-webcomponents/sessionplayer.js | 2 +- dashboard-ui/components/apphost.js | 2 +- dashboard-ui/components/iap.js | 2 +- dashboard-ui/scripts/mypreferenceslanguages.js | 2 +- dashboard-ui/scripts/site.js | 4 ++-- 13 files changed, 14 insertions(+), 13 deletions(-) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/playback/autoplaydetect.js diff --git a/dashboard-ui/bower_components/emby-apiclient/apiclient.js b/dashboard-ui/bower_components/emby-apiclient/apiclient.js index f17f20dece..5b5ac0eb97 100644 --- a/dashboard-ui/bower_components/emby-apiclient/apiclient.js +++ b/dashboard-ui/bower_components/emby-apiclient/apiclient.js @@ -1,2 +1,2 @@ -define(["events"],function(events){"use strict";return function(serverAddress,clientName,applicationVersion,deviceName,deviceId,devicePixelRatio){function redetectBitrate(){stopBitrateDetection(),self.accessToken()&&self.enableAutomaticBitrateDetection!==!1&&setTimeout(redetectBitrateInternal,6e3)}function redetectBitrateInternal(){self.detectBitrate()}function stopBitrateDetection(){detectTimeout&&clearTimeout(detectTimeout)}function onFetchFail(url,response){events.trigger(self,"requestfail",[{url:url,status:response.status,errorCode:response.headers?response.headers.get("X-Application-Error-Code"):null}])}function getFetchPromise(request){var headers=request.headers||{};"json"===request.dataType&&(headers.accept="application/json");var fetchRequest={headers:headers,method:request.type,credentials:"same-origin"},contentType=request.contentType;return request.data&&("string"==typeof request.data?fetchRequest.body=request.data:(fetchRequest.body=paramsToString(request.data),contentType=contentType||"application/x-www-form-urlencoded; charset=UTF-8")),contentType&&(headers["Content-Type"]=contentType),request.timeout?fetchWithTimeout(request.url,fetchRequest,request.timeout):fetch(request.url,fetchRequest)}function fetchWithTimeout(url,options,timeoutMs){return new Promise(function(resolve,reject){var timeout=setTimeout(reject,timeoutMs);options=options||{},options.credentials="same-origin",fetch(url,options).then(function(response){clearTimeout(timeout),resolve(response)},function(error){clearTimeout(timeout),reject(error)})})}function paramsToString(params){var values=[];for(var key in params){var value=params[key];null!==value&&void 0!==value&&""!==value&&values.push(encodeURIComponent(key)+"="+encodeURIComponent(value))}return values.join("&")}function switchConnectionMode(connectionMode){var currentServerInfo=self.serverInfo(),newConnectionMode=connectionMode;return newConnectionMode--,newConnectionMode<0&&(newConnectionMode=MediaBrowser.ConnectionMode.Manual),MediaBrowser.ServerInfo.getServerAddress(currentServerInfo,newConnectionMode)?newConnectionMode:(newConnectionMode--,newConnectionMode<0&&(newConnectionMode=MediaBrowser.ConnectionMode.Manual),MediaBrowser.ServerInfo.getServerAddress(currentServerInfo,newConnectionMode)?newConnectionMode:connectionMode)}function tryReconnectInternal(resolve,reject,connectionMode,currentRetryCount){connectionMode=switchConnectionMode(connectionMode);var url=MediaBrowser.ServerInfo.getServerAddress(self.serverInfo(),connectionMode);console.log("Attempting reconnection to "+url);var timeout=connectionMode===MediaBrowser.ConnectionMode.Local?7e3:15e3;fetchWithTimeout(url+"/system/info/public",{method:"GET",accept:"application/json"},timeout).then(function(){console.log("Reconnect succeeded to "+url),self.serverInfo().LastConnectionMode=connectionMode,self.serverAddress(url),resolve()},function(){if(console.log("Reconnect attempt failed to "+url),currentRetryCount<5){var newConnectionMode=switchConnectionMode(connectionMode);setTimeout(function(){tryReconnectInternal(resolve,reject,newConnectionMode,currentRetryCount+1)},300)}else reject()})}function tryReconnect(){return new Promise(function(resolve,reject){setTimeout(function(){tryReconnectInternal(resolve,reject,self.serverInfo().LastConnectionMode,0)},300)})}function replaceAll(originalString,strReplace,strWith){var reg=new RegExp(strReplace,"ig");return originalString.replace(reg,strWith)}function onWebSocketMessage(msg){if("UserDeleted"===msg.MessageType)currentUser=null;else if("UserUpdated"===msg.MessageType||"UserConfigurationUpdated"===msg.MessageType){var user=msg.Data;user.Id===self.getCurrentUserId()&&(currentUser=null)}events.trigger(self,"websocketmessage",[msg])}function normalizeReturnBitrate(bitrate){if(!bitrate)return lastDetectedBitrate?lastDetectedBitrate:Promise.reject();var result=Math.round(.8*bitrate);return lastDetectedBitrate=result,lastDetectedBitrateTime=(new Date).getTime(),result}function detectBitrateInternal(tests,index,currentBitrate){if(index>=tests.length)return normalizeReturnBitrate(currentBitrate);var test=tests[index];return self.getDownloadSpeed(test.bytes).then(function(bitrate){return bitrate1800?self.ajax({type:"POST",url:self.getUrl("LiveTv/Programs"),data:JSON.stringify(options),contentType:"application/json",dataType:"json"}):self.ajax({type:"GET",url:self.getUrl("LiveTv/Programs",options),dataType:"json"})},self.getLiveTvRecommendedPrograms=function(options){return options=options||{},self.ajax({type:"GET",url:self.getUrl("LiveTv/Programs/Recommended",options),dataType:"json"})},self.getLiveTvRecordings=function(options){var url=self.getUrl("LiveTv/Recordings",options||{});return self.getJSON(url)},self.getLiveTvRecordingSeries=function(options){var url=self.getUrl("LiveTv/Recordings/Series",options||{});return self.getJSON(url)},self.getLiveTvRecordingGroups=function(options){var url=self.getUrl("LiveTv/Recordings/Groups",options||{});return self.getJSON(url)},self.getLiveTvRecordingGroup=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/Recordings/Groups/"+id);return self.getJSON(url)},self.getLiveTvRecording=function(id,userId){if(!id)throw new Error("null id");var options={};userId&&(options.userId=userId);var url=self.getUrl("LiveTv/Recordings/"+id,options);return self.getJSON(url)},self.getLiveTvProgram=function(id,userId){if(!id)throw new Error("null id");var options={};userId&&(options.userId=userId);var url=self.getUrl("LiveTv/Programs/"+id,options);return self.getJSON(url)},self.deleteLiveTvRecording=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/Recordings/"+id);return self.ajax({type:"DELETE",url:url})},self.cancelLiveTvTimer=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/Timers/"+id);return self.ajax({type:"DELETE",url:url})},self.getLiveTvTimers=function(options){var url=self.getUrl("LiveTv/Timers",options||{});return self.getJSON(url)},self.getLiveTvTimer=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/Timers/"+id);return self.getJSON(url)},self.getNewLiveTvTimerDefaults=function(options){options=options||{};var url=self.getUrl("LiveTv/Timers/Defaults",options);return self.getJSON(url)},self.createLiveTvTimer=function(item){if(!item)throw new Error("null item");var url=self.getUrl("LiveTv/Timers");return self.ajax({type:"POST",url:url,data:JSON.stringify(item),contentType:"application/json"})},self.updateLiveTvTimer=function(item){if(!item)throw new Error("null item");var url=self.getUrl("LiveTv/Timers/"+item.Id);return self.ajax({type:"POST",url:url,data:JSON.stringify(item),contentType:"application/json"})},self.resetLiveTvTuner=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/Tuners/"+id+"/Reset");return self.ajax({type:"POST",url:url})},self.getLiveTvSeriesTimers=function(options){var url=self.getUrl("LiveTv/SeriesTimers",options||{});return self.getJSON(url)},self.getFileOrganizationResults=function(options){var url=self.getUrl("Library/FileOrganization",options||{});return self.getJSON(url)},self.deleteOriginalFileFromOrganizationResult=function(id){var url=self.getUrl("Library/FileOrganizations/"+id+"/File");return self.ajax({type:"DELETE",url:url})},self.clearOrganizationLog=function(){var url=self.getUrl("Library/FileOrganizations");return self.ajax({type:"DELETE",url:url})},self.performOrganization=function(id){var url=self.getUrl("Library/FileOrganizations/"+id+"/Organize");return self.ajax({type:"POST",url:url})},self.performEpisodeOrganization=function(id,options){var url=self.getUrl("Library/FileOrganizations/"+id+"/Episode/Organize");return self.ajax({type:"POST",url:url,data:JSON.stringify(options),contentType:"application/json"})},self.getLiveTvSeriesTimer=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/SeriesTimers/"+id);return self.getJSON(url)},self.cancelLiveTvSeriesTimer=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/SeriesTimers/"+id);return self.ajax({type:"DELETE",url:url})},self.createLiveTvSeriesTimer=function(item){if(!item)throw new Error("null item");var url=self.getUrl("LiveTv/SeriesTimers");return self.ajax({type:"POST",url:url,data:JSON.stringify(item),contentType:"application/json"})},self.updateLiveTvSeriesTimer=function(item){if(!item)throw new Error("null item");var url=self.getUrl("LiveTv/SeriesTimers/"+item.Id);return self.ajax({type:"POST",url:url,data:JSON.stringify(item),contentType:"application/json"})},self.getRegistrationInfo=function(feature){var url=self.getUrl("Registrations/"+feature);return self.getJSON(url)},self.getSystemInfo=function(){var url=self.getUrl("System/Info");return self.getJSON(url)},self.getPublicSystemInfo=function(){var url=self.getUrl("System/Info/Public");return self.getJSON(url,!1)},self.getInstantMixFromItem=function(itemId,options){var url=self.getUrl("Items/"+itemId+"/InstantMix",options);return self.getJSON(url)},self.getEpisodes=function(itemId,options){var url=self.getUrl("Shows/"+itemId+"/Episodes",options);return self.getJSON(url)},self.getDisplayPreferences=function(id,userId,app){var url=self.getUrl("DisplayPreferences/"+id,{userId:userId,client:app});return self.getJSON(url)},self.updateDisplayPreferences=function(id,obj,userId,app){var url=self.getUrl("DisplayPreferences/"+id,{userId:userId,client:app});return self.ajax({type:"POST",url:url,data:JSON.stringify(obj),contentType:"application/json"})},self.getSeasons=function(itemId,options){var url=self.getUrl("Shows/"+itemId+"/Seasons",options);return self.getJSON(url)},self.getSimilarItems=function(itemId,options){var url=self.getUrl("Items/"+itemId+"/Similar",options);return self.getJSON(url)},self.getCultures=function(){var url=self.getUrl("Localization/cultures");return self.getJSON(url)},self.getCountries=function(){var url=self.getUrl("Localization/countries");return self.getJSON(url)},self.getPluginSecurityInfo=function(){var url=self.getUrl("Plugins/SecurityInfo");return self.getJSON(url)},self.getPlaybackInfo=function(itemId,options,deviceProfile){var postData={DeviceProfile:deviceProfile};return self.ajax({url:self.getUrl("Items/"+itemId+"/PlaybackInfo",options),type:"POST",data:JSON.stringify(postData),contentType:"application/json",dataType:"json"})},self.getIntros=function(itemId){return self.getJSON(self.getUrl("Users/"+self.getCurrentUserId()+"/Items/"+itemId+"/Intros"))},self.getDirectoryContents=function(path,options){if(!path)throw new Error("null path");if("string"!=typeof path)throw new Error("invalid path");options=options||{},options.path=path;var url=self.getUrl("Environment/DirectoryContents",options);return self.getJSON(url)},self.getNetworkShares=function(path){if(!path)throw new Error("null path");var options={};options.path=path;var url=self.getUrl("Environment/NetworkShares",options);return self.getJSON(url)},self.getParentPath=function(path){if(!path)throw new Error("null path");var options={};options.path=path;var url=self.getUrl("Environment/ParentPath",options);return self.ajax({type:"GET",url:url,dataType:"text"})},self.getDrives=function(){var url=self.getUrl("Environment/Drives");return self.getJSON(url)},self.getNetworkDevices=function(){var url=self.getUrl("Environment/NetworkDevices");return self.getJSON(url)},self.cancelPackageInstallation=function(installationId){if(!installationId)throw new Error("null installationId");var url=self.getUrl("Packages/Installing/"+installationId);return self.ajax({type:"DELETE",url:url})},self.refreshItem=function(itemId,options){if(!itemId)throw new Error("null itemId");var url=self.getUrl("Items/"+itemId+"/Refresh",options||{});return self.ajax({type:"POST",url:url})},self.installPlugin=function(name,guid,updateClass,version){if(!name)throw new Error("null name");if(!updateClass)throw new Error("null updateClass");var options={updateClass:updateClass,AssemblyGuid:guid};version&&(options.version=version);var url=self.getUrl("Packages/Installed/"+name,options);return self.ajax({type:"POST",url:url})},self.restartServer=function(){var url=self.getUrl("System/Restart");return self.ajax({type:"POST",url:url})},self.shutdownServer=function(){var url=self.getUrl("System/Shutdown");return self.ajax({type:"POST",url:url})},self.getPackageInfo=function(name,guid){if(!name)throw new Error("null name");var options={AssemblyGuid:guid},url=self.getUrl("Packages/"+name,options);return self.getJSON(url)},self.getAvailableApplicationUpdate=function(){var url=self.getUrl("Packages/Updates",{PackageType:"System"});return self.getJSON(url)},self.getAvailablePluginUpdates=function(){var url=self.getUrl("Packages/Updates",{PackageType:"UserInstalled"});return self.getJSON(url)},self.getVirtualFolders=function(){var url="Library/VirtualFolders";return url=self.getUrl(url),self.getJSON(url)},self.getPhysicalPaths=function(){var url=self.getUrl("Library/PhysicalPaths");return self.getJSON(url)},self.getServerConfiguration=function(){var url=self.getUrl("System/Configuration");return self.getJSON(url)},self.getDevicesOptions=function(){var url=self.getUrl("System/Configuration/devices");return self.getJSON(url)},self.getContentUploadHistory=function(){var url=self.getUrl("Devices/CameraUploads",{DeviceId:self.deviceId()});return self.getJSON(url)},self.getNamedConfiguration=function(name){var url=self.getUrl("System/Configuration/"+name);return self.getJSON(url)},self.getScheduledTasks=function(options){options=options||{};var url=self.getUrl("ScheduledTasks",options);return self.getJSON(url)},self.startScheduledTask=function(id){if(!id)throw new Error("null id");var url=self.getUrl("ScheduledTasks/Running/"+id);return self.ajax({type:"POST",url:url})},self.getScheduledTask=function(id){if(!id)throw new Error("null id");var url=self.getUrl("ScheduledTasks/"+id);return self.getJSON(url)},self.getNextUpEpisodes=function(options){var url=self.getUrl("Shows/NextUp",options);return self.getJSON(url)},self.stopScheduledTask=function(id){if(!id)throw new Error("null id");var url=self.getUrl("ScheduledTasks/Running/"+id);return self.ajax({type:"DELETE",url:url})},self.getPluginConfiguration=function(id){if(!id)throw new Error("null Id");var url=self.getUrl("Plugins/"+id+"/Configuration");return self.getJSON(url)},self.getAvailablePlugins=function(options){options=options||{},options.PackageType="UserInstalled";var url=self.getUrl("Packages",options);return self.getJSON(url)},self.uninstallPlugin=function(id){if(!id)throw new Error("null Id");var url=self.getUrl("Plugins/"+id);return self.ajax({type:"DELETE",url:url})},self.removeVirtualFolder=function(name,refreshLibrary){if(!name)throw new Error("null name");var url="Library/VirtualFolders";return url=self.getUrl(url,{refreshLibrary:!!refreshLibrary,name:name}),self.ajax({type:"DELETE",url:url})},self.addVirtualFolder=function(name,type,refreshLibrary,libraryOptions){if(!name)throw new Error("null name");var options={};type&&(options.collectionType=type),options.refreshLibrary=!!refreshLibrary,options.name=name;var url="Library/VirtualFolders";return url=self.getUrl(url,options),self.ajax({type:"POST",url:url,data:JSON.stringify({LibraryOptions:libraryOptions}),contentType:"application/json"})},self.updateVirtualFolderOptions=function(id,libraryOptions){if(!id)throw new Error("null name");var url="Library/VirtualFolders/LibraryOptions";return url=self.getUrl(url),self.ajax({type:"POST",url:url,data:JSON.stringify({Id:id,LibraryOptions:libraryOptions}),contentType:"application/json"})},self.renameVirtualFolder=function(name,newName,refreshLibrary){if(!name)throw new Error("null name");var url="Library/VirtualFolders/Name";return url=self.getUrl(url,{refreshLibrary:!!refreshLibrary,newName:newName,name:name}),self.ajax({type:"POST",url:url})},self.addMediaPath=function(virtualFolderName,mediaPath,networkSharePath,refreshLibrary){if(!virtualFolderName)throw new Error("null virtualFolderName");if(!mediaPath)throw new Error("null mediaPath");var url="Library/VirtualFolders/Paths",pathInfo={Path:mediaPath};return networkSharePath&&(pathInfo.NetworkPath=networkSharePath),url=self.getUrl(url,{refreshLibrary:!!refreshLibrary}),self.ajax({type:"POST",url:url,data:JSON.stringify({Name:virtualFolderName,PathInfo:pathInfo}),contentType:"application/json"})},self.updateMediaPath=function(virtualFolderName,pathInfo){if(!virtualFolderName)throw new Error("null virtualFolderName");if(!pathInfo)throw new Error("null pathInfo");var url="Library/VirtualFolders/Paths/Update";return url=self.getUrl(url),self.ajax({type:"POST",url:url,data:JSON.stringify({Name:virtualFolderName,PathInfo:pathInfo}),contentType:"application/json"})},self.removeMediaPath=function(virtualFolderName,mediaPath,refreshLibrary){if(!virtualFolderName)throw new Error("null virtualFolderName");if(!mediaPath)throw new Error("null mediaPath");var url="Library/VirtualFolders/Paths";return url=self.getUrl(url,{refreshLibrary:!!refreshLibrary,path:mediaPath,name:virtualFolderName}),self.ajax({type:"DELETE",url:url})},self.deleteUser=function(id){if(!id)throw new Error("null id");var url=self.getUrl("Users/"+id);return self.ajax({type:"DELETE",url:url})},self.deleteUserImage=function(userId,imageType,imageIndex){if(!userId)throw new Error("null userId");if(!imageType)throw new Error("null imageType");var url=self.getUrl("Users/"+userId+"/Images/"+imageType);return null!=imageIndex&&(url+="/"+imageIndex),self.ajax({type:"DELETE",url:url})},self.deleteItemImage=function(itemId,imageType,imageIndex){if(!imageType)throw new Error("null imageType");var url=self.getUrl("Items/"+itemId+"/Images");return url+="/"+imageType,null!=imageIndex&&(url+="/"+imageIndex),self.ajax({type:"DELETE",url:url})},self.deleteItem=function(itemId){if(!itemId)throw new Error("null itemId");var url=self.getUrl("Items/"+itemId);return self.ajax({type:"DELETE",url:url})},self.stopActiveEncodings=function(playSessionId){var options={deviceId:deviceId};playSessionId&&(options.PlaySessionId=playSessionId);var url=self.getUrl("Videos/ActiveEncodings",options);return self.ajax({type:"DELETE",url:url})},self.reportCapabilities=function(options){var url=self.getUrl("Sessions/Capabilities/Full");return self.ajax({type:"POST",url:url,data:JSON.stringify(options),contentType:"application/json"})},self.updateItemImageIndex=function(itemId,imageType,imageIndex,newIndex){if(!imageType)throw new Error("null imageType");var options={newIndex:newIndex},url=self.getUrl("Items/"+itemId+"/Images/"+imageType+"/"+imageIndex+"/Index",options);return self.ajax({type:"POST",url:url})},self.getItemImageInfos=function(itemId){var url=self.getUrl("Items/"+itemId+"/Images");return self.getJSON(url)},self.getCriticReviews=function(itemId,options){if(!itemId)throw new Error("null itemId");var url=self.getUrl("Items/"+itemId+"/CriticReviews",options);return self.getJSON(url)},self.getItemDownloadUrl=function(itemId){if(!itemId)throw new Error("itemId cannot be empty");var url="Items/"+itemId+"/Download";return self.getUrl(url,{api_key:self.accessToken()})},self.getSessions=function(options){var url=self.getUrl("Sessions",options);return self.getJSON(url)},self.uploadUserImage=function(userId,imageType,file){if(!userId)throw new Error("null userId");if(!imageType)throw new Error("null imageType");if(!file)throw new Error("File must be an image.");if("image/png"!==file.type&&"image/jpeg"!==file.type&&"image/jpeg"!==file.type)throw new Error("File must be an image.");return new Promise(function(resolve,reject){var reader=new FileReader;reader.onerror=function(){reject()},reader.onabort=function(){reject()},reader.onload=function(e){var data=e.target.result.split(",")[1],url=self.getUrl("Users/"+userId+"/Images/"+imageType);self.ajax({type:"POST",url:url,data:data,contentType:"image/"+file.name.substring(file.name.lastIndexOf(".")+1) +define(["events"],function(events){"use strict";return function(serverAddress,clientName,applicationVersion,deviceName,deviceId,devicePixelRatio){function redetectBitrate(){stopBitrateDetection(),self.accessToken()&&self.enableAutomaticBitrateDetection!==!1&&setTimeout(redetectBitrateInternal,6e3)}function redetectBitrateInternal(){self.detectBitrate()}function stopBitrateDetection(){detectTimeout&&clearTimeout(detectTimeout)}function onFetchFail(url,response){events.trigger(self,"requestfail",[{url:url,status:response.status,errorCode:response.headers?response.headers.get("X-Application-Error-Code"):null}])}function getFetchPromise(request){var headers=request.headers||{};"json"===request.dataType&&(headers.accept="application/json");var fetchRequest={headers:headers,method:request.type,credentials:"same-origin"},contentType=request.contentType;return request.data&&("string"==typeof request.data?fetchRequest.body=request.data:(fetchRequest.body=paramsToString(request.data),contentType=contentType||"application/x-www-form-urlencoded; charset=UTF-8")),contentType&&(headers["Content-Type"]=contentType),request.timeout?fetchWithTimeout(request.url,fetchRequest,request.timeout):fetch(request.url,fetchRequest)}function fetchWithTimeout(url,options,timeoutMs){return new Promise(function(resolve,reject){var timeout=setTimeout(reject,timeoutMs);options=options||{},options.credentials="same-origin",fetch(url,options).then(function(response){clearTimeout(timeout),resolve(response)},function(error){clearTimeout(timeout),reject(error)})})}function paramsToString(params){var values=[];for(var key in params){var value=params[key];null!==value&&void 0!==value&&""!==value&&values.push(encodeURIComponent(key)+"="+encodeURIComponent(value))}return values.join("&")}function switchConnectionMode(connectionMode){var currentServerInfo=self.serverInfo(),newConnectionMode=connectionMode;return newConnectionMode--,newConnectionMode<0&&(newConnectionMode=MediaBrowser.ConnectionMode.Manual),MediaBrowser.ServerInfo.getServerAddress(currentServerInfo,newConnectionMode)?newConnectionMode:(newConnectionMode--,newConnectionMode<0&&(newConnectionMode=MediaBrowser.ConnectionMode.Manual),MediaBrowser.ServerInfo.getServerAddress(currentServerInfo,newConnectionMode)?newConnectionMode:connectionMode)}function tryReconnectInternal(resolve,reject,connectionMode,currentRetryCount){connectionMode=switchConnectionMode(connectionMode);var url=MediaBrowser.ServerInfo.getServerAddress(self.serverInfo(),connectionMode);console.log("Attempting reconnection to "+url);var timeout=connectionMode===MediaBrowser.ConnectionMode.Local?7e3:15e3;fetchWithTimeout(url+"/system/info/public",{method:"GET",accept:"application/json"},timeout).then(function(){console.log("Reconnect succeeded to "+url),self.serverInfo().LastConnectionMode=connectionMode,self.serverAddress(url),resolve()},function(){if(console.log("Reconnect attempt failed to "+url),currentRetryCount<5){var newConnectionMode=switchConnectionMode(connectionMode);setTimeout(function(){tryReconnectInternal(resolve,reject,newConnectionMode,currentRetryCount+1)},300)}else reject()})}function tryReconnect(){return new Promise(function(resolve,reject){setTimeout(function(){tryReconnectInternal(resolve,reject,self.serverInfo().LastConnectionMode,0)},300)})}function replaceAll(originalString,strReplace,strWith){var reg=new RegExp(strReplace,"ig");return originalString.replace(reg,strWith)}function onWebSocketMessage(msg){if("UserDeleted"===msg.MessageType)currentUser=null;else if("UserUpdated"===msg.MessageType||"UserConfigurationUpdated"===msg.MessageType){var user=msg.Data;user.Id===self.getCurrentUserId()&&(currentUser=null)}events.trigger(self,"websocketmessage",[msg])}function normalizeReturnBitrate(bitrate){if(!bitrate)return lastDetectedBitrate?lastDetectedBitrate:Promise.reject();var result=Math.round(.8*bitrate);return lastDetectedBitrate=result,lastDetectedBitrateTime=(new Date).getTime(),result}function detectBitrateInternal(tests,index,currentBitrate){if(index>=tests.length)return normalizeReturnBitrate(currentBitrate);var test=tests[index];return self.getDownloadSpeed(test.bytes).then(function(bitrate){return bitrate1800?self.ajax({type:"POST",url:self.getUrl("LiveTv/Programs"),data:JSON.stringify(options),contentType:"application/json",dataType:"json"}):self.ajax({type:"GET",url:self.getUrl("LiveTv/Programs",options),dataType:"json"})},self.getLiveTvRecommendedPrograms=function(options){return options=options||{},self.ajax({type:"GET",url:self.getUrl("LiveTv/Programs/Recommended",options),dataType:"json"})},self.getLiveTvRecordings=function(options){var url=self.getUrl("LiveTv/Recordings",options||{});return self.getJSON(url)},self.getLiveTvRecordingSeries=function(options){var url=self.getUrl("LiveTv/Recordings/Series",options||{});return self.getJSON(url)},self.getLiveTvRecordingGroups=function(options){var url=self.getUrl("LiveTv/Recordings/Groups",options||{});return self.getJSON(url)},self.getLiveTvRecordingGroup=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/Recordings/Groups/"+id);return self.getJSON(url)},self.getLiveTvRecording=function(id,userId){if(!id)throw new Error("null id");var options={};userId&&(options.userId=userId);var url=self.getUrl("LiveTv/Recordings/"+id,options);return self.getJSON(url)},self.getLiveTvProgram=function(id,userId){if(!id)throw new Error("null id");var options={};userId&&(options.userId=userId);var url=self.getUrl("LiveTv/Programs/"+id,options);return self.getJSON(url)},self.deleteLiveTvRecording=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/Recordings/"+id);return self.ajax({type:"DELETE",url:url})},self.cancelLiveTvTimer=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/Timers/"+id);return self.ajax({type:"DELETE",url:url})},self.getLiveTvTimers=function(options){var url=self.getUrl("LiveTv/Timers",options||{});return self.getJSON(url)},self.getLiveTvTimer=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/Timers/"+id);return self.getJSON(url)},self.getNewLiveTvTimerDefaults=function(options){options=options||{};var url=self.getUrl("LiveTv/Timers/Defaults",options);return self.getJSON(url)},self.createLiveTvTimer=function(item){if(!item)throw new Error("null item");var url=self.getUrl("LiveTv/Timers");return self.ajax({type:"POST",url:url,data:JSON.stringify(item),contentType:"application/json"})},self.updateLiveTvTimer=function(item){if(!item)throw new Error("null item");var url=self.getUrl("LiveTv/Timers/"+item.Id);return self.ajax({type:"POST",url:url,data:JSON.stringify(item),contentType:"application/json"})},self.resetLiveTvTuner=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/Tuners/"+id+"/Reset");return self.ajax({type:"POST",url:url})},self.getLiveTvSeriesTimers=function(options){var url=self.getUrl("LiveTv/SeriesTimers",options||{});return self.getJSON(url)},self.getFileOrganizationResults=function(options){var url=self.getUrl("Library/FileOrganization",options||{});return self.getJSON(url)},self.deleteOriginalFileFromOrganizationResult=function(id){var url=self.getUrl("Library/FileOrganizations/"+id+"/File");return self.ajax({type:"DELETE",url:url})},self.clearOrganizationLog=function(){var url=self.getUrl("Library/FileOrganizations");return self.ajax({type:"DELETE",url:url})},self.performOrganization=function(id){var url=self.getUrl("Library/FileOrganizations/"+id+"/Organize");return self.ajax({type:"POST",url:url})},self.performEpisodeOrganization=function(id,options){var url=self.getUrl("Library/FileOrganizations/"+id+"/Episode/Organize");return self.ajax({type:"POST",url:url,data:JSON.stringify(options),contentType:"application/json"})},self.getLiveTvSeriesTimer=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/SeriesTimers/"+id);return self.getJSON(url)},self.cancelLiveTvSeriesTimer=function(id){if(!id)throw new Error("null id");var url=self.getUrl("LiveTv/SeriesTimers/"+id);return self.ajax({type:"DELETE",url:url})},self.createLiveTvSeriesTimer=function(item){if(!item)throw new Error("null item");var url=self.getUrl("LiveTv/SeriesTimers");return self.ajax({type:"POST",url:url,data:JSON.stringify(item),contentType:"application/json"})},self.updateLiveTvSeriesTimer=function(item){if(!item)throw new Error("null item");var url=self.getUrl("LiveTv/SeriesTimers/"+item.Id);return self.ajax({type:"POST",url:url,data:JSON.stringify(item),contentType:"application/json"})},self.getRegistrationInfo=function(feature){var url=self.getUrl("Registrations/"+feature);return self.getJSON(url)},self.getSystemInfo=function(){var url=self.getUrl("System/Info");return self.getJSON(url)},self.getPublicSystemInfo=function(){var url=self.getUrl("System/Info/Public");return self.getJSON(url,!1)},self.getInstantMixFromItem=function(itemId,options){var url=self.getUrl("Items/"+itemId+"/InstantMix",options);return self.getJSON(url)},self.getEpisodes=function(itemId,options){var url=self.getUrl("Shows/"+itemId+"/Episodes",options);return self.getJSON(url)},self.getDisplayPreferences=function(id,userId,app){var url=self.getUrl("DisplayPreferences/"+id,{userId:userId,client:app});return self.getJSON(url)},self.updateDisplayPreferences=function(id,obj,userId,app){var url=self.getUrl("DisplayPreferences/"+id,{userId:userId,client:app});return self.ajax({type:"POST",url:url,data:JSON.stringify(obj),contentType:"application/json"})},self.getSeasons=function(itemId,options){var url=self.getUrl("Shows/"+itemId+"/Seasons",options);return self.getJSON(url)},self.getSimilarItems=function(itemId,options){var url=self.getUrl("Items/"+itemId+"/Similar",options);return self.getJSON(url)},self.getCultures=function(){var url=self.getUrl("Localization/cultures");return self.getJSON(url)},self.getCountries=function(){var url=self.getUrl("Localization/countries");return self.getJSON(url)},self.getPluginSecurityInfo=function(){var url=self.getUrl("Plugins/SecurityInfo");return self.getJSON(url)},self.getPlaybackInfo=function(itemId,options,deviceProfile){var postData={DeviceProfile:deviceProfile};return self.ajax({url:self.getUrl("Items/"+itemId+"/PlaybackInfo",options),type:"POST",data:JSON.stringify(postData),contentType:"application/json",dataType:"json"})},self.getIntros=function(itemId){return self.getJSON(self.getUrl("Users/"+self.getCurrentUserId()+"/Items/"+itemId+"/Intros"))},self.getDirectoryContents=function(path,options){if(!path)throw new Error("null path");if("string"!=typeof path)throw new Error("invalid path");options=options||{},options.path=path;var url=self.getUrl("Environment/DirectoryContents",options);return self.getJSON(url)},self.getNetworkShares=function(path){if(!path)throw new Error("null path");var options={};options.path=path;var url=self.getUrl("Environment/NetworkShares",options);return self.getJSON(url)},self.getParentPath=function(path){if(!path)throw new Error("null path");var options={};options.path=path;var url=self.getUrl("Environment/ParentPath",options);return self.ajax({type:"GET",url:url,dataType:"text"})},self.getDrives=function(){var url=self.getUrl("Environment/Drives");return self.getJSON(url)},self.getNetworkDevices=function(){var url=self.getUrl("Environment/NetworkDevices");return self.getJSON(url)},self.cancelPackageInstallation=function(installationId){if(!installationId)throw new Error("null installationId");var url=self.getUrl("Packages/Installing/"+installationId);return self.ajax({type:"DELETE",url:url})},self.refreshItem=function(itemId,options){if(!itemId)throw new Error("null itemId");var url=self.getUrl("Items/"+itemId+"/Refresh",options||{});return self.ajax({type:"POST",url:url})},self.installPlugin=function(name,guid,updateClass,version){if(!name)throw new Error("null name");if(!updateClass)throw new Error("null updateClass");var options={updateClass:updateClass,AssemblyGuid:guid};version&&(options.version=version);var url=self.getUrl("Packages/Installed/"+name,options);return self.ajax({type:"POST",url:url})},self.restartServer=function(){var url=self.getUrl("System/Restart");return self.ajax({type:"POST",url:url})},self.shutdownServer=function(){var url=self.getUrl("System/Shutdown");return self.ajax({type:"POST",url:url})},self.getPackageInfo=function(name,guid){if(!name)throw new Error("null name");var options={AssemblyGuid:guid},url=self.getUrl("Packages/"+name,options);return self.getJSON(url)},self.getAvailableApplicationUpdate=function(){var url=self.getUrl("Packages/Updates",{PackageType:"System"});return self.getJSON(url)},self.getAvailablePluginUpdates=function(){var url=self.getUrl("Packages/Updates",{PackageType:"UserInstalled"});return self.getJSON(url)},self.getVirtualFolders=function(){var url="Library/VirtualFolders";return url=self.getUrl(url),self.getJSON(url)},self.getPhysicalPaths=function(){var url=self.getUrl("Library/PhysicalPaths");return self.getJSON(url)},self.getServerConfiguration=function(){var url=self.getUrl("System/Configuration");return self.getJSON(url)},self.getDevicesOptions=function(){var url=self.getUrl("System/Configuration/devices");return self.getJSON(url)},self.getContentUploadHistory=function(){var url=self.getUrl("Devices/CameraUploads",{DeviceId:self.deviceId()});return self.getJSON(url)},self.getNamedConfiguration=function(name){var url=self.getUrl("System/Configuration/"+name);return self.getJSON(url)},self.getScheduledTasks=function(options){options=options||{};var url=self.getUrl("ScheduledTasks",options);return self.getJSON(url)},self.startScheduledTask=function(id){if(!id)throw new Error("null id");var url=self.getUrl("ScheduledTasks/Running/"+id);return self.ajax({type:"POST",url:url})},self.getScheduledTask=function(id){if(!id)throw new Error("null id");var url=self.getUrl("ScheduledTasks/"+id);return self.getJSON(url)},self.getNextUpEpisodes=function(options){var url=self.getUrl("Shows/NextUp",options);return self.getJSON(url)},self.stopScheduledTask=function(id){if(!id)throw new Error("null id");var url=self.getUrl("ScheduledTasks/Running/"+id);return self.ajax({type:"DELETE",url:url})},self.getPluginConfiguration=function(id){if(!id)throw new Error("null Id");var url=self.getUrl("Plugins/"+id+"/Configuration");return self.getJSON(url)},self.getAvailablePlugins=function(options){options=options||{},options.PackageType="UserInstalled";var url=self.getUrl("Packages",options);return self.getJSON(url)},self.uninstallPlugin=function(id){if(!id)throw new Error("null Id");var url=self.getUrl("Plugins/"+id);return self.ajax({type:"DELETE",url:url})},self.removeVirtualFolder=function(name,refreshLibrary){if(!name)throw new Error("null name");var url="Library/VirtualFolders";return url=self.getUrl(url,{refreshLibrary:!!refreshLibrary,name:name}),self.ajax({type:"DELETE",url:url})},self.addVirtualFolder=function(name,type,refreshLibrary,libraryOptions){if(!name)throw new Error("null name");var options={};type&&(options.collectionType=type),options.refreshLibrary=!!refreshLibrary,options.name=name;var url="Library/VirtualFolders";return url=self.getUrl(url,options),self.ajax({type:"POST",url:url,data:JSON.stringify({LibraryOptions:libraryOptions}),contentType:"application/json"})},self.updateVirtualFolderOptions=function(id,libraryOptions){if(!id)throw new Error("null name");var url="Library/VirtualFolders/LibraryOptions";return url=self.getUrl(url),self.ajax({type:"POST",url:url,data:JSON.stringify({Id:id,LibraryOptions:libraryOptions}),contentType:"application/json"})},self.renameVirtualFolder=function(name,newName,refreshLibrary){if(!name)throw new Error("null name");var url="Library/VirtualFolders/Name";return url=self.getUrl(url,{refreshLibrary:!!refreshLibrary,newName:newName,name:name}),self.ajax({type:"POST",url:url})},self.addMediaPath=function(virtualFolderName,mediaPath,networkSharePath,refreshLibrary){if(!virtualFolderName)throw new Error("null virtualFolderName");if(!mediaPath)throw new Error("null mediaPath");var url="Library/VirtualFolders/Paths",pathInfo={Path:mediaPath};return networkSharePath&&(pathInfo.NetworkPath=networkSharePath),url=self.getUrl(url,{refreshLibrary:!!refreshLibrary}),self.ajax({type:"POST",url:url,data:JSON.stringify({Name:virtualFolderName,PathInfo:pathInfo}),contentType:"application/json"})},self.updateMediaPath=function(virtualFolderName,pathInfo){if(!virtualFolderName)throw new Error("null virtualFolderName");if(!pathInfo)throw new Error("null pathInfo");var url="Library/VirtualFolders/Paths/Update";return url=self.getUrl(url),self.ajax({type:"POST",url:url,data:JSON.stringify({Name:virtualFolderName,PathInfo:pathInfo}),contentType:"application/json"})},self.removeMediaPath=function(virtualFolderName,mediaPath,refreshLibrary){if(!virtualFolderName)throw new Error("null virtualFolderName");if(!mediaPath)throw new Error("null mediaPath");var url="Library/VirtualFolders/Paths";return url=self.getUrl(url,{refreshLibrary:!!refreshLibrary,path:mediaPath,name:virtualFolderName}),self.ajax({type:"DELETE",url:url})},self.deleteUser=function(id){if(!id)throw new Error("null id");var url=self.getUrl("Users/"+id);return self.ajax({type:"DELETE",url:url})},self.deleteUserImage=function(userId,imageType,imageIndex){if(!userId)throw new Error("null userId");if(!imageType)throw new Error("null imageType");var url=self.getUrl("Users/"+userId+"/Images/"+imageType);return null!=imageIndex&&(url+="/"+imageIndex),self.ajax({type:"DELETE",url:url})},self.deleteItemImage=function(itemId,imageType,imageIndex){if(!imageType)throw new Error("null imageType");var url=self.getUrl("Items/"+itemId+"/Images");return url+="/"+imageType,null!=imageIndex&&(url+="/"+imageIndex),self.ajax({type:"DELETE",url:url})},self.deleteItem=function(itemId){if(!itemId)throw new Error("null itemId");var url=self.getUrl("Items/"+itemId);return self.ajax({type:"DELETE",url:url})},self.stopActiveEncodings=function(playSessionId){var options={deviceId:deviceId};playSessionId&&(options.PlaySessionId=playSessionId);var url=self.getUrl("Videos/ActiveEncodings",options);return self.ajax({type:"DELETE",url:url})},self.reportCapabilities=function(options){var url=self.getUrl("Sessions/Capabilities/Full");return self.ajax({type:"POST",url:url,data:JSON.stringify(options),contentType:"application/json"})},self.updateItemImageIndex=function(itemId,imageType,imageIndex,newIndex){if(!imageType)throw new Error("null imageType");var options={newIndex:newIndex},url=self.getUrl("Items/"+itemId+"/Images/"+imageType+"/"+imageIndex+"/Index",options);return self.ajax({type:"POST",url:url})},self.getItemImageInfos=function(itemId){var url=self.getUrl("Items/"+itemId+"/Images");return self.getJSON(url)},self.getCriticReviews=function(itemId,options){if(!itemId)throw new Error("null itemId");var url=self.getUrl("Items/"+itemId+"/CriticReviews",options);return self.getJSON(url)},self.getItemDownloadUrl=function(itemId){if(!itemId)throw new Error("itemId cannot be empty");var url="Items/"+itemId+"/Download";return self.getUrl(url,{api_key:self.accessToken()})},self.getSessions=function(options){var url=self.getUrl("Sessions",options);return self.getJSON(url)},self.uploadUserImage=function(userId,imageType,file){if(!userId)throw new Error("null userId");if(!imageType)throw new Error("null imageType");if(!file)throw new Error("File must be an image.");if("image/png"!==file.type&&"image/jpeg"!==file.type&&"image/jpeg"!==file.type)throw new Error("File must be an image.");return new Promise(function(resolve,reject){var reader=new FileReader;reader.onerror=function(){reject()},reader.onabort=function(){reject()},reader.onload=function(e){var data=e.target.result.split(",")[1],url=self.getUrl("Users/"+userId+"/Images/"+imageType);self.ajax({type:"POST",url:url,data:data,contentType:"image/"+file.name.substring(file.name.lastIndexOf(".")+1) }).then(function(result){resolve(result)},function(){reject()})},reader.readAsDataURL(file)})},self.uploadItemImage=function(itemId,imageType,file){if(!itemId)throw new Error("null itemId");if(!imageType)throw new Error("null imageType");if(!file)throw new Error("File must be an image.");if("image/png"!==file.type&&"image/jpeg"!==file.type&&"image/jpeg"!==file.type)throw new Error("File must be an image.");var url=self.getUrl("Items/"+itemId+"/Images");return url+="/"+imageType,new Promise(function(resolve,reject){var reader=new FileReader;reader.onerror=function(){reject()},reader.onabort=function(){reject()},reader.onload=function(e){var data=e.target.result.split(",")[1];self.ajax({type:"POST",url:url,data:data,contentType:"image/"+file.name.substring(file.name.lastIndexOf(".")+1)}).then(function(result){resolve(result)},function(){reject()})},reader.readAsDataURL(file)})},self.getInstalledPlugins=function(){var options={},url=self.getUrl("Plugins",options);return self.getJSON(url)},self.getUser=function(id){if(!id)throw new Error("Must supply a userId");var url=self.getUrl("Users/"+id);return self.getJSON(url)},self.getOfflineUser=function(id){if(!id)throw new Error("Must supply a userId");var url=self.getUrl("Users/"+id+"/Offline");return self.getJSON(url)},self.getStudio=function(name,userId){if(!name)throw new Error("null name");var options={};userId&&(options.userId=userId);var url=self.getUrl("Studios/"+self.encodeName(name),options);return self.getJSON(url)},self.getGenre=function(name,userId){if(!name)throw new Error("null name");var options={};userId&&(options.userId=userId);var url=self.getUrl("Genres/"+self.encodeName(name),options);return self.getJSON(url)},self.getMusicGenre=function(name,userId){if(!name)throw new Error("null name");var options={};userId&&(options.userId=userId);var url=self.getUrl("MusicGenres/"+self.encodeName(name),options);return self.getJSON(url)},self.getGameGenre=function(name,userId){if(!name)throw new Error("null name");var options={};userId&&(options.userId=userId);var url=self.getUrl("GameGenres/"+self.encodeName(name),options);return self.getJSON(url)},self.getArtist=function(name,userId){if(!name)throw new Error("null name");var options={};userId&&(options.userId=userId);var url=self.getUrl("Artists/"+self.encodeName(name),options);return self.getJSON(url)},self.getPerson=function(name,userId){if(!name)throw new Error("null name");var options={};userId&&(options.userId=userId);var url=self.getUrl("Persons/"+self.encodeName(name),options);return self.getJSON(url)},self.getPublicUsers=function(){var url=self.getUrl("users/public");return self.ajax({type:"GET",url:url,dataType:"json"},!1)},self.getUsers=function(options){var url=self.getUrl("users",options||{});return self.getJSON(url)},self.getParentalRatings=function(){var url=self.getUrl("Localization/ParentalRatings");return self.getJSON(url)},self.getDefaultImageQuality=function(imageType){return"backdrop"===imageType.toLowerCase()?80:90},self.getUserImageUrl=function(userId,options){if(!userId)throw new Error("null userId");options=options||{};var url="Users/"+userId+"/Images/"+options.type;return null!=options.index&&(url+="/"+options.index),normalizeImageOptions(options),delete options.type,delete options.index,self.getUrl(url,options)},self.getImageUrl=function(itemId,options){if(!itemId)throw new Error("itemId cannot be empty");options=options||{};var url="Items/"+itemId+"/Images/"+options.type;return null!=options.index&&(url+="/"+options.index),options.quality=options.quality||self.getDefaultImageQuality(options.type),self.normalizeImageOptions&&self.normalizeImageOptions(options),delete options.type,delete options.index,self.getUrl(url,options)},self.getScaledImageUrl=function(itemId,options){if(!itemId)throw new Error("itemId cannot be empty");options=options||{};var url="Items/"+itemId+"/Images/"+options.type;return null!=options.index&&(url+="/"+options.index),normalizeImageOptions(options),delete options.type,delete options.index,delete options.minScale,self.getUrl(url,options)},self.getThumbImageUrl=function(item,options){if(!item)throw new Error("null item");return options=options||{},options.imageType="thumb",item.ImageTags&&item.ImageTags.Thumb?(options.tag=item.ImageTags.Thumb,self.getImageUrl(item.Id,options)):item.ParentThumbItemId?(options.tag=item.ImageTags.ParentThumbImageTag,self.getImageUrl(item.ParentThumbItemId,options)):null},self.authenticateUserByName=function(name,password){return new Promise(function(resolve,reject){if(!name)return void reject();var url=self.getUrl("Users/authenticatebyname");require(["cryptojs-sha1","cryptojs-md5"],function(){var postData={Password:CryptoJS.SHA1(password||"").toString(),PasswordMd5:CryptoJS.MD5(password||"").toString(),Username:name};self.ajax({type:"POST",url:url,data:JSON.stringify(postData),dataType:"json",contentType:"application/json"}).then(function(result){self.onAuthenticated&&self.onAuthenticated(self,result),redetectBitrate(),resolve(result)},reject)})})},self.updateUserPassword=function(userId,currentPassword,newPassword){return new Promise(function(resolve,reject){if(!userId)return void reject();var url=self.getUrl("Users/"+userId+"/Password");require(["cryptojs-sha1"],function(){self.ajax({type:"POST",url:url,data:{currentPassword:CryptoJS.SHA1(currentPassword).toString(),newPassword:CryptoJS.SHA1(newPassword).toString()}}).then(resolve,reject)})})},self.updateEasyPassword=function(userId,newPassword){return new Promise(function(resolve,reject){if(!userId)return void reject();var url=self.getUrl("Users/"+userId+"/EasyPassword");require(["cryptojs-sha1"],function(){self.ajax({type:"POST",url:url,data:{newPassword:CryptoJS.SHA1(newPassword).toString()}}).then(resolve,reject)})})},self.resetUserPassword=function(userId){if(!userId)throw new Error("null userId");var url=self.getUrl("Users/"+userId+"/Password"),postData={};return postData.resetPassword=!0,self.ajax({type:"POST",url:url,data:postData})},self.resetEasyPassword=function(userId){if(!userId)throw new Error("null userId");var url=self.getUrl("Users/"+userId+"/EasyPassword"),postData={};return postData.resetPassword=!0,self.ajax({type:"POST",url:url,data:postData})},self.updateServerConfiguration=function(configuration){if(!configuration)throw new Error("null configuration");var url=self.getUrl("System/Configuration");return self.ajax({type:"POST",url:url,data:JSON.stringify(configuration),contentType:"application/json"})},self.updateNamedConfiguration=function(name,configuration){if(!configuration)throw new Error("null configuration");var url=self.getUrl("System/Configuration/"+name);return self.ajax({type:"POST",url:url,data:JSON.stringify(configuration),contentType:"application/json"})},self.updateItem=function(item){if(!item)throw new Error("null item");var url=self.getUrl("Items/"+item.Id);return self.ajax({type:"POST",url:url,data:JSON.stringify(item),contentType:"application/json"})},self.updatePluginSecurityInfo=function(info){var url=self.getUrl("Plugins/SecurityInfo");return self.ajax({type:"POST",url:url,data:JSON.stringify(info),contentType:"application/json"})},self.createUser=function(name){var url=self.getUrl("Users/New");return self.ajax({type:"POST",url:url,data:{Name:name},dataType:"json"})},self.updateUser=function(user){if(!user)throw new Error("null user");var url=self.getUrl("Users/"+user.Id);return self.ajax({type:"POST",url:url,data:JSON.stringify(user),contentType:"application/json"})},self.updateUserPolicy=function(userId,policy){if(!userId)throw new Error("null userId");if(!policy)throw new Error("null policy");var url=self.getUrl("Users/"+userId+"/Policy");return self.ajax({type:"POST",url:url,data:JSON.stringify(policy),contentType:"application/json"})},self.updateUserConfiguration=function(userId,configuration){if(!userId)throw new Error("null userId");if(!configuration)throw new Error("null configuration");var url=self.getUrl("Users/"+userId+"/Configuration");return self.ajax({type:"POST",url:url,data:JSON.stringify(configuration),contentType:"application/json"})},self.updateScheduledTaskTriggers=function(id,triggers){if(!id)throw new Error("null id");if(!triggers)throw new Error("null triggers");var url=self.getUrl("ScheduledTasks/"+id+"/Triggers");return self.ajax({type:"POST",url:url,data:JSON.stringify(triggers),contentType:"application/json"})},self.updatePluginConfiguration=function(id,configuration){if(!id)throw new Error("null Id");if(!configuration)throw new Error("null configuration");var url=self.getUrl("Plugins/"+id+"/Configuration");return self.ajax({type:"POST",url:url,data:JSON.stringify(configuration),contentType:"application/json"})},self.getAncestorItems=function(itemId,userId){if(!itemId)throw new Error("null itemId");var options={};userId&&(options.userId=userId);var url=self.getUrl("Items/"+itemId+"/Ancestors",options);return self.getJSON(url)},self.getItems=function(userId,options){var url;return url="string"===(typeof userId).toString().toLowerCase()?self.getUrl("Users/"+userId+"/Items",options):self.getUrl("Items",options),self.getJSON(url)},self.getMovieRecommendations=function(options){return self.getJSON(self.getUrl("Movies/Recommendations",options))},self.getUpcomingEpisodes=function(options){return self.getJSON(self.getUrl("Shows/Upcoming",options))},self.getChannels=function(query){return self.getJSON(self.getUrl("Channels",query||{}))},self.getLatestChannelItems=function(query){return self.getJSON(self.getUrl("Channels/Items/Latest",query))},self.getUserViews=function(options,userId){options=options||{};var url=self.getUrl("Users/"+(userId||self.getCurrentUserId())+"/Views",options);return self.getJSON(url)},self.getArtists=function(userId,options){if(!userId)throw new Error("null userId");options=options||{},options.userId=userId;var url=self.getUrl("Artists",options);return self.getJSON(url)},self.getAlbumArtists=function(userId,options){if(!userId)throw new Error("null userId");options=options||{},options.userId=userId;var url=self.getUrl("Artists/AlbumArtists",options);return self.getJSON(url)},self.getGenres=function(userId,options){if(!userId)throw new Error("null userId");options=options||{},options.userId=userId;var url=self.getUrl("Genres",options);return self.getJSON(url)},self.getMusicGenres=function(userId,options){if(!userId)throw new Error("null userId");options=options||{},options.userId=userId;var url=self.getUrl("MusicGenres",options);return self.getJSON(url)},self.getGameGenres=function(userId,options){if(!userId)throw new Error("null userId");options=options||{},options.userId=userId;var url=self.getUrl("GameGenres",options);return self.getJSON(url)},self.getPeople=function(userId,options){if(!userId)throw new Error("null userId");options=options||{},options.userId=userId;var url=self.getUrl("Persons",options);return self.getJSON(url)},self.getStudios=function(userId,options){if(!userId)throw new Error("null userId");options=options||{},options.userId=userId;var url=self.getUrl("Studios",options);return self.getJSON(url)},self.getLocalTrailers=function(userId,itemId){if(!userId)throw new Error("null userId");if(!itemId)throw new Error("null itemId");var url=self.getUrl("Users/"+userId+"/Items/"+itemId+"/LocalTrailers");return self.getJSON(url)},self.getGameSystems=function(){var options={},userId=self.getCurrentUserId();userId&&(options.userId=userId);var url=self.getUrl("Games/SystemSummaries",options);return self.getJSON(url)},self.getAdditionalVideoParts=function(userId,itemId){if(!itemId)throw new Error("null itemId");var options={};userId&&(options.userId=userId);var url=self.getUrl("Videos/"+itemId+"/AdditionalParts",options);return self.getJSON(url)},self.getThemeMedia=function(userId,itemId,inherit){if(!itemId)throw new Error("null itemId");var options={};userId&&(options.userId=userId),options.InheritFromParent=inherit||!1;var url=self.getUrl("Items/"+itemId+"/ThemeMedia",options);return self.getJSON(url)},self.getSearchHints=function(options){var url=self.getUrl("Search/Hints",options);return self.getJSON(url).then(function(result){var serverId=self.serverId();return result.SearchHints.forEach(function(i){i.ServerId=serverId}),result})},self.getSpecialFeatures=function(userId,itemId){if(!userId)throw new Error("null userId");if(!itemId)throw new Error("null itemId");var url=self.getUrl("Users/"+userId+"/Items/"+itemId+"/SpecialFeatures");return self.getJSON(url)},self.getDateParamValue=function(date){function formatDigit(i){return i<10?"0"+i:i}var d=date;return""+d.getFullYear()+formatDigit(d.getMonth()+1)+formatDigit(d.getDate())+formatDigit(d.getHours())+formatDigit(d.getMinutes())+formatDigit(d.getSeconds())},self.markPlayed=function(userId,itemId,date){if(!userId)throw new Error("null userId");if(!itemId)throw new Error("null itemId");var options={};date&&(options.DatePlayed=self.getDateParamValue(date));var url=self.getUrl("Users/"+userId+"/PlayedItems/"+itemId,options);return self.ajax({type:"POST",url:url,dataType:"json"})},self.markUnplayed=function(userId,itemId){if(!userId)throw new Error("null userId");if(!itemId)throw new Error("null itemId");var url=self.getUrl("Users/"+userId+"/PlayedItems/"+itemId);return self.ajax({type:"DELETE",url:url,dataType:"json"})},self.updateFavoriteStatus=function(userId,itemId,isFavorite){if(!userId)throw new Error("null userId");if(!itemId)throw new Error("null itemId");var url=self.getUrl("Users/"+userId+"/FavoriteItems/"+itemId),method=isFavorite?"POST":"DELETE";return self.ajax({type:method,url:url,dataType:"json"})},self.updateUserItemRating=function(userId,itemId,likes){if(!userId)throw new Error("null userId");if(!itemId)throw new Error("null itemId");var url=self.getUrl("Users/"+userId+"/Items/"+itemId+"/Rating",{likes:likes});return self.ajax({type:"POST",url:url,dataType:"json"})},self.getItemCounts=function(userId){var options={};userId&&(options.userId=userId);var url=self.getUrl("Items/Counts",options);return self.getJSON(url)},self.clearUserItemRating=function(userId,itemId){if(!userId)throw new Error("null userId");if(!itemId)throw new Error("null itemId");var url=self.getUrl("Users/"+userId+"/Items/"+itemId+"/Rating");return self.ajax({type:"DELETE",url:url,dataType:"json"})},self.reportPlaybackStart=function(options){if(!options)throw new Error("null options");stopBitrateDetection();var url=self.getUrl("Sessions/Playing");return self.ajax({type:"POST",data:JSON.stringify(options),contentType:"application/json",url:url})},self.reportPlaybackProgress=function(options){if(!options)throw new Error("null options");if(self.isWebSocketOpen())return new Promise(function(resolve,reject){var msg=JSON.stringify(options);self.sendWebSocketMessage("ReportPlaybackProgress",msg),resolve()});var url=self.getUrl("Sessions/Playing/Progress");return self.ajax({type:"POST",data:JSON.stringify(options),contentType:"application/json",url:url})},self.reportOfflineActions=function(actions){if(!actions)throw new Error("null actions");var url=self.getUrl("Sync/OfflineActions");return self.ajax({type:"POST",data:JSON.stringify(actions),contentType:"application/json",url:url})},self.syncData=function(data){if(!data)throw new Error("null data");var url=self.getUrl("Sync/Data");return self.ajax({type:"POST",data:JSON.stringify(data),contentType:"application/json",url:url,dataType:"json"})},self.getReadySyncItems=function(deviceId){if(!deviceId)throw new Error("null deviceId");var url=self.getUrl("Sync/Items/Ready",{TargetId:deviceId});return self.getJSON(url)},self.reportSyncJobItemTransferred=function(syncJobItemId){if(!syncJobItemId)throw new Error("null syncJobItemId");var url=self.getUrl("Sync/JobItems/"+syncJobItemId+"/Transferred");return self.ajax({type:"POST",url:url})},self.cancelSyncItems=function(itemIds,targetId){if(!itemIds)throw new Error("null itemIds");var url=self.getUrl("Sync/"+(targetId||self.deviceId())+"/Items",{ItemIds:itemIds.join(",")});return self.ajax({type:"DELETE",url:url})},self.reportPlaybackStopped=function(options){if(!options)throw new Error("null options");redetectBitrate();var url=self.getUrl("Sessions/Playing/Stopped");return self.ajax({type:"POST",data:JSON.stringify(options),contentType:"application/json",url:url})},self.sendPlayCommand=function(sessionId,options){if(!sessionId)throw new Error("null sessionId");if(!options)throw new Error("null options");var url=self.getUrl("Sessions/"+sessionId+"/Playing",options);return self.ajax({type:"POST",url:url})},self.sendCommand=function(sessionId,command){if(!sessionId)throw new Error("null sessionId");if(!command)throw new Error("null command");var url=self.getUrl("Sessions/"+sessionId+"/Command"),ajaxOptions={type:"POST",url:url};return ajaxOptions.data=JSON.stringify(command),ajaxOptions.contentType="application/json",self.ajax(ajaxOptions)},self.sendMessageCommand=function(sessionId,options){if(!sessionId)throw new Error("null sessionId");if(!options)throw new Error("null options");var url=self.getUrl("Sessions/"+sessionId+"/Message",options);return self.ajax({type:"POST",url:url})},self.sendPlayStateCommand=function(sessionId,command,options){if(!sessionId)throw new Error("null sessionId");if(!command)throw new Error("null command");var url=self.getUrl("Sessions/"+sessionId+"/Playing/"+command,options||{});return self.ajax({type:"POST",url:url})};self.createPackageReview=function(review){var url=self.getUrl("Packages/Reviews/"+review.id,review);return self.ajax({type:"POST",url:url})};self.getPackageReviews=function(packageId,minRating,maxRating,limit){if(!packageId)throw new Error("null packageId");var options={};minRating&&(options.MinRating=minRating),maxRating&&(options.MaxRating=maxRating),limit&&(options.Limit=limit);var url=self.getUrl("Packages/"+packageId+"/Reviews",options);return self.getJSON(url)},self.getSmartMatchInfos=function(options){options=options||{};var url=self.getUrl("Library/FileOrganizations/SmartMatches",options);return self.ajax({type:"GET",url:url,dataType:"json"})},self.deleteSmartMatchEntries=function(entries){var url=self.getUrl("Library/FileOrganizations/SmartMatches/Delete"),postData={Entries:entries};return self.ajax({type:"POST",url:url,data:JSON.stringify(postData),contentType:"application/json"})},self.createPin=function(){return self.ajax({type:"POST",url:self.getUrl("Auth/Pin"),data:{deviceId:self.deviceId(),appName:self.appName()},dataType:"json"})},self.getPinStatus=function(pinInfo){var queryString={deviceId:pinInfo.DeviceId,pin:pinInfo.Pin};return self.ajax({type:"GET",url:self.getUrl("Auth/Pin",queryString),dataType:"json"})},self.exchangePin=function(pinInfo){return exchangePin(pinInfo).then(function(result){return self.onAuthenticated&&self.onAuthenticated(self,result),result})}}}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css index 513fc81c89..ea621ffde7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css +++ b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css @@ -1 +1 @@ -.actionSheet,.actionSheetContent{display:-webkit-box;display:-webkit-flex}.actionSheetContent,.actionSheetScroller{-webkit-box-orient:vertical;-webkit-box-direction:normal}.actionSheet{display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;padding:0;border:none;max-height:84%;-webkit-border-radius:1px!important;border-radius:1px!important;color:#fff}.actionsheet-not-fullscreen{background-color:#121314;max-width:90%;max-height:90%;color:#eee}.actionSheetMenuItem:hover{background-color:#222}.actionsheet-fullscreen{max-height:none;-webkit-border-radius:0!important;border-radius:0!important}.actionSheetContent-centered{text-align:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.actionSheetContent{margin:0!important;padding:.4em 0!important;-webkit-flex-direction:column;flex-direction:column;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-box-align:center;-webkit-align-items:center;align-items:center;text-align:center;overflow:hidden}.actionSheetMenuItem{padding:0 1.6em;margin:0;text-transform:none;text-align:inherit;display:-webkit-box;display:-webkit-flex;display:flex;font-weight:inherit;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-flex-shrink:0;flex-shrink:0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.actionSheetMenuItem:focus{-webkit-transform:none!important;transform:none!important}.actionSheetMenuItem-noflex{display:block}.actionSheetItemText{padding:.7em 0;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;vertical-align:middle}.actionSheetItemText-extraspacing{padding:.9em 0}.emby-button-noflex .actionSheetItemText{display:inline-block}.actionSheetItemIcon{margin-right:1.5em!important}.actionSheetScroller{margin-bottom:0!important;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;width:100%}.layout-tv .actionSheetScroller{max-height:64%;max-width:60%;width:auto}.actionSheetTitle{margin:.5em 0!important;padding:0 1em;-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0}.actionSheetText{padding:0 1em;-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0}.actionsheet-extraSpacing{font-size:112%}.btnCloseActionSheet{position:fixed;top:.75em;left:.5em} \ No newline at end of file +.actionSheet,.actionSheetContent{display:-webkit-box;display:-webkit-flex}.actionSheetContent,.actionSheetScroller{-webkit-box-orient:vertical;-webkit-box-direction:normal}.actionSheet{display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;padding:0;border:none;max-height:84%;-webkit-border-radius:1px!important;border-radius:1px!important;color:#fff}.actionsheet-not-fullscreen{background-color:#121314;max-width:90%;max-height:90%;color:#eee}.actionSheetMenuItem:hover{background-color:#222}.actionsheet-fullscreen{max-height:none;-webkit-border-radius:0!important;border-radius:0!important}.actionSheetContent-centered{text-align:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.actionSheetContent{margin:0!important;padding:.4em 0!important;-webkit-flex-direction:column;flex-direction:column;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-box-align:center;-webkit-align-items:center;align-items:center;text-align:center;overflow:hidden}.actionSheetMenuItem{padding:.7em 1.6em;margin:0;text-transform:none;text-align:inherit;display:-webkit-box;display:-webkit-flex;display:flex;font-weight:inherit;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-flex-shrink:0;flex-shrink:0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.actionSheetMenuItem:focus{-webkit-transform:none!important;transform:none!important}.actionSheetMenuItem-noflex{display:block}.actionSheetMenuItem-extraspacing{padding:.9em 1.6em}.actionSheetItemText{white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;vertical-align:middle;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.actionSheetItemSecondaryText{opacity:.7;font-size:90%;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;-webkit-flex-shrink:0;flex-shrink:0;margin-left:5em}.emby-button-noflex .actionSheetItemText{display:inline-block}.actionSheetItemIcon{margin-right:1.5em!important}.actionSheetScroller{margin-bottom:0!important;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;width:100%}.layout-tv .actionSheetScroller{max-height:64%;max-width:60%;width:auto}.actionSheetTitle{margin:.5em 0!important;padding:0 1em;-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0}.actionSheetText{padding:0 1em;-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0}.actionsheet-extraSpacing{font-size:112%}.btnCloseActionSheet{position:fixed;top:.75em;left:.5em} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js index 012a74b098..e532933b07 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js +++ b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js @@ -1 +1 @@ -define(["dialogHelper","layoutManager","globalize","browser","dom","emby-button","css!./actionsheet","material-icons","scrollStyles"],function(dialogHelper,layoutManager,globalize,browser,dom){"use strict";function getOffsets(elems){var doc=document,results=[];if(!doc)return results;for(var box,elem,i=0,length=elems.length;i0&&(pos.left-=overflowX+20),overflowY>0&&(pos.top-=overflowY+20),pos.top+=options.offsetTop||0,pos.left+=options.offsetLeft||0,pos.top=Math.max(pos.top,10),pos.left=Math.max(pos.left,10),pos}function centerFocus(elem,horiz,on){require(["scrollHelper"],function(scrollHelper){var fn=on?"on":"off";scrollHelper.centerFocus[fn](elem,horiz)})}function show(options){var isFullscreen,dialogOptions={removeOnClose:!0,enableHistory:options.enableHistory,scrollY:!1},backButton=!1;layoutManager.tv?(dialogOptions.size="fullscreen",isFullscreen=!0,backButton=!0,dialogOptions.autoFocus=!0):(dialogOptions.modal=!1,dialogOptions.entryAnimation=options.entryAnimation,dialogOptions.exitAnimation=options.exitAnimation,dialogOptions.entryAnimationDuration=options.entryAnimationDuration||140,dialogOptions.exitAnimationDuration=options.exitAnimationDuration||160,dialogOptions.autoFocus=!1);var dlg=dialogHelper.createDialog(dialogOptions);isFullscreen?dlg.classList.add("actionsheet-fullscreen"):dlg.classList.add("actionsheet-not-fullscreen");var extraSpacing=!layoutManager.tv;extraSpacing&&dlg.classList.add("actionsheet-extraSpacing"),dlg.classList.add("actionSheet"),options.dialogClass&&dlg.classList.add(options.dialogClass);var html="",scrollType=layoutManager.desktop?"smoothScrollY":"hiddenScrollY",style=browser.firefox?"max-height:400px;":"";if(options.items.length>20){var minWidth=dom.getWindowSize().innerWidth>=300?240:200;style+="min-width:"+minWidth+"px;"}var i,length,option,renderIcon=!1;for(i=0,length=options.items.length;i');var center=options.title&&!renderIcon;html+=center?'
':'
',options.title&&(layoutManager.tv?(html+='

',html+=options.title,html+="

"):(html+='

',html+=options.title,html+="

")),options.text&&(html+='

',html+=options.text,html+="

"),html+='
';var menuItemClass=browser.firefox?"actionSheetMenuItem actionSheetMenuItem-noflex":"actionSheetMenuItem";options.menuItemClass&&(menuItemClass+=" "+options.menuItemClass);var actionSheetItemTextClass="actionSheetItemText";for(extraSpacing&&(actionSheetItemTextClass+=" actionSheetItemText-extraspacing"),i=0,length=options.items.length;i',option.icon?html+=''+option.icon+"":renderIcon&&!center&&(html+=''),html+='
'+(option.name||option.textContent||option.innerText)+"
",html+=""}options.showCancel&&(html+='
',html+='",html+="
"),html+="
",dlg.innerHTML=html,layoutManager.tv&¢erFocus(dlg.querySelector(".actionSheetScroller"),!1,!0);var btnCloseActionSheet=dlg.querySelector(".btnCloseActionSheet");btnCloseActionSheet&&dlg.querySelector(".btnCloseActionSheet").addEventListener("click",function(){dialogHelper.close(dlg)});var selectedId,timeout;return options.timeout&&(timeout=setTimeout(function(){dialogHelper.close(dlg)},options.timeout)),new Promise(function(resolve,reject){var isResolved;dlg.addEventListener("click",function(e){var actionSheetMenuItem=dom.parentWithClass(e.target,"actionSheetMenuItem");actionSheetMenuItem&&(selectedId=actionSheetMenuItem.getAttribute("data-id"),options.resolveOnClick&&(resolve(selectedId),isResolved=!0),dialogHelper.close(dlg))}),dlg.addEventListener("close",function(){layoutManager.tv&¢erFocus(dlg.querySelector(".actionSheetScroller"),!1,!1),timeout&&(clearTimeout(timeout),timeout=null),isResolved||(null!=selectedId?(options.callback&&options.callback(selectedId),resolve(selectedId)):reject())}),dialogHelper.open(dlg);var setPositions=function(){var pos=options.positionTo&&"fullscreen"!==dialogOptions.size?getPosition(options,dlg):null;pos&&(dlg.style.position="fixed",dlg.style.margin=0,dlg.style.left=pos.left+"px",dlg.style.top=pos.top+"px")};browser.safari?setTimeout(setPositions,0):setPositions()})}return{show:show}}); \ No newline at end of file +define(["dialogHelper","layoutManager","globalize","browser","dom","emby-button","css!./actionsheet","material-icons","scrollStyles"],function(dialogHelper,layoutManager,globalize,browser,dom){"use strict";function getOffsets(elems){var doc=document,results=[];if(!doc)return results;for(var box,elem,i=0,length=elems.length;i0&&(pos.left-=overflowX+20),overflowY>0&&(pos.top-=overflowY+20),pos.top+=options.offsetTop||0,pos.left+=options.offsetLeft||0,pos.top=Math.max(pos.top,10),pos.left=Math.max(pos.left,10),pos}function centerFocus(elem,horiz,on){require(["scrollHelper"],function(scrollHelper){var fn=on?"on":"off";scrollHelper.centerFocus[fn](elem,horiz)})}function show(options){var isFullscreen,dialogOptions={removeOnClose:!0,enableHistory:options.enableHistory,scrollY:!1},backButton=!1;layoutManager.tv?(dialogOptions.size="fullscreen",isFullscreen=!0,backButton=!0,dialogOptions.autoFocus=!0):(dialogOptions.modal=!1,dialogOptions.entryAnimation=options.entryAnimation,dialogOptions.exitAnimation=options.exitAnimation,dialogOptions.entryAnimationDuration=options.entryAnimationDuration||140,dialogOptions.exitAnimationDuration=options.exitAnimationDuration||160,dialogOptions.autoFocus=!1);var dlg=dialogHelper.createDialog(dialogOptions);isFullscreen?dlg.classList.add("actionsheet-fullscreen"):dlg.classList.add("actionsheet-not-fullscreen");var extraSpacing=!layoutManager.tv;extraSpacing&&dlg.classList.add("actionsheet-extraSpacing"),dlg.classList.add("actionSheet"),options.dialogClass&&dlg.classList.add(options.dialogClass);var html="",scrollType=layoutManager.desktop?"smoothScrollY":"hiddenScrollY",style=browser.firefox?"max-height:400px;":"";if(options.items.length>20){var minWidth=dom.getWindowSize().innerWidth>=300?240:200;style+="min-width:"+minWidth+"px;"}var i,length,option,renderIcon=!1;for(i=0,length=options.items.length;i');var center=options.title&&!renderIcon;html+=center?'
':'
',options.title&&(layoutManager.tv?(html+='

',html+=options.title,html+="

"):(html+='

',html+=options.title,html+="

")),options.text&&(html+='

',html+=options.text,html+="

"),html+='
';var menuItemClass=browser.firefox?"actionSheetMenuItem actionSheetMenuItem-noflex":"actionSheetMenuItem";options.menuItemClass&&(menuItemClass+=" "+options.menuItemClass),extraSpacing&&(menuItemClass+=" actionSheetMenuItem-extraspacing");var actionSheetItemTextClass="actionSheetItemText";for(i=0,length=options.items.length;i',option.icon?html+=''+option.icon+"":renderIcon&&!center&&(html+=''),html+='
'+(option.name||option.textContent||option.innerText)+"
",option.secondaryText&&(html+='
'+option.secondaryText+"
"),html+=""}options.showCancel&&(html+='
',html+='",html+="
"),html+="
",dlg.innerHTML=html,layoutManager.tv&¢erFocus(dlg.querySelector(".actionSheetScroller"),!1,!0);var btnCloseActionSheet=dlg.querySelector(".btnCloseActionSheet");btnCloseActionSheet&&dlg.querySelector(".btnCloseActionSheet").addEventListener("click",function(){dialogHelper.close(dlg)});var selectedId,timeout;return options.timeout&&(timeout=setTimeout(function(){dialogHelper.close(dlg)},options.timeout)),new Promise(function(resolve,reject){var isResolved;dlg.addEventListener("click",function(e){var actionSheetMenuItem=dom.parentWithClass(e.target,"actionSheetMenuItem");actionSheetMenuItem&&(selectedId=actionSheetMenuItem.getAttribute("data-id"),options.resolveOnClick&&(resolve(selectedId),isResolved=!0),dialogHelper.close(dlg))}),dlg.addEventListener("close",function(){layoutManager.tv&¢erFocus(dlg.querySelector(".actionSheetScroller"),!1,!1),timeout&&(clearTimeout(timeout),timeout=null),isResolved||(null!=selectedId?(options.callback&&options.callback(selectedId),resolve(selectedId)):reject())}),dialogHelper.open(dlg);var setPositions=function(){var pos=options.positionTo&&"fullscreen"!==dialogOptions.size?getPosition(options,dlg):null;pos&&(dlg.style.position="fixed",dlg.style.margin=0,dlg.style.left=pos.left+"px",dlg.style.top=pos.top+"px")};browser.safari?setTimeout(setPositions,0):setPositions()})}return{show:show}}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/chromecastplayer.js b/dashboard-ui/bower_components/emby-webcomponents/chromecastplayer.js index 03b2702b28..cf16443809 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/chromecastplayer.js +++ b/dashboard-ui/bower_components/emby-webcomponents/chromecastplayer.js @@ -1 +1 @@ -define(["appSettings","playbackManager","connectionManager","globalize","events"],function(appSettings,playbackManager,connectionManager,globalize,events){"use strict";function sendConnectionResult(isOk){var resolve=currentResolve,reject=currentReject;currentResolve=null,currentReject=null,isOk?resolve&&resolve():reject?reject():playbackManager.removeActivePlayer(PlayerName)}function alertText(text,title){require(["alert"],function(alert){alert({text:text,title:title})})}function chromecastPlayer(){function initializeChromecast(){fileref.loaded=!0,castPlayer=new CastPlayer,document.dispatchEvent(new CustomEvent("chromecastloaded",{detail:{player:self}})),events.on(castPlayer,"connect",function(e){currentResolve?sendConnectionResult(!0):playbackManager.setActivePlayer(PlayerName,self.getCurrentTargetInfo()),console.log("cc: connect"),self.lastPlayerData=null}),events.on(castPlayer,"playbackstart",function(e,data){console.log("cc: playbackstart"),castPlayer.initializeCastPlayer();var state=self.getPlayerStateInternal(data);events.trigger(self,"playbackstart",[state])}),events.on(castPlayer,"playbackstop",function(e,data){console.log("cc: playbackstop");var state=self.getPlayerStateInternal(data);events.trigger(self,"playbackstop",[state]),self.lastPlayerData={}}),events.on(castPlayer,"playbackprogress",function(e,data){console.log("cc: positionchange");var state=self.getPlayerStateInternal(data);events.trigger(self,"timeupdate",[state])}),events.on(castPlayer,"volumechange",function(e,data){console.log("cc: volumechange");var state=self.getPlayerStateInternal(data);events.trigger(self,"volumechange",[state])}),events.on(castPlayer,"repeatmodechange",function(e,data){console.log("cc: repeatmodechange");var state=self.getPlayerStateInternal(data);events.trigger(self,"repeatmodechange",[state])}),events.on(castPlayer,"playstatechange",function(e,data){console.log("cc: playstatechange");var state=self.getPlayerStateInternal(data);events.trigger(self,"pause",[state])})}function normalizeImages(state){if(state&&state.NowPlayingItem){var item=state.NowPlayingItem;item.ImageTags&&item.ImageTags.Primary||item.PrimaryImageTag&&(item.ImageTags=item.ImageTags||{},item.ImageTags.Primary=item.PrimaryImageTag),item.BackdropImageTag&&item.BackdropItemId===item.Id&&(item.BackdropImageTags=[item.BackdropImageTag]),item.BackdropImageTag&&item.BackdropItemId!==item.Id&&(item.ParentBackdropImageTags=[item.BackdropImageTag],item.ParentBackdropItemId=item.BackdropItemId)}}var castPlayer,self=this;self.name=PlayerName,self.type="mediaplayer",self.id="chromecast",self.isLocalPlayer=!1,self.getItemsForPlayback=function(query){var userId=ApiClient.getCurrentUserId();return query.Ids&&1===query.Ids.split(",").length?ApiClient.getItem(userId,query.Ids.split(",")).then(function(item){return{Items:[item],TotalRecordCount:1}}):(query.Limit=query.Limit||100,query.ExcludeLocationTypes="Virtual",ApiClient.getItems(userId,query))},self.play=function(options){return ApiClient.getCurrentUser().then(function(user){return options.items?self.playWithCommand(options,"PlayNow"):self.getItemsForPlayback({Ids:options.ids.join(",")}).then(function(result){return options.items=result.Items,self.playWithCommand(options,"PlayNow")})})},self.playWithCommand=function(options,command){if(!options.items){var apiClient=connectionManager.getApiClient(options.serverId);return apiClient.getItem(apiClient.getCurrentUserId(),options.ids[0]).then(function(item){return options.items=[item],self.playWithCommand(options,command)})}return castPlayer.loadMedia(options,command)},self.unpause=function(){castPlayer.sendMessage({options:{},command:"Unpause"})},self.playPause=function(){castPlayer.sendMessage({options:{},command:"PlayPause"})},self.pause=function(){castPlayer.sendMessage({options:{},command:"Pause"})},self.shuffle=function(item){var apiClient=connectionManager.getApiClient(item.ServerId),userId=apiClient.getCurrentUserId();apiClient.getItem(userId,item.Id).then(function(item){self.playWithCommand({items:[item]},"Shuffle")})},self.instantMix=function(item){var apiClient=connectionManager.getApiClient(item.ServerId),userId=apiClient.getCurrentUserId();apiClient.getItem(userId,item.Id).then(function(item){self.playWithCommand({items:[item]},"InstantMix")})},self.canPlayMediaType=function(mediaType){return mediaType=(mediaType||"").toLowerCase(),"audio"===mediaType||"video"===mediaType},self.canQueueMediaType=function(mediaType){return self.canPlayMediaType(mediaType)},self.queue=function(options){self.playWithCommand(options,"PlayLast")},self.queueNext=function(options){self.playWithCommand(options,"PlayNext")},self.stop=function(){return castPlayer.sendMessage({options:{},command:"Stop"})},self.displayContent=function(options){castPlayer.sendMessage({options:options,command:"DisplayContent"})},self.isPlaying=function(){var state=self.lastPlayerData||{};return null!=state.NowPlayingItem},self.isPlayingVideo=function(){var state=self.lastPlayerData||{};return state=state.NowPlayingItem||{},"Video"===state.MediaType},self.isPlayingAudio=function(){var state=self.lastPlayerData||{};return state=state.NowPlayingItem||{},"Audio"===state.MediaType},self.currentTime=function(val){if(null!=val)return self.seek(val);var state=self.lastPlayerData||{};return state=state.PlayState||{},state.PositionTicks},self.duration=function(){var state=self.lastPlayerData||{};return state=state.NowPlayingItem||{},state.RunTimeTicks},self.paused=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.IsPaused},self.isMuted=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.IsMuted},self.setMute=function(isMuted){isMuted?castPlayer.sendMessage({options:{},command:"Mute"}):castPlayer.sendMessage({options:{},command:"Unmute"})},self.getRepeatMode=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.RepeatMode},self.setRepeatMode=function(mode){castPlayer.sendMessage({options:{RepeatMode:mode},command:"SetRepeatMode"})},self.toggleMute=function(){castPlayer.sendMessage({options:{},command:"ToggleMute"})},self.getTargets=function(){var targets=[];return castPlayer.hasReceivers&&targets.push(self.getCurrentTargetInfo()),Promise.resolve(targets)},self.getCurrentTargetInfo=function(){var appName=null;return castPlayer.session&&castPlayer.session.receiver&&castPlayer.session.receiver.friendlyName&&(appName=castPlayer.session.receiver.friendlyName),{name:PlayerName,id:PlayerName,playerName:PlayerName,playableMediaTypes:["Audio","Video"],isLocalPlayer:!1,appName:PlayerName,deviceName:appName,supportedCommands:["VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","DisplayContent","SetRepeatMode","EndSession"]}},self.seek=function(position){position=parseInt(position),position/=1e7,castPlayer.sendMessage({options:{position:position},command:"Seek"})},self.audioTracks=function(){var state=self.lastPlayerData||{};state=state.NowPlayingItem||{};var streams=state.MediaStreams||[];return streams.filter(function(s){return"Audio"===s.Type})},self.setAudioStreamIndex=function(index){castPlayer.sendMessage({options:{index:index},command:"SetAudioStreamIndex"})},self.getAudioStreamIndex=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.AudioStreamIndex},self.subtitleTracks=function(){var state=self.lastPlayerData||{};state=state.NowPlayingItem||{};var streams=state.MediaStreams||[];return streams.filter(function(s){return"Subtitle"===s.Type})},self.getSubtitleStreamIndex=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.SubtitleStreamIndex},self.setSubtitleStreamIndex=function(index){castPlayer.sendMessage({options:{index:index},command:"SetSubtitleStreamIndex"})},self.getMaxStreamingBitrate=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.MaxStreamingBitrate},self.setMaxStreamingBitrate=function(bitrate){castPlayer.sendMessage({options:{bitrate:bitrate},command:"SetMaxStreamingBitrate"})},self.isFullscreen=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.IsFullscreen},self.toggleFullscreen=function(){},self.nextTrack=function(){castPlayer.sendMessage({options:{},command:"NextTrack"})},self.previousTrack=function(){castPlayer.sendMessage({options:{},command:"PreviousTrack"})},self.beginPlayerUpdates=function(){},self.endPlayerUpdates=function(){},self.getVolume=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},null==state.VolumeLevel?100:state.VolumeLevel},self.volumeDown=function(){castPlayer.sendMessage({options:{},command:"VolumeDown"})},self.endSession=function(){self.stop().then(function(){setTimeout(function(){castPlayer.stopApp()},1e3)})},self.volumeUp=function(){castPlayer.sendMessage({options:{},command:"VolumeUp"})},self.setVolume=function(vol){vol=Math.min(vol,100),vol=Math.max(vol,0),castPlayer.sendMessage({options:{volume:vol},command:"SetVolume"})},self.getPlaylist=function(){return Promise.resolve([])},self.getCurrentPlaylistItemId=function(){},self.setCurrentPlaylistItem=function(playlistItemId){return Promise.resolve()},self.removeFromPlaylist=function(playlistItemIds){return Promise.resolve()},self.getPlayerState=function(){return Promise.resolve(self.getPlayerStateInternal()||{})},self.lastPlayerData={},self.getPlayerStateInternal=function(data){var triggerStateChange=!1;return data&&!self.lastPlayerData&&(triggerStateChange=!0),data=data||self.lastPlayerData,self.lastPlayerData=data,normalizeImages(data),triggerStateChange&&events.trigger(self,"statechange",[data]),data},self.tryPair=function(target){return castPlayer.deviceState!==DEVICE_STATE.ACTIVE&&castPlayer.isInitialized?new Promise(function(resolve,reject){currentResolve=resolve,currentReject=reject,castPlayer.launchApp()}):(currentResolve=null,currentReject=null,Promise.reject())},fileref.loaded?initializeChromecast():fileref.onload=initializeChromecast}var currentResolve,currentReject,PlayerName="Chromecast",DEVICE_STATE={IDLE:0,ACTIVE:1,WARNING:2,ERROR:3},PLAYER_STATE={IDLE:"IDLE",LOADING:"LOADING",LOADED:"LOADED",PLAYING:"PLAYING",PAUSED:"PAUSED",STOPPED:"STOPPED",SEEKING:"SEEKING",ERROR:"ERROR"},applicationID="2D4B1DA3",messageNamespace="urn:x-cast:com.connectsdk",CastPlayer=function(){this.deviceState=DEVICE_STATE.IDLE,this.currentMediaSession=null,this.session=null,this.castPlayerState=PLAYER_STATE.IDLE,this.hasReceivers=!1,this.errorHandler=this.onError.bind(this),this.mediaStatusUpdateHandler=this.onMediaStatusUpdate.bind(this),this.initializeCastPlayer()};CastPlayer.prototype.initializeCastPlayer=function(){var chrome=window.chrome;if(chrome){if(!chrome.cast||!chrome.cast.isAvailable)return void setTimeout(this.initializeCastPlayer.bind(this),1e3);var sessionRequest=new chrome.cast.SessionRequest(applicationID),apiConfig=new chrome.cast.ApiConfig(sessionRequest,this.sessionListener.bind(this),this.receiverListener.bind(this),"origin_scoped");console.log("chromecast.initialize"),chrome.cast.initialize(apiConfig,this.onInitSuccess.bind(this),this.errorHandler)}},CastPlayer.prototype.onInitSuccess=function(){this.isInitialized=!0,console.log("chromecast init success")},CastPlayer.prototype.onError=function(){console.log("chromecast error")},CastPlayer.prototype.sessionListener=function(e){this.session=e,this.session&&(console.log("sessionListener "+JSON.stringify(e)),this.session.media[0]&&this.onMediaDiscovered("activeSession",this.session.media[0]),this.onSessionConnected(e))},CastPlayer.prototype.messageListener=function(namespace,message){if("string"==typeof message&&(message=JSON.parse(message)),"playbackerror"===message.type){var errorCode=message.data;setTimeout(function(){alertText(globalize.translate("MessagePlaybackError"+errorCode),globalize.translate("HeaderPlaybackError"))},300)}else"connectionerror"===message.type?setTimeout(function(){alertText(globalize.translate("MessageChromecastConnectionError"),globalize.translate("HeaderError"))},300):message.type&&events.trigger(this,message.type,[message.data])},CastPlayer.prototype.receiverListener=function(e){"available"===e?(console.log("chromecast receiver found"),this.hasReceivers=!0):(console.log("chromecast receiver list empty"),this.hasReceivers=!1)},CastPlayer.prototype.sessionUpdateListener=function(isAlive){console.log("sessionUpdateListener alive: "+isAlive),isAlive||(this.session=null,this.deviceState=DEVICE_STATE.IDLE,this.castPlayerState=PLAYER_STATE.IDLE,console.log("sessionUpdateListener: setting currentMediaSession to null"),this.currentMediaSession=null,sendConnectionResult(!1))},CastPlayer.prototype.launchApp=function(){console.log("chromecast launching app..."),chrome.cast.requestSession(this.onRequestSessionSuccess.bind(this),this.onLaunchError.bind(this))},CastPlayer.prototype.onRequestSessionSuccess=function(e){console.log("chromecast session success: "+e.sessionId),this.onSessionConnected(e)},CastPlayer.prototype.onSessionConnected=function(session){this.session=session,this.deviceState=DEVICE_STATE.ACTIVE,this.session.addMessageListener(messageNamespace,this.messageListener.bind(this)),this.session.addMediaListener(this.sessionMediaListener.bind(this)),this.session.addUpdateListener(this.sessionUpdateListener.bind(this)),events.trigger(this,"connect"),this.sendMessage({options:{},command:"Identify"})},CastPlayer.prototype.sessionMediaListener=function(e){console.log("sessionMediaListener"),this.currentMediaSession=e,this.currentMediaSession.addUpdateListener(this.mediaStatusUpdateHandler)},CastPlayer.prototype.onLaunchError=function(){console.log("chromecast launch error"),this.deviceState=DEVICE_STATE.ERROR,sendConnectionResult(!1)},CastPlayer.prototype.stopApp=function(){this.session&&this.session.stop(this.onStopAppSuccess.bind(this,"Session stopped"),this.errorHandler)},CastPlayer.prototype.onStopAppSuccess=function(message){console.log(message),this.deviceState=DEVICE_STATE.IDLE,this.castPlayerState=PLAYER_STATE.IDLE,console.log("onStopAppSuccess: setting currentMediaSession to null"),this.currentMediaSession=null},CastPlayer.prototype.loadMedia=function(options,command){return this.session?(options.items=options.items.map(function(i){return{Id:i.Id,Name:i.Name,Type:i.Type,MediaType:i.MediaType,IsFolder:i.IsFolder}}),this.sendMessage({options:options,command:command})):(console.log("no session"),Promise.reject())},CastPlayer.prototype.sendMessage=function(message){var player=this,receiverName=null,session=player.session;session&&session.receiver&&session.receiver.friendlyName&&(receiverName=session.receiver.friendlyName),message=Object.assign(message,{userId:ApiClient.getCurrentUserId(),deviceId:ApiClient.deviceId(),accessToken:ApiClient.accessToken(),serverAddress:ApiClient.serverAddress(),receiverName:receiverName});var bitrateSetting=appSettings.maxChromecastBitrate();return bitrateSetting&&(message.maxBitrate=bitrateSetting),new Promise(function(resolve,reject){require(["chromecasthelpers"],function(chromecasthelpers){chromecasthelpers.getServerAddress(ApiClient).then(function(serverAddress){message.serverAddress=serverAddress,player.sendMessageInternal(message).then(resolve,reject)},reject)})})},CastPlayer.prototype.sendMessageInternal=function(message){return message=JSON.stringify(message),this.session.sendMessage(messageNamespace,message,this.onPlayCommandSuccess.bind(this),this.errorHandler),Promise.resolve()},CastPlayer.prototype.onPlayCommandSuccess=function(){console.log("Message was sent to receiver ok.")},CastPlayer.prototype.onMediaDiscovered=function(how,mediaSession){console.log("chromecast new media session ID:"+mediaSession.mediaSessionId+" ("+how+")"),this.currentMediaSession=mediaSession,"loadMedia"===how&&(this.castPlayerState=PLAYER_STATE.PLAYING),"activeSession"===how&&(this.castPlayerState=mediaSession.playerState),this.currentMediaSession.addUpdateListener(this.mediaStatusUpdateHandler)},CastPlayer.prototype.onMediaStatusUpdate=function(e){e===!1&&(this.castPlayerState=PLAYER_STATE.IDLE),console.log("chromecast updating media: "+e)},CastPlayer.prototype.setReceiverVolume=function(mute,vol){return this.currentMediaSession?void(mute?this.session.setReceiverMuted(!0,this.mediaCommandSuccessCallback.bind(this),this.errorHandler):this.session.setReceiverVolumeLevel(vol||1,this.mediaCommandSuccessCallback.bind(this),this.errorHandler)):void console.log("this.currentMediaSession is null")},CastPlayer.prototype.mute=function(){this.setReceiverVolume(!0)},CastPlayer.prototype.mediaCommandSuccessCallback=function(info,e){console.log(info)};var fileref=document.createElement("script");return fileref.setAttribute("type","text/javascript"),fileref.onload=function(){fileref.loaded=!0},fileref.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"),document.querySelector("head").appendChild(fileref),chromecastPlayer}); \ No newline at end of file +define(["appSettings","playbackManager","connectionManager","globalize","events"],function(appSettings,playbackManager,connectionManager,globalize,events){"use strict";function sendConnectionResult(isOk){var resolve=currentResolve,reject=currentReject;currentResolve=null,currentReject=null,isOk?resolve&&resolve():reject?reject():playbackManager.removeActivePlayer(PlayerName)}function alertText(text,title){require(["alert"],function(alert){alert({text:text,title:title})})}function chromecastPlayer(){function initializeChromecast(){fileref.loaded=!0,castPlayer=new CastPlayer,document.dispatchEvent(new CustomEvent("chromecastloaded",{detail:{player:self}})),events.on(castPlayer,"connect",function(e){currentResolve?sendConnectionResult(!0):playbackManager.setActivePlayer(PlayerName,self.getCurrentTargetInfo()),console.log("cc: connect"),self.lastPlayerData=null}),events.on(castPlayer,"playbackstart",function(e,data){console.log("cc: playbackstart"),castPlayer.initializeCastPlayer();var state=self.getPlayerStateInternal(data);events.trigger(self,"playbackstart",[state])}),events.on(castPlayer,"playbackstop",function(e,data){console.log("cc: playbackstop");var state=self.getPlayerStateInternal(data);events.trigger(self,"playbackstop",[state]),self.lastPlayerData={}}),events.on(castPlayer,"playbackprogress",function(e,data){console.log("cc: positionchange");var state=self.getPlayerStateInternal(data);events.trigger(self,"timeupdate",[state])}),events.on(castPlayer,"volumechange",function(e,data){console.log("cc: volumechange");var state=self.getPlayerStateInternal(data);events.trigger(self,"volumechange",[state])}),events.on(castPlayer,"repeatmodechange",function(e,data){console.log("cc: repeatmodechange");var state=self.getPlayerStateInternal(data);events.trigger(self,"repeatmodechange",[state])}),events.on(castPlayer,"playstatechange",function(e,data){console.log("cc: playstatechange");var state=self.getPlayerStateInternal(data);events.trigger(self,"pause",[state])})}function normalizeImages(state){if(state&&state.NowPlayingItem){var item=state.NowPlayingItem;item.ImageTags&&item.ImageTags.Primary||item.PrimaryImageTag&&(item.ImageTags=item.ImageTags||{},item.ImageTags.Primary=item.PrimaryImageTag),item.BackdropImageTag&&item.BackdropItemId===item.Id&&(item.BackdropImageTags=[item.BackdropImageTag]),item.BackdropImageTag&&item.BackdropItemId!==item.Id&&(item.ParentBackdropImageTags=[item.BackdropImageTag],item.ParentBackdropItemId=item.BackdropItemId)}}var castPlayer,self=this;self.name=PlayerName,self.type="mediaplayer",self.id="chromecast",self.isLocalPlayer=!1,self.getItemsForPlayback=function(query){var userId=ApiClient.getCurrentUserId();return query.Ids&&1===query.Ids.split(",").length?ApiClient.getItem(userId,query.Ids.split(",")).then(function(item){return{Items:[item],TotalRecordCount:1}}):(query.Limit=query.Limit||100,query.ExcludeLocationTypes="Virtual",ApiClient.getItems(userId,query))},self.play=function(options){return ApiClient.getCurrentUser().then(function(user){return options.items?self.playWithCommand(options,"PlayNow"):self.getItemsForPlayback({Ids:options.ids.join(",")}).then(function(result){return options.items=result.Items,self.playWithCommand(options,"PlayNow")})})},self.playWithCommand=function(options,command){if(!options.items){var apiClient=connectionManager.getApiClient(options.serverId);return apiClient.getItem(apiClient.getCurrentUserId(),options.ids[0]).then(function(item){return options.items=[item],self.playWithCommand(options,command)})}return castPlayer.loadMedia(options,command)},self.unpause=function(){castPlayer.sendMessage({options:{},command:"Unpause"})},self.playPause=function(){castPlayer.sendMessage({options:{},command:"PlayPause"})},self.pause=function(){castPlayer.sendMessage({options:{},command:"Pause"})},self.shuffle=function(item){var apiClient=connectionManager.getApiClient(item.ServerId),userId=apiClient.getCurrentUserId();apiClient.getItem(userId,item.Id).then(function(item){self.playWithCommand({items:[item]},"Shuffle")})},self.instantMix=function(item){var apiClient=connectionManager.getApiClient(item.ServerId),userId=apiClient.getCurrentUserId();apiClient.getItem(userId,item.Id).then(function(item){self.playWithCommand({items:[item]},"InstantMix")})},self.canPlayMediaType=function(mediaType){return mediaType=(mediaType||"").toLowerCase(),"audio"===mediaType||"video"===mediaType},self.canQueueMediaType=function(mediaType){return self.canPlayMediaType(mediaType)},self.queue=function(options){self.playWithCommand(options,"PlayLast")},self.queueNext=function(options){self.playWithCommand(options,"PlayNext")},self.stop=function(){return castPlayer.sendMessage({options:{},command:"Stop"})},self.displayContent=function(options){castPlayer.sendMessage({options:options,command:"DisplayContent"})},self.isPlaying=function(){var state=self.lastPlayerData||{};return null!=state.NowPlayingItem},self.isPlayingVideo=function(){var state=self.lastPlayerData||{};return state=state.NowPlayingItem||{},"Video"===state.MediaType},self.isPlayingAudio=function(){var state=self.lastPlayerData||{};return state=state.NowPlayingItem||{},"Audio"===state.MediaType},self.currentTime=function(val){if(null!=val)return self.seek(val);var state=self.lastPlayerData||{};return state=state.PlayState||{},state.PositionTicks},self.duration=function(){var state=self.lastPlayerData||{};return state=state.NowPlayingItem||{},state.RunTimeTicks},self.paused=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.IsPaused},self.isMuted=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.IsMuted},self.setMute=function(isMuted){isMuted?castPlayer.sendMessage({options:{},command:"Mute"}):castPlayer.sendMessage({options:{},command:"Unmute"})},self.getRepeatMode=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.RepeatMode},self.setRepeatMode=function(mode){castPlayer.sendMessage({options:{RepeatMode:mode},command:"SetRepeatMode"})},self.toggleMute=function(){castPlayer.sendMessage({options:{},command:"ToggleMute"})},self.getTargets=function(){var targets=[];return castPlayer.hasReceivers&&targets.push(self.getCurrentTargetInfo()),Promise.resolve(targets)},self.getCurrentTargetInfo=function(){var appName=null;return castPlayer.session&&castPlayer.session.receiver&&castPlayer.session.receiver.friendlyName&&(appName=castPlayer.session.receiver.friendlyName),{name:PlayerName,id:PlayerName,playerName:PlayerName,playableMediaTypes:["Audio","Video"],isLocalPlayer:!1,appName:PlayerName,deviceName:appName,supportedCommands:["VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","DisplayContent","SetRepeatMode","EndSession"]}},self.seek=function(position){position=parseInt(position),position/=1e7,castPlayer.sendMessage({options:{position:position},command:"Seek"})},self.audioTracks=function(){var state=self.lastPlayerData||{};state=state.NowPlayingItem||{};var streams=state.MediaStreams||[];return streams.filter(function(s){return"Audio"===s.Type})},self.setAudioStreamIndex=function(index){castPlayer.sendMessage({options:{index:index},command:"SetAudioStreamIndex"})},self.getAudioStreamIndex=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.AudioStreamIndex},self.subtitleTracks=function(){var state=self.lastPlayerData||{};state=state.NowPlayingItem||{};var streams=state.MediaStreams||[];return streams.filter(function(s){return"Subtitle"===s.Type})},self.getSubtitleStreamIndex=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.SubtitleStreamIndex},self.setSubtitleStreamIndex=function(index){castPlayer.sendMessage({options:{index:index},command:"SetSubtitleStreamIndex"})},self.getMaxStreamingBitrate=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.MaxStreamingBitrate},self.setMaxStreamingBitrate=function(options){castPlayer.sendMessage({options:options,command:"SetMaxStreamingBitrate"})},self.isFullscreen=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},state.IsFullscreen},self.toggleFullscreen=function(){},self.nextTrack=function(){castPlayer.sendMessage({options:{},command:"NextTrack"})},self.previousTrack=function(){castPlayer.sendMessage({options:{},command:"PreviousTrack"})},self.beginPlayerUpdates=function(){},self.endPlayerUpdates=function(){},self.getVolume=function(){var state=self.lastPlayerData||{};return state=state.PlayState||{},null==state.VolumeLevel?100:state.VolumeLevel},self.volumeDown=function(){castPlayer.sendMessage({options:{},command:"VolumeDown"})},self.endSession=function(){self.stop().then(function(){setTimeout(function(){castPlayer.stopApp()},1e3)})},self.volumeUp=function(){castPlayer.sendMessage({options:{},command:"VolumeUp"})},self.setVolume=function(vol){vol=Math.min(vol,100),vol=Math.max(vol,0),castPlayer.sendMessage({options:{volume:vol},command:"SetVolume"})},self.getPlaylist=function(){return Promise.resolve([])},self.getCurrentPlaylistItemId=function(){},self.setCurrentPlaylistItem=function(playlistItemId){return Promise.resolve()},self.removeFromPlaylist=function(playlistItemIds){return Promise.resolve()},self.getPlayerState=function(){return Promise.resolve(self.getPlayerStateInternal()||{})},self.lastPlayerData={},self.getPlayerStateInternal=function(data){var triggerStateChange=!1;return data&&!self.lastPlayerData&&(triggerStateChange=!0),data=data||self.lastPlayerData,self.lastPlayerData=data,normalizeImages(data),triggerStateChange&&events.trigger(self,"statechange",[data]),data},self.tryPair=function(target){return castPlayer.deviceState!==DEVICE_STATE.ACTIVE&&castPlayer.isInitialized?new Promise(function(resolve,reject){currentResolve=resolve,currentReject=reject,castPlayer.launchApp()}):(currentResolve=null,currentReject=null,Promise.reject())},fileref.loaded?initializeChromecast():fileref.onload=initializeChromecast}var currentResolve,currentReject,PlayerName="Chromecast",DEVICE_STATE={IDLE:0,ACTIVE:1,WARNING:2,ERROR:3},PLAYER_STATE={IDLE:"IDLE",LOADING:"LOADING",LOADED:"LOADED",PLAYING:"PLAYING",PAUSED:"PAUSED",STOPPED:"STOPPED",SEEKING:"SEEKING",ERROR:"ERROR"},applicationID="2D4B1DA3",messageNamespace="urn:x-cast:com.connectsdk",CastPlayer=function(){this.deviceState=DEVICE_STATE.IDLE,this.currentMediaSession=null,this.session=null,this.castPlayerState=PLAYER_STATE.IDLE,this.hasReceivers=!1,this.errorHandler=this.onError.bind(this),this.mediaStatusUpdateHandler=this.onMediaStatusUpdate.bind(this),this.initializeCastPlayer()};CastPlayer.prototype.initializeCastPlayer=function(){var chrome=window.chrome;if(chrome){if(!chrome.cast||!chrome.cast.isAvailable)return void setTimeout(this.initializeCastPlayer.bind(this),1e3);var sessionRequest=new chrome.cast.SessionRequest(applicationID),apiConfig=new chrome.cast.ApiConfig(sessionRequest,this.sessionListener.bind(this),this.receiverListener.bind(this),"origin_scoped");console.log("chromecast.initialize"),chrome.cast.initialize(apiConfig,this.onInitSuccess.bind(this),this.errorHandler)}},CastPlayer.prototype.onInitSuccess=function(){this.isInitialized=!0,console.log("chromecast init success")},CastPlayer.prototype.onError=function(){console.log("chromecast error")},CastPlayer.prototype.sessionListener=function(e){this.session=e,this.session&&(console.log("sessionListener "+JSON.stringify(e)),this.session.media[0]&&this.onMediaDiscovered("activeSession",this.session.media[0]),this.onSessionConnected(e))},CastPlayer.prototype.messageListener=function(namespace,message){if("string"==typeof message&&(message=JSON.parse(message)),"playbackerror"===message.type){var errorCode=message.data;setTimeout(function(){alertText(globalize.translate("MessagePlaybackError"+errorCode),globalize.translate("HeaderPlaybackError"))},300)}else"connectionerror"===message.type?setTimeout(function(){alertText(globalize.translate("MessageChromecastConnectionError"),globalize.translate("HeaderError"))},300):message.type&&events.trigger(this,message.type,[message.data])},CastPlayer.prototype.receiverListener=function(e){"available"===e?(console.log("chromecast receiver found"),this.hasReceivers=!0):(console.log("chromecast receiver list empty"),this.hasReceivers=!1)},CastPlayer.prototype.sessionUpdateListener=function(isAlive){console.log("sessionUpdateListener alive: "+isAlive),isAlive||(this.session=null,this.deviceState=DEVICE_STATE.IDLE,this.castPlayerState=PLAYER_STATE.IDLE,console.log("sessionUpdateListener: setting currentMediaSession to null"),this.currentMediaSession=null,sendConnectionResult(!1))},CastPlayer.prototype.launchApp=function(){console.log("chromecast launching app..."),chrome.cast.requestSession(this.onRequestSessionSuccess.bind(this),this.onLaunchError.bind(this))},CastPlayer.prototype.onRequestSessionSuccess=function(e){console.log("chromecast session success: "+e.sessionId),this.onSessionConnected(e)},CastPlayer.prototype.onSessionConnected=function(session){this.session=session,this.deviceState=DEVICE_STATE.ACTIVE,this.session.addMessageListener(messageNamespace,this.messageListener.bind(this)),this.session.addMediaListener(this.sessionMediaListener.bind(this)),this.session.addUpdateListener(this.sessionUpdateListener.bind(this)),events.trigger(this,"connect"),this.sendMessage({options:{},command:"Identify"})},CastPlayer.prototype.sessionMediaListener=function(e){console.log("sessionMediaListener"),this.currentMediaSession=e,this.currentMediaSession.addUpdateListener(this.mediaStatusUpdateHandler)},CastPlayer.prototype.onLaunchError=function(){console.log("chromecast launch error"),this.deviceState=DEVICE_STATE.ERROR,sendConnectionResult(!1)},CastPlayer.prototype.stopApp=function(){this.session&&this.session.stop(this.onStopAppSuccess.bind(this,"Session stopped"),this.errorHandler)},CastPlayer.prototype.onStopAppSuccess=function(message){console.log(message),this.deviceState=DEVICE_STATE.IDLE,this.castPlayerState=PLAYER_STATE.IDLE,console.log("onStopAppSuccess: setting currentMediaSession to null"),this.currentMediaSession=null},CastPlayer.prototype.loadMedia=function(options,command){return this.session?(options.items=options.items.map(function(i){return{Id:i.Id,Name:i.Name,Type:i.Type,MediaType:i.MediaType,IsFolder:i.IsFolder}}),this.sendMessage({options:options,command:command})):(console.log("no session"),Promise.reject())},CastPlayer.prototype.sendMessage=function(message){var player=this,receiverName=null,session=player.session;session&&session.receiver&&session.receiver.friendlyName&&(receiverName=session.receiver.friendlyName),message=Object.assign(message,{userId:ApiClient.getCurrentUserId(),deviceId:ApiClient.deviceId(),accessToken:ApiClient.accessToken(),serverAddress:ApiClient.serverAddress(),receiverName:receiverName});var bitrateSetting=appSettings.maxChromecastBitrate();return bitrateSetting&&(message.maxBitrate=bitrateSetting),new Promise(function(resolve,reject){require(["chromecasthelpers"],function(chromecasthelpers){chromecasthelpers.getServerAddress(ApiClient).then(function(serverAddress){message.serverAddress=serverAddress,player.sendMessageInternal(message).then(resolve,reject)},reject)})})},CastPlayer.prototype.sendMessageInternal=function(message){return message=JSON.stringify(message),this.session.sendMessage(messageNamespace,message,this.onPlayCommandSuccess.bind(this),this.errorHandler),Promise.resolve()},CastPlayer.prototype.onPlayCommandSuccess=function(){console.log("Message was sent to receiver ok.")},CastPlayer.prototype.onMediaDiscovered=function(how,mediaSession){console.log("chromecast new media session ID:"+mediaSession.mediaSessionId+" ("+how+")"),this.currentMediaSession=mediaSession,"loadMedia"===how&&(this.castPlayerState=PLAYER_STATE.PLAYING),"activeSession"===how&&(this.castPlayerState=mediaSession.playerState),this.currentMediaSession.addUpdateListener(this.mediaStatusUpdateHandler)},CastPlayer.prototype.onMediaStatusUpdate=function(e){e===!1&&(this.castPlayerState=PLAYER_STATE.IDLE),console.log("chromecast updating media: "+e)},CastPlayer.prototype.setReceiverVolume=function(mute,vol){return this.currentMediaSession?void(mute?this.session.setReceiverMuted(!0,this.mediaCommandSuccessCallback.bind(this),this.errorHandler):this.session.setReceiverVolumeLevel(vol||1,this.mediaCommandSuccessCallback.bind(this),this.errorHandler)):void console.log("this.currentMediaSession is null")},CastPlayer.prototype.mute=function(){this.setReceiverVolume(!0)},CastPlayer.prototype.mediaCommandSuccessCallback=function(info,e){console.log(info)};var fileref=document.createElement("script");return fileref.setAttribute("type","text/javascript"),fileref.onload=function(){fileref.loaded=!0},fileref.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"),document.querySelector("head").appendChild(fileref),chromecastPlayer}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/playback/autoplaydetect.js b/dashboard-ui/bower_components/emby-webcomponents/playback/autoplaydetect.js new file mode 100644 index 0000000000..1d1c7913cc --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/playback/autoplaydetect.js @@ -0,0 +1 @@ +define([],function(){"use strict";function supportsHtmlMediaAutoplay(){return new Promise(function(resolve,reject){var timeout,elem=document.createElement("video"),elemStyle=elem.style;if(!("autoplay"in elem))return void resolve(!1);elemStyle.position="absolute",elemStyle.height=0,elemStyle.width=0;try{elem.src="data:video/mp4;base64,AAAAHGZ0eXBtcDQyAAAAAG1wNDJpc29tYXZjMQAAAz5tb292AAAAbG12aGQAAAAAzaNacc2jWnEAAV+QAAFfkAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAGGlvZHMAAAAAEICAgAcAT////3//AAACQ3RyYWsAAABcdGtoZAAAAAHNo1pxzaNacQAAAAEAAAAAAAFfkAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAEAAAABAAAAAAAd9tZGlhAAAAIG1kaGQAAAAAzaNacc2jWnEAAV+QAAFfkFXEAAAAAAAhaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAAAAAAGWbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAABVnN0YmwAAACpc3RzZAAAAAAAAAABAAAAmWF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAEAAQAEgAAABIAAAAAAAAAAEOSlZUL0FWQyBDb2RpbmcAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAxYXZjQwH0AAr/4QAZZ/QACq609NQYBBkAAAMAAQAAAwAKjxImoAEABWjOAa8gAAAAEmNvbHJuY2xjAAYAAQAGAAAAGHN0dHMAAAAAAAAAAQAAAAUAAEZQAAAAKHN0c3oAAAAAAAAAAAAAAAUAAAIqAAAACAAAAAgAAAAIAAAACAAAAChzdHNjAAAAAAAAAAIAAAABAAAABAAAAAEAAAACAAAAAQAAAAEAAAAYc3RjbwAAAAAAAAACAAADYgAABaQAAAAUc3RzcwAAAAAAAAABAAAAAQAAABFzZHRwAAAAAAREREREAAAAb3VkdGEAAABnbWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcgAAAAAAAAAAAAAAAAAAAAA6aWxzdAAAADKpdG9vAAAAKmRhdGEAAAABAAAAAEhhbmRCcmFrZSAwLjkuOCAyMDEyMDcxODAwAAACUm1kYXQAAAHkBgX/4NxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxMjAgLSBILjI2NC9NUEVHLTQgQVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDExIC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcveDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MCByZWY9MSBkZWJsb2NrPTE6MDowIGFuYWx5c2U9MHgxOjAgbWU9ZXNhIHN1Ym1lPTkgcHN5PTAgbWl4ZWRfcmVmPTAgbWVfcmFuZ2U9NCBjaHJvbWFfbWU9MSB0cmVsbGlzPTAgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0wIGNocm9tYV9xcF9vZmZzZXQ9MCB0aHJlYWRzPTYgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTUwIGtleWludF9taW49NSBzY2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmM9Y3FwIG1idHJlZT0wIHFwPTAAgAAAAD5liISscR8A+E4ACAACFoAAITAAAgsAAPgYCoKgoC+L4vi+KAvi+L4YfAEAACMzgABF9AAEUGUgABDJiXnf4AAAAARBmiKUAAAABEGaQpQAAAAEQZpilAAAAARBmoKU"}catch(e){return void resolve(!1)}elem.setAttribute("autoplay",""),elem.style="display:none",document.body.appendChild(elem);var testAutoplay=function(arg){clearTimeout(timeout),elem.removeEventListener("playing",testAutoplay);var supported=arg&&"playing"===arg.type||0!==elem.currentTime;elem.parentNode.removeChild(elem),supported?resolve():reject()};elem.addEventListener("playing",testAutoplay),timeout=setTimeout(testAutoplay,400)})}return{supportsHtmlMediaAutoplay:supportsHtmlMediaAutoplay}}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js b/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js index e96a1306f8..b9236a5171 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js @@ -1,2 +1,2 @@ define(["events","datetime","appSettings","pluginManager","userSettings","globalize","connectionManager","loading","serverNotifications","apphost","fullscreenManager","layoutManager"],function(events,datetime,appSettings,pluginManager,userSettings,globalize,connectionManager,loading,serverNotifications,apphost,fullscreenManager,layoutManager){"use strict";function enableLocalPlaylistManagement(player){return!!player.isLocalPlayer}function bindToFullscreenChange(player){events.on(fullscreenManager,"fullscreenchange",function(){events.trigger(player,"fullscreenchange")})}function PlaybackManager(){function triggerPlayerChange(newPlayer,newTarget,previousPlayer,previousTargetInfo){(newPlayer||previousPlayer)&&(newTarget&&previousTargetInfo&&newTarget.id===previousTargetInfo.id||events.trigger(self,"playerchange",[newPlayer,newTarget,previousPlayer]))}function displayPlayerInLocalGroup(player){return player.isLocalPlayer}function getSupportedCommands(player){if(player.isLocalPlayer){var list=["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","SetMaxStreamingBitrate","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"];return apphost.supports("fullscreenchange")&&!layoutManager.tv&&list.push("ToggleFullscreen"),player.supports&&player.supports("pictureinpicture")&&list.push("PictureInPicture"),list}throw new Error("player must define supported commands")}function createTarget(player){return{name:player.name,id:player.id,playerName:player.name,playableMediaTypes:["Audio","Video","Game"].map(player.canPlayMediaType),isLocalPlayer:player.isLocalPlayer,supportedCommands:getSupportedCommands(player)}}function getPlayerTargets(player){return player.getTargets?player.getTargets():Promise.resolve([createTarget(player)])}function getCurrentSubtitleStream(player){var index=getPlayerData(player).subtitleStreamIndex;return null==index||index===-1?null:getSubtitleStream(player,index)}function getSubtitleStream(player,index){return self.currentMediaSource(player).MediaStreams.filter(function(s){return"Subtitle"===s.Type&&s.Index===index})[0]}function setCurrentPlayerInternal(player,targetInfo){var previousPlayer=currentPlayer,previousTargetInfo=currentTargetInfo;if(player&&!targetInfo&&player.isLocalPlayer&&(targetInfo=createTarget(player)),player&&!targetInfo)throw new Error("targetInfo cannot be null");currentPairingId=null,currentPlayer=player,currentTargetInfo=targetInfo,targetInfo&&console.log("Active player: "+JSON.stringify(targetInfo)),player&&player.isLocalPlayer&&(lastLocalPlayer=player),previousPlayer&&self.endPlayerUpdates(previousPlayer),player&&self.beginPlayerUpdates(player),triggerPlayerChange(player,targetInfo,previousPlayer,previousTargetInfo)}function getAutomaticPlayers(){var player=currentPlayer;return player&&!enableLocalPlaylistManagement(player)?[player]:self.getPlayers().filter(enableLocalPlaylistManagement)}function canPlayerSeek(player){var currentSrc=(player.currentSrc()||"").toLowerCase();return currentSrc.indexOf(".m3u8")!==-1||player.duration()}function changeStream(player,ticks,params){if(canPlayerSeek(player)&&null==params)return void player.currentTime(parseInt(ticks/1e4));params=params||{};var liveStreamId=getPlayerData(player).streamInfo.liveStreamId,playSessionId=getPlayerData(player).streamInfo.playSessionId,playerData=getPlayerData(player),currentItem=playerData.streamInfo.item;player.getDeviceProfile(currentItem).then(function(deviceProfile){var audioStreamIndex=null==params.AudioStreamIndex?getPlayerData(player).audioStreamIndex:params.AudioStreamIndex,subtitleStreamIndex=null==params.SubtitleStreamIndex?getPlayerData(player).subtitleStreamIndex:params.SubtitleStreamIndex,currentMediaSource=playerData.streamInfo.mediaSource,apiClient=connectionManager.getApiClient(currentItem.ServerId);ticks&&(ticks=parseInt(ticks));var maxBitrate=params.MaxStreamingBitrate||self.getMaxStreamingBitrate(player);getPlaybackInfo(apiClient,currentItem.Id,deviceProfile,maxBitrate,ticks,currentMediaSource,audioStreamIndex,subtitleStreamIndex,liveStreamId).then(function(result){validatePlaybackInfoResult(result)&&(currentMediaSource=result.MediaSources[0],createStreamInfo(apiClient,currentItem.MediaType,currentItem,currentMediaSource,ticks).then(function(streamInfo){return streamInfo.fullscreen=currentPlayOptions.fullscreen,streamInfo.url?(getPlayerData(player).subtitleStreamIndex=subtitleStreamIndex,getPlayerData(player).audioStreamIndex=audioStreamIndex,getPlayerData(player).maxStreamingBitrate=maxBitrate,void changeStreamToUrl(apiClient,player,playSessionId,streamInfo)):(showPlaybackInfoErrorMessage("NoCompatibleStream"),void self.nextTrack())}))})})}function changeStreamToUrl(apiClient,player,playSessionId,streamInfo,newPositionTicks){clearProgressInterval(player),getPlayerData(player).isChangingStream=!0,"Video"===getPlayerData(player).MediaType?apiClient.stopActiveEncodings(playSessionId).then(function(){setSrcIntoPlayer(apiClient,player,streamInfo)}):setSrcIntoPlayer(apiClient,player,streamInfo)}function setSrcIntoPlayer(apiClient,player,streamInfo){player.play(streamInfo).then(function(){getPlayerData(player).isChangingStream=!1,getPlayerData(player).streamInfo=streamInfo,startProgressInterval(player),sendProgressUpdate(player)})}function getPlayerData(player){if(!player)throw new Error("player cannot be null");if(!player.name)throw new Error("player name cannot be null");var state=playerStates[player.name];return state||(playerStates[player.name]={},state=playerStates[player.name]),player}function getCurrentTicks(player){var playerTime=Math.floor(1e4*(player||currentPlayer).currentTime());return playerTime+=getPlayerData(player).streamInfo.transcodingOffsetTicks||0}function getNowPlayingItemForReporting(player,item,mediaSource){var nowPlayingItem=Object.assign({},item);return mediaSource&&(nowPlayingItem.RunTimeTicks=mediaSource.RunTimeTicks),nowPlayingItem.RunTimeTicks=nowPlayingItem.RunTimeTicks||1e4*player.duration(),nowPlayingItem}function translateItemsForPlayback(items,options){var promise,firstItem=items[0],serverId=firstItem.ServerId;return"Program"===firstItem.Type?promise=getItemsForPlayback(serverId,{Ids:firstItem.ChannelId}):"Playlist"===firstItem.Type?promise=getItemsForPlayback(serverId,{ParentId:firstItem.Id}):"MusicArtist"===firstItem.Type?promise=getItemsForPlayback(serverId,{ArtistIds:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio"}):"MusicGenre"===firstItem.Type?promise=getItemsForPlayback(serverId,{Genres:firstItem.Name,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio"}):firstItem.IsFolder?promise=getItemsForPlayback(serverId,{ParentId:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio,Video"}):"Episode"===firstItem.Type&&1===items.length&&getPlayer(firstItem,options).supportsProgress!==!1&&(promise=new Promise(function(resolve,reject){var apiClient=connectionManager.getApiClient(firstItem.ServerId);apiClient.getCurrentUser().then(function(user){return user.Configuration.EnableNextEpisodeAutoPlay&&firstItem.SeriesId?void apiClient.getEpisodes(firstItem.SeriesId,{IsVirtualUnaired:!1,IsMissing:!1,UserId:apiClient.getCurrentUserId(),Fields:"MediaSources,Chapters"}).then(function(episodesResult){var foundItem=!1;episodesResult.Items=episodesResult.Items.filter(function(e){return!!foundItem||e.Id===firstItem.Id&&(foundItem=!0,!0)}),episodesResult.TotalRecordCount=episodesResult.Items.length,resolve(episodesResult)},reject):void resolve(null)})})),promise?promise.then(function(result){return result?result.Items:items}):Promise.resolve(items)}function playWithIntros(items,options,user){var firstItem=items[0];"Video"===firstItem.MediaType;var afterPlayInternal=function(){for(var i=0,length=items.length;i=interceptors.length)return void resolve();var interceptor=interceptors[index];interceptor.intercept(options).then(function(){runNextPrePlay(interceptors,index+1,options,resolve,reject)},reject)}function playAfterBitrateDetect(connectionManager,maxBitrate,item,playOptions,onPlaybackStartedFn){var promise,startPosition=playOptions.startPositionTicks,player=getPlayer(item,playOptions),activePlayer=currentPlayer;return activePlayer?(playNextAfterEnded=!1,promise=onPlaybackChanging(activePlayer,player,item)):promise=Promise.resolve(),isServerItem(item)&&"Game"!==item.MediaType?Promise.all([promise,player.getDeviceProfile(item)]).then(function(responses){var deviceProfile=responses[1],apiClient=connectionManager.getApiClient(item.ServerId);return getPlaybackMediaSource(apiClient,deviceProfile,maxBitrate,item,startPosition).then(function(mediaSource){return createStreamInfo(apiClient,item.MediaType,item,mediaSource,startPosition).then(function(streamInfo){return streamInfo.fullscreen=playOptions.fullscreen,getPlayerData(player).isChangingStream=!1,getPlayerData(player).maxStreamingBitrate=maxBitrate,player.play(streamInfo).then(function(){loading.hide(),onPlaybackStartedFn(),onPlaybackStarted(player,streamInfo,mediaSource)})})})}):promise.then(function(){var streamInfo=createStreamInfoFromUrlItem(item);return streamInfo.fullscreen=playOptions.fullscreen,getPlayerData(player).isChangingStream=!1,player.play(streamInfo).then(function(){loading.hide(),onPlaybackStartedFn(),onPlaybackStarted(player,streamInfo)})})}function createStreamInfoFromUrlItem(item){return{url:item.Url||item.Path,playMethod:"DirectPlay",item:item,textTracks:[],mediaType:item.MediaType}}function backdropImageUrl(apiClient,item,options){return options=options||{},options.type=options.type||"Backdrop",options.maxWidth||options.width||options.maxHeight||options.height||(options.quality=100),item.BackdropImageTags&&item.BackdropImageTags.length?(options.tag=item.BackdropImageTags[0],apiClient.getScaledImageUrl(item.Id,options)):item.ParentBackdropImageTags&&item.ParentBackdropImageTags.length?(options.tag=item.ParentBackdropImageTags[0],apiClient.getScaledImageUrl(item.ParentBackdropItemId,options)):null}function getMimeType(type,container){if(container=(container||"").toLowerCase(),"audio"===type){if("opus"===container)return"audio/ogg";if("webma"===container)return"audio/webm";if("m4a"===container)return"audio/mp4"}else if("video"===type){if("mkv"===container)return"video/x-matroska";if("m4v"===container)return"video/mp4";if("mov"===container)return"video/quicktime";if("mpg"===container)return"video/mpeg";if("flv"===container)return"video/x-flv"}return type+"/"+container}function createStreamInfo(apiClient,type,item,mediaSource,startPosition){var mediaUrl,contentType,directOptions,transcodingOffsetTicks=0,playerStartPositionTicks=startPosition,liveStreamId=mediaSource.LiveStreamId,playMethod="Transcode",mediaSourceContainer=(mediaSource.Container||"").toLowerCase();if("Video"===type)contentType=getMimeType("video",mediaSourceContainer),mediaSource.enableDirectPlay?(mediaUrl=mediaSource.Path,playMethod="DirectPlay"):mediaSource.SupportsDirectStream?(directOptions={Static:!0,mediaSourceId:mediaSource.Id,deviceId:apiClient.deviceId(),api_key:apiClient.accessToken()},mediaSource.ETag&&(directOptions.Tag=mediaSource.ETag),mediaSource.LiveStreamId&&(directOptions.LiveStreamId=mediaSource.LiveStreamId),mediaUrl=apiClient.getUrl("Videos/"+item.Id+"/stream."+mediaSourceContainer,directOptions),playMethod="DirectStream"):mediaSource.SupportsTranscoding&&(mediaUrl=apiClient.getUrl(mediaSource.TranscodingUrl),"hls"===mediaSource.TranscodingSubProtocol?contentType="application/x-mpegURL":(playerStartPositionTicks=null,contentType=getMimeType("video",mediaSource.TranscodingContainer),mediaUrl.toLowerCase().indexOf("copytimestamps=true")===-1&&(transcodingOffsetTicks=startPosition||0)));else if("Audio"===type)if(contentType=getMimeType("audio",mediaSourceContainer),mediaSource.enableDirectPlay)mediaUrl=mediaSource.Path,playMethod="DirectPlay";else{var isDirectStream=mediaSource.SupportsDirectStream;isDirectStream?(directOptions={Static:!0,mediaSourceId:mediaSource.Id,deviceId:apiClient.deviceId(),api_key:apiClient.accessToken()},mediaSource.ETag&&(directOptions.Tag=mediaSource.ETag),mediaSource.LiveStreamId&&(directOptions.LiveStreamId=mediaSource.LiveStreamId),mediaUrl=apiClient.getUrl("Audio/"+item.Id+"/stream."+mediaSourceContainer,directOptions),playMethod="DirectStream"):mediaSource.SupportsTranscoding&&(mediaUrl=apiClient.getUrl(mediaSource.TranscodingUrl),"hls"===mediaSource.TranscodingSubProtocol?contentType="application/x-mpegURL":(transcodingOffsetTicks=startPosition||0,playerStartPositionTicks=null,contentType=getMimeType("audio",mediaSource.TranscodingContainer)))}else"Game"===type&&(mediaUrl=mediaSource.Path,playMethod="DirectPlay");!mediaUrl&&mediaSource.SupportsDirectPlay&&(mediaUrl=mediaSource.Path);var resultInfo={url:mediaUrl,mimeType:contentType,transcodingOffsetTicks:transcodingOffsetTicks,playMethod:playMethod,playerStartPositionTicks:playerStartPositionTicks,item:item,mediaSource:mediaSource,textTracks:getTextTracks(apiClient,mediaSource),tracks:getTextTracks(apiClient,mediaSource),mediaType:type,liveStreamId:liveStreamId,playSessionId:getParam("playSessionId",mediaUrl),title:item.Name},backdropUrl=backdropImageUrl(apiClient,item,{});return backdropUrl&&(resultInfo.backdropUrl=backdropUrl),Promise.resolve(resultInfo)}function getParam(name,url){name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regexS="[\\?&]"+name+"=([^&#]*)",regex=new RegExp(regexS,"i"),results=regex.exec(url);return null==results?"":decodeURIComponent(results[1].replace(/\+/g," "))}function getTextTracks(apiClient,mediaSource){for(var subtitleStreams=mediaSource.MediaStreams.filter(function(s){return"Subtitle"===s.Type}),textStreams=subtitleStreams.filter(function(s){return"External"===s.DeliveryMethod}),tracks=[],i=0,length=textStreams.length;i=playlistLength&&(newIndex=0);break;default:newIndex=self.getCurrentPlaylistIndex(player)+1}if(newIndex<0||newIndex>=playlistLength)return null;var item=playlist[newIndex];return item?{item:item,index:newIndex}:null}function queue(options,mode,player){if(player=player||currentPlayer,!player)return self.play(options);if(!enableLocalPlaylistManagement(player))return"next"===mode?player.queueNext(item):player.queue(item);if(options.items)return translateItemsForPlayback(options.items,options).then(function(items){queueAll(items,mode)});if(!options.serverId)throw new Error("serverId required!");return getItemsForPlayback(options.serverId,{Ids:options.ids.join(",")}).then(function(result){return translateItemsForPlayback(result.Items,options).then(function(items){queueAll(items,mode)})})}function queueAll(items,mode){for(var i=0,length=items.length;iintervalTime&&sendProgressUpdate(player)},500)}function sendProgressUpdate(player){player.lastProgressReport=(new Date).getTime(),self.getPlayerState(player).then(function(state){var currentItem=getPlayerData(player).streamInfo.item;reportPlayback(state,currentItem.ServerId,"reportPlaybackProgress")})}function reportPlayback(state,serverId,method){if(serverId){var info={QueueableMediaTypes:state.NowPlayingItem.MediaType,ItemId:state.NowPlayingItem.Id};for(var i in state.PlayState)info[i]=state.PlayState[i];var apiClient=connectionManager.getApiClient(serverId);apiClient[method](info)}}function clearProgressInterval(player){getPlayerData(player).currentProgressInterval&&(clearTimeout(getPlayerData(player).currentProgressInterval),getPlayerData(player).currentProgressInterval=null)}var currentPlayer,currentTargetInfo,lastLocalPlayer,currentPlaylistIndex,currentPlaylistItemId,currentPlayOptions,self=this,players=[],currentPairingId=null,repeatMode="RepeatNone",playlist=[],playNextAfterEnded=!0,playerStates={};self.currentItem=function(player){var data=getPlayerData(player);return data.streamInfo?data.streamInfo.item:null},self.currentMediaSource=function(player){var data=getPlayerData(player);return data.streamInfo?data.streamInfo.mediaSource:null},self.beginPlayerUpdates=function(player){player.beginPlayerUpdates&&player.beginPlayerUpdates()},self.endPlayerUpdates=function(player){player.endPlayerUpdates&&player.endPlayerUpdates()},self.getPlayerInfo=function(){var player=currentPlayer;if(!player)return null;var target=currentTargetInfo||{};return{name:player.name,isLocalPlayer:player.isLocalPlayer,id:target.id,deviceName:target.deviceName,playableMediaTypes:target.playableMediaTypes,supportedCommands:target.supportedCommands}},self.setActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name){if(currentPlayer&¤tPlayer.isLocalPlayer)return;return void setCurrentPlayerInternal(null,null)}if("string"==typeof player&&(player=players.filter(function(p){return p.name===player})[0]),!player)throw new Error("null player");setCurrentPlayerInternal(player,targetInfo)},self.trySetActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name)return void(currentPlayer&¤tPlayer.isLocalPlayer);if("string"==typeof player&&(player=players.filter(function(p){return p.name===player})[0]),!player)throw new Error("null player");if(currentPairingId!==targetInfo.id){currentPairingId=targetInfo.id;var promise=player.tryPair?player.tryPair(targetInfo):Promise.resolve();promise.then(function(){setCurrentPlayerInternal(player,targetInfo)},function(){currentPairingId===targetInfo.id&&(currentPairingId=null)})}},self.trySetActiveDeviceName=function(name){function normalizeName(t){return t.toLowerCase().replace(" ","")}name=normalizeName(name),self.getTargets().then(function(result){var target=result.filter(function(p){return normalizeName(p.name)===name})[0];target&&self.trySetActivePlayer(target.playerName,target)})},self.setDefaultPlayerActive=function(){self.setActivePlayer("localplayer")},self.removeActivePlayer=function(name){var playerInfo=self.getPlayerInfo();playerInfo&&playerInfo.name===name&&self.setDefaultPlayerActive()},self.removeActiveTarget=function(id){var playerInfo=self.getPlayerInfo();playerInfo&&playerInfo.id===id&&self.setDefaultPlayerActive()},self.disconnectFromPlayer=function(){var playerInfo=self.getPlayerInfo();playerInfo&&(playerInfo.supportedCommands.indexOf("EndSession")!==-1?require(["dialog"],function(dialog){var menuItems=[];menuItems.push({name:globalize.translate("ButtonYes"),id:"yes"}),menuItems.push({name:globalize.translate("ButtonNo"),id:"no"}),dialog({buttons:menuItems,text:globalize.translate("ConfirmEndPlayerSession")}).then(function(id){switch(id){case"yes":self.getCurrentPlayer().endSession(),self.setDefaultPlayerActive(); -break;case"no":self.setDefaultPlayerActive()}})}):self.setDefaultPlayerActive())},self.getTargets=function(){var promises=players.filter(function(p){return!displayPlayerInLocalGroup(p)}).map(getPlayerTargets);return Promise.all(promises).then(function(responses){var targets=[];targets.push({name:globalize.translate("sharedcomponents#HeaderMyDevice"),id:"localplayer",playerName:"localplayer",playableMediaTypes:["Audio","Video","Game"],isLocalPlayer:!0,supportedCommands:getSupportedCommands({isLocalPlayer:!0})});for(var i=0;idatetime.parseISO8601Date(item.EndDate).getTime()||(new Date).getTime()ticks})[0];nextChapter?self.seek(nextChapter.StartPositionTicks,player):self.nextTrack(player)},self.previousChapter=function(player){player=player||currentPlayer;var item=self.currentItem(player),ticks=getCurrentTicks(player);ticks-=1e8,0===self.getCurrentPlaylistIndex(player)&&(ticks=Math.max(ticks,0));var previousChapters=(item.Chapters||[]).filter(function(i){return i.StartPositionTicks<=ticks});previousChapters.length?self.seek(previousChapters[previousChapters.length-1].StartPositionTicks,player):self.previousTrack(player)},self.fastForward=function(player){if(player=player||currentPlayer,null!=player.fastForward)return void player.fastForward(userSettings.skipForwardLength());var ticks=getCurrentTicks(player);ticks+=1e4*userSettings.skipForwardLength();var runTimeTicks=self.duration(player)||0;ticks0||canPlayerSeek(player)),item&&(state.NowPlayingItem=getNowPlayingItemForReporting(player,item,mediaSource)),state.MediaSource=mediaSource,Promise.resolve(state)},self.currentTime=function(player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.currentTime():getCurrentTicks(player)},self.duration=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.duration();var streamInfo=getPlayerData(player).streamInfo;if(streamInfo&&streamInfo.mediaSource&&streamInfo.mediaSource.RunTimeTicks)return streamInfo.mediaSource.RunTimeTicks;var playerDuration=player.duration();return playerDuration&&(playerDuration*=1e4),playerDuration};var currentId=0;self.getSubtitleUrl=function(textStream,serverId){var apiClient=connectionManager.getApiClient(serverId),textStreamUrl=textStream.IsExternalUrl?textStream.DeliveryUrl:apiClient.getUrl(textStream.DeliveryUrl);return textStreamUrl},self.setCurrentPlaylistItem=function(playlistItemId,player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.setCurrentPlaylistItem(playlistItemId);for(var newItem,newItemIndex,i=0,length=playlist.length;i=playlist.length)throw new Error("newIndex out of bounds");moveInArray(playlist,oldIndex,newIndex),events.trigger(player,"playlistitemmove",[{playlistItemId:playlistItemId,newIndex:newIndex}])}},self.getCurrentPlaylistIndex=function(i,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getCurrentPlaylistIndex():findPlaylistIndex(currentPlaylistItemId,playlist)},self.getCurrentPlaylistItemId=function(i,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getCurrentPlaylistItemId():currentPlaylistItemId},self.setRepeatMode=function(value,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.setRepeatMode(value):(repeatMode=value,void events.trigger(player,"repeatmodechange"))},self.getRepeatMode=function(player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getRepeatMode():repeatMode},self.nextTrack=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.nextTrack();var newItemInfo=getNextItemInfo(player);if(newItemInfo){console.log("playing next track");var playOptions=Object.assign({},currentPlayOptions,{startPositionTicks:0});playInternal(newItemInfo.item,playOptions,function(){setPlaylistState(newItemInfo.item.PlaylistItemId,newItemInfo.index)})}},self.previousTrack=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.previousTrack();var newIndex=self.getCurrentPlaylistIndex(player)-1;if(newIndex>=0){var newItem=playlist[newIndex];if(newItem){var playOptions=Object.assign({},currentPlayOptions,{startPositionTicks:0});playInternal(newItem,playOptions,function(){setPlaylistState(newItem.PlaylistItemId,newIndex)})}}},self.queue=function(options,player){queue(options,"",player)},self.queueNext=function(options,player){queue(options,"next",player)},events.on(pluginManager,"registered",function(e,plugin){"mediaplayer"===plugin.type&&initMediaPlayer(plugin)}),pluginManager.ofType("mediaplayer").map(initMediaPlayer),window.addEventListener("beforeunload",function(e){var player=currentPlayer;player&&getPlayerData(player).currentProgressInterval&&(playNextAfterEnded=!1,onPlaybackStopped.call(player))}),events.on(serverNotifications,"ServerShuttingDown",function(e,apiClient,data){self.setDefaultPlayerActive()}),events.on(serverNotifications,"ServerRestarting",function(e,apiClient,data){self.setDefaultPlayerActive()})}return new PlaybackManager}); \ No newline at end of file +break;case"no":self.setDefaultPlayerActive()}})}):self.setDefaultPlayerActive())},self.getTargets=function(){var promises=players.filter(function(p){return!displayPlayerInLocalGroup(p)}).map(getPlayerTargets);return Promise.all(promises).then(function(responses){var targets=[];targets.push({name:globalize.translate("sharedcomponents#HeaderMyDevice"),id:"localplayer",playerName:"localplayer",playableMediaTypes:["Audio","Video","Game"],isLocalPlayer:!0,supportedCommands:getSupportedCommands({isLocalPlayer:!0})});for(var i=0;idatetime.parseISO8601Date(item.EndDate).getTime()||(new Date).getTime()ticks})[0];nextChapter?self.seek(nextChapter.StartPositionTicks,player):self.nextTrack(player)},self.previousChapter=function(player){player=player||currentPlayer;var item=self.currentItem(player),ticks=getCurrentTicks(player);ticks-=1e8,0===self.getCurrentPlaylistIndex(player)&&(ticks=Math.max(ticks,0));var previousChapters=(item.Chapters||[]).filter(function(i){return i.StartPositionTicks<=ticks});previousChapters.length?self.seek(previousChapters[previousChapters.length-1].StartPositionTicks,player):self.previousTrack(player)},self.fastForward=function(player){if(player=player||currentPlayer,null!=player.fastForward)return void player.fastForward(userSettings.skipForwardLength());var ticks=getCurrentTicks(player);ticks+=1e4*userSettings.skipForwardLength();var runTimeTicks=self.duration(player)||0;ticks0||canPlayerSeek(player)),item&&(state.NowPlayingItem=getNowPlayingItemForReporting(player,item,mediaSource)),state.MediaSource=mediaSource,Promise.resolve(state)},self.currentTime=function(player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.currentTime():getCurrentTicks(player)},self.duration=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.duration();var streamInfo=getPlayerData(player).streamInfo;if(streamInfo&&streamInfo.mediaSource&&streamInfo.mediaSource.RunTimeTicks)return streamInfo.mediaSource.RunTimeTicks;var playerDuration=player.duration();return playerDuration&&(playerDuration*=1e4),playerDuration};var currentId=0;self.getSubtitleUrl=function(textStream,serverId){var apiClient=connectionManager.getApiClient(serverId),textStreamUrl=textStream.IsExternalUrl?textStream.DeliveryUrl:apiClient.getUrl(textStream.DeliveryUrl);return textStreamUrl},self.setCurrentPlaylistItem=function(playlistItemId,player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.setCurrentPlaylistItem(playlistItemId);for(var newItem,newItemIndex,i=0,length=playlist.length;i=playlist.length)throw new Error("newIndex out of bounds");moveInArray(playlist,oldIndex,newIndex),events.trigger(player,"playlistitemmove",[{playlistItemId:playlistItemId,newIndex:newIndex}])}},self.getCurrentPlaylistIndex=function(i,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getCurrentPlaylistIndex():findPlaylistIndex(currentPlaylistItemId,playlist)},self.getCurrentPlaylistItemId=function(i,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getCurrentPlaylistItemId():currentPlaylistItemId},self.setRepeatMode=function(value,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.setRepeatMode(value):(repeatMode=value,void events.trigger(player,"repeatmodechange"))},self.getRepeatMode=function(player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getRepeatMode():repeatMode},self.nextTrack=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.nextTrack();var newItemInfo=getNextItemInfo(player);if(newItemInfo){console.log("playing next track");var playOptions=Object.assign({},currentPlayOptions,{startPositionTicks:0});playInternal(newItemInfo.item,playOptions,function(){setPlaylistState(newItemInfo.item.PlaylistItemId,newItemInfo.index)})}},self.previousTrack=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.previousTrack();var newIndex=self.getCurrentPlaylistIndex(player)-1;if(newIndex>=0){var newItem=playlist[newIndex];if(newItem){var playOptions=Object.assign({},currentPlayOptions,{startPositionTicks:0});playInternal(newItem,playOptions,function(){setPlaylistState(newItem.PlaylistItemId,newIndex)})}}},self.queue=function(options,player){queue(options,"",player)},self.queueNext=function(options,player){queue(options,"next",player)},events.on(pluginManager,"registered",function(e,plugin){"mediaplayer"===plugin.type&&initMediaPlayer(plugin)}),pluginManager.ofType("mediaplayer").map(initMediaPlayer),window.addEventListener("beforeunload",function(e){var player=currentPlayer;player&&getPlayerData(player).currentProgressInterval&&(playNextAfterEnded=!1,onPlaybackStopped.call(player))}),events.on(serverNotifications,"ServerShuttingDown",function(e,apiClient,data){self.setDefaultPlayerActive()}),events.on(serverNotifications,"ServerRestarting",function(e,apiClient,data){self.setDefaultPlayerActive()})}return new PlaybackManager}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/playback/playersettingsmenu.js b/dashboard-ui/bower_components/emby-webcomponents/playback/playersettingsmenu.js index 40a4ed1bec..3e973c1a85 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/playback/playersettingsmenu.js +++ b/dashboard-ui/bower_components/emby-webcomponents/playback/playersettingsmenu.js @@ -1 +1 @@ -define(["actionsheet","datetime","playbackManager","globalize","appSettings","qualityoptions"],function(actionsheet,datetime,playbackManager,globalize,appSettings,qualityoptions){"use strict";function showQualityMenu(player,btn){var videoStream=playbackManager.currentMediaSource(player).MediaStreams.filter(function(stream){return"Video"===stream.Type})[0],videoWidth=videoStream?videoStream.Width:null,options=qualityoptions.getVideoQualityOptions(playbackManager.getMaxStreamingBitrate(player),videoWidth),menuItems=options.map(function(o){var opt={name:o.name,id:o.bitrate};return o.selected&&(opt.selected=!0),opt}),selectedId=options.filter(function(o){return o.selected});return selectedId=selectedId.length?selectedId[0].bitrate:null,actionsheet.show({items:menuItems,positionTo:btn}).then(function(id){var bitrate=parseInt(id);bitrate!==selectedId&&playbackManager.setMaxStreamingBitrate(bitrate,player)})}function show(options){var player=options.player;options.mediaType;return showQualityMenu(player,options.positionTo)}return{show:show}}); \ No newline at end of file +define(["actionsheet","datetime","playbackManager","globalize","appSettings","qualityoptions"],function(actionsheet,datetime,playbackManager,globalize,appSettings,qualityoptions){"use strict";function showQualityMenu(player,btn){var videoStream=playbackManager.currentMediaSource(player).MediaStreams.filter(function(stream){return"Video"===stream.Type})[0],videoWidth=videoStream?videoStream.Width:null,options=qualityoptions.getVideoQualityOptions({currentMaxBitrate:playbackManager.getMaxStreamingBitrate(player),isAutomaticBitrateEnabled:playbackManager.enableAutomaticBitrateDetection(player),videoWidth:videoWidth,enableAuto:!0}),menuItems=options.map(function(o){var opt={name:o.name,id:o.bitrate,secondaryText:o.secondaryText};return o.selected&&(opt.selected=!0),opt}),selectedId=options.filter(function(o){return o.selected});return selectedId=selectedId.length?selectedId[0].bitrate:null,actionsheet.show({items:menuItems,positionTo:btn}).then(function(id){var bitrate=parseInt(id);bitrate!==selectedId&&playbackManager.setMaxStreamingBitrate({enableAutomaticBitrateDetection:!bitrate,maxBitrate:bitrate},player)})}function showSettingsMenu(player,btn){}function getQualitySecondaryText(player){return playbackManager.getPlayerState(player).then(function(state){var videoStream=(playbackManager.enableAutomaticBitrateDetection(player),playbackManager.getMaxStreamingBitrate(player),playbackManager.currentMediaSource(player).MediaStreams.filter(function(stream){return"Video"===stream.Type})[0]),videoWidth=videoStream?videoStream.Width:null,options=qualityoptions.getVideoQualityOptions({currentMaxBitrate:playbackManager.getMaxStreamingBitrate(player),isAutomaticBitrateEnabled:playbackManager.enableAutomaticBitrateDetection(player),videoWidth:videoWidth,enableAuto:!0}),selectedOption=(options.map(function(o){var opt={name:o.name,id:o.bitrate,secondaryText:o.secondaryText};return o.selected&&(opt.selected=!0),opt}),options.filter(function(o){return o.selected}));if(!selectedOption.length)return null;selectedOption=selectedOption[0];var text=selectedOption.name;return selectedOption.autoText&&(text+=state.PlayState&&"Transcode"!==state.PlayState.PlayMethod?" - Direct":" "+selectedOption.autoText),text})}function show(options){var player=options.player;return getQualitySecondaryText(player).then(function(secondaryQualityText){var menuItems=(options.mediaType,[]);return menuItems.push({name:globalize.translate("sharedcomponents#Quality"),id:"quality",secondaryText:secondaryQualityText}),actionsheet.show({items:menuItems,positionTo:options.positionTo}).then(function(id){switch(id){case"quality":return showQualityMenu(player,options.positionTo);case"settings":return showSettingsMenu(player,options.positionTo)}return Promise.reject()})})}return{show:show}}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/qualityoptions.js b/dashboard-ui/bower_components/emby-webcomponents/qualityoptions.js index 96bf67e829..29b176c239 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/qualityoptions.js +++ b/dashboard-ui/bower_components/emby-webcomponents/qualityoptions.js @@ -1 +1 @@ -define([],function(){"use strict";function getVideoQualityOptions(maxStreamingBitrate,videoWidth){var maxAllowedWidth=videoWidth||4096,options=[];if(maxAllowedWidth>=3800&&(options.push({name:"4K - 120Mbps",maxHeight:2160,bitrate:12e7}),options.push({name:"4K - 100Mbps",maxHeight:2160,bitrate:1e8}),options.push({name:"4K - 80Mbps",maxHeight:2160,bitrate:8e7})),maxAllowedWidth>=1900?(options.push({name:"1080p - 60Mbps",maxHeight:1080,bitrate:6e7}),options.push({name:"1080p - 50Mbps",maxHeight:1080,bitrate:5e7}),options.push({name:"1080p - 40Mbps",maxHeight:1080,bitrate:4e7}),options.push({name:"1080p - 30Mbps",maxHeight:1080,bitrate:3e7}),options.push({name:"1080p - 25Mbps",maxHeight:1080,bitrate:25e6}),options.push({name:"1080p - 20Mbps",maxHeight:1080,bitrate:2e7}),options.push({name:"1080p - 15Mbps",maxHeight:1080,bitrate:15e6}),options.push({name:"1080p - 10Mbps",maxHeight:1080,bitrate:10000001}),options.push({name:"1080p - 8Mbps",maxHeight:1080,bitrate:8000001}),options.push({name:"1080p - 6Mbps",maxHeight:1080,bitrate:6000001}),options.push({name:"1080p - 5Mbps",maxHeight:1080,bitrate:5000001}),options.push({name:"1080p - 4Mbps",maxHeight:1080,bitrate:4000002})):maxAllowedWidth>=1260?(options.push({name:"720p - 10Mbps",maxHeight:720,bitrate:1e7}),options.push({name:"720p - 8Mbps",maxHeight:720,bitrate:8e6}),options.push({name:"720p - 6Mbps",maxHeight:720,bitrate:6e6}),options.push({name:"720p - 5Mbps",maxHeight:720,bitrate:5e6})):maxAllowedWidth>=620&&(options.push({name:"480p - 4Mbps",maxHeight:480,bitrate:4000001}),options.push({name:"480p - 3Mbps",maxHeight:480,bitrate:3000001}),options.push({name:"480p - 2.5Mbps",maxHeight:480,bitrate:25e5}),options.push({name:"480p - 2Mbps",maxHeight:480,bitrate:2000001}),options.push({name:"480p - 1.5Mbps",maxHeight:480,bitrate:1500001})),maxAllowedWidth>=1260&&(options.push({name:"720p - 4Mbps",maxHeight:720,bitrate:4e6}),options.push({name:"720p - 3Mbps",maxHeight:720,bitrate:3e6}),options.push({name:"720p - 2Mbps",maxHeight:720,bitrate:2e6}),options.push({name:"720p - 1.5Mbps",maxHeight:720,bitrate:15e5}),options.push({name:"720p - 1Mbps",maxHeight:720,bitrate:1000001})),options.push({name:"480p - 1.0Mbps",maxHeight:480,bitrate:1e6}),options.push({name:"480p - 720kbps",maxHeight:480,bitrate:72e4}),options.push({name:"480p - 420kbps",maxHeight:480,bitrate:42e4}),options.push({name:"360p",maxHeight:360,bitrate:4e5}),options.push({name:"240p",maxHeight:240,bitrate:32e4}),options.push({name:"144p",maxHeight:144,bitrate:192e3}),maxStreamingBitrate){for(var selectedIndex=-1,i=0,length=options.length;i=3800&&(qualityOptions.push({name:"4K - 120Mbps",maxHeight:2160,bitrate:12e7}),qualityOptions.push({name:"4K - 100Mbps",maxHeight:2160,bitrate:1e8}),qualityOptions.push({name:"4K - 80Mbps",maxHeight:2160,bitrate:8e7})),maxAllowedWidth>=1900?(qualityOptions.push({name:"1080p - 60Mbps",maxHeight:1080,bitrate:6e7}),qualityOptions.push({name:"1080p - 50Mbps",maxHeight:1080,bitrate:5e7}),qualityOptions.push({name:"1080p - 40Mbps",maxHeight:1080,bitrate:4e7}),qualityOptions.push({name:"1080p - 30Mbps",maxHeight:1080,bitrate:3e7}),qualityOptions.push({name:"1080p - 25Mbps",maxHeight:1080,bitrate:25e6}),qualityOptions.push({name:"1080p - 20Mbps",maxHeight:1080,bitrate:2e7}),qualityOptions.push({name:"1080p - 15Mbps",maxHeight:1080,bitrate:15e6}),qualityOptions.push({name:"1080p - 10Mbps",maxHeight:1080,bitrate:10000001}),qualityOptions.push({name:"1080p - 8Mbps",maxHeight:1080,bitrate:8000001}),qualityOptions.push({name:"1080p - 6Mbps",maxHeight:1080,bitrate:6000001}),qualityOptions.push({name:"1080p - 5Mbps",maxHeight:1080,bitrate:5000001}),qualityOptions.push({name:"1080p - 4Mbps",maxHeight:1080,bitrate:4000002})):maxAllowedWidth>=1260?(qualityOptions.push({name:"720p - 10Mbps",maxHeight:720,bitrate:1e7}),qualityOptions.push({name:"720p - 8Mbps",maxHeight:720,bitrate:8e6}),qualityOptions.push({name:"720p - 6Mbps",maxHeight:720,bitrate:6e6}),qualityOptions.push({name:"720p - 5Mbps",maxHeight:720,bitrate:5e6})):maxAllowedWidth>=620&&(qualityOptions.push({name:"480p - 4Mbps",maxHeight:480,bitrate:4000001}),qualityOptions.push({name:"480p - 3Mbps",maxHeight:480,bitrate:3000001}),qualityOptions.push({name:"480p - 2.5Mbps",maxHeight:480,bitrate:25e5}),qualityOptions.push({name:"480p - 2Mbps",maxHeight:480,bitrate:2000001}),qualityOptions.push({name:"480p - 1.5Mbps",maxHeight:480,bitrate:1500001})),maxAllowedWidth>=1260&&(qualityOptions.push({name:"720p - 4Mbps",maxHeight:720,bitrate:4e6}),qualityOptions.push({name:"720p - 3Mbps",maxHeight:720,bitrate:3e6}),qualityOptions.push({name:"720p - 2Mbps",maxHeight:720,bitrate:2e6}),qualityOptions.push({name:"720p - 1.5Mbps",maxHeight:720,bitrate:15e5}),qualityOptions.push({name:"720p - 1Mbps",maxHeight:720,bitrate:1000001})),qualityOptions.push({name:"480p - 1.0Mbps",maxHeight:480,bitrate:1e6}),qualityOptions.push({name:"480p - 720kbps",maxHeight:480,bitrate:72e4}),qualityOptions.push({name:"480p - 420kbps",maxHeight:480,bitrate:42e4}),qualityOptions.push({name:"360p",maxHeight:360,bitrate:4e5}),qualityOptions.push({name:"240p",maxHeight:240,bitrate:32e4}),qualityOptions.push({name:"144p",maxHeight:144,bitrate:192e3});var autoQualityOption={name:globalize.translate("sharedcomponents#Auto"),bitrate:0,selected:options.isAutomaticBitrateEnabled};if(options.enableAuto&&qualityOptions.push(autoQualityOption),maxStreamingBitrate){for(var selectedIndex=-1,i=0,length=qualityOptions.length;i"+culture.DisplayName+""}select.innerHTML=html}return function(view,params){function loadForm(page,user,loggedInUser,allCulturesPromise){userSettingsInstance.setUserInfo(userId,ApiClient).then(function(){userSettingsLoaded=!0,allCulturesPromise.then(function(allCultures){populateLanguages(page.querySelector("#selectAudioLanguage"),allCultures),populateLanguages(page.querySelector("#selectSubtitleLanguage"),allCultures),page.querySelector("#selectAudioLanguage",page).value=user.Configuration.AudioLanguagePreference||"",page.querySelector("#selectSubtitleLanguage",page).value=user.Configuration.SubtitleLanguagePreference||"",page.querySelector(".chkEpisodeAutoPlay").checked=user.Configuration.EnableNextEpisodeAutoPlay||!1}),page.querySelector("#selectSubtitlePlaybackMode").value=user.Configuration.SubtitleMode||"",page.querySelector(".chkPlayDefaultAudioTrack").checked=user.Configuration.PlayDefaultAudioTrack||!1,page.querySelector(".chkEnableCinemaMode").checked=userSettingsInstance.enableCinemaMode(),page.querySelector(".chkExternalVideoPlayer").checked=appSettings.enableExternalPlayers(),require(["qualityoptions"],function(qualityoptions){var bitrateOptions=qualityoptions.getVideoQualityOptions(appSettings.maxStreamingBitrate()).map(function(i){return'"}).join("");bitrateOptions='"+bitrateOptions,page.querySelector("#selectMaxBitrate").innerHTML=bitrateOptions,page.querySelector("#selectMaxChromecastBitrate").innerHTML=bitrateOptions,appSettings.enableAutomaticBitrateDetection()?page.querySelector("#selectMaxBitrate").value="":page.querySelector("#selectMaxBitrate").value=appSettings.maxStreamingBitrate(),page.querySelector("#selectMaxChromecastBitrate").value=appSettings.maxChromecastBitrate()||"",Dashboard.hideLoadingMsg()})})}function loadPage(page){Dashboard.showLoadingMsg();var promise1=ApiClient.getUser(userId),promise2=Dashboard.getCurrentUser(),allCulturesPromise=ApiClient.getCultures();Promise.all([promise1,promise2]).then(function(responses){loadForm(page,responses[1],responses[0],allCulturesPromise)}),ApiClient.getNamedConfiguration("cinemamode").then(function(cinemaConfig){cinemaConfig.EnableIntrosForMovies||cinemaConfig.EnableIntrosForEpisodes?page.querySelector(".cinemaModeOptions").classList.remove("hide"):page.querySelector(".cinemaModeOptions").classList.add("hide")})}function refreshGlobalUserSettings(){require(["userSettings"],function(userSettings){userSettings.importFrom(userSettingsInstance)})}function saveUser(page,user){return user.Configuration.AudioLanguagePreference=page.querySelector("#selectAudioLanguage").value,user.Configuration.SubtitleLanguagePreference=page.querySelector("#selectSubtitleLanguage").value,user.Configuration.SubtitleMode=page.querySelector("#selectSubtitlePlaybackMode").value,user.Configuration.PlayDefaultAudioTrack=page.querySelector(".chkPlayDefaultAudioTrack").checked,user.Configuration.EnableNextEpisodeAutoPlay=page.querySelector(".chkEpisodeAutoPlay").checked,userSettingsLoaded&&(userSettingsInstance.enableCinemaMode(page.querySelector(".chkEnableCinemaMode").checked),userId===Dashboard.getCurrentUserId()&&refreshGlobalUserSettings()),ApiClient.updateUserConfiguration(user.Id,user.Configuration)}function save(page){appSettings.enableExternalPlayers(page.querySelector(".chkExternalVideoPlayer").checked),page.querySelector("#selectMaxBitrate").value?(appSettings.maxStreamingBitrate(page.querySelector("#selectMaxBitrate").value),appSettings.enableAutomaticBitrateDetection(!1)):appSettings.enableAutomaticBitrateDetection(!0),appSettings.maxChromecastBitrate(page.querySelector("#selectMaxChromecastBitrate").value),AppInfo.enableAutoSave||Dashboard.showLoadingMsg(),ApiClient.getUser(userId).then(function(result){saveUser(page,result).then(function(){Dashboard.hideLoadingMsg(),AppInfo.enableAutoSave||require(["toast"],function(toast){toast(Globalize.translate("SettingsSaved"))})},function(){Dashboard.hideLoadingMsg()})})}var userSettingsLoaded,userId=params.userId||Dashboard.getCurrentUserId(),userSettingsInstance=new userSettingsBuilder;view.querySelector("#selectSubtitlePlaybackMode").addEventListener("change",function(){for(var subtitlesHelp=view.querySelectorAll(".subtitlesHelp"),i=0,length=subtitlesHelp.length;i"+culture.DisplayName+""}select.innerHTML=html}return function(view,params){function loadForm(page,user,loggedInUser,allCulturesPromise){userSettingsInstance.setUserInfo(userId,ApiClient).then(function(){userSettingsLoaded=!0,allCulturesPromise.then(function(allCultures){populateLanguages(page.querySelector("#selectAudioLanguage"),allCultures),populateLanguages(page.querySelector("#selectSubtitleLanguage"),allCultures),page.querySelector("#selectAudioLanguage",page).value=user.Configuration.AudioLanguagePreference||"",page.querySelector("#selectSubtitleLanguage",page).value=user.Configuration.SubtitleLanguagePreference||"",page.querySelector(".chkEpisodeAutoPlay").checked=user.Configuration.EnableNextEpisodeAutoPlay||!1}),page.querySelector("#selectSubtitlePlaybackMode").value=user.Configuration.SubtitleMode||"",page.querySelector(".chkPlayDefaultAudioTrack").checked=user.Configuration.PlayDefaultAudioTrack||!1,page.querySelector(".chkEnableCinemaMode").checked=userSettingsInstance.enableCinemaMode(),page.querySelector(".chkExternalVideoPlayer").checked=appSettings.enableExternalPlayers(),require(["qualityoptions"],function(qualityoptions){var bitrateOptions=qualityoptions.getVideoQualityOptions({currentMaxBitrate:appSettings.maxStreamingBitrate(),isAutomaticBitrateEnabled:appSettings.enableAutomaticBitrateDetection(),enableAuto:!0}).map(function(i){return'"}).join("");page.querySelector("#selectMaxBitrate").innerHTML=bitrateOptions,page.querySelector("#selectMaxChromecastBitrate").innerHTML=bitrateOptions,appSettings.enableAutomaticBitrateDetection()?page.querySelector("#selectMaxBitrate").value="":page.querySelector("#selectMaxBitrate").value=appSettings.maxStreamingBitrate(),page.querySelector("#selectMaxChromecastBitrate").value=appSettings.maxChromecastBitrate()||"",Dashboard.hideLoadingMsg()})})}function loadPage(page){Dashboard.showLoadingMsg();var promise1=ApiClient.getUser(userId),promise2=Dashboard.getCurrentUser(),allCulturesPromise=ApiClient.getCultures();Promise.all([promise1,promise2]).then(function(responses){loadForm(page,responses[1],responses[0],allCulturesPromise)}),ApiClient.getNamedConfiguration("cinemamode").then(function(cinemaConfig){cinemaConfig.EnableIntrosForMovies||cinemaConfig.EnableIntrosForEpisodes?page.querySelector(".cinemaModeOptions").classList.remove("hide"):page.querySelector(".cinemaModeOptions").classList.add("hide")})}function refreshGlobalUserSettings(){require(["userSettings"],function(userSettings){userSettings.importFrom(userSettingsInstance)})}function saveUser(page,user){return user.Configuration.AudioLanguagePreference=page.querySelector("#selectAudioLanguage").value,user.Configuration.SubtitleLanguagePreference=page.querySelector("#selectSubtitleLanguage").value,user.Configuration.SubtitleMode=page.querySelector("#selectSubtitlePlaybackMode").value,user.Configuration.PlayDefaultAudioTrack=page.querySelector(".chkPlayDefaultAudioTrack").checked,user.Configuration.EnableNextEpisodeAutoPlay=page.querySelector(".chkEpisodeAutoPlay").checked,userSettingsLoaded&&(userSettingsInstance.enableCinemaMode(page.querySelector(".chkEnableCinemaMode").checked),userId===Dashboard.getCurrentUserId()&&refreshGlobalUserSettings()),ApiClient.updateUserConfiguration(user.Id,user.Configuration)}function save(page){appSettings.enableExternalPlayers(page.querySelector(".chkExternalVideoPlayer").checked),page.querySelector("#selectMaxBitrate").value?(appSettings.maxStreamingBitrate(page.querySelector("#selectMaxBitrate").value),appSettings.enableAutomaticBitrateDetection(!1)):appSettings.enableAutomaticBitrateDetection(!0),appSettings.maxChromecastBitrate(page.querySelector("#selectMaxChromecastBitrate").value),AppInfo.enableAutoSave||Dashboard.showLoadingMsg(),ApiClient.getUser(userId).then(function(result){saveUser(page,result).then(function(){Dashboard.hideLoadingMsg(),AppInfo.enableAutoSave||require(["toast"],function(toast){toast(Globalize.translate("SettingsSaved"))})},function(){Dashboard.hideLoadingMsg()})})}var userSettingsLoaded,userId=params.userId||Dashboard.getCurrentUserId(),userSettingsInstance=new userSettingsBuilder;view.querySelector("#selectSubtitlePlaybackMode").addEventListener("change",function(){for(var subtitlesHelp=view.querySelectorAll(".subtitlesHelp"),i=0,length=subtitlesHelp.length;i",menuHtml+='',menuHtml+=item.name,menuHtml+="",menuHtml+=""},getToolsMenuHtml:function(page){var i,length,item,items=Dashboard.getToolsMenuLinks(page),menuHtml="";for(menuHtml+='
',i=0,length=items.length;i
"),item.href?menuHtml+=Dashboard.getToolsLinkHtml(item):(menuHtml+='
',menuHtml+=item.name,menuHtml+="
");return menuHtml+="
"},getToolsMenuLinks:function(){return[{name:Globalize.translate("TabServer")},{name:Globalize.translate("TabDashboard"),href:"dashboard.html",pageIds:["dashboardPage"],icon:"dashboard"},{name:Globalize.translate("TabSettings"),href:"dashboardgeneral.html",pageIds:["dashboardGeneralPage"],icon:"settings"},{name:Globalize.translate("TabDevices"),href:"devices.html",pageIds:["devicesPage","devicePage"],icon:"tablet"},{name:Globalize.translate("TabUsers"),href:"userprofiles.html",pageIds:["userProfilesPage","newUserPage","editUserPage","userLibraryAccessPage","userParentalControlPage","userPasswordPage"],icon:"people"},{name:"Emby Premiere",href:"supporterkey.html",pageIds:["supporterKeyPage"],icon:"star"},{divider:!0,name:Globalize.translate("TabLibrary"),href:"library.html",pageIds:["mediaLibraryPage","librarySettingsPage","libraryDisplayPage","metadataImagesConfigurationPage","metadataNfoPage"],icon:"folder",color:"#38c"},{name:Globalize.translate("TabSubtitles"),href:"metadatasubtitles.html",pageIds:["metadataSubtitlesPage"],icon:"closed_caption"},{name:Globalize.translate("TabPlayback"),icon:"play_circle_filled",color:"#E5342E",href:"cinemamodeconfiguration.html",pageIds:["cinemaModeConfigurationPage","playbackConfigurationPage","streamingSettingsPage"]},{name:Globalize.translate("TabSync"),icon:"sync",href:"syncactivity.html",pageIds:["syncActivityPage","syncJobPage","devicesUploadPage","syncSettingsPage"],color:"#009688"},{name:Globalize.translate("TabTranscoding"),icon:"transform",href:"encodingsettings.html",pageIds:["encodingSettingsPage"]},{divider:!0,name:Globalize.translate("TabExtras")},{name:Globalize.translate("TabAutoOrganize"),color:"#01C0DD",href:"autoorganizelog.html",pageIds:["libraryFileOrganizerPage","libraryFileOrganizerSmartMatchPage","libraryFileOrganizerLogPage"],icon:"folder"},{name:Globalize.translate("DLNA"),href:"dlnasettings.html",pageIds:["dlnaSettingsPage","dlnaProfilesPage","dlnaProfilePage"],icon:"settings"},{name:Globalize.translate("TabLiveTV"),href:"livetvstatus.html",pageIds:["liveTvStatusPage","liveTvSettingsPage","liveTvTunerProviderHdHomerunPage","liveTvTunerProviderM3UPage","liveTvTunerProviderSatPage"],icon:"dvr"},{name:Globalize.translate("TabNotifications"),icon:"notifications",color:"brown",href:"notificationsettings.html",pageIds:["notificationSettingsPage","notificationSettingPage"]},{name:Globalize.translate("TabPlugins"),icon:"add_shopping_cart",color:"#9D22B1",href:"plugins.html",pageIds:["pluginsPage","pluginCatalogPage"]},{divider:!0,name:Globalize.translate("TabExpert")},{name:Globalize.translate("TabAdvanced"),icon:"settings",href:"dashboardhosting.html",color:"#F16834",pageIds:["dashboardHostingPage","serverSecurityPage"]},{name:Globalize.translate("TabLogs"),href:"log.html",pageIds:["logPage"],icon:"folder_open"},{name:Globalize.translate("TabScheduledTasks"),href:"scheduledtasks.html",pageIds:["scheduledTasksPage","scheduledTaskPage"],icon:"schedule"},{name:Globalize.translate("MetadataManager"),href:"edititemmetadata.html",pageIds:[],icon:"mode_edit"},{name:Globalize.translate("ButtonReports"),href:"reports.html",pageIds:[],icon:"insert_chart"}]},getSupportedRemoteCommands:function(){return["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"]},capabilities:function(){var caps={PlayableMediaTypes:["Audio","Video"],SupportedCommands:Dashboard.getSupportedRemoteCommands(),SupportsPersistentIdentifier:Dashboard.isRunningInCordova(),SupportsMediaControl:!0,SupportedLiveMediaTypes:["Audio","Video"]};return Dashboard.isRunningInCordova()&&!browserInfo.safari&&(caps.SupportsSync=!0,caps.SupportsContentUploading=!0),caps},normalizeImageOptions:function(options){AppInfo.hasLowImageBandwidth&&(options.enableImageEnhancers=!1);var setQuality;if(options.maxWidth&&(setQuality=!0),options.width&&(setQuality=!0),options.maxHeight&&(setQuality=!0),options.height&&(setQuality=!0),setQuality){var quality=90,isBackdrop="backdrop"==(options.type||"").toLowerCase();isBackdrop&&(quality-=10),browserInfo.slow&&(quality-=40),AppInfo.hasLowImageBandwidth&&!isBackdrop&&(quality-=10),options.quality=quality}}},AppInfo={};!function(){"use strict";function setAppInfo(){var isCordova=Dashboard.isRunningInCordova();AppInfo.enableHomeTabs=!0,AppInfo.enableAutoSave=browserInfo.touch,AppInfo.enableAppStorePolicy=isCordova;var isIOS=browserInfo.ipad||browserInfo.iphone,isAndroid=browserInfo.android;isIOS&&(AppInfo.hasLowImageBandwidth=!0),isCordova?(AppInfo.isNativeApp=!0,AppInfo.enableHomeTabs=!1,isAndroid&&(AppInfo.supportsExternalPlayers=!0)):AppInfo.enableSupporterMembership=!0,AppInfo.supportsFileInput=!(AppInfo.isNativeApp&&isAndroid),isCordova&&isIOS?AppInfo.moreIcon="more-horiz":AppInfo.moreIcon="more-vert",AppInfo.supportsUserDisplayLanguageSetting=Dashboard.isConnectMode()}function initializeApiClient(apiClient){AppInfo.enableAppStorePolicy&&(apiClient.getAvailablePlugins=function(){return Promise.resolve([])},apiClient.getInstalledPlugins=function(){return Promise.resolve([])}),apiClient.normalizeImageOptions=Dashboard.normalizeImageOptions,Events.off(apiClient,"requestfail",Dashboard.onRequestFail),Events.on(apiClient,"requestfail",Dashboard.onRequestFail)}function onApiClientCreated(e,newApiClient){initializeApiClient(newApiClient),window.$&&($.ajax=newApiClient.ajax)}function defineConnectionManager(connectionManager){window.ConnectionManager=connectionManager,define("connectionManager",[],function(){return connectionManager})}function bindConnectionManagerEvents(connectionManager,events,userSettings){window.Events=events,events.on(ConnectionManager,"apiclientcreated",onApiClientCreated),connectionManager.currentApiClient=function(){if(!localApiClient){var server=connectionManager.getLastUsedServer();server&&(localApiClient=connectionManager.getApiClient(server.Id))}return localApiClient},connectionManager.onLocalUserSignedIn=function(user){return localApiClient=connectionManager.getApiClient(user.ServerId),window.ApiClient=localApiClient,userSettings.setUserInfo(user.Id,localApiClient)},events.on(connectionManager,"localusersignedout",function(){userSettings.setUserInfo(null,null)})}function createConnectionManager(){return new Promise(function(resolve,reject){require(["connectionManagerFactory","apphost","credentialprovider","events","userSettings"],function(connectionManagerExports,apphost,credentialProvider,events,userSettings){window.MediaBrowser=Object.assign(window.MediaBrowser||{},connectionManagerExports);var credentialProviderInstance=new credentialProvider,promises=[apphost.getSyncProfile(),apphost.appInfo()];Promise.all(promises).then(function(responses){var deviceProfile=responses[0],appInfo=responses[1],capabilities=Dashboard.capabilities();capabilities.DeviceProfile=deviceProfile;var connectionManager=new MediaBrowser.ConnectionManager(credentialProviderInstance,appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,capabilities,window.devicePixelRatio);return defineConnectionManager(connectionManager),bindConnectionManagerEvents(connectionManager,events,userSettings),Dashboard.isConnectMode()?void resolve():(console.log("loading ApiClient singleton"),getRequirePromise(["apiclient"]).then(function(apiClientFactory){console.log("creating ApiClient singleton");var apiClient=new apiClientFactory(Dashboard.serverAddress(),appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,window.devicePixelRatio);apiClient.enableAutomaticNetworking=!1,connectionManager.addApiClient(apiClient),require(["css!"+apiClient.getUrl("Branding/Css")]),window.ApiClient=apiClient,localApiClient=apiClient,console.log("loaded ApiClient singleton"),resolve()}))})})})}function setDocumentClasses(browser){var elem=document.documentElement;AppInfo.enableSupporterMembership||elem.classList.add("supporterMembershipDisabled")}function loadTheme(){var name=getParameterByName("theme");if(name)return void require(["themes/"+name+"/theme"]);if(!AppInfo.isNativeApp){var date=new Date,month=date.getMonth(),day=date.getDate();return 9==month&&day>=30?void require(["themes/halloween/theme"]):void 0}}function returnFirstDependency(obj){return obj}function getBowerPath(){return"bower_components"}function getLayoutManager(layoutManager){return layoutManager.init(),layoutManager}function getAppStorage(basePath){try{return localStorage.setItem("_test","0"),localStorage.removeItem("_test"),basePath+"/appstorage-localstorage"}catch(e){return basePath+"/appstorage-memory"}}function createWindowHeadroom(){var headroom=new Headroom([],{tolerance:{down:0,up:0},classes:{}});return headroom.init(),headroom}function createMainContentHammer(Hammer){var hammer=new Hammer(document.querySelector(".mainDrawerPanelContent"),null);return hammer}function createSharedAppFooter(appFooter){var footer=new appFooter({});return footer}function initRequire(){var urlArgs="v="+(window.dashboardVersion||(new Date).getDate()),bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents",paths={velocity:bowerPath+"/velocity/velocity.min",vibrant:bowerPath+"/vibrant/dist/vibrant",ironCardList:"components/ironcardlist/ironcardlist",scrollThreshold:"components/scrollthreshold",playlisteditor:"components/playlisteditor/playlisteditor",medialibrarycreator:"components/medialibrarycreator/medialibrarycreator",medialibraryeditor:"components/medialibraryeditor/medialibraryeditor",howler:bowerPath+"/howlerjs/howler.min",sortable:bowerPath+"/Sortable/Sortable.min",isMobile:bowerPath+"/isMobile/isMobile.min",headroom:bowerPath+"/headroomjs/dist/headroom",masonry:bowerPath+"/masonry/dist/masonry.pkgd.min",humanedate:"components/humanedate",libraryBrowser:"scripts/librarybrowser",chromecasthelpers:"components/chromecasthelpers",events:apiClientBowerPath+"/events",credentialprovider:apiClientBowerPath+"/credentials",apiclient:apiClientBowerPath+"/apiclient",connectionManagerFactory:bowerPath+"/emby-apiclient/connectionmanager",visibleinviewport:embyWebComponentsBowerPath+"/visibleinviewport",browserdeviceprofile:embyWebComponentsBowerPath+"/browserdeviceprofile",browser:embyWebComponentsBowerPath+"/browser",inputManager:embyWebComponentsBowerPath+"/inputmanager",qualityoptions:embyWebComponentsBowerPath+"/qualityoptions",hammer:bowerPath+"/hammerjs/hammer.min",pageJs:embyWebComponentsBowerPath+"/pagejs/page",focusManager:embyWebComponentsBowerPath+"/focusmanager",datetime:embyWebComponentsBowerPath+"/datetime",globalize:embyWebComponentsBowerPath+"/globalize",itemHelper:embyWebComponentsBowerPath+"/itemhelper",itemShortcuts:embyWebComponentsBowerPath+"/shortcuts",serverNotifications:embyWebComponentsBowerPath+"/servernotifications",playbackManager:embyWebComponentsBowerPath+"/playback/playbackmanager",nowPlayingHelper:embyWebComponentsBowerPath+"/playback/nowplayinghelper",pluginManager:embyWebComponentsBowerPath+"/pluginmanager",packageManager:embyWebComponentsBowerPath+"/packagemanager",webAnimations:bowerPath+"/web-animations-js/web-animations-next-lite.min"};paths.hlsjs=bowerPath+"/hlsjs/dist/hls.min",define("webActionSheet",[embyWebComponentsBowerPath+"/actionsheet/actionsheet"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.sharingMenu="cordova/sharingwidget":define("sharingMenu",[embyWebComponentsBowerPath+"/sharing/sharingmenu"],returnFirstDependency),paths.wakeonlan=apiClientBowerPath+"/wakeonlan",define("libjass",[bowerPath+"/libjass/libjass.min","css!"+bowerPath+"/libjass/libjass"],returnFirstDependency),window.IntersectionObserver?define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-intersectionobserver"],returnFirstDependency):define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-scroll"],returnFirstDependency),define("imageLoader",[embyWebComponentsBowerPath+"/images/imagehelper"],returnFirstDependency),define("appfooter",["components/appfooter/appfooter"],returnFirstDependency),define("dockedtabs",["components/dockedtabs/dockedtabs"],returnFirstDependency),define("directorybrowser",["components/directorybrowser/directorybrowser"],returnFirstDependency),define("metadataEditor",[embyWebComponentsBowerPath+"/metadataeditor/metadataeditor"],returnFirstDependency),define("personEditor",[embyWebComponentsBowerPath+"/metadataeditor/personeditor"],returnFirstDependency),define("playerSelectionMenu",[embyWebComponentsBowerPath+"/playback/playerselection"],returnFirstDependency),define("playerSettingsMenu",[embyWebComponentsBowerPath+"/playback/playersettingsmenu"],returnFirstDependency),define("libraryMenu",["scripts/librarymenu"],returnFirstDependency),define("emby-collapse",[embyWebComponentsBowerPath+"/emby-collapse/emby-collapse"],returnFirstDependency),define("emby-button",[embyWebComponentsBowerPath+"/emby-button/emby-button"],returnFirstDependency),define("emby-itemscontainer",[embyWebComponentsBowerPath+"/emby-itemscontainer/emby-itemscontainer"],returnFirstDependency),define("emby-tabs",[embyWebComponentsBowerPath+"/emby-tabs/emby-tabs"],returnFirstDependency),define("itemHoverMenu",[embyWebComponentsBowerPath+"/itemhovermenu/itemhovermenu"],returnFirstDependency),define("multiSelect",[embyWebComponentsBowerPath+"/multiselect/multiselect"],returnFirstDependency),define("alphaPicker",[embyWebComponentsBowerPath+"/alphapicker/alphapicker"],returnFirstDependency),define("paper-icon-button-light",[embyWebComponentsBowerPath+"/emby-button/paper-icon-button-light"]),define("connectHelper",[embyWebComponentsBowerPath+"/emby-connect/connecthelper"],returnFirstDependency),define("emby-input",[embyWebComponentsBowerPath+"/emby-input/emby-input"],returnFirstDependency),define("emby-select",[embyWebComponentsBowerPath+"/emby-select/emby-select"],returnFirstDependency),define("emby-slider",[embyWebComponentsBowerPath+"/emby-slider/emby-slider"],returnFirstDependency),define("emby-checkbox",[embyWebComponentsBowerPath+"/emby-checkbox/emby-checkbox"],returnFirstDependency),define("emby-toggle",[embyWebComponentsBowerPath+"/emby-toggle/emby-toggle"],returnFirstDependency),define("emby-radio",[embyWebComponentsBowerPath+"/emby-radio/emby-radio"],returnFirstDependency),define("emby-textarea",[embyWebComponentsBowerPath+"/emby-textarea/emby-textarea"],returnFirstDependency),define("collectionEditor",[embyWebComponentsBowerPath+"/collectioneditor/collectioneditor"],returnFirstDependency),define("playlistEditor",[embyWebComponentsBowerPath+"/playlisteditor/playlisteditor"],returnFirstDependency),define("recordingCreator",[embyWebComponentsBowerPath+"/recordingcreator/recordingcreator"],returnFirstDependency),define("recordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/recordingeditor"],returnFirstDependency),define("seriesRecordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/seriesrecordingeditor"],returnFirstDependency),define("recordingFields",[embyWebComponentsBowerPath+"/recordingcreator/recordingfields"],returnFirstDependency),define("recordingHelper",[embyWebComponentsBowerPath+"/recordingcreator/recordinghelper"],returnFirstDependency),define("subtitleEditor",[embyWebComponentsBowerPath+"/subtitleeditor/subtitleeditor"],returnFirstDependency),define("itemIdentifier",[embyWebComponentsBowerPath+"/itemidentifier/itemidentifier"],returnFirstDependency),define("mediaInfo",[embyWebComponentsBowerPath+"/mediainfo/mediainfo"],returnFirstDependency),define("itemContextMenu",[embyWebComponentsBowerPath+"/itemcontextmenu"],returnFirstDependency),define("imageEditor",[embyWebComponentsBowerPath+"/imageeditor/imageeditor"],returnFirstDependency),define("dom",[embyWebComponentsBowerPath+"/dom"],returnFirstDependency),define("fullscreen-doubleclick",[embyWebComponentsBowerPath+"/fullscreen/fullscreen-doubleclick"],returnFirstDependency),define("fullscreenManager",[embyWebComponentsBowerPath+"/fullscreen/fullscreenmanager","events"],returnFirstDependency),define("layoutManager",[embyWebComponentsBowerPath+"/layoutmanager"],getLayoutManager),define("playMenu",[embyWebComponentsBowerPath+"/playmenu"],returnFirstDependency),define("refreshDialog",[embyWebComponentsBowerPath+"/refreshdialog/refreshdialog"],returnFirstDependency),define("backdrop",[embyWebComponentsBowerPath+"/backdrop/backdrop"],returnFirstDependency),define("fetchHelper",[embyWebComponentsBowerPath+"/fetchhelper"],returnFirstDependency),define("roundCardStyle",["cardStyle","css!"+embyWebComponentsBowerPath+"/cardbuilder/roundcard"],returnFirstDependency),define("cardStyle",["css!"+embyWebComponentsBowerPath+"/cardbuilder/card"],returnFirstDependency),define("cardBuilder",[embyWebComponentsBowerPath+"/cardbuilder/cardbuilder"],returnFirstDependency),define("peoplecardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/peoplecardbuilder"],returnFirstDependency),define("chaptercardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/chaptercardbuilder"],returnFirstDependency),define("mouseManager",[embyWebComponentsBowerPath+"/input/mouse"],returnFirstDependency),define("deleteHelper",[embyWebComponentsBowerPath+"/deletehelper"],returnFirstDependency),define("tvguide",[embyWebComponentsBowerPath+"/guide/guide"],returnFirstDependency),define("programStyles",["css!"+embyWebComponentsBowerPath+"/guide/programs"],returnFirstDependency),define("guide-settings-dialog",[embyWebComponentsBowerPath+"/guide/guide-settings"],returnFirstDependency),define("syncDialog",[embyWebComponentsBowerPath+"/sync/sync"],returnFirstDependency),define("syncToggle",[embyWebComponentsBowerPath+"/sync/synctoggle"],returnFirstDependency),define("syncJobEditor",[embyWebComponentsBowerPath+"/sync/syncjobeditor"],returnFirstDependency),define("syncJobList",[embyWebComponentsBowerPath+"/sync/syncjoblist"],returnFirstDependency),define("voiceDialog",[embyWebComponentsBowerPath+"/voice/voicedialog"],returnFirstDependency),define("voiceReceiver",[embyWebComponentsBowerPath+"/voice/voicereceiver"],returnFirstDependency),define("voiceProcessor",[embyWebComponentsBowerPath+"/voice/voiceprocessor"],returnFirstDependency),define("viewManager",[embyWebComponentsBowerPath+"/viewmanager/viewmanager"],function(viewManager){return window.ViewManager=viewManager,viewManager.dispatchPageEvents(!0),viewManager}),Dashboard.isRunningInCordova()&&window.MainActivity?define("shell",["cordova/shell"],returnFirstDependency):define("shell",[embyWebComponentsBowerPath+"/shell"],returnFirstDependency),define("sharingmanager",[embyWebComponentsBowerPath+"/sharing/sharingmanager"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.apphost="cordova/apphost":paths.apphost="components/apphost",Dashboard.isRunningInCordova()&&window.MainActivity?(paths.appStorage="cordova/appstorage",paths.filesystem="cordova/filesystem"):(paths.appStorage=getAppStorage(apiClientBowerPath),paths.filesystem=embyWebComponentsBowerPath+"/filesystem");var sha1Path=bowerPath+"/cryptojslib/components/sha1-min",md5Path=bowerPath+"/cryptojslib/components/md5-min",shim={};shim[sha1Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},shim[md5Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},requirejs.config({waitSeconds:0,map:{"*":{css:bowerPath+"/emby-webcomponents/require/requirecss",html:bowerPath+"/emby-webcomponents/require/requirehtml",text:bowerPath+"/emby-webcomponents/require/requiretext"}},urlArgs:urlArgs,paths:paths,shim:shim}),define("cryptojs-sha1",[sha1Path]),define("cryptojs-md5",[md5Path]),define("jstree",[bowerPath+"/jstree/dist/jstree","css!thirdparty/jstree/themes/default/style.min.css"]),define("dashboardcss",["css!css/dashboard"]),define("jqmtable",["thirdparty/jquerymobile-1.4.5/jqm.table","css!thirdparty/jquerymobile-1.4.5/jqm.table.css"]),define("jqmwidget",["thirdparty/jquerymobile-1.4.5/jqm.widget"]),define("jqmslider",["thirdparty/jquerymobile-1.4.5/jqm.slider","css!thirdparty/jquerymobile-1.4.5/jqm.slider.css"]),define("jqmpopup",["thirdparty/jquerymobile-1.4.5/jqm.popup","css!thirdparty/jquerymobile-1.4.5/jqm.popup.css"]),define("jqmlistview",["css!thirdparty/jquerymobile-1.4.5/jqm.listview.css"]),define("jqmpanel",["thirdparty/jquerymobile-1.4.5/jqm.panel","css!thirdparty/jquerymobile-1.4.5/jqm.panel.css"]),define("slideshow",[embyWebComponentsBowerPath+"/slideshow/slideshow"],returnFirstDependency),define("fetch",[bowerPath+"/fetch/fetch"]),define("raf",[embyWebComponentsBowerPath+"/polyfills/raf"]),define("functionbind",[embyWebComponentsBowerPath+"/polyfills/bind"]),define("arraypolyfills",[embyWebComponentsBowerPath+"/polyfills/array"]),define("objectassign",[embyWebComponentsBowerPath+"/polyfills/objectassign"]),define("clearButtonStyle",["css!"+embyWebComponentsBowerPath+"/clearbutton"]),define("userdataButtons",[embyWebComponentsBowerPath+"/userdatabuttons/userdatabuttons"],returnFirstDependency),define("listView",[embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("listViewStyle",["css!"+embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("formDialogStyle",["css!"+embyWebComponentsBowerPath+"/formdialog"],returnFirstDependency),define("indicators",[embyWebComponentsBowerPath+"/indicators/indicators"],returnFirstDependency),define("registrationServices",[embyWebComponentsBowerPath+"/registrationservices/registrationservices"],returnFirstDependency),Dashboard.isRunningInCordova()?(define("iapManager",["cordova/iap"],returnFirstDependency),define("fileupload",["cordova/fileupload"],returnFirstDependency)):(define("iapManager",["components/iap"],returnFirstDependency),define("fileupload",[apiClientBowerPath+"/fileupload"],returnFirstDependency)),define("connectionmanager",[apiClientBowerPath+"/connectionmanager"]),define("cameraRoll",[apiClientBowerPath+"/cameraroll"],returnFirstDependency),define("contentuploader",[apiClientBowerPath+"/sync/contentuploader"]),define("serversync",[apiClientBowerPath+"/sync/serversync"]),define("multiserversync",[apiClientBowerPath+"/sync/multiserversync"]),define("offlineusersync",[apiClientBowerPath+"/sync/offlineusersync"]),define("mediasync",[apiClientBowerPath+"/sync/mediasync"]),define("swiper",[bowerPath+"/Swiper/dist/js/swiper.min","css!"+bowerPath+"/Swiper/dist/css/swiper.min"],returnFirstDependency),define("scroller",[embyWebComponentsBowerPath+"/scroller/smoothscroller"],returnFirstDependency),define("toast",[embyWebComponentsBowerPath+"/toast/toast"],returnFirstDependency),define("scrollHelper",[embyWebComponentsBowerPath+"/scrollhelper"],returnFirstDependency),define("appSettings",[embyWebComponentsBowerPath+"/appsettings"],updateAppSettings),define("userSettings",[embyWebComponentsBowerPath+"/usersettings/usersettings"],returnFirstDependency),define("userSettingsBuilder",[embyWebComponentsBowerPath+"/usersettings/usersettingsbuilder"],returnFirstDependency),define("material-icons",["css!"+embyWebComponentsBowerPath+"/fonts/material-icons/style"]),define("robotoFont",["css!"+embyWebComponentsBowerPath+"/fonts/roboto/style"]),define("scrollStyles",["css!"+embyWebComponentsBowerPath+"/scrollstyles"]),define("navdrawer",["components/navdrawer/navdrawer"],returnFirstDependency),define("viewcontainer",["components/viewcontainer-lite","css!"+embyWebComponentsBowerPath+"/viewmanager/viewcontainer-lite"],returnFirstDependency),define("queryString",[bowerPath+"/query-string/index"],function(){return queryString}),define("jQuery",[bowerPath+"/jquery/dist/jquery.slim.min"],function(){return window.ApiClient&&(jQuery.ajax=ApiClient.ajax),jQuery}),define("fnchecked",["legacy/fnchecked"]),define("dialogHelper",[embyWebComponentsBowerPath+"/dialoghelper/dialoghelper"],function(dialoghelper){return dialoghelper.setOnOpen(onDialogOpen),dialoghelper}),define("inputmanager",["inputManager"],returnFirstDependency),define("historyManager",["embyRouter"],returnFirstDependency),define("headroom-window",["headroom"],createWindowHeadroom),define("hammer-main",["hammer"],createMainContentHammer),define("appfooter-shared",["appfooter"],createSharedAppFooter),define("skinManager",[],function(){return{loadUserSkin:function(){Emby.Page.show("/home.html")}}}),define("connectionManager",[],function(){return ConnectionManager}),define("apiClientResolver",[],function(){return function(){return window.ApiClient}}),define("embyRouter",[embyWebComponentsBowerPath+"/router"],function(embyRouter){function showItem(item,serverId,options){if("string"==typeof item)require(["connectionManager"],function(connectionManager){var apiClient=connectionManager.currentApiClient();apiClient.getItem(apiClient.getCurrentUserId(),item).then(function(item){embyRouter.showItem(item,options)})});else{2==arguments.length&&(options=arguments[1]);var context=options?options.context:null;Emby.Page.show("/"+LibraryBrowser.getHref(item,context),{item:item})}}return embyRouter.showLocalLogin=function(apiClient,serverId,manualLogin){Dashboard.navigate("login.html?serverid="+serverId)},embyRouter.showVideoOsd=function(){return Dashboard.navigate("videoosd.html")},embyRouter.showSelectServer=function(){Dashboard.navigate("selectserver.html")},embyRouter.showWelcome=function(){Dashboard.isConnectMode()?Dashboard.navigate("connectlogin.html?mode=welcome"):Dashboard.navigate("login.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.showGuide=function(){Dashboard.navigate("livetv.html?tab=1")},embyRouter.goHome=function(){Dashboard.navigate("home.html"); -},embyRouter.showSearch=function(){Dashboard.navigate("search.html")},embyRouter.showLiveTV=function(){Dashboard.navigate("livetv.html")},embyRouter.showRecordedTV=function(){Dashboard.navigate("livetv.html?tab=3")},embyRouter.showFavorites=function(){Dashboard.navigate("favorites.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.setTitle=function(){},embyRouter.showItem=showItem,embyRouter})}function updateAppSettings(appSettings){return appSettings.enableExternalPlayers=function(val){return null!=val&&appSettings.set("externalplayers",val.toString()),"true"===appSettings.get("externalplayers")},appSettings}function onDialogOpen(dlg){dlg.classList.contains("background-theme-a")||dlg.classList.contains("actionSheet")||(dlg.classList.add("background-theme-b"),dlg.classList.add("ui-body-b"))}function initRequireWithBrowser(browser){var bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents";Dashboard.isRunningInCordova()&&browser.safari?define("actionsheet",["cordova/actionsheet"],returnFirstDependency):define("actionsheet",["webActionSheet"],returnFirstDependency),"registerElement"in document?define("registerElement",[]):browser.msie?define("registerElement",[bowerPath+"/webcomponentsjs/webcomponents-lite.min.js"]):define("registerElement",[bowerPath+"/document-register-element/build/document-register-element"]),window.chrome&&window.chrome.sockets?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.android?define("serverdiscovery",["cordova/serverdiscovery"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.safari?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.safari?define("imageFetcher",["cordova/imagestore"],returnFirstDependency):define("imageFetcher",[embyWebComponentsBowerPath+"/images/basicimagefetcher"],returnFirstDependency);var preferNativeAlerts=browser.tv;preferNativeAlerts&&window.alert?define("alert",[embyWebComponentsBowerPath+"/alert/nativealert"],returnFirstDependency):define("alert",[embyWebComponentsBowerPath+"/alert/alert"],returnFirstDependency),define("dialog",[embyWebComponentsBowerPath+"/dialog/dialog"],returnFirstDependency),preferNativeAlerts&&window.confirm?define("confirm",[embyWebComponentsBowerPath+"/confirm/nativeconfirm"],returnFirstDependency):define("confirm",[embyWebComponentsBowerPath+"/confirm/confirm"],returnFirstDependency);var preferNativePrompt=preferNativeAlerts||browser.xboxOne;preferNativePrompt&&window.confirm?define("prompt",[embyWebComponentsBowerPath+"/prompt/nativeprompt"],returnFirstDependency):define("prompt",[embyWebComponentsBowerPath+"/prompt/prompt"],returnFirstDependency),browser.tizen||browser.operaTv?define("loading",[embyWebComponentsBowerPath+"/loading/loading-legacy"],returnFirstDependency):define("loading",[embyWebComponentsBowerPath+"/loading/loading-lite"],returnFirstDependency),define("multi-download",[embyWebComponentsBowerPath+"/multidownload"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("fileDownloader",["cordova/filedownloader"],returnFirstDependency),define("localassetmanager",["cordova/localassetmanager"],returnFirstDependency)):(define("fileDownloader",[embyWebComponentsBowerPath+"/filedownloader"],returnFirstDependency),define("localassetmanager",[apiClientBowerPath+"/localassetmanager"],returnFirstDependency)),define("screenLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",["cordova/wakelock"],returnFirstDependency),define("networkLock",["cordova/networklock"],returnFirstDependency)):(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),define("networkLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency))}function init(){Dashboard.isRunningInCordova()&&browserInfo.android&&define("nativedirectorychooser",["cordova/nativedirectorychooser"]),Dashboard.isRunningInCordova()&&browserInfo.android?define("localsync",["cordova/localsync"],returnFirstDependency):define("localsync",["scripts/localsync"],returnFirstDependency),define("livetvcss",["css!css/livetv.css"]),define("detailtablecss",["css!css/detailtable.css"]),define("autoorganizetablecss",["css!css/autoorganizetable.css"]),define("buttonenabled",["legacy/buttonenabled"]),initAfterDependencies()}function getRequirePromise(deps){return new Promise(function(resolve,reject){require(deps,resolve)})}function initAfterDependencies(){var list=[];window.fetch||list.push("fetch"),"function"!=typeof Object.assign&&list.push("objectassign"),Array.prototype.filter||list.push("arraypolyfills"),Function.prototype.bind||list.push("functionbind"),window.requestAnimationFrame||list.push("raf"),require(list,function(){createConnectionManager().then(function(){console.log("initAfterDependencies promises resolved"),require(["globalize"],function(globalize){window.Globalize=globalize,Promise.all([loadCoreDictionary(globalize),loadSharedComponentsDictionary(globalize)]).then(onGlobalizeInit)})})})}function loadSharedComponentsDictionary(globalize){var baseUrl="bower_components/emby-webcomponents/strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sk","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});globalize.loadStrings({name:"sharedcomponents",translations:translations})}function loadCoreDictionary(globalize){var baseUrl="strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});return globalize.defaultModule("core"),globalize.loadStrings({name:"core",translations:translations})}function onGlobalizeInit(){document.title=Globalize.translateDocument(document.title,"core"),require(["apphost"],function(appHost){loadPlugins([],appHost,browserInfo).then(onAppReady)})}function defineRoute(newRoute,dictionary){var baseRoute=Emby.Page.baseUrl(),path=newRoute.path;path=path.replace(baseRoute,""),console.log("Defining route: "+path),newRoute.dictionary=newRoute.dictionary||dictionary||"core",Emby.Page.addRoute(path,newRoute)}function defineCoreRoutes(){console.log("Defining core routes"),defineRoute({path:"/addplugin.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"scripts/addpluginpage"}),defineRoute({path:"/appservices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizelog.html",dependencies:["scripts/taskbutton","autoorganizetablecss"],controller:"dashboard/autoorganizelog",roles:"admin"}),defineRoute({path:"/autoorganizesmart.html",dependencies:["emby-button"],controller:"dashboard/autoorganizesmart",autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizetv.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-select","emby-collapse"],controller:"dashboard/autoorganizetv",autoFocus:!1,roles:"admin"}),defineRoute({path:"/channelitems.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/channels.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/channels"}),defineRoute({path:"/channelsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/cinemamodeconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/connectlogin.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/connectlogin"}),defineRoute({path:"/dashboard.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardgeneral.html",controller:"dashboard/dashboardgeneral",autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardhosting.html",dependencies:["emby-input","emby-button"],autoFocus:!1,roles:"admin",controller:"dashboard/dashboardhosting"}),defineRoute({path:"/device.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devicesupload.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofile.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaserversettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnasettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/edititemmetadata.html",dependencies:[],controller:"scripts/edititemmetadata",autoFocus:!1}),defineRoute({path:"/encodingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/favorites.html",dependencies:[],autoFocus:!1,controller:"scripts/favorites"}),defineRoute({path:"/forgotpassword.html",dependencies:["emby-input","emby-button"],anonymous:!0,startup:!0,controller:"scripts/forgotpassword"}),defineRoute({path:"/forgotpasswordpin.html",dependencies:["emby-input","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/forgotpasswordpin"}),defineRoute({path:"/gamegenres.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/games.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesrecommended.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamestudios.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesystems.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/home.html",dependencies:[],autoFocus:!1,controller:"scripts/indexpage",transition:"fade",type:"home"}),defineRoute({path:"/index.html",dependencies:[],autoFocus:!1,isDefaultRoute:!0}),defineRoute({path:"/itemdetails.html",dependencies:["emby-button","scripts/livetvcomponents","paper-icon-button-light","emby-itemscontainer"],controller:"scripts/itemdetailpage",autoFocus:!1,transition:"fade"}),defineRoute({path:"/itemlist.html",dependencies:[],autoFocus:!1,controller:"scripts/itemlistpage",transition:"fade"}),defineRoute({path:"/kids.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/library.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/librarydisplay.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"dashboard/librarydisplay"}),defineRoute({path:"/librarysettings.html",dependencies:["emby-collapse","emby-input","emby-button","emby-select"],autoFocus:!1,roles:"admin",controller:"dashboard/librarysettings"}),defineRoute({path:"/livetv.html",dependencies:["emby-button","livetvcss"],controller:"scripts/livetvsuggested",autoFocus:!1,transition:"fade"}),defineRoute({path:"/livetvguideprovider.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvitems.html",dependencies:[],autoFocus:!1,controller:"scripts/livetvitems"}),defineRoute({path:"/livetvseriestimer.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-collapse","scripts/livetvcomponents","scripts/livetvseriestimer","livetvcss"],autoFocus:!1,controller:"scripts/livetvseriestimer"}),defineRoute({path:"/livetvsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/livetvstatus.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-hdhomerun.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-m3u.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-satip.html",dependencies:["emby-input"],autoFocus:!1,roles:"admin",controller:"dashboard/livetvtunerprovider-satip"}),defineRoute({path:"/log.html",dependencies:["emby-checkbox"],roles:"admin",controller:"dashboard/logpage"}),defineRoute({path:"/login.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/loginpage"}),defineRoute({path:"/metadataadvanced.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadataimages.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatanfo.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatasubtitles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/movies.html",dependencies:["emby-button"],autoFocus:!1,controller:"scripts/moviesrecommended",transition:"fade"}),defineRoute({path:"/music.html",dependencies:[],controller:"scripts/musicrecommended",autoFocus:!1,transition:"fade"}),defineRoute({path:"/mypreferencesdisplay.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencesdisplay"}),defineRoute({path:"/mypreferenceshome.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceshome"}),defineRoute({path:"/mypreferenceslanguages.html",dependencies:["emby-button","emby-checkbox","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceslanguages"}),defineRoute({path:"/mypreferencesmenu.html",dependencies:["emby-button"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencescommon"}),defineRoute({path:"/myprofile.html",dependencies:["emby-button","emby-collapse","emby-checkbox","emby-input"],autoFocus:!1,transition:"fade",controller:"scripts/myprofile"}),defineRoute({path:"/mysync.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/mysync"}),defineRoute({path:"/camerauploadsettings.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/camerauploadsettings"}),defineRoute({path:"/mysyncjob.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/syncjob"}),defineRoute({path:"/mysyncsettings.html",dependencies:["emby-checkbox","emby-input","emby-button","paper-icon-button-light"],autoFocus:!1,transition:"fade",controller:"scripts/mysyncsettings"}),defineRoute({path:"/notificationlist.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/notificationsetting.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/notificationsettings.html",controller:"scripts/notificationsettings",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/nowplaying.html",dependencies:["paper-icon-button-light","emby-slider","emby-button","emby-input","emby-itemscontainer"],controller:"scripts/nowplayingpage",autoFocus:!1,transition:"fade",fullscreen:!0,supportsThemeMedia:!0}),defineRoute({path:"/photos.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/playbackconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/playlists.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/playlists"}),defineRoute({path:"/plugincatalog.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/plugins.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/reports.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/scheduledtask.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/scheduledtasks.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/search.html",dependencies:[],controller:"scripts/searchpage"}),defineRoute({path:"/secondaryitems.html",dependencies:[],autoFocus:!1,controller:"scripts/secondaryitems"}),defineRoute({path:"/selectserver.html",dependencies:["listViewStyle","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/selectserver"}),defineRoute({path:"/serversecurity.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/shared.html",dependencies:[],autoFocus:!1,anonymous:!0}),defineRoute({path:"/streamingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/support.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/supporterkey.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/syncactivity.html",dependencies:[],autoFocus:!1,controller:"scripts/syncactivity"}),defineRoute({path:"/syncsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/tv.html",dependencies:["paper-icon-button-light","emby-button"],autoFocus:!1,controller:"scripts/tvrecommended",transition:"fade"}),defineRoute({path:"/useredit.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userlibraryaccess.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/usernew.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userparentalcontrol.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userpassword.html",dependencies:["emby-input","emby-button","emby-checkbox"],autoFocus:!1,controller:"scripts/userpasswordpage"}),defineRoute({path:"/userprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/wizardagreement.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardcomponents.html",dependencies:["dashboardcss","emby-button","emby-input","emby-select"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardcomponents"}),defineRoute({path:"/wizardfinish.html",dependencies:["emby-button","dashboardcss"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardfinishpage"}),defineRoute({path:"/wizardlibrary.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvguide.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvtuner.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardsettings.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardstart.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizarduser.html",dependencies:["dashboardcss","emby-input"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/videoosd.html",dependencies:[],transition:"fade",controller:"scripts/videoosd",autoFocus:!1,type:"video-osd",supportsThemeMedia:!0,fullscreen:!0}),defineRoute({path:"/configurationpage",dependencies:["jQuery"],autoFocus:!1,enableCache:!1,enableContentQueryString:!0,roles:"admin"}),defineRoute({path:"/",isDefaultRoute:!0,autoFocus:!1,dependencies:[]})}function loadPlugins(externalPlugins,appHost,browser,shell){console.log("Loading installed plugins");var list=["bower_components/emby-webcomponents/playback/playbackvalidation"];Dashboard.isRunningInCordova()&&browser.android?(document.createElement("audio").canPlayType("audio/flac").replace(/no/,"")&&document.createElement("audio").canPlayType('audio/ogg; codecs="opus"').replace(/no/,"")||(window.VlcAudio=!0),list.push("cordova/vlcplayer")):Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/audioplayer"),list.push("bower_components/emby-webcomponents/htmlaudioplayer/plugin"),Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/chromecast"),Dashboard.isRunningInCordova()&&browser.android&&list.push("cordova/externalplayer"),list.push("bower_components/emby-webcomponents/htmlvideoplayer/plugin"),appHost.supports("remotecontrol")&&(list.push("bower_components/emby-webcomponents/sessionplayer"),browser.chrome&&list.push("bower_components/emby-webcomponents/chromecastplayer")),list.push("bower_components/emby-webcomponents/youtubeplayer/plugin");for(var i=0,length=externalPlugins.length;i",menuHtml+='',menuHtml+=item.name,menuHtml+="",menuHtml+=""},getToolsMenuHtml:function(page){var i,length,item,items=Dashboard.getToolsMenuLinks(page),menuHtml="";for(menuHtml+='
',i=0,length=items.length;i
"),item.href?menuHtml+=Dashboard.getToolsLinkHtml(item):(menuHtml+='
',menuHtml+=item.name,menuHtml+="
");return menuHtml+="
"},getToolsMenuLinks:function(){return[{name:Globalize.translate("TabServer")},{name:Globalize.translate("TabDashboard"),href:"dashboard.html",pageIds:["dashboardPage"],icon:"dashboard"},{name:Globalize.translate("TabSettings"),href:"dashboardgeneral.html",pageIds:["dashboardGeneralPage"],icon:"settings"},{name:Globalize.translate("TabDevices"),href:"devices.html",pageIds:["devicesPage","devicePage"],icon:"tablet"},{name:Globalize.translate("TabUsers"),href:"userprofiles.html",pageIds:["userProfilesPage","newUserPage","editUserPage","userLibraryAccessPage","userParentalControlPage","userPasswordPage"],icon:"people"},{name:"Emby Premiere",href:"supporterkey.html",pageIds:["supporterKeyPage"],icon:"star"},{divider:!0,name:Globalize.translate("TabLibrary"),href:"library.html",pageIds:["mediaLibraryPage","librarySettingsPage","libraryDisplayPage","metadataImagesConfigurationPage","metadataNfoPage"],icon:"folder",color:"#38c"},{name:Globalize.translate("TabSubtitles"),href:"metadatasubtitles.html",pageIds:["metadataSubtitlesPage"],icon:"closed_caption"},{name:Globalize.translate("TabPlayback"),icon:"play_circle_filled",color:"#E5342E",href:"cinemamodeconfiguration.html",pageIds:["cinemaModeConfigurationPage","playbackConfigurationPage","streamingSettingsPage"]},{name:Globalize.translate("TabSync"),icon:"sync",href:"syncactivity.html",pageIds:["syncActivityPage","syncJobPage","devicesUploadPage","syncSettingsPage"],color:"#009688"},{name:Globalize.translate("TabTranscoding"),icon:"transform",href:"encodingsettings.html",pageIds:["encodingSettingsPage"]},{divider:!0,name:Globalize.translate("TabExtras")},{name:Globalize.translate("TabAutoOrganize"),color:"#01C0DD",href:"autoorganizelog.html",pageIds:["libraryFileOrganizerPage","libraryFileOrganizerSmartMatchPage","libraryFileOrganizerLogPage"],icon:"folder"},{name:Globalize.translate("DLNA"),href:"dlnasettings.html",pageIds:["dlnaSettingsPage","dlnaProfilesPage","dlnaProfilePage"],icon:"settings"},{name:Globalize.translate("TabLiveTV"),href:"livetvstatus.html",pageIds:["liveTvStatusPage","liveTvSettingsPage","liveTvTunerProviderHdHomerunPage","liveTvTunerProviderM3UPage","liveTvTunerProviderSatPage"],icon:"dvr"},{name:Globalize.translate("TabNotifications"),icon:"notifications",color:"brown",href:"notificationsettings.html",pageIds:["notificationSettingsPage","notificationSettingPage"]},{name:Globalize.translate("TabPlugins"),icon:"add_shopping_cart",color:"#9D22B1",href:"plugins.html",pageIds:["pluginsPage","pluginCatalogPage"]},{divider:!0,name:Globalize.translate("TabExpert")},{name:Globalize.translate("TabAdvanced"),icon:"settings",href:"dashboardhosting.html",color:"#F16834",pageIds:["dashboardHostingPage","serverSecurityPage"]},{name:Globalize.translate("TabLogs"),href:"log.html",pageIds:["logPage"],icon:"folder_open"},{name:Globalize.translate("TabScheduledTasks"),href:"scheduledtasks.html",pageIds:["scheduledTasksPage","scheduledTaskPage"],icon:"schedule"},{name:Globalize.translate("MetadataManager"),href:"edititemmetadata.html",pageIds:[],icon:"mode_edit"},{name:Globalize.translate("ButtonReports"),href:"reports.html",pageIds:[],icon:"insert_chart"}]},getSupportedRemoteCommands:function(){return["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"]},capabilities:function(){var caps={PlayableMediaTypes:["Audio","Video"],SupportedCommands:Dashboard.getSupportedRemoteCommands(),SupportsPersistentIdentifier:Dashboard.isRunningInCordova(),SupportsMediaControl:!0,SupportedLiveMediaTypes:["Audio","Video"]};return Dashboard.isRunningInCordova()&&!browserInfo.safari&&(caps.SupportsSync=!0,caps.SupportsContentUploading=!0),caps},normalizeImageOptions:function(options){AppInfo.hasLowImageBandwidth&&(options.enableImageEnhancers=!1);var setQuality;if(options.maxWidth&&(setQuality=!0),options.width&&(setQuality=!0),options.maxHeight&&(setQuality=!0),options.height&&(setQuality=!0),setQuality){var quality=90,isBackdrop="backdrop"==(options.type||"").toLowerCase();isBackdrop&&(quality-=10),browserInfo.slow&&(quality-=40),AppInfo.hasLowImageBandwidth&&!isBackdrop&&(quality-=10),options.quality=quality}}},AppInfo={};!function(){"use strict";function setAppInfo(){var isCordova=Dashboard.isRunningInCordova();AppInfo.enableHomeTabs=!0,AppInfo.enableAutoSave=browserInfo.touch,AppInfo.enableAppStorePolicy=isCordova;var isIOS=browserInfo.ipad||browserInfo.iphone,isAndroid=browserInfo.android;isIOS&&(AppInfo.hasLowImageBandwidth=!0),isCordova?(AppInfo.isNativeApp=!0,AppInfo.enableHomeTabs=!1,isAndroid&&(AppInfo.supportsExternalPlayers=!0)):AppInfo.enableSupporterMembership=!0,AppInfo.supportsFileInput=!(AppInfo.isNativeApp&&isAndroid),isCordova&&isIOS?AppInfo.moreIcon="more-horiz":AppInfo.moreIcon="more-vert",AppInfo.supportsUserDisplayLanguageSetting=Dashboard.isConnectMode()}function initializeApiClient(apiClient){AppInfo.enableAppStorePolicy&&(apiClient.getAvailablePlugins=function(){return Promise.resolve([])},apiClient.getInstalledPlugins=function(){return Promise.resolve([])}),apiClient.normalizeImageOptions=Dashboard.normalizeImageOptions,Events.off(apiClient,"requestfail",Dashboard.onRequestFail),Events.on(apiClient,"requestfail",Dashboard.onRequestFail)}function onApiClientCreated(e,newApiClient){initializeApiClient(newApiClient),window.$&&($.ajax=newApiClient.ajax)}function defineConnectionManager(connectionManager){window.ConnectionManager=connectionManager,define("connectionManager",[],function(){return connectionManager})}function bindConnectionManagerEvents(connectionManager,events,userSettings){window.Events=events,events.on(ConnectionManager,"apiclientcreated",onApiClientCreated),connectionManager.currentApiClient=function(){if(!localApiClient){var server=connectionManager.getLastUsedServer();server&&(localApiClient=connectionManager.getApiClient(server.Id))}return localApiClient},connectionManager.onLocalUserSignedIn=function(user){return localApiClient=connectionManager.getApiClient(user.ServerId),window.ApiClient=localApiClient,userSettings.setUserInfo(user.Id,localApiClient)},events.on(connectionManager,"localusersignedout",function(){userSettings.setUserInfo(null,null)})}function createConnectionManager(){return new Promise(function(resolve,reject){require(["connectionManagerFactory","apphost","credentialprovider","events","userSettings"],function(connectionManagerExports,apphost,credentialProvider,events,userSettings){window.MediaBrowser=Object.assign(window.MediaBrowser||{},connectionManagerExports);var credentialProviderInstance=new credentialProvider,promises=[apphost.getSyncProfile(),apphost.appInfo()];Promise.all(promises).then(function(responses){var deviceProfile=responses[0],appInfo=responses[1],capabilities=Dashboard.capabilities();capabilities.DeviceProfile=deviceProfile;var connectionManager=new MediaBrowser.ConnectionManager(credentialProviderInstance,appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,capabilities,window.devicePixelRatio);return defineConnectionManager(connectionManager),bindConnectionManagerEvents(connectionManager,events,userSettings),Dashboard.isConnectMode()?void resolve():(console.log("loading ApiClient singleton"),getRequirePromise(["apiclient"]).then(function(apiClientFactory){console.log("creating ApiClient singleton");var apiClient=new apiClientFactory(Dashboard.serverAddress(),appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,window.devicePixelRatio);apiClient.enableAutomaticNetworking=!1,connectionManager.addApiClient(apiClient),require(["css!"+apiClient.getUrl("Branding/Css")]),window.ApiClient=apiClient,localApiClient=apiClient,console.log("loaded ApiClient singleton"),resolve()}))})})})}function setDocumentClasses(browser){var elem=document.documentElement;AppInfo.enableSupporterMembership||elem.classList.add("supporterMembershipDisabled")}function loadTheme(){var name=getParameterByName("theme");if(name)return void require(["themes/"+name+"/theme"]);if(!AppInfo.isNativeApp){var date=new Date,month=date.getMonth(),day=date.getDate();return 9==month&&day>=30?void require(["themes/halloween/theme"]):void 0}}function returnFirstDependency(obj){return obj}function getBowerPath(){return"bower_components"}function getLayoutManager(layoutManager){return layoutManager.init(),layoutManager}function getAppStorage(basePath){try{return localStorage.setItem("_test","0"),localStorage.removeItem("_test"),basePath+"/appstorage-localstorage"}catch(e){return basePath+"/appstorage-memory"}}function createWindowHeadroom(){var headroom=new Headroom([],{tolerance:{down:0,up:0},classes:{}});return headroom.init(),headroom}function createMainContentHammer(Hammer){var hammer=new Hammer(document.querySelector(".mainDrawerPanelContent"),null);return hammer}function createSharedAppFooter(appFooter){var footer=new appFooter({});return footer}function initRequire(){var urlArgs="v="+(window.dashboardVersion||(new Date).getDate()),bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents",paths={velocity:bowerPath+"/velocity/velocity.min",vibrant:bowerPath+"/vibrant/dist/vibrant",ironCardList:"components/ironcardlist/ironcardlist",scrollThreshold:"components/scrollthreshold",playlisteditor:"components/playlisteditor/playlisteditor",medialibrarycreator:"components/medialibrarycreator/medialibrarycreator",medialibraryeditor:"components/medialibraryeditor/medialibraryeditor",howler:bowerPath+"/howlerjs/howler.min",sortable:bowerPath+"/Sortable/Sortable.min",isMobile:bowerPath+"/isMobile/isMobile.min",headroom:bowerPath+"/headroomjs/dist/headroom",masonry:bowerPath+"/masonry/dist/masonry.pkgd.min",humanedate:"components/humanedate",libraryBrowser:"scripts/librarybrowser",chromecasthelpers:"components/chromecasthelpers",events:apiClientBowerPath+"/events",credentialprovider:apiClientBowerPath+"/credentials",apiclient:apiClientBowerPath+"/apiclient",connectionManagerFactory:bowerPath+"/emby-apiclient/connectionmanager",visibleinviewport:embyWebComponentsBowerPath+"/visibleinviewport",browserdeviceprofile:embyWebComponentsBowerPath+"/browserdeviceprofile",browser:embyWebComponentsBowerPath+"/browser",inputManager:embyWebComponentsBowerPath+"/inputmanager",qualityoptions:embyWebComponentsBowerPath+"/qualityoptions",hammer:bowerPath+"/hammerjs/hammer.min",pageJs:embyWebComponentsBowerPath+"/pagejs/page",focusManager:embyWebComponentsBowerPath+"/focusmanager",datetime:embyWebComponentsBowerPath+"/datetime",globalize:embyWebComponentsBowerPath+"/globalize",itemHelper:embyWebComponentsBowerPath+"/itemhelper",itemShortcuts:embyWebComponentsBowerPath+"/shortcuts",serverNotifications:embyWebComponentsBowerPath+"/servernotifications",playbackManager:embyWebComponentsBowerPath+"/playback/playbackmanager",autoPlayDetect:embyWebComponentsBowerPath+"/playback/autoplaydetect",nowPlayingHelper:embyWebComponentsBowerPath+"/playback/nowplayinghelper",pluginManager:embyWebComponentsBowerPath+"/pluginmanager",packageManager:embyWebComponentsBowerPath+"/packagemanager",webAnimations:bowerPath+"/web-animations-js/web-animations-next-lite.min"};paths.hlsjs=bowerPath+"/hlsjs/dist/hls.min",define("webActionSheet",[embyWebComponentsBowerPath+"/actionsheet/actionsheet"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.sharingMenu="cordova/sharingwidget":define("sharingMenu",[embyWebComponentsBowerPath+"/sharing/sharingmenu"],returnFirstDependency),paths.wakeonlan=apiClientBowerPath+"/wakeonlan",define("libjass",[bowerPath+"/libjass/libjass.min","css!"+bowerPath+"/libjass/libjass"],returnFirstDependency),window.IntersectionObserver?define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-intersectionobserver"],returnFirstDependency):define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-scroll"],returnFirstDependency),define("imageLoader",[embyWebComponentsBowerPath+"/images/imagehelper"],returnFirstDependency),define("appfooter",["components/appfooter/appfooter"],returnFirstDependency),define("dockedtabs",["components/dockedtabs/dockedtabs"],returnFirstDependency),define("directorybrowser",["components/directorybrowser/directorybrowser"],returnFirstDependency),define("metadataEditor",[embyWebComponentsBowerPath+"/metadataeditor/metadataeditor"],returnFirstDependency),define("personEditor",[embyWebComponentsBowerPath+"/metadataeditor/personeditor"],returnFirstDependency),define("playerSelectionMenu",[embyWebComponentsBowerPath+"/playback/playerselection"],returnFirstDependency),define("playerSettingsMenu",[embyWebComponentsBowerPath+"/playback/playersettingsmenu"],returnFirstDependency),define("libraryMenu",["scripts/librarymenu"],returnFirstDependency),define("emby-collapse",[embyWebComponentsBowerPath+"/emby-collapse/emby-collapse"],returnFirstDependency),define("emby-button",[embyWebComponentsBowerPath+"/emby-button/emby-button"],returnFirstDependency),define("emby-itemscontainer",[embyWebComponentsBowerPath+"/emby-itemscontainer/emby-itemscontainer"],returnFirstDependency),define("emby-tabs",[embyWebComponentsBowerPath+"/emby-tabs/emby-tabs"],returnFirstDependency),define("itemHoverMenu",[embyWebComponentsBowerPath+"/itemhovermenu/itemhovermenu"],returnFirstDependency),define("multiSelect",[embyWebComponentsBowerPath+"/multiselect/multiselect"],returnFirstDependency),define("alphaPicker",[embyWebComponentsBowerPath+"/alphapicker/alphapicker"],returnFirstDependency),define("paper-icon-button-light",[embyWebComponentsBowerPath+"/emby-button/paper-icon-button-light"]),define("connectHelper",[embyWebComponentsBowerPath+"/emby-connect/connecthelper"],returnFirstDependency),define("emby-input",[embyWebComponentsBowerPath+"/emby-input/emby-input"],returnFirstDependency),define("emby-select",[embyWebComponentsBowerPath+"/emby-select/emby-select"],returnFirstDependency),define("emby-slider",[embyWebComponentsBowerPath+"/emby-slider/emby-slider"],returnFirstDependency),define("emby-checkbox",[embyWebComponentsBowerPath+"/emby-checkbox/emby-checkbox"],returnFirstDependency),define("emby-toggle",[embyWebComponentsBowerPath+"/emby-toggle/emby-toggle"],returnFirstDependency),define("emby-radio",[embyWebComponentsBowerPath+"/emby-radio/emby-radio"],returnFirstDependency),define("emby-textarea",[embyWebComponentsBowerPath+"/emby-textarea/emby-textarea"],returnFirstDependency),define("collectionEditor",[embyWebComponentsBowerPath+"/collectioneditor/collectioneditor"],returnFirstDependency),define("playlistEditor",[embyWebComponentsBowerPath+"/playlisteditor/playlisteditor"],returnFirstDependency),define("recordingCreator",[embyWebComponentsBowerPath+"/recordingcreator/recordingcreator"],returnFirstDependency),define("recordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/recordingeditor"],returnFirstDependency),define("seriesRecordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/seriesrecordingeditor"],returnFirstDependency),define("recordingFields",[embyWebComponentsBowerPath+"/recordingcreator/recordingfields"],returnFirstDependency),define("recordingHelper",[embyWebComponentsBowerPath+"/recordingcreator/recordinghelper"],returnFirstDependency),define("subtitleEditor",[embyWebComponentsBowerPath+"/subtitleeditor/subtitleeditor"],returnFirstDependency),define("itemIdentifier",[embyWebComponentsBowerPath+"/itemidentifier/itemidentifier"],returnFirstDependency),define("mediaInfo",[embyWebComponentsBowerPath+"/mediainfo/mediainfo"],returnFirstDependency),define("itemContextMenu",[embyWebComponentsBowerPath+"/itemcontextmenu"],returnFirstDependency),define("imageEditor",[embyWebComponentsBowerPath+"/imageeditor/imageeditor"],returnFirstDependency),define("dom",[embyWebComponentsBowerPath+"/dom"],returnFirstDependency),define("fullscreen-doubleclick",[embyWebComponentsBowerPath+"/fullscreen/fullscreen-doubleclick"],returnFirstDependency),define("fullscreenManager",[embyWebComponentsBowerPath+"/fullscreen/fullscreenmanager","events"],returnFirstDependency),define("layoutManager",[embyWebComponentsBowerPath+"/layoutmanager"],getLayoutManager),define("playMenu",[embyWebComponentsBowerPath+"/playmenu"],returnFirstDependency),define("refreshDialog",[embyWebComponentsBowerPath+"/refreshdialog/refreshdialog"],returnFirstDependency),define("backdrop",[embyWebComponentsBowerPath+"/backdrop/backdrop"],returnFirstDependency),define("fetchHelper",[embyWebComponentsBowerPath+"/fetchhelper"],returnFirstDependency),define("roundCardStyle",["cardStyle","css!"+embyWebComponentsBowerPath+"/cardbuilder/roundcard"],returnFirstDependency),define("cardStyle",["css!"+embyWebComponentsBowerPath+"/cardbuilder/card"],returnFirstDependency),define("cardBuilder",[embyWebComponentsBowerPath+"/cardbuilder/cardbuilder"],returnFirstDependency),define("peoplecardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/peoplecardbuilder"],returnFirstDependency),define("chaptercardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/chaptercardbuilder"],returnFirstDependency),define("mouseManager",[embyWebComponentsBowerPath+"/input/mouse"],returnFirstDependency),define("deleteHelper",[embyWebComponentsBowerPath+"/deletehelper"],returnFirstDependency),define("tvguide",[embyWebComponentsBowerPath+"/guide/guide"],returnFirstDependency),define("programStyles",["css!"+embyWebComponentsBowerPath+"/guide/programs"],returnFirstDependency),define("guide-settings-dialog",[embyWebComponentsBowerPath+"/guide/guide-settings"],returnFirstDependency),define("syncDialog",[embyWebComponentsBowerPath+"/sync/sync"],returnFirstDependency),define("syncToggle",[embyWebComponentsBowerPath+"/sync/synctoggle"],returnFirstDependency),define("syncJobEditor",[embyWebComponentsBowerPath+"/sync/syncjobeditor"],returnFirstDependency),define("syncJobList",[embyWebComponentsBowerPath+"/sync/syncjoblist"],returnFirstDependency),define("voiceDialog",[embyWebComponentsBowerPath+"/voice/voicedialog"],returnFirstDependency),define("voiceReceiver",[embyWebComponentsBowerPath+"/voice/voicereceiver"],returnFirstDependency),define("voiceProcessor",[embyWebComponentsBowerPath+"/voice/voiceprocessor"],returnFirstDependency),define("viewManager",[embyWebComponentsBowerPath+"/viewmanager/viewmanager"],function(viewManager){return window.ViewManager=viewManager,viewManager.dispatchPageEvents(!0),viewManager}),Dashboard.isRunningInCordova()&&window.MainActivity?define("shell",["cordova/shell"],returnFirstDependency):define("shell",[embyWebComponentsBowerPath+"/shell"],returnFirstDependency),define("sharingmanager",[embyWebComponentsBowerPath+"/sharing/sharingmanager"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.apphost="cordova/apphost":paths.apphost="components/apphost",Dashboard.isRunningInCordova()&&window.MainActivity?(paths.appStorage="cordova/appstorage",paths.filesystem="cordova/filesystem"):(paths.appStorage=getAppStorage(apiClientBowerPath),paths.filesystem=embyWebComponentsBowerPath+"/filesystem");var sha1Path=bowerPath+"/cryptojslib/components/sha1-min",md5Path=bowerPath+"/cryptojslib/components/md5-min",shim={};shim[sha1Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},shim[md5Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},requirejs.config({waitSeconds:0,map:{"*":{css:bowerPath+"/emby-webcomponents/require/requirecss",html:bowerPath+"/emby-webcomponents/require/requirehtml",text:bowerPath+"/emby-webcomponents/require/requiretext"}},urlArgs:urlArgs,paths:paths,shim:shim}),define("cryptojs-sha1",[sha1Path]),define("cryptojs-md5",[md5Path]),define("jstree",[bowerPath+"/jstree/dist/jstree","css!thirdparty/jstree/themes/default/style.min.css"]),define("dashboardcss",["css!css/dashboard"]),define("jqmtable",["thirdparty/jquerymobile-1.4.5/jqm.table","css!thirdparty/jquerymobile-1.4.5/jqm.table.css"]),define("jqmwidget",["thirdparty/jquerymobile-1.4.5/jqm.widget"]),define("jqmslider",["thirdparty/jquerymobile-1.4.5/jqm.slider","css!thirdparty/jquerymobile-1.4.5/jqm.slider.css"]),define("jqmpopup",["thirdparty/jquerymobile-1.4.5/jqm.popup","css!thirdparty/jquerymobile-1.4.5/jqm.popup.css"]),define("jqmlistview",["css!thirdparty/jquerymobile-1.4.5/jqm.listview.css"]),define("jqmpanel",["thirdparty/jquerymobile-1.4.5/jqm.panel","css!thirdparty/jquerymobile-1.4.5/jqm.panel.css"]),define("slideshow",[embyWebComponentsBowerPath+"/slideshow/slideshow"],returnFirstDependency),define("fetch",[bowerPath+"/fetch/fetch"]),define("raf",[embyWebComponentsBowerPath+"/polyfills/raf"]),define("functionbind",[embyWebComponentsBowerPath+"/polyfills/bind"]),define("arraypolyfills",[embyWebComponentsBowerPath+"/polyfills/array"]),define("objectassign",[embyWebComponentsBowerPath+"/polyfills/objectassign"]),define("clearButtonStyle",["css!"+embyWebComponentsBowerPath+"/clearbutton"]),define("userdataButtons",[embyWebComponentsBowerPath+"/userdatabuttons/userdatabuttons"],returnFirstDependency),define("listView",[embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("listViewStyle",["css!"+embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("formDialogStyle",["css!"+embyWebComponentsBowerPath+"/formdialog"],returnFirstDependency),define("indicators",[embyWebComponentsBowerPath+"/indicators/indicators"],returnFirstDependency),define("registrationServices",[embyWebComponentsBowerPath+"/registrationservices/registrationservices"],returnFirstDependency),Dashboard.isRunningInCordova()?(define("iapManager",["cordova/iap"],returnFirstDependency),define("fileupload",["cordova/fileupload"],returnFirstDependency)):(define("iapManager",["components/iap"],returnFirstDependency),define("fileupload",[apiClientBowerPath+"/fileupload"],returnFirstDependency)),define("connectionmanager",[apiClientBowerPath+"/connectionmanager"]),define("cameraRoll",[apiClientBowerPath+"/cameraroll"],returnFirstDependency),define("contentuploader",[apiClientBowerPath+"/sync/contentuploader"]),define("serversync",[apiClientBowerPath+"/sync/serversync"]),define("multiserversync",[apiClientBowerPath+"/sync/multiserversync"]),define("offlineusersync",[apiClientBowerPath+"/sync/offlineusersync"]),define("mediasync",[apiClientBowerPath+"/sync/mediasync"]),define("swiper",[bowerPath+"/Swiper/dist/js/swiper.min","css!"+bowerPath+"/Swiper/dist/css/swiper.min"],returnFirstDependency),define("scroller",[embyWebComponentsBowerPath+"/scroller/smoothscroller"],returnFirstDependency),define("toast",[embyWebComponentsBowerPath+"/toast/toast"],returnFirstDependency),define("scrollHelper",[embyWebComponentsBowerPath+"/scrollhelper"],returnFirstDependency),define("appSettings",[embyWebComponentsBowerPath+"/appsettings"],updateAppSettings),define("userSettings",[embyWebComponentsBowerPath+"/usersettings/usersettings"],returnFirstDependency),define("userSettingsBuilder",[embyWebComponentsBowerPath+"/usersettings/usersettingsbuilder"],returnFirstDependency),define("material-icons",["css!"+embyWebComponentsBowerPath+"/fonts/material-icons/style"]),define("robotoFont",["css!"+embyWebComponentsBowerPath+"/fonts/roboto/style"]),define("scrollStyles",["css!"+embyWebComponentsBowerPath+"/scrollstyles"]),define("navdrawer",["components/navdrawer/navdrawer"],returnFirstDependency),define("viewcontainer",["components/viewcontainer-lite","css!"+embyWebComponentsBowerPath+"/viewmanager/viewcontainer-lite"],returnFirstDependency),define("queryString",[bowerPath+"/query-string/index"],function(){return queryString}),define("jQuery",[bowerPath+"/jquery/dist/jquery.slim.min"],function(){return window.ApiClient&&(jQuery.ajax=ApiClient.ajax),jQuery}),define("fnchecked",["legacy/fnchecked"]),define("dialogHelper",[embyWebComponentsBowerPath+"/dialoghelper/dialoghelper"],function(dialoghelper){return dialoghelper.setOnOpen(onDialogOpen),dialoghelper}),define("inputmanager",["inputManager"],returnFirstDependency),define("historyManager",["embyRouter"],returnFirstDependency),define("headroom-window",["headroom"],createWindowHeadroom),define("hammer-main",["hammer"],createMainContentHammer),define("appfooter-shared",["appfooter"],createSharedAppFooter),define("skinManager",[],function(){return{loadUserSkin:function(){Emby.Page.show("/home.html")}}}),define("connectionManager",[],function(){return ConnectionManager}),define("apiClientResolver",[],function(){return function(){return window.ApiClient}}),define("embyRouter",[embyWebComponentsBowerPath+"/router"],function(embyRouter){function showItem(item,serverId,options){if("string"==typeof item)require(["connectionManager"],function(connectionManager){var apiClient=connectionManager.currentApiClient();apiClient.getItem(apiClient.getCurrentUserId(),item).then(function(item){embyRouter.showItem(item,options)})});else{2==arguments.length&&(options=arguments[1]);var context=options?options.context:null;Emby.Page.show("/"+LibraryBrowser.getHref(item,context),{item:item})}}return embyRouter.showLocalLogin=function(apiClient,serverId,manualLogin){Dashboard.navigate("login.html?serverid="+serverId)},embyRouter.showVideoOsd=function(){return Dashboard.navigate("videoosd.html")},embyRouter.showSelectServer=function(){Dashboard.navigate("selectserver.html")},embyRouter.showWelcome=function(){Dashboard.isConnectMode()?Dashboard.navigate("connectlogin.html?mode=welcome"):Dashboard.navigate("login.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.showGuide=function(){Dashboard.navigate("livetv.html?tab=1"); +},embyRouter.goHome=function(){Dashboard.navigate("home.html")},embyRouter.showSearch=function(){Dashboard.navigate("search.html")},embyRouter.showLiveTV=function(){Dashboard.navigate("livetv.html")},embyRouter.showRecordedTV=function(){Dashboard.navigate("livetv.html?tab=3")},embyRouter.showFavorites=function(){Dashboard.navigate("favorites.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.setTitle=function(){},embyRouter.showItem=showItem,embyRouter})}function updateAppSettings(appSettings){return appSettings.enableExternalPlayers=function(val){return null!=val&&appSettings.set("externalplayers",val.toString()),"true"===appSettings.get("externalplayers")},appSettings}function onDialogOpen(dlg){dlg.classList.contains("background-theme-a")||dlg.classList.contains("actionSheet")||(dlg.classList.add("background-theme-b"),dlg.classList.add("ui-body-b"))}function initRequireWithBrowser(browser){var bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents";Dashboard.isRunningInCordova()&&browser.safari?define("actionsheet",["cordova/actionsheet"],returnFirstDependency):define("actionsheet",["webActionSheet"],returnFirstDependency),"registerElement"in document?define("registerElement",[]):browser.msie?define("registerElement",[bowerPath+"/webcomponentsjs/webcomponents-lite.min.js"]):define("registerElement",[bowerPath+"/document-register-element/build/document-register-element"]),window.chrome&&window.chrome.sockets?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.android?define("serverdiscovery",["cordova/serverdiscovery"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.safari?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.safari?define("imageFetcher",["cordova/imagestore"],returnFirstDependency):define("imageFetcher",[embyWebComponentsBowerPath+"/images/basicimagefetcher"],returnFirstDependency);var preferNativeAlerts=browser.tv;preferNativeAlerts&&window.alert?define("alert",[embyWebComponentsBowerPath+"/alert/nativealert"],returnFirstDependency):define("alert",[embyWebComponentsBowerPath+"/alert/alert"],returnFirstDependency),define("dialog",[embyWebComponentsBowerPath+"/dialog/dialog"],returnFirstDependency),preferNativeAlerts&&window.confirm?define("confirm",[embyWebComponentsBowerPath+"/confirm/nativeconfirm"],returnFirstDependency):define("confirm",[embyWebComponentsBowerPath+"/confirm/confirm"],returnFirstDependency);var preferNativePrompt=preferNativeAlerts||browser.xboxOne;preferNativePrompt&&window.confirm?define("prompt",[embyWebComponentsBowerPath+"/prompt/nativeprompt"],returnFirstDependency):define("prompt",[embyWebComponentsBowerPath+"/prompt/prompt"],returnFirstDependency),browser.tizen||browser.operaTv?define("loading",[embyWebComponentsBowerPath+"/loading/loading-legacy"],returnFirstDependency):define("loading",[embyWebComponentsBowerPath+"/loading/loading-lite"],returnFirstDependency),define("multi-download",[embyWebComponentsBowerPath+"/multidownload"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("fileDownloader",["cordova/filedownloader"],returnFirstDependency),define("localassetmanager",["cordova/localassetmanager"],returnFirstDependency)):(define("fileDownloader",[embyWebComponentsBowerPath+"/filedownloader"],returnFirstDependency),define("localassetmanager",[apiClientBowerPath+"/localassetmanager"],returnFirstDependency)),define("screenLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",["cordova/wakelock"],returnFirstDependency),define("networkLock",["cordova/networklock"],returnFirstDependency)):(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),define("networkLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency))}function init(){Dashboard.isRunningInCordova()&&browserInfo.android&&define("nativedirectorychooser",["cordova/nativedirectorychooser"]),Dashboard.isRunningInCordova()&&browserInfo.android?define("localsync",["cordova/localsync"],returnFirstDependency):define("localsync",["scripts/localsync"],returnFirstDependency),define("livetvcss",["css!css/livetv.css"]),define("detailtablecss",["css!css/detailtable.css"]),define("autoorganizetablecss",["css!css/autoorganizetable.css"]),define("buttonenabled",["legacy/buttonenabled"]),initAfterDependencies()}function getRequirePromise(deps){return new Promise(function(resolve,reject){require(deps,resolve)})}function initAfterDependencies(){var list=[];window.fetch||list.push("fetch"),"function"!=typeof Object.assign&&list.push("objectassign"),Array.prototype.filter||list.push("arraypolyfills"),Function.prototype.bind||list.push("functionbind"),window.requestAnimationFrame||list.push("raf"),require(list,function(){createConnectionManager().then(function(){console.log("initAfterDependencies promises resolved"),require(["globalize"],function(globalize){window.Globalize=globalize,Promise.all([loadCoreDictionary(globalize),loadSharedComponentsDictionary(globalize)]).then(onGlobalizeInit)})})})}function loadSharedComponentsDictionary(globalize){var baseUrl="bower_components/emby-webcomponents/strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sk","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});globalize.loadStrings({name:"sharedcomponents",translations:translations})}function loadCoreDictionary(globalize){var baseUrl="strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});return globalize.defaultModule("core"),globalize.loadStrings({name:"core",translations:translations})}function onGlobalizeInit(){document.title=Globalize.translateDocument(document.title,"core"),require(["apphost"],function(appHost){loadPlugins([],appHost,browserInfo).then(onAppReady)})}function defineRoute(newRoute,dictionary){var baseRoute=Emby.Page.baseUrl(),path=newRoute.path;path=path.replace(baseRoute,""),console.log("Defining route: "+path),newRoute.dictionary=newRoute.dictionary||dictionary||"core",Emby.Page.addRoute(path,newRoute)}function defineCoreRoutes(){console.log("Defining core routes"),defineRoute({path:"/addplugin.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"scripts/addpluginpage"}),defineRoute({path:"/appservices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizelog.html",dependencies:["scripts/taskbutton","autoorganizetablecss"],controller:"dashboard/autoorganizelog",roles:"admin"}),defineRoute({path:"/autoorganizesmart.html",dependencies:["emby-button"],controller:"dashboard/autoorganizesmart",autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizetv.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-select","emby-collapse"],controller:"dashboard/autoorganizetv",autoFocus:!1,roles:"admin"}),defineRoute({path:"/channelitems.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/channels.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/channels"}),defineRoute({path:"/channelsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/cinemamodeconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/connectlogin.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/connectlogin"}),defineRoute({path:"/dashboard.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardgeneral.html",controller:"dashboard/dashboardgeneral",autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardhosting.html",dependencies:["emby-input","emby-button"],autoFocus:!1,roles:"admin",controller:"dashboard/dashboardhosting"}),defineRoute({path:"/device.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devicesupload.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofile.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaserversettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnasettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/edititemmetadata.html",dependencies:[],controller:"scripts/edititemmetadata",autoFocus:!1}),defineRoute({path:"/encodingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/favorites.html",dependencies:[],autoFocus:!1,controller:"scripts/favorites"}),defineRoute({path:"/forgotpassword.html",dependencies:["emby-input","emby-button"],anonymous:!0,startup:!0,controller:"scripts/forgotpassword"}),defineRoute({path:"/forgotpasswordpin.html",dependencies:["emby-input","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/forgotpasswordpin"}),defineRoute({path:"/gamegenres.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/games.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesrecommended.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamestudios.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesystems.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/home.html",dependencies:[],autoFocus:!1,controller:"scripts/indexpage",transition:"fade",type:"home"}),defineRoute({path:"/index.html",dependencies:[],autoFocus:!1,isDefaultRoute:!0}),defineRoute({path:"/itemdetails.html",dependencies:["emby-button","scripts/livetvcomponents","paper-icon-button-light","emby-itemscontainer"],controller:"scripts/itemdetailpage",autoFocus:!1,transition:"fade"}),defineRoute({path:"/itemlist.html",dependencies:[],autoFocus:!1,controller:"scripts/itemlistpage",transition:"fade"}),defineRoute({path:"/kids.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/library.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/librarydisplay.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"dashboard/librarydisplay"}),defineRoute({path:"/librarysettings.html",dependencies:["emby-collapse","emby-input","emby-button","emby-select"],autoFocus:!1,roles:"admin",controller:"dashboard/librarysettings"}),defineRoute({path:"/livetv.html",dependencies:["emby-button","livetvcss"],controller:"scripts/livetvsuggested",autoFocus:!1,transition:"fade"}),defineRoute({path:"/livetvguideprovider.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvitems.html",dependencies:[],autoFocus:!1,controller:"scripts/livetvitems"}),defineRoute({path:"/livetvseriestimer.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-collapse","scripts/livetvcomponents","scripts/livetvseriestimer","livetvcss"],autoFocus:!1,controller:"scripts/livetvseriestimer"}),defineRoute({path:"/livetvsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/livetvstatus.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-hdhomerun.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-m3u.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-satip.html",dependencies:["emby-input"],autoFocus:!1,roles:"admin",controller:"dashboard/livetvtunerprovider-satip"}),defineRoute({path:"/log.html",dependencies:["emby-checkbox"],roles:"admin",controller:"dashboard/logpage"}),defineRoute({path:"/login.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/loginpage"}),defineRoute({path:"/metadataadvanced.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadataimages.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatanfo.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatasubtitles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/movies.html",dependencies:["emby-button"],autoFocus:!1,controller:"scripts/moviesrecommended",transition:"fade"}),defineRoute({path:"/music.html",dependencies:[],controller:"scripts/musicrecommended",autoFocus:!1,transition:"fade"}),defineRoute({path:"/mypreferencesdisplay.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencesdisplay"}),defineRoute({path:"/mypreferenceshome.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceshome"}),defineRoute({path:"/mypreferenceslanguages.html",dependencies:["emby-button","emby-checkbox","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceslanguages"}),defineRoute({path:"/mypreferencesmenu.html",dependencies:["emby-button"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencescommon"}),defineRoute({path:"/myprofile.html",dependencies:["emby-button","emby-collapse","emby-checkbox","emby-input"],autoFocus:!1,transition:"fade",controller:"scripts/myprofile"}),defineRoute({path:"/mysync.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/mysync"}),defineRoute({path:"/camerauploadsettings.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/camerauploadsettings"}),defineRoute({path:"/mysyncjob.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/syncjob"}),defineRoute({path:"/mysyncsettings.html",dependencies:["emby-checkbox","emby-input","emby-button","paper-icon-button-light"],autoFocus:!1,transition:"fade",controller:"scripts/mysyncsettings"}),defineRoute({path:"/notificationlist.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/notificationsetting.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/notificationsettings.html",controller:"scripts/notificationsettings",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/nowplaying.html",dependencies:["paper-icon-button-light","emby-slider","emby-button","emby-input","emby-itemscontainer"],controller:"scripts/nowplayingpage",autoFocus:!1,transition:"fade",fullscreen:!0,supportsThemeMedia:!0}),defineRoute({path:"/photos.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/playbackconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/playlists.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/playlists"}),defineRoute({path:"/plugincatalog.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/plugins.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/reports.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/scheduledtask.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/scheduledtasks.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/search.html",dependencies:[],controller:"scripts/searchpage"}),defineRoute({path:"/secondaryitems.html",dependencies:[],autoFocus:!1,controller:"scripts/secondaryitems"}),defineRoute({path:"/selectserver.html",dependencies:["listViewStyle","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/selectserver"}),defineRoute({path:"/serversecurity.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/shared.html",dependencies:[],autoFocus:!1,anonymous:!0}),defineRoute({path:"/streamingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/support.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/supporterkey.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/syncactivity.html",dependencies:[],autoFocus:!1,controller:"scripts/syncactivity"}),defineRoute({path:"/syncsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/tv.html",dependencies:["paper-icon-button-light","emby-button"],autoFocus:!1,controller:"scripts/tvrecommended",transition:"fade"}),defineRoute({path:"/useredit.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userlibraryaccess.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/usernew.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userparentalcontrol.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userpassword.html",dependencies:["emby-input","emby-button","emby-checkbox"],autoFocus:!1,controller:"scripts/userpasswordpage"}),defineRoute({path:"/userprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/wizardagreement.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardcomponents.html",dependencies:["dashboardcss","emby-button","emby-input","emby-select"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardcomponents"}),defineRoute({path:"/wizardfinish.html",dependencies:["emby-button","dashboardcss"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardfinishpage"}),defineRoute({path:"/wizardlibrary.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvguide.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvtuner.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardsettings.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardstart.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizarduser.html",dependencies:["dashboardcss","emby-input"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/videoosd.html",dependencies:[],transition:"fade",controller:"scripts/videoosd",autoFocus:!1,type:"video-osd",supportsThemeMedia:!0,fullscreen:!0}),defineRoute({path:"/configurationpage",dependencies:["jQuery"],autoFocus:!1,enableCache:!1,enableContentQueryString:!0,roles:"admin"}),defineRoute({path:"/",isDefaultRoute:!0,autoFocus:!1,dependencies:[]})}function loadPlugins(externalPlugins,appHost,browser,shell){console.log("Loading installed plugins");var list=["bower_components/emby-webcomponents/playback/playbackvalidation"];Dashboard.isRunningInCordova()&&browser.android?(document.createElement("audio").canPlayType("audio/flac").replace(/no/,"")&&document.createElement("audio").canPlayType('audio/ogg; codecs="opus"').replace(/no/,"")||(window.VlcAudio=!0),list.push("cordova/vlcplayer")):Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/audioplayer"),list.push("bower_components/emby-webcomponents/htmlaudioplayer/plugin"),Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/chromecast"),Dashboard.isRunningInCordova()&&browser.android&&list.push("cordova/externalplayer"),list.push("bower_components/emby-webcomponents/htmlvideoplayer/plugin"),appHost.supports("remotecontrol")&&(list.push("bower_components/emby-webcomponents/sessionplayer"),browser.chrome&&list.push("bower_components/emby-webcomponents/chromecastplayer")),list.push("bower_components/emby-webcomponents/youtubeplayer/plugin");for(var i=0,length=externalPlugins.length;i Date: Mon, 30 Jan 2017 16:38:24 -0500 Subject: [PATCH 11/19] fix autoplay detection --- .../emby-webcomponents/actionsheet/actionsheet.js | 2 +- .../emby-webcomponents/browserdeviceprofile.js | 2 +- .../emby-webcomponents/inputmanager.js | 2 +- .../emby-webcomponents/playback/autoplaydetect.js | 2 +- .../emby-webcomponents/playback/playbackmanager.js | 2 +- .../emby-webcomponents/scroller/smoothscroller.js | 2 +- .../emby-webcomponents/strings/en-us.json | 3 ++- dashboard-ui/bower_components/hlsjs/dist/hls.min.js | 10 +++++----- dashboard-ui/components/apphost.js | 2 +- dashboard-ui/components/remotecontrol.js | 2 +- dashboard-ui/css/librarymenu.css | 2 +- dashboard-ui/index.html | 6 ++---- dashboard-ui/scripts/itemdetailpage.js | 4 ++-- dashboard-ui/scripts/nowplayingbar.js | 2 +- dashboard-ui/scripts/site.js | 2 +- dashboard-ui/scripts/videoosd.js | 2 +- dashboard-ui/thirdparty/paper-button-style.css | 2 +- dashboard-ui/videoosd.html | 2 +- 18 files changed, 25 insertions(+), 26 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js index e532933b07..92580cde56 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js +++ b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js @@ -1 +1 @@ -define(["dialogHelper","layoutManager","globalize","browser","dom","emby-button","css!./actionsheet","material-icons","scrollStyles"],function(dialogHelper,layoutManager,globalize,browser,dom){"use strict";function getOffsets(elems){var doc=document,results=[];if(!doc)return results;for(var box,elem,i=0,length=elems.length;i0&&(pos.left-=overflowX+20),overflowY>0&&(pos.top-=overflowY+20),pos.top+=options.offsetTop||0,pos.left+=options.offsetLeft||0,pos.top=Math.max(pos.top,10),pos.left=Math.max(pos.left,10),pos}function centerFocus(elem,horiz,on){require(["scrollHelper"],function(scrollHelper){var fn=on?"on":"off";scrollHelper.centerFocus[fn](elem,horiz)})}function show(options){var isFullscreen,dialogOptions={removeOnClose:!0,enableHistory:options.enableHistory,scrollY:!1},backButton=!1;layoutManager.tv?(dialogOptions.size="fullscreen",isFullscreen=!0,backButton=!0,dialogOptions.autoFocus=!0):(dialogOptions.modal=!1,dialogOptions.entryAnimation=options.entryAnimation,dialogOptions.exitAnimation=options.exitAnimation,dialogOptions.entryAnimationDuration=options.entryAnimationDuration||140,dialogOptions.exitAnimationDuration=options.exitAnimationDuration||160,dialogOptions.autoFocus=!1);var dlg=dialogHelper.createDialog(dialogOptions);isFullscreen?dlg.classList.add("actionsheet-fullscreen"):dlg.classList.add("actionsheet-not-fullscreen");var extraSpacing=!layoutManager.tv;extraSpacing&&dlg.classList.add("actionsheet-extraSpacing"),dlg.classList.add("actionSheet"),options.dialogClass&&dlg.classList.add(options.dialogClass);var html="",scrollType=layoutManager.desktop?"smoothScrollY":"hiddenScrollY",style=browser.firefox?"max-height:400px;":"";if(options.items.length>20){var minWidth=dom.getWindowSize().innerWidth>=300?240:200;style+="min-width:"+minWidth+"px;"}var i,length,option,renderIcon=!1;for(i=0,length=options.items.length;i');var center=options.title&&!renderIcon;html+=center?'
':'
',options.title&&(layoutManager.tv?(html+='

',html+=options.title,html+="

"):(html+='

',html+=options.title,html+="

")),options.text&&(html+='

',html+=options.text,html+="

"),html+='
';var menuItemClass=browser.firefox?"actionSheetMenuItem actionSheetMenuItem-noflex":"actionSheetMenuItem";options.menuItemClass&&(menuItemClass+=" "+options.menuItemClass),extraSpacing&&(menuItemClass+=" actionSheetMenuItem-extraspacing");var actionSheetItemTextClass="actionSheetItemText";for(i=0,length=options.items.length;i',option.icon?html+=''+option.icon+"":renderIcon&&!center&&(html+=''),html+='
'+(option.name||option.textContent||option.innerText)+"
",option.secondaryText&&(html+='
'+option.secondaryText+"
"),html+=""}options.showCancel&&(html+='
',html+='",html+="
"),html+="
",dlg.innerHTML=html,layoutManager.tv&¢erFocus(dlg.querySelector(".actionSheetScroller"),!1,!0);var btnCloseActionSheet=dlg.querySelector(".btnCloseActionSheet");btnCloseActionSheet&&dlg.querySelector(".btnCloseActionSheet").addEventListener("click",function(){dialogHelper.close(dlg)});var selectedId,timeout;return options.timeout&&(timeout=setTimeout(function(){dialogHelper.close(dlg)},options.timeout)),new Promise(function(resolve,reject){var isResolved;dlg.addEventListener("click",function(e){var actionSheetMenuItem=dom.parentWithClass(e.target,"actionSheetMenuItem");actionSheetMenuItem&&(selectedId=actionSheetMenuItem.getAttribute("data-id"),options.resolveOnClick&&(resolve(selectedId),isResolved=!0),dialogHelper.close(dlg))}),dlg.addEventListener("close",function(){layoutManager.tv&¢erFocus(dlg.querySelector(".actionSheetScroller"),!1,!1),timeout&&(clearTimeout(timeout),timeout=null),isResolved||(null!=selectedId?(options.callback&&options.callback(selectedId),resolve(selectedId)):reject())}),dialogHelper.open(dlg);var setPositions=function(){var pos=options.positionTo&&"fullscreen"!==dialogOptions.size?getPosition(options,dlg):null;pos&&(dlg.style.position="fixed",dlg.style.margin=0,dlg.style.left=pos.left+"px",dlg.style.top=pos.top+"px")};browser.safari?setTimeout(setPositions,0):setPositions()})}return{show:show}}); \ No newline at end of file +define(["dialogHelper","layoutManager","globalize","browser","dom","emby-button","css!./actionsheet","material-icons","scrollStyles"],function(dialogHelper,layoutManager,globalize,browser,dom){"use strict";function getOffsets(elems){var doc=document,results=[];if(!doc)return results;for(var box,elem,i=0,length=elems.length;i0&&(pos.left-=overflowX+20),overflowY>0&&(pos.top-=overflowY+20),pos.top+=options.offsetTop||0,pos.left+=options.offsetLeft||0,pos.top=Math.max(pos.top,10),pos.left=Math.max(pos.left,10),pos}function centerFocus(elem,horiz,on){require(["scrollHelper"],function(scrollHelper){var fn=on?"on":"off";scrollHelper.centerFocus[fn](elem,horiz)})}function show(options){var isFullscreen,dialogOptions={removeOnClose:!0,enableHistory:options.enableHistory,scrollY:!1},backButton=!1;layoutManager.tv?(dialogOptions.size="fullscreen",isFullscreen=!0,backButton=!0,dialogOptions.autoFocus=!0):(dialogOptions.modal=!1,dialogOptions.entryAnimation=options.entryAnimation,dialogOptions.exitAnimation=options.exitAnimation,dialogOptions.entryAnimationDuration=options.entryAnimationDuration||140,dialogOptions.exitAnimationDuration=options.exitAnimationDuration||160,dialogOptions.autoFocus=!1);var dlg=dialogHelper.createDialog(dialogOptions);isFullscreen?dlg.classList.add("actionsheet-fullscreen"):dlg.classList.add("actionsheet-not-fullscreen");var extraSpacing=!layoutManager.tv;extraSpacing&&dlg.classList.add("actionsheet-extraSpacing"),dlg.classList.add("actionSheet"),options.dialogClass&&dlg.classList.add(options.dialogClass);var html="",scrollType=layoutManager.desktop?"smoothScrollY":"hiddenScrollY",style="";if(options.items.length>20){var minWidth=dom.getWindowSize().innerWidth>=300?240:200;style+="min-width:"+minWidth+"px;"}var i,length,option,renderIcon=!1;for(i=0,length=options.items.length;i');var center=options.title&&!renderIcon;html+=center?'
':'
',options.title&&(layoutManager.tv?(html+='

',html+=options.title,html+="

"):(html+='

',html+=options.title,html+="

")),options.text&&(html+='

',html+=options.text,html+="

"),html+='
';var menuItemClass=browser.firefox?"actionSheetMenuItem actionSheetMenuItem-noflex":"actionSheetMenuItem";options.menuItemClass&&(menuItemClass+=" "+options.menuItemClass),extraSpacing&&(menuItemClass+=" actionSheetMenuItem-extraspacing");var actionSheetItemTextClass="actionSheetItemText";for(i=0,length=options.items.length;i',option.icon?html+=''+option.icon+"":renderIcon&&!center&&(html+=''),html+='
'+(option.name||option.textContent||option.innerText)+"
",option.secondaryText&&(html+='
'+option.secondaryText+"
"),html+=""}options.showCancel&&(html+='
',html+='",html+="
"),html+="
",dlg.innerHTML=html,layoutManager.tv&¢erFocus(dlg.querySelector(".actionSheetScroller"),!1,!0);var btnCloseActionSheet=dlg.querySelector(".btnCloseActionSheet");btnCloseActionSheet&&dlg.querySelector(".btnCloseActionSheet").addEventListener("click",function(){dialogHelper.close(dlg)});var selectedId,timeout;return options.timeout&&(timeout=setTimeout(function(){dialogHelper.close(dlg)},options.timeout)),new Promise(function(resolve,reject){var isResolved;dlg.addEventListener("click",function(e){var actionSheetMenuItem=dom.parentWithClass(e.target,"actionSheetMenuItem");actionSheetMenuItem&&(selectedId=actionSheetMenuItem.getAttribute("data-id"),options.resolveOnClick&&(resolve(selectedId),isResolved=!0),dialogHelper.close(dlg))}),dlg.addEventListener("close",function(){layoutManager.tv&¢erFocus(dlg.querySelector(".actionSheetScroller"),!1,!1),timeout&&(clearTimeout(timeout),timeout=null),isResolved||(null!=selectedId?(options.callback&&options.callback(selectedId),resolve(selectedId)):reject())}),dialogHelper.open(dlg);var setPositions=function(){var pos=options.positionTo&&"fullscreen"!==dialogOptions.size?getPosition(options,dlg):null;pos&&(dlg.style.position="fixed",dlg.style.margin=0,dlg.style.left=pos.left+"px",dlg.style.top=pos.top+"px")};browser.safari?setTimeout(setPositions,0):setPositions()})}return{show:show}}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js index eae569203f..c5cd62240c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js +++ b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js @@ -1 +1 @@ -define(["browser"],function(browser){"use strict";function canPlayH264(){var v=document.createElement("video");return!(!v.canPlayType||!v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,""))}function canPlayH265(){return!!browser.tizen}function supportsTextTracks(){return null==_supportsTextTracks&&(_supportsTextTracks=null!=document.createElement("video").textTracks),_supportsTextTracks}function canPlayHls(src){return null==_canPlayHls&&(_canPlayHls=canPlayNativeHls()||canPlayHlsWithMSE()),_canPlayHls}function canPlayNativeHls(){var media=document.createElement("video");return!(!media.canPlayType("application/x-mpegURL").replace(/no/,"")&&!media.canPlayType("application/vnd.apple.mpegURL").replace(/no/,""))}function canPlayHlsWithMSE(){return null!=window.MediaSource}function canPlayAudioFormat(format){var typeString;if("flac"===format){if(browser.tizen)return!0;if(browser.edgeUwp)return!0}else if("wma"===format){if(browser.tizen)return!0;if(browser.edgeUwp)return!0}else if("opus"===format)return typeString='audio/ogg; codecs="opus"',!!document.createElement("audio").canPlayType(typeString).replace(/no/,"");return typeString="webma"===format?"audio/webm":"audio/"+format,!!document.createElement("audio").canPlayType(typeString).replace(/no/,"")}function testCanPlayMkv(videoTestElement){if(videoTestElement.canPlayType("video/x-matroska")||videoTestElement.canPlayType("video/mkv"))return!0;var userAgent=navigator.userAgent.toLowerCase();return browser.chrome?!browser.operaTv&&(userAgent.indexOf("vivaldi")===-1&&userAgent.indexOf("opera")===-1):!!browser.tizen||!!browser.edgeUwp}function testCanPlayTs(){return browser.tizen||browser.web0s||browser.edgeUwp}function getDirectPlayProfileForVideoContainer(container,videoAudioCodecs){var supported=!1,profileContainer=container,videoCodecs=[];switch(container){case"asf":supported=browser.tizen||browser.edgeUwp,videoAudioCodecs=[];break;case"avi":supported=browser.tizen||browser.edgeUwp;break;case"mpg":case"mpeg":supported=browser.edgeUwp||browser.tizen;break;case"3gp":case"flv":case"mts":case"trp":case"vob":case"vro":supported=browser.tizen;break;case"mov":supported=browser.tizen||browser.chrome||browser.edgeUwp,videoCodecs.push("h264");break;case"m2ts":supported=browser.tizen||browser.web0s||browser.edgeUwp,videoCodecs.push("h264");break;case"wmv":supported=browser.tizen||browser.web0s||browser.edgeUwp,videoAudioCodecs=[];break;case"ts":supported=testCanPlayTs(),videoCodecs.push("h264"),canPlayH265()&&(videoCodecs.push("h265"),videoCodecs.push("hevc")),profileContainer="ts,mpegts"}return supported?{Container:profileContainer,Type:"Video",VideoCodec:videoCodecs.join(","),AudioCodec:videoAudioCodecs.join(",")}:null}function getMaxBitrate(){return 12e7}var _supportsTextTracks,_canPlayHls;return function(options){options=options||{};var physicalAudioChannels=options.audioChannels||(browser.mobile?2:6),bitrateSetting=getMaxBitrate(),videoTestElement=document.createElement("video"),canPlayWebm=videoTestElement.canPlayType("video/webm").replace(/no/,""),canPlayMkv=testCanPlayMkv(videoTestElement),profile={};profile.MaxStreamingBitrate=bitrateSetting,profile.MaxStaticBitrate=1e8,profile.MusicStreamingTranscodingBitrate=Math.min(bitrateSetting,192e3),profile.DirectPlayProfiles=[];var videoAudioCodecs=[],hlsVideoAudioCodecs=[],supportsMp3VideoAudio=videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.69"').replace(/no/,"")||videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.6B"').replace(/no/,"");(videoTestElement.canPlayType('audio/mp4; codecs="ac-3"').replace(/no/,"")&&!browser.osx&&!browser.iOS||browser.edgeUwp||browser.tizen||browser.web0s)&&(videoAudioCodecs.push("ac3"),browser.edge&&browser.touch&&!browser.edgeUwp||hlsVideoAudioCodecs.push("ac3")),browser.tizen&&(videoAudioCodecs.push("eac3"),hlsVideoAudioCodecs.push("eac3"));var mp3Added=!1;canPlayMkv&&supportsMp3VideoAudio&&(mp3Added=!0,videoAudioCodecs.push("mp3")),videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"').replace(/no/,"")&&(videoAudioCodecs.push("aac"),hlsVideoAudioCodecs.push("aac")),supportsMp3VideoAudio&&(mp3Added||videoAudioCodecs.push("mp3"),browser.ps4||hlsVideoAudioCodecs.push("mp3")),(browser.tizen||options.supportsDts)&&(videoAudioCodecs.push("dca"),videoAudioCodecs.push("dts")),options.supportsTrueHd&&videoAudioCodecs.push("truehd"),videoAudioCodecs=videoAudioCodecs.filter(function(c){return(options.disableVideoAudioCodecs||[]).indexOf(c)===-1}),hlsVideoAudioCodecs=hlsVideoAudioCodecs.filter(function(c){return(options.disableHlsVideoAudioCodecs||[]).indexOf(c)===-1});var mp4VideoCodecs=[];canPlayH264()&&mp4VideoCodecs.push("h264"),canPlayH265()&&(mp4VideoCodecs.push("h265"),mp4VideoCodecs.push("hevc")),mp4VideoCodecs.length&&profile.DirectPlayProfiles.push({Container:"mp4,m4v",Type:"Video",VideoCodec:mp4VideoCodecs.join(","),AudioCodec:videoAudioCodecs.join(",")}),browser.tizen&&(mp4VideoCodecs.push("mpeg2video"),mp4VideoCodecs.push("vc1")),canPlayMkv&&mp4VideoCodecs.length&&(profile.DirectPlayProfiles.push({Container:"mkv",Type:"Video",VideoCodec:mp4VideoCodecs.join(","),AudioCodec:videoAudioCodecs.join(",")}),browser.edgeUwp&&profile.DirectPlayProfiles.push({Container:"mkv",Type:"Video",VideoCodec:"vc1",AudioCodec:videoAudioCodecs.join(",")})),["m2ts","mov","wmv","ts","asf","avi","mpg","mpeg"].map(function(container){return getDirectPlayProfileForVideoContainer(container,videoAudioCodecs)}).filter(function(i){return null!=i}).forEach(function(i){profile.DirectPlayProfiles.push(i)}),["opus","mp3","aac","flac","webma","wma","wav"].filter(canPlayAudioFormat).forEach(function(audioFormat){profile.DirectPlayProfiles.push({Container:"webma"===audioFormat?"webma,webm":audioFormat,Type:"Audio"}),"aac"===audioFormat&&profile.DirectPlayProfiles.push({Container:"m4a",AudioCodec:audioFormat,Type:"Audio"})}),canPlayWebm&&profile.DirectPlayProfiles.push({Container:"webm",Type:"Video"}),profile.TranscodingProfiles=[],canPlayNativeHls()&&options.enableHlsAudio&&profile.TranscodingProfiles.push({Container:"ts",Type:"Audio",AudioCodec:"aac",Context:"Streaming",Protocol:"hls"}),["opus","mp3","aac","wav"].filter(canPlayAudioFormat).forEach(function(audioFormat){profile.TranscodingProfiles.push({Container:audioFormat,Type:"Audio",AudioCodec:audioFormat,Context:"Streaming",Protocol:"http",MaxAudioChannels:physicalAudioChannels.toString()}),profile.TranscodingProfiles.push({Container:audioFormat,Type:"Audio",AudioCodec:audioFormat,Context:"Static",Protocol:"http",MaxAudioChannels:physicalAudioChannels.toString()})}),canPlayMkv&&!browser.tizen&&options.enableMkvProgressive!==!1&&profile.TranscodingProfiles.push({Container:"mkv",Type:"Video",AudioCodec:videoAudioCodecs.join(","),VideoCodec:"h264",Context:"Streaming",MaxAudioChannels:physicalAudioChannels.toString(),CopyTimestamps:!0}),canPlayHls()&&options.enableHls!==!1&&profile.TranscodingProfiles.push({Container:"ts",Type:"Video",AudioCodec:hlsVideoAudioCodecs.join(","),VideoCodec:"h264",Context:"Streaming",Protocol:"hls",MaxAudioChannels:physicalAudioChannels.toString()}),browser.firefox&&profile.TranscodingProfiles.push({Container:"mp4",Type:"Video",AudioCodec:videoAudioCodecs.join(","),VideoCodec:"h264",Context:"Streaming",Protocol:"http"}),canPlayWebm&&profile.TranscodingProfiles.push({Container:"webm",Type:"Video",AudioCodec:"vorbis",VideoCodec:"vpx",Context:"Streaming",Protocol:"http",MaxAudioChannels:physicalAudioChannels.toString()}),profile.TranscodingProfiles.push({Container:"mp4",Type:"Video",AudioCodec:videoAudioCodecs.join(","),VideoCodec:"h264",Context:"Streaming",Protocol:"http",MaxAudioChannels:physicalAudioChannels.toString()}),profile.TranscodingProfiles.push({Container:"mp4",Type:"Video",AudioCodec:videoAudioCodecs.join(","),VideoCodec:"h264",Context:"Static",Protocol:"http"}),profile.ContainerProfiles=[],profile.CodecProfiles=[];var supportsSecondaryAudio=browser.tizen;videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.5"').replace(/no/,"")||(profile.CodecProfiles.push({Type:"VideoAudio",Codec:"aac",Conditions:[{Condition:"NotEquals",Property:"AudioProfile",Value:"HE-AAC"},{Condition:"LessThanEqual",Property:"AudioBitrate",Value:"128000"}]}),supportsSecondaryAudio||profile.CodecProfiles[profile.CodecProfiles.length-1].Conditions.push({Condition:"Equals",Property:"IsSecondaryAudio",Value:"false",IsRequired:"false"})),supportsSecondaryAudio||profile.CodecProfiles.push({Type:"VideoAudio",Conditions:[{Condition:"Equals",Property:"IsSecondaryAudio",Value:"false",IsRequired:"false"}]});var maxLevel="41";browser.chrome&&!browser.mobile&&(maxLevel="51"),profile.CodecProfiles.push({Type:"Video",Codec:"h264",Conditions:[{Condition:"NotEquals",Property:"IsAnamorphic",Value:"true",IsRequired:!1},{Condition:"EqualsAny",Property:"VideoProfile",Value:"high|main|baseline|constrained baseline"},{Condition:"LessThanEqual",Property:"VideoLevel",Value:maxLevel}]}),browser.edgeUwp||browser.tizen||browser.web0s||profile.CodecProfiles[profile.CodecProfiles.length-1].Conditions.push({Condition:"NotEquals",Property:"IsAVC",Value:"false",IsRequired:!1});var isTizenFhd=!1;if(browser.tizen)try{var isTizenUhd=webapis.productinfo.isUdPanelSupported();isTizenFhd=!isTizenUhd,console.log("isTizenFhd = "+isTizenFhd)}catch(error){console.log("isUdPanelSupported() error code = "+error.code)}var globalMaxVideoBitrate=browser.ps4?"8000000":browser.xboxOne?"10000000":browser.edgeUwp?"40000000":browser.tizen&&isTizenFhd?"20000000":"",h264MaxVideoBitrate=globalMaxVideoBitrate;return browser.tizen&&!isTizenFhd&&(h264MaxVideoBitrate="60000000"),h264MaxVideoBitrate&&profile.CodecProfiles[profile.CodecProfiles.length-1].Conditions.push({Condition:"LessThanEqual",Property:"VideoBitrate",Value:h264MaxVideoBitrate,IsRequired:!0}),globalMaxVideoBitrate&&profile.CodecProfiles.push({Type:"Video",Conditions:[{Condition:"LessThanEqual",Property:"VideoBitrate",Value:globalMaxVideoBitrate}]}),browser.tizen&&!isTizenFhd&&(profile.CodecProfiles.push({Type:"Video",Codec:"vp9",Conditions:[{Condition:"LessThanEqual",Property:"VideoBitrate",Value:"40000000"}]}),profile.CodecProfiles.push({Type:"Video",Codec:"mpeg4,vc1,mpeg2video,mpeg1video,msmpeg4,h263,vp6,vp8",Conditions:[{Condition:"LessThanEqual",Property:"VideoBitrate",Value:"20000000"}]}),profile.CodecProfiles.push({Type:"Video",Conditions:[{Condition:"LessThanEqual",Property:"VideoBitrate",Value:"80000000"}]})),profile.SubtitleProfiles=[],supportsTextTracks()&&profile.SubtitleProfiles.push({Format:"vtt",Method:"External"}),profile.ResponseProfiles=[],profile.ResponseProfiles.push({Type:"Video",Container:"m4v",MimeType:"video/mp4"}),browser.chrome&&profile.ResponseProfiles.push({Type:"Video",Container:"mov",MimeType:"video/webm"}),profile}}); \ No newline at end of file +define(["browser"],function(browser){"use strict";function canPlayH264(){var v=document.createElement("video");return!(!v.canPlayType||!v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,""))}function canPlayH265(){return!!browser.tizen}function supportsTextTracks(){return null==_supportsTextTracks&&(_supportsTextTracks=null!=document.createElement("video").textTracks),_supportsTextTracks}function canPlayHls(src){return null==_canPlayHls&&(_canPlayHls=canPlayNativeHls()||canPlayHlsWithMSE()),_canPlayHls}function canPlayNativeHls(){var media=document.createElement("video");return!(!media.canPlayType("application/x-mpegURL").replace(/no/,"")&&!media.canPlayType("application/vnd.apple.mpegURL").replace(/no/,""))}function canPlayHlsWithMSE(){return null!=window.MediaSource}function canPlayAudioFormat(format){var typeString;if("flac"===format){if(browser.tizen)return!0;if(browser.edgeUwp)return!0}else if("wma"===format){if(browser.tizen)return!0;if(browser.edgeUwp)return!0}else if("opus"===format)return typeString='audio/ogg; codecs="opus"',!!document.createElement("audio").canPlayType(typeString).replace(/no/,"");return typeString="webma"===format?"audio/webm":"audio/"+format,!!document.createElement("audio").canPlayType(typeString).replace(/no/,"")}function testCanPlayMkv(videoTestElement){if(videoTestElement.canPlayType("video/x-matroska")||videoTestElement.canPlayType("video/mkv"))return!0;var userAgent=navigator.userAgent.toLowerCase();return browser.chrome?!browser.operaTv&&(userAgent.indexOf("vivaldi")===-1&&userAgent.indexOf("opera")===-1):!!browser.tizen||!!browser.edgeUwp}function testCanPlayTs(){return browser.tizen||browser.web0s||browser.edgeUwp}function getDirectPlayProfileForVideoContainer(container,videoAudioCodecs){var supported=!1,profileContainer=container,videoCodecs=[];switch(container){case"asf":supported=browser.tizen||browser.edgeUwp,videoAudioCodecs=[];break;case"avi":supported=browser.tizen||browser.edgeUwp;break;case"mpg":case"mpeg":supported=browser.edgeUwp||browser.tizen;break;case"3gp":case"flv":case"mts":case"trp":case"vob":case"vro":supported=browser.tizen;break;case"mov":supported=browser.tizen||browser.chrome||browser.edgeUwp,videoCodecs.push("h264");break;case"m2ts":supported=browser.tizen||browser.web0s||browser.edgeUwp,videoCodecs.push("h264");break;case"wmv":supported=browser.tizen||browser.web0s||browser.edgeUwp,videoAudioCodecs=[];break;case"ts":supported=testCanPlayTs(),videoCodecs.push("h264"),canPlayH265()&&(videoCodecs.push("h265"),videoCodecs.push("hevc")),profileContainer="ts,mpegts"}return supported?{Container:profileContainer,Type:"Video",VideoCodec:videoCodecs.join(","),AudioCodec:videoAudioCodecs.join(",")}:null}function getMaxBitrate(){return 12e7}var _supportsTextTracks,_canPlayHls;return function(options){options=options||{};var physicalAudioChannels=options.audioChannels||(browser.mobile?2:6),bitrateSetting=getMaxBitrate(),videoTestElement=document.createElement("video"),canPlayWebm=videoTestElement.canPlayType("video/webm").replace(/no/,""),canPlayMkv=testCanPlayMkv(videoTestElement),profile={};profile.MaxStreamingBitrate=bitrateSetting,profile.MaxStaticBitrate=1e8,profile.MusicStreamingTranscodingBitrate=Math.min(bitrateSetting,192e3),profile.DirectPlayProfiles=[];var videoAudioCodecs=[],hlsVideoAudioCodecs=[],supportsMp3VideoAudio=videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.69"').replace(/no/,"")||videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.6B"').replace(/no/,"");(videoTestElement.canPlayType('audio/mp4; codecs="ac-3"').replace(/no/,"")&&!browser.osx&&!browser.iOS||browser.edgeUwp||browser.tizen||browser.web0s)&&(videoAudioCodecs.push("ac3"),browser.edge&&browser.touch&&!browser.edgeUwp||hlsVideoAudioCodecs.push("ac3")),browser.tizen&&(videoAudioCodecs.push("eac3"),hlsVideoAudioCodecs.push("eac3"));var mp3Added=!1;canPlayMkv&&supportsMp3VideoAudio&&(mp3Added=!0,videoAudioCodecs.push("mp3")),videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"').replace(/no/,"")&&(videoAudioCodecs.push("aac"),hlsVideoAudioCodecs.push("aac")),supportsMp3VideoAudio&&(mp3Added||videoAudioCodecs.push("mp3"),browser.ps4||hlsVideoAudioCodecs.push("mp3")),(browser.tizen||options.supportsDts)&&(videoAudioCodecs.push("dca"),videoAudioCodecs.push("dts")),options.supportsTrueHd&&videoAudioCodecs.push("truehd"),videoAudioCodecs=videoAudioCodecs.filter(function(c){return(options.disableVideoAudioCodecs||[]).indexOf(c)===-1}),hlsVideoAudioCodecs=hlsVideoAudioCodecs.filter(function(c){return(options.disableHlsVideoAudioCodecs||[]).indexOf(c)===-1});var mp4VideoCodecs=[];canPlayH264()&&mp4VideoCodecs.push("h264"),canPlayH265()&&(mp4VideoCodecs.push("h265"),mp4VideoCodecs.push("hevc")),mp4VideoCodecs.length&&profile.DirectPlayProfiles.push({Container:"mp4,m4v",Type:"Video",VideoCodec:mp4VideoCodecs.join(","),AudioCodec:videoAudioCodecs.join(",")}),browser.tizen&&(mp4VideoCodecs.push("mpeg2video"),mp4VideoCodecs.push("vc1")),canPlayMkv&&mp4VideoCodecs.length&&(profile.DirectPlayProfiles.push({Container:"mkv",Type:"Video",VideoCodec:mp4VideoCodecs.join(","),AudioCodec:videoAudioCodecs.join(",")}),browser.edgeUwp&&profile.DirectPlayProfiles.push({Container:"mkv",Type:"Video",VideoCodec:"vc1",AudioCodec:videoAudioCodecs.join(",")})),["m2ts","mov","wmv","ts","asf","avi","mpg","mpeg"].map(function(container){return getDirectPlayProfileForVideoContainer(container,videoAudioCodecs)}).filter(function(i){return null!=i}).forEach(function(i){profile.DirectPlayProfiles.push(i)}),["opus","mp3","aac","flac","webma","wma","wav"].filter(canPlayAudioFormat).forEach(function(audioFormat){profile.DirectPlayProfiles.push({Container:"webma"===audioFormat?"webma,webm":audioFormat,Type:"Audio"}),"aac"===audioFormat&&profile.DirectPlayProfiles.push({Container:"m4a",AudioCodec:audioFormat,Type:"Audio"})}),canPlayWebm&&profile.DirectPlayProfiles.push({Container:"webm",Type:"Video"}),profile.TranscodingProfiles=[],canPlayNativeHls()&&options.enableHlsAudio&&profile.TranscodingProfiles.push({Container:"ts",Type:"Audio",AudioCodec:"aac",Context:"Streaming",Protocol:"hls"}),["mp3","aac","opus","wav"].filter(canPlayAudioFormat).forEach(function(audioFormat){profile.TranscodingProfiles.push({Container:audioFormat,Type:"Audio",AudioCodec:audioFormat,Context:"Streaming",Protocol:"http",MaxAudioChannels:physicalAudioChannels.toString()})}),["opus","mp3","aac","wav"].filter(canPlayAudioFormat).forEach(function(audioFormat){profile.TranscodingProfiles.push({Container:audioFormat,Type:"Audio",AudioCodec:audioFormat,Context:"Static",Protocol:"http",MaxAudioChannels:physicalAudioChannels.toString()})}),canPlayMkv&&!browser.tizen&&options.enableMkvProgressive!==!1&&profile.TranscodingProfiles.push({Container:"mkv",Type:"Video",AudioCodec:videoAudioCodecs.join(","),VideoCodec:"h264",Context:"Streaming",MaxAudioChannels:physicalAudioChannels.toString(),CopyTimestamps:!0}),canPlayHls()&&options.enableHls!==!1&&profile.TranscodingProfiles.push({Container:"ts",Type:"Video",AudioCodec:hlsVideoAudioCodecs.join(","),VideoCodec:"h264",Context:"Streaming",Protocol:"hls",MaxAudioChannels:physicalAudioChannels.toString()}),browser.firefox&&profile.TranscodingProfiles.push({Container:"mp4",Type:"Video",AudioCodec:videoAudioCodecs.join(","),VideoCodec:"h264",Context:"Streaming",Protocol:"http"}),canPlayWebm&&profile.TranscodingProfiles.push({Container:"webm",Type:"Video",AudioCodec:"vorbis",VideoCodec:"vpx",Context:"Streaming",Protocol:"http",MaxAudioChannels:physicalAudioChannels.toString()}),profile.TranscodingProfiles.push({Container:"mp4",Type:"Video",AudioCodec:videoAudioCodecs.join(","),VideoCodec:"h264",Context:"Streaming",Protocol:"http",MaxAudioChannels:physicalAudioChannels.toString()}),profile.TranscodingProfiles.push({Container:"mp4",Type:"Video",AudioCodec:videoAudioCodecs.join(","),VideoCodec:"h264",Context:"Static",Protocol:"http"}),profile.ContainerProfiles=[],profile.CodecProfiles=[];var supportsSecondaryAudio=browser.tizen;videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.5"').replace(/no/,"")||(profile.CodecProfiles.push({Type:"VideoAudio",Codec:"aac",Conditions:[{Condition:"NotEquals",Property:"AudioProfile",Value:"HE-AAC"},{Condition:"LessThanEqual",Property:"AudioBitrate",Value:"128000"}]}),supportsSecondaryAudio||profile.CodecProfiles[profile.CodecProfiles.length-1].Conditions.push({Condition:"Equals",Property:"IsSecondaryAudio",Value:"false",IsRequired:"false"})),supportsSecondaryAudio||profile.CodecProfiles.push({Type:"VideoAudio",Conditions:[{Condition:"Equals",Property:"IsSecondaryAudio",Value:"false",IsRequired:"false"}]});var maxLevel="41";browser.chrome&&!browser.mobile&&(maxLevel="51"),profile.CodecProfiles.push({Type:"Video",Codec:"h264",Conditions:[{Condition:"NotEquals",Property:"IsAnamorphic",Value:"true",IsRequired:!1},{Condition:"EqualsAny",Property:"VideoProfile",Value:"high|main|baseline|constrained baseline"},{Condition:"LessThanEqual",Property:"VideoLevel",Value:maxLevel}]}),browser.edgeUwp||browser.tizen||browser.web0s||profile.CodecProfiles[profile.CodecProfiles.length-1].Conditions.push({Condition:"NotEquals",Property:"IsAVC",Value:"false",IsRequired:!1});var isTizenFhd=!1;if(browser.tizen)try{var isTizenUhd=webapis.productinfo.isUdPanelSupported();isTizenFhd=!isTizenUhd,console.log("isTizenFhd = "+isTizenFhd)}catch(error){console.log("isUdPanelSupported() error code = "+error.code)}var globalMaxVideoBitrate=browser.ps4?"8000000":browser.xboxOne?"10000000":browser.edgeUwp?"40000000":browser.tizen&&isTizenFhd?"20000000":"",h264MaxVideoBitrate=globalMaxVideoBitrate;return browser.tizen&&!isTizenFhd&&(h264MaxVideoBitrate="60000000"),h264MaxVideoBitrate&&profile.CodecProfiles[profile.CodecProfiles.length-1].Conditions.push({Condition:"LessThanEqual",Property:"VideoBitrate",Value:h264MaxVideoBitrate,IsRequired:!0}),globalMaxVideoBitrate&&profile.CodecProfiles.push({Type:"Video",Conditions:[{Condition:"LessThanEqual",Property:"VideoBitrate",Value:globalMaxVideoBitrate}]}),browser.tizen&&!isTizenFhd&&(profile.CodecProfiles.push({Type:"Video",Codec:"vp9",Conditions:[{Condition:"LessThanEqual",Property:"VideoBitrate",Value:"40000000"}]}),profile.CodecProfiles.push({Type:"Video",Codec:"mpeg4,vc1,mpeg2video,mpeg1video,msmpeg4,h263,vp6,vp8",Conditions:[{Condition:"LessThanEqual",Property:"VideoBitrate",Value:"20000000"}]}),profile.CodecProfiles.push({Type:"Video",Conditions:[{Condition:"LessThanEqual",Property:"VideoBitrate",Value:"80000000"}]})),profile.SubtitleProfiles=[],supportsTextTracks()&&profile.SubtitleProfiles.push({Format:"vtt",Method:"External"}),profile.ResponseProfiles=[],profile.ResponseProfiles.push({Type:"Video",Container:"m4v",MimeType:"video/mp4"}),browser.chrome&&profile.ResponseProfiles.push({Type:"Video",Container:"mov",MimeType:"video/webm"}),profile}}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js b/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js index 6b14c51bdf..fe79007682 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js @@ -1 +1 @@ -define(["playbackManager","focusManager","embyRouter","dom"],function(playbackManager,focusManager,embyRouter,dom){"use strict";function notify(){lastInputTime=(new Date).getTime(),handleCommand("unknown")}function notifyMouseMove(){lastInputTime=(new Date).getTime()}function idleTime(){return(new Date).getTime()-lastInputTime}function select(sourceElement){sourceElement.click()}function on(scope,fn){eventListenerCount++,scope.addEventListener("command",fn)}function off(scope,fn){eventListenerCount&&eventListenerCount--,scope.removeEventListener("command",fn)}function checkCommandTime(command){var last=commandTimes[command]||0,now=(new Date).getTime();return!(now-last<1e3)&&(commandTimes[command]=now,!0)}function handleCommand(name,options){lastInputTime=(new Date).getTime();var sourceElement=options?options.sourceElement:null;if(sourceElement&&(sourceElement=focusManager.focusableParent(sourceElement)),sourceElement=sourceElement||document.activeElement||window,eventListenerCount){var customEvent=new CustomEvent("command",{detail:{command:name},bubbles:!0,cancelable:!0}),eventResult=sourceElement.dispatchEvent(customEvent);if(!eventResult)return}switch(name){case"up":focusManager.moveUp(sourceElement);break;case"down":focusManager.moveDown(sourceElement);break;case"left":focusManager.moveLeft(sourceElement);break;case"right":focusManager.moveRight(sourceElement);break;case"home":embyRouter.goHome();break;case"settings":embyRouter.showSettings();break;case"back":embyRouter.back();break;case"forward":break;case"select":select(sourceElement);break;case"pageup":break;case"pagedown":break;case"end":break;case"menu":case"info":break;case"next":playbackManager.isPlaying()&&playbackManager.nextChapter();break;case"previous":playbackManager.isPlaying()&&playbackManager.previousChapter();break;case"guide":embyRouter.showGuide();break;case"recordedtv":embyRouter.showRecordedTV();break;case"record":break;case"livetv":embyRouter.showLiveTV();break;case"mute":playbackManager.setMute(!0);break;case"unmute":playbackManager.setMute(!1);break;case"togglemute":playbackManager.toggleMute();break;case"channelup":playbackManager.nextTrack();break;case"channeldown":playbackManager.previousTrack();break;case"volumedown":playbackManager.volumeDown();break;case"volumeup":playbackManager.volumeUp();break;case"play":playbackManager.unpause();break;case"pause":playbackManager.pause();break;case"playpause":playbackManager.playPause();break;case"stop":checkCommandTime("stop")&&playbackManager.stop();break;case"changezoom":break;case"changeaudiotrack":break;case"changesubtitletrack":break;case"search":embyRouter.showSearch();break;case"favorites":embyRouter.showFavorites();break;case"fastforward":playbackManager.fastForward();break;case"rewind":playbackManager.rewind();break;case"togglefullscreen":break;case"disabledisplaymirror":playbackManager.enableDisplayMirroring(!1);break;case"enabledisplaymirror":playbackManager.enableDisplayMirroring(!0);break;case"toggledisplaymirror":playbackManager.toggleDisplayMirroring();break;case"movies":break;case"music":break;case"tv":break;case"latestepisodes":break;case"nowplaying":break;case"upcomingtv":break;case"nextup":}}var lastInputTime=(new Date).getTime(),eventListenerCount=0,commandTimes={};return dom.addEventListener(document,"click",notify,{passive:!0}),{trigger:handleCommand,handle:handleCommand,notify:notify,notifyMouseMove:notifyMouseMove,idleTime:idleTime,on:on,off:off}}); \ No newline at end of file +define(["playbackManager","focusManager","embyRouter","dom"],function(playbackManager,focusManager,embyRouter,dom){"use strict";function notify(){lastInputTime=(new Date).getTime(),handleCommand("unknown")}function notifyMouseMove(){lastInputTime=(new Date).getTime()}function idleTime(){return(new Date).getTime()-lastInputTime}function select(sourceElement){sourceElement.click()}function on(scope,fn){eventListenerCount++,dom.addEventListener(scope,"command",fn,{})}function off(scope,fn){eventListenerCount&&eventListenerCount--,dom.removeEventListener(scope,"command",fn,{})}function checkCommandTime(command){var last=commandTimes[command]||0,now=(new Date).getTime();return!(now-last<1e3)&&(commandTimes[command]=now,!0)}function handleCommand(name,options){lastInputTime=(new Date).getTime();var sourceElement=options?options.sourceElement:null;if(sourceElement&&(sourceElement=focusManager.focusableParent(sourceElement)),sourceElement=sourceElement||document.activeElement||window,eventListenerCount){var customEvent=new CustomEvent("command",{detail:{command:name},bubbles:!0,cancelable:!0}),eventResult=sourceElement.dispatchEvent(customEvent);if(!eventResult)return}switch(name){case"up":focusManager.moveUp(sourceElement);break;case"down":focusManager.moveDown(sourceElement);break;case"left":focusManager.moveLeft(sourceElement);break;case"right":focusManager.moveRight(sourceElement);break;case"home":embyRouter.goHome();break;case"settings":embyRouter.showSettings();break;case"back":embyRouter.back();break;case"forward":break;case"select":select(sourceElement);break;case"pageup":break;case"pagedown":break;case"end":break;case"menu":case"info":break;case"next":playbackManager.isPlaying()&&playbackManager.nextChapter();break;case"previous":playbackManager.isPlaying()&&playbackManager.previousChapter();break;case"guide":embyRouter.showGuide();break;case"recordedtv":embyRouter.showRecordedTV();break;case"record":break;case"livetv":embyRouter.showLiveTV();break;case"mute":playbackManager.setMute(!0);break;case"unmute":playbackManager.setMute(!1);break;case"togglemute":playbackManager.toggleMute();break;case"channelup":playbackManager.nextTrack();break;case"channeldown":playbackManager.previousTrack();break;case"volumedown":playbackManager.volumeDown();break;case"volumeup":playbackManager.volumeUp();break;case"play":playbackManager.unpause();break;case"pause":playbackManager.pause();break;case"playpause":playbackManager.playPause();break;case"stop":checkCommandTime("stop")&&playbackManager.stop();break;case"changezoom":break;case"changeaudiotrack":break;case"changesubtitletrack":break;case"search":embyRouter.showSearch();break;case"favorites":embyRouter.showFavorites();break;case"fastforward":playbackManager.fastForward();break;case"rewind":playbackManager.rewind();break;case"togglefullscreen":break;case"disabledisplaymirror":playbackManager.enableDisplayMirroring(!1);break;case"enabledisplaymirror":playbackManager.enableDisplayMirroring(!0);break;case"toggledisplaymirror":playbackManager.toggleDisplayMirroring();break;case"movies":break;case"music":break;case"tv":break;case"latestepisodes":break;case"nowplaying":break;case"upcomingtv":break;case"nextup":}}var lastInputTime=(new Date).getTime(),eventListenerCount=0,commandTimes={};return dom.addEventListener(document,"click",notify,{passive:!0}),{trigger:handleCommand,handle:handleCommand,notify:notify,notifyMouseMove:notifyMouseMove,idleTime:idleTime,on:on,off:off}}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/playback/autoplaydetect.js b/dashboard-ui/bower_components/emby-webcomponents/playback/autoplaydetect.js index 1d1c7913cc..93781cce4b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/playback/autoplaydetect.js +++ b/dashboard-ui/bower_components/emby-webcomponents/playback/autoplaydetect.js @@ -1 +1 @@ -define([],function(){"use strict";function supportsHtmlMediaAutoplay(){return new Promise(function(resolve,reject){var timeout,elem=document.createElement("video"),elemStyle=elem.style;if(!("autoplay"in elem))return void resolve(!1);elemStyle.position="absolute",elemStyle.height=0,elemStyle.width=0;try{elem.src="data:video/mp4;base64,AAAAHGZ0eXBtcDQyAAAAAG1wNDJpc29tYXZjMQAAAz5tb292AAAAbG12aGQAAAAAzaNacc2jWnEAAV+QAAFfkAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAGGlvZHMAAAAAEICAgAcAT////3//AAACQ3RyYWsAAABcdGtoZAAAAAHNo1pxzaNacQAAAAEAAAAAAAFfkAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAEAAAABAAAAAAAd9tZGlhAAAAIG1kaGQAAAAAzaNacc2jWnEAAV+QAAFfkFXEAAAAAAAhaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAAAAAAGWbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAABVnN0YmwAAACpc3RzZAAAAAAAAAABAAAAmWF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAEAAQAEgAAABIAAAAAAAAAAEOSlZUL0FWQyBDb2RpbmcAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAxYXZjQwH0AAr/4QAZZ/QACq609NQYBBkAAAMAAQAAAwAKjxImoAEABWjOAa8gAAAAEmNvbHJuY2xjAAYAAQAGAAAAGHN0dHMAAAAAAAAAAQAAAAUAAEZQAAAAKHN0c3oAAAAAAAAAAAAAAAUAAAIqAAAACAAAAAgAAAAIAAAACAAAAChzdHNjAAAAAAAAAAIAAAABAAAABAAAAAEAAAACAAAAAQAAAAEAAAAYc3RjbwAAAAAAAAACAAADYgAABaQAAAAUc3RzcwAAAAAAAAABAAAAAQAAABFzZHRwAAAAAAREREREAAAAb3VkdGEAAABnbWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcgAAAAAAAAAAAAAAAAAAAAA6aWxzdAAAADKpdG9vAAAAKmRhdGEAAAABAAAAAEhhbmRCcmFrZSAwLjkuOCAyMDEyMDcxODAwAAACUm1kYXQAAAHkBgX/4NxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxMjAgLSBILjI2NC9NUEVHLTQgQVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDExIC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcveDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MCByZWY9MSBkZWJsb2NrPTE6MDowIGFuYWx5c2U9MHgxOjAgbWU9ZXNhIHN1Ym1lPTkgcHN5PTAgbWl4ZWRfcmVmPTAgbWVfcmFuZ2U9NCBjaHJvbWFfbWU9MSB0cmVsbGlzPTAgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0wIGNocm9tYV9xcF9vZmZzZXQ9MCB0aHJlYWRzPTYgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTUwIGtleWludF9taW49NSBzY2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmM9Y3FwIG1idHJlZT0wIHFwPTAAgAAAAD5liISscR8A+E4ACAACFoAAITAAAgsAAPgYCoKgoC+L4vi+KAvi+L4YfAEAACMzgABF9AAEUGUgABDJiXnf4AAAAARBmiKUAAAABEGaQpQAAAAEQZpilAAAAARBmoKU"}catch(e){return void resolve(!1)}elem.setAttribute("autoplay",""),elem.style="display:none",document.body.appendChild(elem);var testAutoplay=function(arg){clearTimeout(timeout),elem.removeEventListener("playing",testAutoplay);var supported=arg&&"playing"===arg.type||0!==elem.currentTime;elem.parentNode.removeChild(elem),supported?resolve():reject()};elem.addEventListener("playing",testAutoplay),timeout=setTimeout(testAutoplay,400)})}return{supportsHtmlMediaAutoplay:supportsHtmlMediaAutoplay}}); \ No newline at end of file +define([],function(){"use strict";function supportsHtmlMediaAutoplay(){return new Promise(function(resolve,reject){var timeout,elem=document.createElement("video"),elemStyle=elem.style;if(!("autoplay"in elem))return void reject();elemStyle.position="absolute",elemStyle.height=0,elemStyle.width=0,elem.setAttribute("autoplay","autoplay"),elem.style.display="none",document.body.appendChild(elem);var testAutoplay=function(arg){clearTimeout(timeout),elem.removeEventListener("playing",testAutoplay),elem.removeEventListener("play",testAutoplay);var supported=arg&&"playing"===arg.type||arg&&"play"===arg.type||0!==elem.currentTime;elem.parentNode.removeChild(elem),supported?resolve():reject()};elem.addEventListener("play",testAutoplay),elem.addEventListener("playing",testAutoplay);try{elem.src="data:video/mp4;base64,AAAAHGZ0eXBtcDQyAAAAAG1wNDJpc29tYXZjMQAAAz5tb292AAAAbG12aGQAAAAAzaNacc2jWnEAAV+QAAFfkAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAGGlvZHMAAAAAEICAgAcAT////3//AAACQ3RyYWsAAABcdGtoZAAAAAHNo1pxzaNacQAAAAEAAAAAAAFfkAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAEAAAABAAAAAAAd9tZGlhAAAAIG1kaGQAAAAAzaNacc2jWnEAAV+QAAFfkFXEAAAAAAAhaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAAAAAAGWbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAABVnN0YmwAAACpc3RzZAAAAAAAAAABAAAAmWF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAEAAQAEgAAABIAAAAAAAAAAEOSlZUL0FWQyBDb2RpbmcAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAxYXZjQwH0AAr/4QAZZ/QACq609NQYBBkAAAMAAQAAAwAKjxImoAEABWjOAa8gAAAAEmNvbHJuY2xjAAYAAQAGAAAAGHN0dHMAAAAAAAAAAQAAAAUAAEZQAAAAKHN0c3oAAAAAAAAAAAAAAAUAAAIqAAAACAAAAAgAAAAIAAAACAAAAChzdHNjAAAAAAAAAAIAAAABAAAABAAAAAEAAAACAAAAAQAAAAEAAAAYc3RjbwAAAAAAAAACAAADYgAABaQAAAAUc3RzcwAAAAAAAAABAAAAAQAAABFzZHRwAAAAAAREREREAAAAb3VkdGEAAABnbWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcgAAAAAAAAAAAAAAAAAAAAA6aWxzdAAAADKpdG9vAAAAKmRhdGEAAAABAAAAAEhhbmRCcmFrZSAwLjkuOCAyMDEyMDcxODAwAAACUm1kYXQAAAHkBgX/4NxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxMjAgLSBILjI2NC9NUEVHLTQgQVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDExIC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcveDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MCByZWY9MSBkZWJsb2NrPTE6MDowIGFuYWx5c2U9MHgxOjAgbWU9ZXNhIHN1Ym1lPTkgcHN5PTAgbWl4ZWRfcmVmPTAgbWVfcmFuZ2U9NCBjaHJvbWFfbWU9MSB0cmVsbGlzPTAgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0wIGNocm9tYV9xcF9vZmZzZXQ9MCB0aHJlYWRzPTYgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTUwIGtleWludF9taW49NSBzY2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmM9Y3FwIG1idHJlZT0wIHFwPTAAgAAAAD5liISscR8A+E4ACAACFoAAITAAAgsAAPgYCoKgoC+L4vi+KAvi+L4YfAEAACMzgABF9AAEUGUgABDJiXnf4AAAAARBmiKUAAAABEGaQpQAAAAEQZpilAAAAARBmoKU";var promise=elem.play();promise&&promise.catch&&promise.catch(reject),timeout=setTimeout(testAutoplay,500)}catch(e){return void reject()}})}return{supportsHtmlMediaAutoplay:supportsHtmlMediaAutoplay}}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js b/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js index b9236a5171..596dac1b60 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js @@ -1,2 +1,2 @@ -define(["events","datetime","appSettings","pluginManager","userSettings","globalize","connectionManager","loading","serverNotifications","apphost","fullscreenManager","layoutManager"],function(events,datetime,appSettings,pluginManager,userSettings,globalize,connectionManager,loading,serverNotifications,apphost,fullscreenManager,layoutManager){"use strict";function enableLocalPlaylistManagement(player){return!!player.isLocalPlayer}function bindToFullscreenChange(player){events.on(fullscreenManager,"fullscreenchange",function(){events.trigger(player,"fullscreenchange")})}function PlaybackManager(){function triggerPlayerChange(newPlayer,newTarget,previousPlayer,previousTargetInfo){(newPlayer||previousPlayer)&&(newTarget&&previousTargetInfo&&newTarget.id===previousTargetInfo.id||events.trigger(self,"playerchange",[newPlayer,newTarget,previousPlayer]))}function displayPlayerInLocalGroup(player){return player.isLocalPlayer}function getSupportedCommands(player){if(player.isLocalPlayer){var list=["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","SetMaxStreamingBitrate","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"];return apphost.supports("fullscreenchange")&&!layoutManager.tv&&list.push("ToggleFullscreen"),player.supports&&player.supports("pictureinpicture")&&list.push("PictureInPicture"),list}throw new Error("player must define supported commands")}function createTarget(player){return{name:player.name,id:player.id,playerName:player.name,playableMediaTypes:["Audio","Video","Game"].map(player.canPlayMediaType),isLocalPlayer:player.isLocalPlayer,supportedCommands:getSupportedCommands(player)}}function getPlayerTargets(player){return player.getTargets?player.getTargets():Promise.resolve([createTarget(player)])}function getCurrentSubtitleStream(player){var index=getPlayerData(player).subtitleStreamIndex;return null==index||index===-1?null:getSubtitleStream(player,index)}function getSubtitleStream(player,index){return self.currentMediaSource(player).MediaStreams.filter(function(s){return"Subtitle"===s.Type&&s.Index===index})[0]}function setCurrentPlayerInternal(player,targetInfo){var previousPlayer=currentPlayer,previousTargetInfo=currentTargetInfo;if(player&&!targetInfo&&player.isLocalPlayer&&(targetInfo=createTarget(player)),player&&!targetInfo)throw new Error("targetInfo cannot be null");currentPairingId=null,currentPlayer=player,currentTargetInfo=targetInfo,targetInfo&&console.log("Active player: "+JSON.stringify(targetInfo)),player&&player.isLocalPlayer&&(lastLocalPlayer=player),previousPlayer&&self.endPlayerUpdates(previousPlayer),player&&self.beginPlayerUpdates(player),triggerPlayerChange(player,targetInfo,previousPlayer,previousTargetInfo)}function getAutomaticPlayers(){var player=currentPlayer;return player&&!enableLocalPlaylistManagement(player)?[player]:self.getPlayers().filter(enableLocalPlaylistManagement)}function canPlayerSeek(player){var currentSrc=(player.currentSrc()||"").toLowerCase();return currentSrc.indexOf(".m3u8")!==-1||player.duration()}function changeStream(player,ticks,params){if(canPlayerSeek(player)&&null==params)return void player.currentTime(parseInt(ticks/1e4));params=params||{};var liveStreamId=getPlayerData(player).streamInfo.liveStreamId,playSessionId=getPlayerData(player).streamInfo.playSessionId,playerData=getPlayerData(player),currentItem=playerData.streamInfo.item;player.getDeviceProfile(currentItem).then(function(deviceProfile){var audioStreamIndex=null==params.AudioStreamIndex?getPlayerData(player).audioStreamIndex:params.AudioStreamIndex,subtitleStreamIndex=null==params.SubtitleStreamIndex?getPlayerData(player).subtitleStreamIndex:params.SubtitleStreamIndex,currentMediaSource=playerData.streamInfo.mediaSource,apiClient=connectionManager.getApiClient(currentItem.ServerId);ticks&&(ticks=parseInt(ticks));var maxBitrate=params.MaxStreamingBitrate||self.getMaxStreamingBitrate(player);getPlaybackInfo(apiClient,currentItem.Id,deviceProfile,maxBitrate,ticks,currentMediaSource,audioStreamIndex,subtitleStreamIndex,liveStreamId).then(function(result){validatePlaybackInfoResult(result)&&(currentMediaSource=result.MediaSources[0],createStreamInfo(apiClient,currentItem.MediaType,currentItem,currentMediaSource,ticks).then(function(streamInfo){return streamInfo.fullscreen=currentPlayOptions.fullscreen,streamInfo.url?(getPlayerData(player).subtitleStreamIndex=subtitleStreamIndex,getPlayerData(player).audioStreamIndex=audioStreamIndex,getPlayerData(player).maxStreamingBitrate=maxBitrate,void changeStreamToUrl(apiClient,player,playSessionId,streamInfo)):(showPlaybackInfoErrorMessage("NoCompatibleStream"),void self.nextTrack())}))})})}function changeStreamToUrl(apiClient,player,playSessionId,streamInfo,newPositionTicks){clearProgressInterval(player),getPlayerData(player).isChangingStream=!0,"Video"===getPlayerData(player).MediaType?apiClient.stopActiveEncodings(playSessionId).then(function(){setSrcIntoPlayer(apiClient,player,streamInfo)}):setSrcIntoPlayer(apiClient,player,streamInfo)}function setSrcIntoPlayer(apiClient,player,streamInfo){player.play(streamInfo).then(function(){getPlayerData(player).isChangingStream=!1,getPlayerData(player).streamInfo=streamInfo,startProgressInterval(player),sendProgressUpdate(player)})}function getPlayerData(player){if(!player)throw new Error("player cannot be null");if(!player.name)throw new Error("player name cannot be null");var state=playerStates[player.name];return state||(playerStates[player.name]={},state=playerStates[player.name]),player}function getCurrentTicks(player){var playerTime=Math.floor(1e4*(player||currentPlayer).currentTime());return playerTime+=getPlayerData(player).streamInfo.transcodingOffsetTicks||0}function getNowPlayingItemForReporting(player,item,mediaSource){var nowPlayingItem=Object.assign({},item);return mediaSource&&(nowPlayingItem.RunTimeTicks=mediaSource.RunTimeTicks),nowPlayingItem.RunTimeTicks=nowPlayingItem.RunTimeTicks||1e4*player.duration(),nowPlayingItem}function translateItemsForPlayback(items,options){var promise,firstItem=items[0],serverId=firstItem.ServerId;return"Program"===firstItem.Type?promise=getItemsForPlayback(serverId,{Ids:firstItem.ChannelId}):"Playlist"===firstItem.Type?promise=getItemsForPlayback(serverId,{ParentId:firstItem.Id}):"MusicArtist"===firstItem.Type?promise=getItemsForPlayback(serverId,{ArtistIds:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio"}):"MusicGenre"===firstItem.Type?promise=getItemsForPlayback(serverId,{Genres:firstItem.Name,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio"}):firstItem.IsFolder?promise=getItemsForPlayback(serverId,{ParentId:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio,Video"}):"Episode"===firstItem.Type&&1===items.length&&getPlayer(firstItem,options).supportsProgress!==!1&&(promise=new Promise(function(resolve,reject){var apiClient=connectionManager.getApiClient(firstItem.ServerId);apiClient.getCurrentUser().then(function(user){return user.Configuration.EnableNextEpisodeAutoPlay&&firstItem.SeriesId?void apiClient.getEpisodes(firstItem.SeriesId,{IsVirtualUnaired:!1,IsMissing:!1,UserId:apiClient.getCurrentUserId(),Fields:"MediaSources,Chapters"}).then(function(episodesResult){var foundItem=!1;episodesResult.Items=episodesResult.Items.filter(function(e){return!!foundItem||e.Id===firstItem.Id&&(foundItem=!0,!0)}),episodesResult.TotalRecordCount=episodesResult.Items.length,resolve(episodesResult)},reject):void resolve(null)})})),promise?promise.then(function(result){return result?result.Items:items}):Promise.resolve(items)}function playWithIntros(items,options,user){var firstItem=items[0];"Video"===firstItem.MediaType;var afterPlayInternal=function(){for(var i=0,length=items.length;i=interceptors.length)return void resolve();var interceptor=interceptors[index];interceptor.intercept(options).then(function(){runNextPrePlay(interceptors,index+1,options,resolve,reject)},reject)}function playAfterBitrateDetect(connectionManager,maxBitrate,item,playOptions,onPlaybackStartedFn){var promise,startPosition=playOptions.startPositionTicks,player=getPlayer(item,playOptions),activePlayer=currentPlayer;return activePlayer?(playNextAfterEnded=!1,promise=onPlaybackChanging(activePlayer,player,item)):promise=Promise.resolve(),isServerItem(item)&&"Game"!==item.MediaType?Promise.all([promise,player.getDeviceProfile(item)]).then(function(responses){var deviceProfile=responses[1],apiClient=connectionManager.getApiClient(item.ServerId);return getPlaybackMediaSource(apiClient,deviceProfile,maxBitrate,item,startPosition).then(function(mediaSource){return createStreamInfo(apiClient,item.MediaType,item,mediaSource,startPosition).then(function(streamInfo){return streamInfo.fullscreen=playOptions.fullscreen,getPlayerData(player).isChangingStream=!1,getPlayerData(player).maxStreamingBitrate=maxBitrate,player.play(streamInfo).then(function(){loading.hide(),onPlaybackStartedFn(),onPlaybackStarted(player,streamInfo,mediaSource)})})})}):promise.then(function(){var streamInfo=createStreamInfoFromUrlItem(item);return streamInfo.fullscreen=playOptions.fullscreen,getPlayerData(player).isChangingStream=!1,player.play(streamInfo).then(function(){loading.hide(),onPlaybackStartedFn(),onPlaybackStarted(player,streamInfo)})})}function createStreamInfoFromUrlItem(item){return{url:item.Url||item.Path,playMethod:"DirectPlay",item:item,textTracks:[],mediaType:item.MediaType}}function backdropImageUrl(apiClient,item,options){return options=options||{},options.type=options.type||"Backdrop",options.maxWidth||options.width||options.maxHeight||options.height||(options.quality=100),item.BackdropImageTags&&item.BackdropImageTags.length?(options.tag=item.BackdropImageTags[0],apiClient.getScaledImageUrl(item.Id,options)):item.ParentBackdropImageTags&&item.ParentBackdropImageTags.length?(options.tag=item.ParentBackdropImageTags[0],apiClient.getScaledImageUrl(item.ParentBackdropItemId,options)):null}function getMimeType(type,container){if(container=(container||"").toLowerCase(),"audio"===type){if("opus"===container)return"audio/ogg";if("webma"===container)return"audio/webm";if("m4a"===container)return"audio/mp4"}else if("video"===type){if("mkv"===container)return"video/x-matroska";if("m4v"===container)return"video/mp4";if("mov"===container)return"video/quicktime";if("mpg"===container)return"video/mpeg";if("flv"===container)return"video/x-flv"}return type+"/"+container}function createStreamInfo(apiClient,type,item,mediaSource,startPosition){var mediaUrl,contentType,directOptions,transcodingOffsetTicks=0,playerStartPositionTicks=startPosition,liveStreamId=mediaSource.LiveStreamId,playMethod="Transcode",mediaSourceContainer=(mediaSource.Container||"").toLowerCase();if("Video"===type)contentType=getMimeType("video",mediaSourceContainer),mediaSource.enableDirectPlay?(mediaUrl=mediaSource.Path,playMethod="DirectPlay"):mediaSource.SupportsDirectStream?(directOptions={Static:!0,mediaSourceId:mediaSource.Id,deviceId:apiClient.deviceId(),api_key:apiClient.accessToken()},mediaSource.ETag&&(directOptions.Tag=mediaSource.ETag),mediaSource.LiveStreamId&&(directOptions.LiveStreamId=mediaSource.LiveStreamId),mediaUrl=apiClient.getUrl("Videos/"+item.Id+"/stream."+mediaSourceContainer,directOptions),playMethod="DirectStream"):mediaSource.SupportsTranscoding&&(mediaUrl=apiClient.getUrl(mediaSource.TranscodingUrl),"hls"===mediaSource.TranscodingSubProtocol?contentType="application/x-mpegURL":(playerStartPositionTicks=null,contentType=getMimeType("video",mediaSource.TranscodingContainer),mediaUrl.toLowerCase().indexOf("copytimestamps=true")===-1&&(transcodingOffsetTicks=startPosition||0)));else if("Audio"===type)if(contentType=getMimeType("audio",mediaSourceContainer),mediaSource.enableDirectPlay)mediaUrl=mediaSource.Path,playMethod="DirectPlay";else{var isDirectStream=mediaSource.SupportsDirectStream;isDirectStream?(directOptions={Static:!0,mediaSourceId:mediaSource.Id,deviceId:apiClient.deviceId(),api_key:apiClient.accessToken()},mediaSource.ETag&&(directOptions.Tag=mediaSource.ETag),mediaSource.LiveStreamId&&(directOptions.LiveStreamId=mediaSource.LiveStreamId),mediaUrl=apiClient.getUrl("Audio/"+item.Id+"/stream."+mediaSourceContainer,directOptions),playMethod="DirectStream"):mediaSource.SupportsTranscoding&&(mediaUrl=apiClient.getUrl(mediaSource.TranscodingUrl),"hls"===mediaSource.TranscodingSubProtocol?contentType="application/x-mpegURL":(transcodingOffsetTicks=startPosition||0,playerStartPositionTicks=null,contentType=getMimeType("audio",mediaSource.TranscodingContainer)))}else"Game"===type&&(mediaUrl=mediaSource.Path,playMethod="DirectPlay");!mediaUrl&&mediaSource.SupportsDirectPlay&&(mediaUrl=mediaSource.Path);var resultInfo={url:mediaUrl,mimeType:contentType,transcodingOffsetTicks:transcodingOffsetTicks,playMethod:playMethod,playerStartPositionTicks:playerStartPositionTicks,item:item,mediaSource:mediaSource,textTracks:getTextTracks(apiClient,mediaSource),tracks:getTextTracks(apiClient,mediaSource),mediaType:type,liveStreamId:liveStreamId,playSessionId:getParam("playSessionId",mediaUrl),title:item.Name},backdropUrl=backdropImageUrl(apiClient,item,{});return backdropUrl&&(resultInfo.backdropUrl=backdropUrl),Promise.resolve(resultInfo)}function getParam(name,url){name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regexS="[\\?&]"+name+"=([^&#]*)",regex=new RegExp(regexS,"i"),results=regex.exec(url);return null==results?"":decodeURIComponent(results[1].replace(/\+/g," "))}function getTextTracks(apiClient,mediaSource){for(var subtitleStreams=mediaSource.MediaStreams.filter(function(s){return"Subtitle"===s.Type}),textStreams=subtitleStreams.filter(function(s){return"External"===s.DeliveryMethod}),tracks=[],i=0,length=textStreams.length;i=playlistLength&&(newIndex=0);break;default:newIndex=self.getCurrentPlaylistIndex(player)+1}if(newIndex<0||newIndex>=playlistLength)return null;var item=playlist[newIndex];return item?{item:item,index:newIndex}:null}function queue(options,mode,player){if(player=player||currentPlayer,!player)return self.play(options);if(!enableLocalPlaylistManagement(player))return"next"===mode?player.queueNext(item):player.queue(item);if(options.items)return translateItemsForPlayback(options.items,options).then(function(items){queueAll(items,mode)});if(!options.serverId)throw new Error("serverId required!");return getItemsForPlayback(options.serverId,{Ids:options.ids.join(",")}).then(function(result){return translateItemsForPlayback(result.Items,options).then(function(items){queueAll(items,mode)})})}function queueAll(items,mode){for(var i=0,length=items.length;iintervalTime&&sendProgressUpdate(player)},500)}function sendProgressUpdate(player){player.lastProgressReport=(new Date).getTime(),self.getPlayerState(player).then(function(state){var currentItem=getPlayerData(player).streamInfo.item;reportPlayback(state,currentItem.ServerId,"reportPlaybackProgress")})}function reportPlayback(state,serverId,method){if(serverId){var info={QueueableMediaTypes:state.NowPlayingItem.MediaType,ItemId:state.NowPlayingItem.Id};for(var i in state.PlayState)info[i]=state.PlayState[i];var apiClient=connectionManager.getApiClient(serverId);apiClient[method](info)}}function clearProgressInterval(player){getPlayerData(player).currentProgressInterval&&(clearTimeout(getPlayerData(player).currentProgressInterval),getPlayerData(player).currentProgressInterval=null)}var currentPlayer,currentTargetInfo,lastLocalPlayer,currentPlaylistIndex,currentPlaylistItemId,currentPlayOptions,self=this,players=[],currentPairingId=null,repeatMode="RepeatNone",playlist=[],playNextAfterEnded=!0,playerStates={};self.currentItem=function(player){var data=getPlayerData(player);return data.streamInfo?data.streamInfo.item:null},self.currentMediaSource=function(player){var data=getPlayerData(player);return data.streamInfo?data.streamInfo.mediaSource:null},self.beginPlayerUpdates=function(player){player.beginPlayerUpdates&&player.beginPlayerUpdates()},self.endPlayerUpdates=function(player){player.endPlayerUpdates&&player.endPlayerUpdates()},self.getPlayerInfo=function(){var player=currentPlayer;if(!player)return null;var target=currentTargetInfo||{};return{name:player.name,isLocalPlayer:player.isLocalPlayer,id:target.id,deviceName:target.deviceName,playableMediaTypes:target.playableMediaTypes,supportedCommands:target.supportedCommands}},self.setActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name){if(currentPlayer&¤tPlayer.isLocalPlayer)return;return void setCurrentPlayerInternal(null,null)}if("string"==typeof player&&(player=players.filter(function(p){return p.name===player})[0]),!player)throw new Error("null player");setCurrentPlayerInternal(player,targetInfo)},self.trySetActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name)return void(currentPlayer&¤tPlayer.isLocalPlayer);if("string"==typeof player&&(player=players.filter(function(p){return p.name===player})[0]),!player)throw new Error("null player");if(currentPairingId!==targetInfo.id){currentPairingId=targetInfo.id;var promise=player.tryPair?player.tryPair(targetInfo):Promise.resolve();promise.then(function(){setCurrentPlayerInternal(player,targetInfo)},function(){currentPairingId===targetInfo.id&&(currentPairingId=null)})}},self.trySetActiveDeviceName=function(name){function normalizeName(t){return t.toLowerCase().replace(" ","")}name=normalizeName(name),self.getTargets().then(function(result){var target=result.filter(function(p){return normalizeName(p.name)===name})[0];target&&self.trySetActivePlayer(target.playerName,target)})},self.setDefaultPlayerActive=function(){self.setActivePlayer("localplayer")},self.removeActivePlayer=function(name){var playerInfo=self.getPlayerInfo();playerInfo&&playerInfo.name===name&&self.setDefaultPlayerActive()},self.removeActiveTarget=function(id){var playerInfo=self.getPlayerInfo();playerInfo&&playerInfo.id===id&&self.setDefaultPlayerActive()},self.disconnectFromPlayer=function(){var playerInfo=self.getPlayerInfo();playerInfo&&(playerInfo.supportedCommands.indexOf("EndSession")!==-1?require(["dialog"],function(dialog){var menuItems=[];menuItems.push({name:globalize.translate("ButtonYes"),id:"yes"}),menuItems.push({name:globalize.translate("ButtonNo"),id:"no"}),dialog({buttons:menuItems,text:globalize.translate("ConfirmEndPlayerSession")}).then(function(id){switch(id){case"yes":self.getCurrentPlayer().endSession(),self.setDefaultPlayerActive(); +define(["events","datetime","appSettings","pluginManager","userSettings","globalize","connectionManager","loading","serverNotifications","apphost","fullscreenManager","layoutManager"],function(events,datetime,appSettings,pluginManager,userSettings,globalize,connectionManager,loading,serverNotifications,apphost,fullscreenManager,layoutManager){"use strict";function enableLocalPlaylistManagement(player){return!!player.isLocalPlayer}function bindToFullscreenChange(player){events.on(fullscreenManager,"fullscreenchange",function(){events.trigger(player,"fullscreenchange")})}function PlaybackManager(){function triggerPlayerChange(newPlayer,newTarget,previousPlayer,previousTargetInfo){(newPlayer||previousPlayer)&&(newTarget&&previousTargetInfo&&newTarget.id===previousTargetInfo.id||events.trigger(self,"playerchange",[newPlayer,newTarget,previousPlayer]))}function displayPlayerInLocalGroup(player){return player.isLocalPlayer}function getSupportedCommands(player){if(player.isLocalPlayer){var list=["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","SetMaxStreamingBitrate","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"];return apphost.supports("fullscreenchange")&&!layoutManager.tv&&list.push("ToggleFullscreen"),player.supports&&player.supports("pictureinpicture")&&list.push("PictureInPicture"),list}throw new Error("player must define supported commands")}function createTarget(player){return{name:player.name,id:player.id,playerName:player.name,playableMediaTypes:["Audio","Video","Game"].map(player.canPlayMediaType),isLocalPlayer:player.isLocalPlayer,supportedCommands:getSupportedCommands(player)}}function getPlayerTargets(player){return player.getTargets?player.getTargets():Promise.resolve([createTarget(player)])}function getCurrentSubtitleStream(player){var index=getPlayerData(player).subtitleStreamIndex;return null==index||index===-1?null:getSubtitleStream(player,index)}function getSubtitleStream(player,index){return self.currentMediaSource(player).MediaStreams.filter(function(s){return"Subtitle"===s.Type&&s.Index===index})[0]}function setCurrentPlayerInternal(player,targetInfo){var previousPlayer=currentPlayer,previousTargetInfo=currentTargetInfo;if(player&&!targetInfo&&player.isLocalPlayer&&(targetInfo=createTarget(player)),player&&!targetInfo)throw new Error("targetInfo cannot be null");currentPairingId=null,currentPlayer=player,currentTargetInfo=targetInfo,targetInfo&&console.log("Active player: "+JSON.stringify(targetInfo)),player&&player.isLocalPlayer&&(lastLocalPlayer=player),previousPlayer&&self.endPlayerUpdates(previousPlayer),player&&self.beginPlayerUpdates(player),triggerPlayerChange(player,targetInfo,previousPlayer,previousTargetInfo)}function getAutomaticPlayers(){var player=currentPlayer;return player&&!enableLocalPlaylistManagement(player)?[player]:self.getPlayers().filter(enableLocalPlaylistManagement)}function canPlayerSeek(player){var currentSrc=(player.currentSrc()||"").toLowerCase();return currentSrc.indexOf(".m3u8")!==-1||player.duration()}function changeStream(player,ticks,params){if(canPlayerSeek(player)&&null==params)return void player.currentTime(parseInt(ticks/1e4));params=params||{};var liveStreamId=getPlayerData(player).streamInfo.liveStreamId,playSessionId=getPlayerData(player).streamInfo.playSessionId,playerData=getPlayerData(player),currentItem=playerData.streamInfo.item;player.getDeviceProfile(currentItem).then(function(deviceProfile){var audioStreamIndex=null==params.AudioStreamIndex?getPlayerData(player).audioStreamIndex:params.AudioStreamIndex,subtitleStreamIndex=null==params.SubtitleStreamIndex?getPlayerData(player).subtitleStreamIndex:params.SubtitleStreamIndex,currentMediaSource=playerData.streamInfo.mediaSource,apiClient=connectionManager.getApiClient(currentItem.ServerId);ticks&&(ticks=parseInt(ticks));var maxBitrate=params.MaxStreamingBitrate||self.getMaxStreamingBitrate(player);getPlaybackInfo(apiClient,currentItem.Id,deviceProfile,maxBitrate,ticks,currentMediaSource,audioStreamIndex,subtitleStreamIndex,liveStreamId).then(function(result){validatePlaybackInfoResult(result)&&(currentMediaSource=result.MediaSources[0],createStreamInfo(apiClient,currentItem.MediaType,currentItem,currentMediaSource,ticks).then(function(streamInfo){return streamInfo.fullscreen=currentPlayOptions.fullscreen,streamInfo.url?(getPlayerData(player).subtitleStreamIndex=subtitleStreamIndex,getPlayerData(player).audioStreamIndex=audioStreamIndex,getPlayerData(player).maxStreamingBitrate=maxBitrate,void changeStreamToUrl(apiClient,player,playSessionId,streamInfo)):(showPlaybackInfoErrorMessage("NoCompatibleStream"),void self.nextTrack())}))})})}function changeStreamToUrl(apiClient,player,playSessionId,streamInfo,newPositionTicks){clearProgressInterval(player),getPlayerData(player).isChangingStream=!0,"Video"===getPlayerData(player).MediaType?apiClient.stopActiveEncodings(playSessionId).then(function(){setSrcIntoPlayer(apiClient,player,streamInfo)}):setSrcIntoPlayer(apiClient,player,streamInfo)}function setSrcIntoPlayer(apiClient,player,streamInfo){player.play(streamInfo).then(function(){getPlayerData(player).isChangingStream=!1,getPlayerData(player).streamInfo=streamInfo,startProgressInterval(player),sendProgressUpdate(player)})}function getPlayerData(player){if(!player)throw new Error("player cannot be null");if(!player.name)throw new Error("player name cannot be null");var state=playerStates[player.name];return state||(playerStates[player.name]={},state=playerStates[player.name]),player}function getCurrentTicks(player){var playerTime=Math.floor(1e4*(player||currentPlayer).currentTime());return playerTime+=getPlayerData(player).streamInfo.transcodingOffsetTicks||0}function getNowPlayingItemForReporting(player,item,mediaSource){var nowPlayingItem=Object.assign({},item);return mediaSource&&(nowPlayingItem.RunTimeTicks=mediaSource.RunTimeTicks),nowPlayingItem.RunTimeTicks=nowPlayingItem.RunTimeTicks||1e4*player.duration(),nowPlayingItem}function translateItemsForPlayback(items,options){var promise,firstItem=items[0],serverId=firstItem.ServerId;return"Program"===firstItem.Type?promise=getItemsForPlayback(serverId,{Ids:firstItem.ChannelId}):"Playlist"===firstItem.Type?promise=getItemsForPlayback(serverId,{ParentId:firstItem.Id}):"MusicArtist"===firstItem.Type?promise=getItemsForPlayback(serverId,{ArtistIds:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio"}):"MusicGenre"===firstItem.Type?promise=getItemsForPlayback(serverId,{Genres:firstItem.Name,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio"}):firstItem.IsFolder?promise=getItemsForPlayback(serverId,{ParentId:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio,Video"}):"Episode"===firstItem.Type&&1===items.length&&getPlayer(firstItem,options).supportsProgress!==!1&&(promise=new Promise(function(resolve,reject){var apiClient=connectionManager.getApiClient(firstItem.ServerId);apiClient.getCurrentUser().then(function(user){return user.Configuration.EnableNextEpisodeAutoPlay&&firstItem.SeriesId?void apiClient.getEpisodes(firstItem.SeriesId,{IsVirtualUnaired:!1,IsMissing:!1,UserId:apiClient.getCurrentUserId(),Fields:"MediaSources,Chapters"}).then(function(episodesResult){var foundItem=!1;episodesResult.Items=episodesResult.Items.filter(function(e){return!!foundItem||e.Id===firstItem.Id&&(foundItem=!0,!0)}),episodesResult.TotalRecordCount=episodesResult.Items.length,resolve(episodesResult)},reject):void resolve(null)})})),promise?promise.then(function(result){return result?result.Items:items}):Promise.resolve(items)}function playWithIntros(items,options,user){var firstItem=items[0];"Video"===firstItem.MediaType;var afterPlayInternal=function(){for(var i=0,length=items.length;i=interceptors.length)return void resolve();var interceptor=interceptors[index];interceptor.intercept(options).then(function(){runNextPrePlay(interceptors,index+1,options,resolve,reject)},reject)}function playAfterBitrateDetect(connectionManager,maxBitrate,item,playOptions,onPlaybackStartedFn){var promise,startPosition=playOptions.startPositionTicks,player=getPlayer(item,playOptions),activePlayer=currentPlayer;return activePlayer?(playNextAfterEnded=!1,promise=onPlaybackChanging(activePlayer,player,item)):promise=Promise.resolve(),isServerItem(item)&&"Game"!==item.MediaType?Promise.all([promise,player.getDeviceProfile(item)]).then(function(responses){var deviceProfile=responses[1],apiClient=connectionManager.getApiClient(item.ServerId);return getPlaybackMediaSource(apiClient,deviceProfile,maxBitrate,item,startPosition).then(function(mediaSource){return createStreamInfo(apiClient,item.MediaType,item,mediaSource,startPosition).then(function(streamInfo){return streamInfo.fullscreen=playOptions.fullscreen,getPlayerData(player).isChangingStream=!1,getPlayerData(player).maxStreamingBitrate=maxBitrate,player.play(streamInfo).then(function(){loading.hide(),onPlaybackStartedFn(),onPlaybackStarted(player,streamInfo,mediaSource)})})})}):promise.then(function(){var streamInfo=createStreamInfoFromUrlItem(item);return streamInfo.fullscreen=playOptions.fullscreen,getPlayerData(player).isChangingStream=!1,player.play(streamInfo).then(function(){loading.hide(),onPlaybackStartedFn(),onPlaybackStarted(player,streamInfo)})})}function createStreamInfoFromUrlItem(item){return{url:item.Url||item.Path,playMethod:"DirectPlay",item:item,textTracks:[],mediaType:item.MediaType}}function backdropImageUrl(apiClient,item,options){return options=options||{},options.type=options.type||"Backdrop",options.maxWidth||options.width||options.maxHeight||options.height||(options.quality=100),item.BackdropImageTags&&item.BackdropImageTags.length?(options.tag=item.BackdropImageTags[0],apiClient.getScaledImageUrl(item.Id,options)):item.ParentBackdropImageTags&&item.ParentBackdropImageTags.length?(options.tag=item.ParentBackdropImageTags[0],apiClient.getScaledImageUrl(item.ParentBackdropItemId,options)):null}function getMimeType(type,container){if(container=(container||"").toLowerCase(),"audio"===type){if("opus"===container)return"audio/ogg";if("webma"===container)return"audio/webm";if("m4a"===container)return"audio/mp4"}else if("video"===type){if("mkv"===container)return"video/x-matroska";if("m4v"===container)return"video/mp4";if("mov"===container)return"video/quicktime";if("mpg"===container)return"video/mpeg";if("flv"===container)return"video/x-flv"}return type+"/"+container}function createStreamInfo(apiClient,type,item,mediaSource,startPosition){var mediaUrl,contentType,directOptions,transcodingOffsetTicks=0,playerStartPositionTicks=startPosition,liveStreamId=mediaSource.LiveStreamId,playMethod="Transcode",mediaSourceContainer=(mediaSource.Container||"").toLowerCase();if("Video"===type)contentType=getMimeType("video",mediaSourceContainer),mediaSource.enableDirectPlay?(mediaUrl=mediaSource.Path,playMethod="DirectPlay"):mediaSource.SupportsDirectStream?(directOptions={Static:!0,mediaSourceId:mediaSource.Id,deviceId:apiClient.deviceId(),api_key:apiClient.accessToken()},mediaSource.ETag&&(directOptions.Tag=mediaSource.ETag),mediaSource.LiveStreamId&&(directOptions.LiveStreamId=mediaSource.LiveStreamId),mediaUrl=apiClient.getUrl("Videos/"+item.Id+"/stream."+mediaSourceContainer,directOptions),playMethod="DirectStream"):mediaSource.SupportsTranscoding&&(mediaUrl=apiClient.getUrl(mediaSource.TranscodingUrl),"hls"===mediaSource.TranscodingSubProtocol?contentType="application/x-mpegURL":(playerStartPositionTicks=null,contentType=getMimeType("video",mediaSource.TranscodingContainer),mediaUrl.toLowerCase().indexOf("copytimestamps=true")===-1&&(transcodingOffsetTicks=startPosition||0)));else if("Audio"===type)if(contentType=getMimeType("audio",mediaSourceContainer),mediaSource.enableDirectPlay)mediaUrl=mediaSource.Path,playMethod="DirectPlay";else{var isDirectStream=mediaSource.SupportsDirectStream;isDirectStream?(directOptions={Static:!0,mediaSourceId:mediaSource.Id,deviceId:apiClient.deviceId(),api_key:apiClient.accessToken()},mediaSource.ETag&&(directOptions.Tag=mediaSource.ETag),mediaSource.LiveStreamId&&(directOptions.LiveStreamId=mediaSource.LiveStreamId),mediaUrl=apiClient.getUrl("Audio/"+item.Id+"/stream."+mediaSourceContainer,directOptions),playMethod="DirectStream"):mediaSource.SupportsTranscoding&&(mediaUrl=apiClient.getUrl(mediaSource.TranscodingUrl),"hls"===mediaSource.TranscodingSubProtocol?contentType="application/x-mpegURL":(transcodingOffsetTicks=startPosition||0,playerStartPositionTicks=null,contentType=getMimeType("audio",mediaSource.TranscodingContainer)))}else"Game"===type&&(mediaUrl=mediaSource.Path,playMethod="DirectPlay");!mediaUrl&&mediaSource.SupportsDirectPlay&&(mediaUrl=mediaSource.Path);var resultInfo={url:mediaUrl,mimeType:contentType,transcodingOffsetTicks:transcodingOffsetTicks,playMethod:playMethod,playerStartPositionTicks:playerStartPositionTicks,item:item,mediaSource:mediaSource,textTracks:getTextTracks(apiClient,mediaSource),tracks:getTextTracks(apiClient,mediaSource),mediaType:type,liveStreamId:liveStreamId,playSessionId:getParam("playSessionId",mediaUrl),title:item.Name},backdropUrl=backdropImageUrl(apiClient,item,{});return backdropUrl&&(resultInfo.backdropUrl=backdropUrl),Promise.resolve(resultInfo)}function getParam(name,url){name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regexS="[\\?&]"+name+"=([^&#]*)",regex=new RegExp(regexS,"i"),results=regex.exec(url);return null==results?"":decodeURIComponent(results[1].replace(/\+/g," "))}function getTextTracks(apiClient,mediaSource){for(var subtitleStreams=mediaSource.MediaStreams.filter(function(s){return"Subtitle"===s.Type}),textStreams=subtitleStreams.filter(function(s){return"External"===s.DeliveryMethod}),tracks=[],i=0,length=textStreams.length;i=playlistLength&&(newIndex=0);break;default:newIndex=self.getCurrentPlaylistIndex(player)+1}if(newIndex<0||newIndex>=playlistLength)return null;var item=playlist[newIndex];return item?{item:item,index:newIndex}:null}function queue(options,mode,player){if(player=player||currentPlayer,!player)return self.play(options);if(!enableLocalPlaylistManagement(player))return"next"===mode?player.queueNext(item):player.queue(item);if(options.items)return translateItemsForPlayback(options.items,options).then(function(items){queueAll(items,mode)});if(!options.serverId)throw new Error("serverId required!");return getItemsForPlayback(options.serverId,{Ids:options.ids.join(",")}).then(function(result){return translateItemsForPlayback(result.Items,options).then(function(items){queueAll(items,mode)})})}function queueAll(items,mode){for(var i=0,length=items.length;iintervalTime&&sendProgressUpdate(player)},500)}function sendProgressUpdate(player){player.lastProgressReport=(new Date).getTime(),self.getPlayerState(player).then(function(state){var currentItem=getPlayerData(player).streamInfo.item;reportPlayback(state,currentItem.ServerId,"reportPlaybackProgress")})}function reportPlayback(state,serverId,method){if(serverId){var info={QueueableMediaTypes:state.NowPlayingItem.MediaType,ItemId:state.NowPlayingItem.Id};for(var i in state.PlayState)info[i]=state.PlayState[i];var apiClient=connectionManager.getApiClient(serverId);apiClient[method](info)}}function clearProgressInterval(player){getPlayerData(player).currentProgressInterval&&(clearTimeout(getPlayerData(player).currentProgressInterval),getPlayerData(player).currentProgressInterval=null)}var currentPlayer,currentTargetInfo,lastLocalPlayer,currentPlaylistIndex,currentPlaylistItemId,currentPlayOptions,self=this,players=[],currentPairingId=null,repeatMode="RepeatNone",playlist=[],playNextAfterEnded=!0,playerStates={};self.currentItem=function(player){var data=getPlayerData(player);return data.streamInfo?data.streamInfo.item:null},self.currentMediaSource=function(player){var data=getPlayerData(player);return data.streamInfo?data.streamInfo.mediaSource:null},self.beginPlayerUpdates=function(player){player.beginPlayerUpdates&&player.beginPlayerUpdates()},self.endPlayerUpdates=function(player){player.endPlayerUpdates&&player.endPlayerUpdates()},self.getPlayerInfo=function(){var player=currentPlayer;if(!player)return null;var target=currentTargetInfo||{};return{name:player.name,isLocalPlayer:player.isLocalPlayer,id:target.id,deviceName:target.deviceName,playableMediaTypes:target.playableMediaTypes,supportedCommands:target.supportedCommands}},self.setActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name){if(currentPlayer&¤tPlayer.isLocalPlayer)return;return void setCurrentPlayerInternal(null,null)}if("string"==typeof player&&(player=players.filter(function(p){return p.name===player})[0]),!player)throw new Error("null player");setCurrentPlayerInternal(player,targetInfo)},self.trySetActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name)return void(currentPlayer&¤tPlayer.isLocalPlayer);if("string"==typeof player&&(player=players.filter(function(p){return p.name===player})[0]),!player)throw new Error("null player");if(currentPairingId!==targetInfo.id){currentPairingId=targetInfo.id;var promise=player.tryPair?player.tryPair(targetInfo):Promise.resolve();promise.then(function(){setCurrentPlayerInternal(player,targetInfo)},function(){currentPairingId===targetInfo.id&&(currentPairingId=null)})}},self.trySetActiveDeviceName=function(name){function normalizeName(t){return t.toLowerCase().replace(" ","")}name=normalizeName(name),self.getTargets().then(function(result){var target=result.filter(function(p){return normalizeName(p.name)===name})[0];target&&self.trySetActivePlayer(target.playerName,target)})},self.setDefaultPlayerActive=function(){self.setActivePlayer("localplayer")},self.removeActivePlayer=function(name){var playerInfo=self.getPlayerInfo();playerInfo&&playerInfo.name===name&&self.setDefaultPlayerActive()},self.removeActiveTarget=function(id){var playerInfo=self.getPlayerInfo();playerInfo&&playerInfo.id===id&&self.setDefaultPlayerActive()},self.disconnectFromPlayer=function(){var playerInfo=self.getPlayerInfo();playerInfo&&(playerInfo.supportedCommands.indexOf("EndSession")!==-1?require(["dialog"],function(dialog){var menuItems=[];menuItems.push({name:globalize.translate("ButtonYes"),id:"yes"}),menuItems.push({name:globalize.translate("ButtonNo"),id:"no"}),dialog({buttons:menuItems,text:globalize.translate("ConfirmEndPlayerSession")}).then(function(id){switch(id){case"yes":self.getCurrentPlayer().endSession(),self.setDefaultPlayerActive(); break;case"no":self.setDefaultPlayerActive()}})}):self.setDefaultPlayerActive())},self.getTargets=function(){var promises=players.filter(function(p){return!displayPlayerInLocalGroup(p)}).map(getPlayerTargets);return Promise.all(promises).then(function(responses){var targets=[];targets.push({name:globalize.translate("sharedcomponents#HeaderMyDevice"),id:"localplayer",playerName:"localplayer",playableMediaTypes:["Audio","Video","Game"],isLocalPlayer:!0,supportedCommands:getSupportedCommands({isLocalPlayer:!0})});for(var i=0;idatetime.parseISO8601Date(item.EndDate).getTime()||(new Date).getTime()ticks})[0];nextChapter?self.seek(nextChapter.StartPositionTicks,player):self.nextTrack(player)},self.previousChapter=function(player){player=player||currentPlayer;var item=self.currentItem(player),ticks=getCurrentTicks(player);ticks-=1e8,0===self.getCurrentPlaylistIndex(player)&&(ticks=Math.max(ticks,0));var previousChapters=(item.Chapters||[]).filter(function(i){return i.StartPositionTicks<=ticks});previousChapters.length?self.seek(previousChapters[previousChapters.length-1].StartPositionTicks,player):self.previousTrack(player)},self.fastForward=function(player){if(player=player||currentPlayer,null!=player.fastForward)return void player.fastForward(userSettings.skipForwardLength());var ticks=getCurrentTicks(player);ticks+=1e4*userSettings.skipForwardLength();var runTimeTicks=self.duration(player)||0;ticks0||canPlayerSeek(player)),item&&(state.NowPlayingItem=getNowPlayingItemForReporting(player,item,mediaSource)),state.MediaSource=mediaSource,Promise.resolve(state)},self.currentTime=function(player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.currentTime():getCurrentTicks(player)},self.duration=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.duration();var streamInfo=getPlayerData(player).streamInfo;if(streamInfo&&streamInfo.mediaSource&&streamInfo.mediaSource.RunTimeTicks)return streamInfo.mediaSource.RunTimeTicks;var playerDuration=player.duration();return playerDuration&&(playerDuration*=1e4),playerDuration};var currentId=0;self.getSubtitleUrl=function(textStream,serverId){var apiClient=connectionManager.getApiClient(serverId),textStreamUrl=textStream.IsExternalUrl?textStream.DeliveryUrl:apiClient.getUrl(textStream.DeliveryUrl);return textStreamUrl},self.setCurrentPlaylistItem=function(playlistItemId,player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.setCurrentPlaylistItem(playlistItemId);for(var newItem,newItemIndex,i=0,length=playlist.length;i=playlist.length)throw new Error("newIndex out of bounds");moveInArray(playlist,oldIndex,newIndex),events.trigger(player,"playlistitemmove",[{playlistItemId:playlistItemId,newIndex:newIndex}])}},self.getCurrentPlaylistIndex=function(i,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getCurrentPlaylistIndex():findPlaylistIndex(currentPlaylistItemId,playlist)},self.getCurrentPlaylistItemId=function(i,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getCurrentPlaylistItemId():currentPlaylistItemId},self.setRepeatMode=function(value,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.setRepeatMode(value):(repeatMode=value,void events.trigger(player,"repeatmodechange"))},self.getRepeatMode=function(player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getRepeatMode():repeatMode},self.nextTrack=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.nextTrack();var newItemInfo=getNextItemInfo(player);if(newItemInfo){console.log("playing next track");var playOptions=Object.assign({},currentPlayOptions,{startPositionTicks:0});playInternal(newItemInfo.item,playOptions,function(){setPlaylistState(newItemInfo.item.PlaylistItemId,newItemInfo.index)})}},self.previousTrack=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.previousTrack();var newIndex=self.getCurrentPlaylistIndex(player)-1;if(newIndex>=0){var newItem=playlist[newIndex];if(newItem){var playOptions=Object.assign({},currentPlayOptions,{startPositionTicks:0});playInternal(newItem,playOptions,function(){setPlaylistState(newItem.PlaylistItemId,newIndex)})}}},self.queue=function(options,player){queue(options,"",player)},self.queueNext=function(options,player){queue(options,"next",player)},events.on(pluginManager,"registered",function(e,plugin){"mediaplayer"===plugin.type&&initMediaPlayer(plugin)}),pluginManager.ofType("mediaplayer").map(initMediaPlayer),window.addEventListener("beforeunload",function(e){var player=currentPlayer;player&&getPlayerData(player).currentProgressInterval&&(playNextAfterEnded=!1,onPlaybackStopped.call(player))}),events.on(serverNotifications,"ServerShuttingDown",function(e,apiClient,data){self.setDefaultPlayerActive()}),events.on(serverNotifications,"ServerRestarting",function(e,apiClient,data){self.setDefaultPlayerActive()})}return new PlaybackManager}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js b/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js index 381fa7baec..21b94d5869 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js +++ b/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js @@ -1 +1 @@ -define(["browser","layoutManager","dom","focusManager","scrollStyles"],function(browser,layoutManager,dom,focusManager){"use strict";function type(value){return null==value?String(value):"object"==typeof value||"function"==typeof value?Object.prototype.toString.call(value).match(/\s([a-z]+)/i)[1].toLowerCase()||"object":typeof value}function disableOneEvent(event){event.preventDefault(),event.stopPropagation(),this.removeEventListener(event.type,disableOneEvent)}function within(number,min,max){return numbermax?max:number}var dragMouseEvents=["mousemove","mouseup"],dragTouchEvents=["touchmove","touchend"],wheelEvent=document.implementation.hasFeature("Event.wheel","3.0")?"wheel":"mousewheel",interactiveElements=["INPUT","SELECT","TEXTAREA"],abs=Math.abs,sqrt=Math.sqrt,pow=Math.pow,round=Math.round,max=Math.max,scrollerFactory=(Math.min,function(frame,options){function sibling(n,elem){for(var matched=[];n;n=n.nextSibling)1===n.nodeType&&n!==elem&&matched.push(n);return matched}function load(isInit){frameSize=getWidthOrHeight(frameElement,o.horizontal?"width":"height");var slideeSize=o.scrollWidth||Math.max(slideeElement[o.horizontal?"offsetWidth":"offsetHeight"],slideeElement[o.horizontal?"scrollWidth":"scrollHeight"]);pos.start=0,pos.end=max(slideeSize-frameSize,0),isInit||slideTo(within(pos.dest,pos.start,pos.end))}function getWidthOrHeight(elem,name,extra){var valueIsBorderBox=!0,val="width"===name?elem.offsetWidth:elem.offsetHeight,styles=getComputedStyle(elem,null),isBorderBox="border-box"===styles.getPropertyValue("box-sizing");if(val<=0||null==val){if((val<0||null==val)&&(val=elem.style[name]),rnumnonpx.test(val))return val;valueIsBorderBox=isBorderBox&&(support.boxSizingReliable()||val===elem.style[name]),val=parseFloat(val)||0}return val+augmentWidthOrHeight(elem,name,extra||(isBorderBox?"border":"content"),valueIsBorderBox,styles)}function augmentWidthOrHeight(elem,name,extra,isBorderBox,styles){for(var i=extra===(isBorderBox?"border":"content")?4:"width"===name?1:0,val=0;i<4;i+=2);return val}function nativeScrollTo(container,pos,immediate){!immediate&&container.scrollTo?o.horizontal?container.scrollTo(pos,0):container.scrollTo(0,pos):o.horizontal?container.scrollLeft=Math.round(pos):container.scrollTop=Math.round(pos)}function slideTo(newPos,immediate){return newPos=within(newPos,pos.start,pos.end),transform?(animation.from=pos.cur,animation.to=newPos,animation.tweesing=dragging.tweese||dragging.init&&!dragging.slidee,animation.immediate=!animation.tweesing&&(immediate||dragging.init&&dragging.slidee||!o.speed),dragging.tweese=0,void(newPos!==pos.dest&&(pos.dest=newPos,renderAnimate(animation)))):void nativeScrollTo(slideeElement,newPos,immediate)}function renderAnimate(){var obj=getComputedStyle(slideeElement,null).getPropertyValue("transform").match(/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/);obj&&(pos.cur=parseInt(o.horizontal?obj[1]:obj[2])*-1);var keyframes;animation.to=round(animation.to),keyframes=o.horizontal?[{transform:"translate3d("+-round(pos.cur||animation.from)+"px, 0, 0)",offset:0},{transform:"translate3d("+-round(animation.to)+"px, 0, 0)",offset:1}]:[{transform:"translate3d(0, "+-round(pos.cur||animation.from)+"px, 0)",offset:0},{transform:"translate3d(0, "+-round(animation.to)+"px, 0)",offset:1}];var speed=o.speed;animation.immediate&&(speed=o.immediateSpeed||50,browser.animate||(o.immediateSpeed=0));var animationConfig={duration:speed,iterations:1,fill:"both"};browser.animate&&(animationConfig.easing="ease-out");var animationInstance=slideeElement.animate(keyframes,animationConfig);animationInstance.onfinish=function(){pos.cur=animation.to,document.dispatchEvent(scrollEvent)}}function getBoundingClientRect(elem){return elem.getBoundingClientRect?elem.getBoundingClientRect():{top:0,left:0}}function to(location,item,immediate){if("boolean"===type(item)&&(immediate=item,item=void 0),void 0===item)slideTo(pos[location],immediate);else{var itemPos=self.getPos(item);itemPos&&slideTo(itemPos[location],immediate,!0)}}function continuousInit(source){dragging.released=0,dragging.source=source,dragging.slidee="slidee"===source}function dragInitSlidee(event){dragInit(event,"slidee")}function dragInit(event,source){var isTouch="touchstart"===event.type,isSlidee="slidee"===source;if(!(dragging.init||!isTouch&&isInteractive(event.target))&&(!isSlidee||(isTouch?o.touchDragging:o.mouseDragging&&event.which<2))){isTouch||event.preventDefault(),continuousInit(source),dragging.init=0,dragging.source=event.target,dragging.touch=isTouch;var pointer=isTouch?event.touches[0]:event;dragging.initX=pointer.pageX,dragging.initY=pointer.pageY,dragging.initPos=isSlidee?pos.cur:hPos.cur,dragging.start=+new Date,dragging.time=0,dragging.path=0,dragging.delta=0,dragging.locked=0,dragging.pathToLock=isSlidee?isTouch?30:10:0,isTouch?dragTouchEvents.forEach(function(eventName){dom.addEventListener(document,eventName,dragHandler,{passive:!0})}):dragMouseEvents.forEach(function(eventName){dom.addEventListener(document,eventName,dragHandler,{passive:!0})}),isSlidee&&slideeElement.classList.add(o.draggedClass)}}function dragHandler(event){dragging.released="mouseup"===event.type||"touchend"===event.type;var pointer=dragging.touch?event[dragging.released?"changedTouches":"touches"][0]:event;if(dragging.pathX=pointer.pageX-dragging.initX,dragging.pathY=pointer.pageY-dragging.initY,dragging.path=sqrt(pow(dragging.pathX,2)+pow(dragging.pathY,2)),dragging.delta=o.horizontal?dragging.pathX:dragging.pathY,dragging.released||!(dragging.path<1)){if(!dragging.init){if(dragging.pathabs(dragging.pathY):abs(dragging.pathX)dragging.pathToLock&&dragging.slidee&&(dragging.locked=1,dragging.source.addEventListener("click",disableOneEvent)),dragging.released&&dragEnd(),slideTo(dragging.slidee?round(dragging.initPos-dragging.delta):handleToSlidee(dragging.initPos+dragging.delta))}}function dragEnd(){dragging.released=!0,dragging.touch?dragTouchEvents.forEach(function(eventName){dom.removeEventListener(document,eventName,dragHandler,{passive:!0})}):dragMouseEvents.forEach(function(eventName){dom.removeEventListener(document,eventName,dragHandler,{passive:!0})}),dragging.slidee&&slideeElement.classList.remove(o.draggedClass),setTimeout(function(){dragging.source.removeEventListener("click",disableOneEvent)}),dragging.init=0}function isInteractive(element){for(;element;){if(interactiveElements.indexOf(element.tagName)!==-1)return!0;element=element.parentNode}return!1}function normalizeWheelDelta(event){return scrolling.curDelta=(o.horizontal?event.deltaY||event.deltaX:event.deltaY)||-event.wheelDelta,transform&&(scrolling.curDelta/=1===event.deltaMode?3:100),scrolling.curDelta}function scrollHandler(event){if(o.scrollBy&&pos.start!==pos.end){var delta=normalizeWheelDelta(event);transform?(delta>0&&pos.destpos.start,self.slideBy(o.scrollBy*delta)):(isSmoothScrollSupported&&(delta*=12),o.horizontal?slideeElement.scrollLeft+=delta:slideeElement.scrollTop+=delta)}}function onResize(){load(!1)}function resetScroll(){o.horizontal?this.scrollLeft=0:this.scrollTop=0}function onFrameClick(e){if(1===e.which){var focusableParent=focusManager.focusableParent(e.target);focusableParent&&focusableParent!==document.activeElement&&focusableParent.focus()}}var o=Object.assign({},{slidee:null,horizontal:!1,scrollSource:null,scrollBy:0,scrollHijack:300,dragSource:null,mouseDragging:1,touchDragging:1,swingSpeed:.2,dragThreshold:3,intervactive:null,speed:0,draggedClass:"dragged",activeClass:"active",disabledClass:"disabled"},options),isSmoothScrollSupported="scrollBehavior"in document.documentElement.style;isSmoothScrollSupported&&browser.firefox?options.enableNativeScroll=!0:options.requireAnimation?options.enableNativeScroll=!1:layoutManager.tv&&browser.animate||(options.enableNativeScroll=!0);var self=this;self.options=o;var frameElement=frame,slideeElement=o.slidee?o.slidee:sibling(frameElement.firstChild)[0],frameSize=0,pos={start:0,center:0,end:0,cur:0,dest:0},transform=!options.enableNativeScroll,hPos={start:0,end:0,cur:0},scrollSource=o.scrollSource?o.scrollSource:frameElement,dragSourceElement=o.dragSource?o.dragSource:frameElement,animation={},dragging={released:1},scrolling={last:0,delta:0,resetTime:200};frame=frameElement,self.initialized=0,self.frame=frame,self.slidee=slideeElement,self.options=o,self.dragging=dragging;var pnum=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,rnumnonpx=new RegExp("^("+pnum+")(?!px)[a-z%]+$","i");self.reload=function(){load()};var scrollEvent=new CustomEvent("scroll");self.getPos=function(item){var slideeOffset=getBoundingClientRect(slideeElement),itemOffset=getBoundingClientRect(item),offset=o.horizontal?itemOffset.left-slideeOffset.left:itemOffset.top-slideeOffset.top,size=o.horizontal?itemOffset.width:itemOffset.height;size||0===size||(size=item[o.horizontal?"offsetWidth":"offsetHeight"]);var centerOffset=o.centerOffset||0;return transform||(centerOffset=0,offset+=o.horizontal?slideeElement.scrollLeft:slideeElement.scrollTop),{start:offset,center:offset+centerOffset-frameSize/2+size/2,end:offset-frameSize+size,size:size}},self.getCenterPosition=function(item){var pos=self.getPos(item);return within(pos.center,pos.start,pos.end)},self.slideBy=function(delta,immediate){delta&&slideTo(pos.dest+delta,immediate)},self.slideTo=function(pos,immediate){slideTo(pos,immediate)},self.toStart=function(item,immediate){to("start",item,immediate)},self.toEnd=function(item,immediate){to("end",item,immediate)},self.toCenter=function(item,immediate){to("center",item,immediate)},self.destroy=function(){return dom.removeEventListener(window,"resize",onResize,{passive:!0}),dom.removeEventListener(frameElement,"scroll",resetScroll,{passive:!0}),dom.removeEventListener(scrollSource,wheelEvent,scrollHandler,{passive:!0}),dom.removeEventListener(dragSourceElement,"touchstart",dragInitSlidee,{passive:!0}),dom.removeEventListener(frameElement,"click",onFrameClick,{passive:!0,capture:!0}),dom.removeEventListener(dragSourceElement,"mousedown",dragInitSlidee,{}),self.initialized=0,self},self.init=function(){if(!self.initialized){if(frame.sly)throw new Error("There is already a Sly instance on this element");frame.sly=!0;var movables=[];return slideeElement&&movables.push(slideeElement),transform?(slideeElement.style["will-change"]="transform",o.horizontal?slideeElement.classList.add("animatedScrollX"):slideeElement.classList.add("animatedScrollY")):o.horizontal?layoutManager.desktop?slideeElement.classList.add("smoothScrollX"):slideeElement.classList.add("hiddenScrollX"):layoutManager.desktop?slideeElement.classList.add("smoothScrollY"):slideeElement.classList.add("hiddenScrollY"),(o.horizontal||transform)&&dom.addEventListener(dragSourceElement,"mousedown",dragInitSlidee,{}),transform?(dom.addEventListener(dragSourceElement,"touchstart",dragInitSlidee,{passive:!0}),o.scrollWidth||dom.addEventListener(window,"resize",onResize,{passive:!0}),o.horizontal||dom.addEventListener(frameElement,"scroll",resetScroll,{passive:!0}),dom.addEventListener(scrollSource,wheelEvent,scrollHandler,{passive:!0})):o.horizontal&&dom.addEventListener(scrollSource,wheelEvent,scrollHandler,{passive:!0}),dom.addEventListener(frameElement,"click",onFrameClick,{passive:!0,capture:!0}),self.initialized=1,load(!0),self}}});return scrollerFactory.create=function(frame,options){var instance=new scrollerFactory(frame,options);return Promise.resolve(instance)},scrollerFactory}); \ No newline at end of file +define(["browser","layoutManager","dom","focusManager","scrollStyles"],function(browser,layoutManager,dom,focusManager){"use strict";function type(value){return null==value?String(value):"object"==typeof value||"function"==typeof value?Object.prototype.toString.call(value).match(/\s([a-z]+)/i)[1].toLowerCase()||"object":typeof value}function disableOneEvent(event){event.preventDefault(),event.stopPropagation(),this.removeEventListener(event.type,disableOneEvent)}function within(number,min,max){return numbermax?max:number}var dragMouseEvents=["mousemove","mouseup"],dragTouchEvents=["touchmove","touchend"],wheelEvent=document.implementation.hasFeature("Event.wheel","3.0")?"wheel":"mousewheel",interactiveElements=["INPUT","SELECT","TEXTAREA"],abs=Math.abs,sqrt=Math.sqrt,pow=Math.pow,round=Math.round,max=Math.max,scrollerFactory=(Math.min,function(frame,options){function sibling(n,elem){for(var matched=[];n;n=n.nextSibling)1===n.nodeType&&n!==elem&&matched.push(n);return matched}function load(isInit){frameSize=getWidthOrHeight(frameElement,o.horizontal?"width":"height");var slideeSize=o.scrollWidth||Math.max(slideeElement[o.horizontal?"offsetWidth":"offsetHeight"],slideeElement[o.horizontal?"scrollWidth":"scrollHeight"]);pos.start=0,pos.end=max(slideeSize-frameSize,0),isInit||slideTo(within(pos.dest,pos.start,pos.end))}function getWidthOrHeight(elem,name,extra){var valueIsBorderBox=!0,val="width"===name?elem.offsetWidth:elem.offsetHeight,styles=getComputedStyle(elem,null),isBorderBox="border-box"===styles.getPropertyValue("box-sizing");if(val<=0||null==val){if((val<0||null==val)&&(val=elem.style[name]),rnumnonpx.test(val))return val;valueIsBorderBox=isBorderBox&&(support.boxSizingReliable()||val===elem.style[name]),val=parseFloat(val)||0}return val+augmentWidthOrHeight(elem,name,extra||(isBorderBox?"border":"content"),valueIsBorderBox,styles)}function augmentWidthOrHeight(elem,name,extra,isBorderBox,styles){for(var i=extra===(isBorderBox?"border":"content")?4:"width"===name?1:0,val=0;i<4;i+=2);return val}function nativeScrollTo(container,pos,immediate){!immediate&&container.scrollTo?o.horizontal?container.scrollTo(pos,0):container.scrollTo(0,pos):o.horizontal?container.scrollLeft=Math.round(pos):container.scrollTop=Math.round(pos)}function slideTo(newPos,immediate){return newPos=within(newPos,pos.start,pos.end),transform?(animation.from=pos.cur,animation.to=newPos,animation.tweesing=dragging.tweese||dragging.init&&!dragging.slidee,animation.immediate=!animation.tweesing&&(immediate||dragging.init&&dragging.slidee||!o.speed),dragging.tweese=0,void(newPos!==pos.dest&&(pos.dest=newPos,renderAnimate(animation)))):void nativeScrollTo(slideeElement,newPos,immediate)}function renderAnimate(){var obj=getComputedStyle(slideeElement,null).getPropertyValue("transform").match(/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/);obj&&(pos.cur=parseInt(o.horizontal?obj[1]:obj[2])*-1);var keyframes;animation.to=round(animation.to),keyframes=o.horizontal?[{transform:"translate3d("+-round(pos.cur||animation.from)+"px, 0, 0)",offset:0},{transform:"translate3d("+-round(animation.to)+"px, 0, 0)",offset:1}]:[{transform:"translate3d(0, "+-round(pos.cur||animation.from)+"px, 0)",offset:0},{transform:"translate3d(0, "+-round(animation.to)+"px, 0)",offset:1}];var speed=o.speed;animation.immediate&&(speed=o.immediateSpeed||50,browser.animate||(o.immediateSpeed=0));var animationConfig={duration:speed,iterations:1,fill:"both"};browser.animate&&(animationConfig.easing="ease-out");var animationInstance=slideeElement.animate(keyframes,animationConfig);animationInstance.onfinish=function(){pos.cur=animation.to,document.dispatchEvent(scrollEvent)}}function getBoundingClientRect(elem){return elem.getBoundingClientRect?elem.getBoundingClientRect():{top:0,left:0}}function to(location,item,immediate){if("boolean"===type(item)&&(immediate=item,item=void 0),void 0===item)slideTo(pos[location],immediate);else{var itemPos=self.getPos(item);itemPos&&slideTo(itemPos[location],immediate,!0)}}function continuousInit(source){dragging.released=0,dragging.source=source,dragging.slidee="slidee"===source}function dragInitSlidee(event){dragInit(event,"slidee")}function dragInit(event,source){var isTouch="touchstart"===event.type,isSlidee="slidee"===source;if(!(dragging.init||!isTouch&&isInteractive(event.target))&&(!isSlidee||(isTouch?o.touchDragging:o.mouseDragging&&event.which<2))){isTouch||event.preventDefault(),continuousInit(source),dragging.init=0,dragging.source=event.target,dragging.touch=isTouch;var pointer=isTouch?event.touches[0]:event;dragging.initX=pointer.pageX,dragging.initY=pointer.pageY,dragging.initPos=isSlidee?pos.cur:hPos.cur,dragging.start=+new Date,dragging.time=0,dragging.path=0,dragging.delta=0,dragging.locked=0,dragging.pathToLock=isSlidee?isTouch?30:10:0,isTouch?dragTouchEvents.forEach(function(eventName){dom.addEventListener(document,eventName,dragHandler,{passive:!0})}):transform||dragMouseEvents.forEach(function(eventName){dom.addEventListener(document,eventName,dragHandler,{passive:!0})}),isSlidee&&slideeElement.classList.add(o.draggedClass)}}function dragHandler(event){dragging.released="mouseup"===event.type||"touchend"===event.type;var pointer=dragging.touch?event[dragging.released?"changedTouches":"touches"][0]:event;if(dragging.pathX=pointer.pageX-dragging.initX,dragging.pathY=pointer.pageY-dragging.initY,dragging.path=sqrt(pow(dragging.pathX,2)+pow(dragging.pathY,2)),dragging.delta=o.horizontal?dragging.pathX:dragging.pathY,dragging.released||!(dragging.path<1)){if(!dragging.init){if(dragging.pathabs(dragging.pathY):abs(dragging.pathX)dragging.pathToLock&&dragging.slidee&&(dragging.locked=1,dragging.source.addEventListener("click",disableOneEvent)),dragging.released&&dragEnd(),slideTo(dragging.slidee?round(dragging.initPos-dragging.delta):handleToSlidee(dragging.initPos+dragging.delta))}}function dragEnd(){dragging.released=!0,dragging.touch?dragTouchEvents.forEach(function(eventName){dom.removeEventListener(document,eventName,dragHandler,{passive:!0})}):dragMouseEvents.forEach(function(eventName){dom.removeEventListener(document,eventName,dragHandler,{passive:!0})}),dragging.slidee&&slideeElement.classList.remove(o.draggedClass),setTimeout(function(){dragging.source.removeEventListener("click",disableOneEvent)}),dragging.init=0}function isInteractive(element){for(;element;){if(interactiveElements.indexOf(element.tagName)!==-1)return!0;element=element.parentNode}return!1}function normalizeWheelDelta(event){return scrolling.curDelta=(o.horizontal?event.deltaY||event.deltaX:event.deltaY)||-event.wheelDelta,transform&&(scrolling.curDelta/=1===event.deltaMode?3:100),scrolling.curDelta}function scrollHandler(event){if(o.scrollBy&&pos.start!==pos.end){var delta=normalizeWheelDelta(event);transform?(delta>0&&pos.destpos.start,self.slideBy(o.scrollBy*delta)):(isSmoothScrollSupported&&(delta*=12),o.horizontal?slideeElement.scrollLeft+=delta:slideeElement.scrollTop+=delta)}}function onResize(){load(!1)}function resetScroll(){o.horizontal?this.scrollLeft=0:this.scrollTop=0}function onFrameClick(e){if(1===e.which){var focusableParent=focusManager.focusableParent(e.target);focusableParent&&focusableParent!==document.activeElement&&focusableParent.focus()}}var o=Object.assign({},{slidee:null,horizontal:!1,scrollSource:null,scrollBy:0,scrollHijack:300,dragSource:null,mouseDragging:1,touchDragging:1,swingSpeed:.2,dragThreshold:3,intervactive:null,speed:0,draggedClass:"dragged",activeClass:"active",disabledClass:"disabled"},options),isSmoothScrollSupported="scrollBehavior"in document.documentElement.style;isSmoothScrollSupported&&browser.firefox?options.enableNativeScroll=!0:options.requireAnimation?options.enableNativeScroll=!1:layoutManager.tv&&browser.animate||(options.enableNativeScroll=!0);var self=this;self.options=o;var frameElement=frame,slideeElement=o.slidee?o.slidee:sibling(frameElement.firstChild)[0],frameSize=0,pos={start:0,center:0,end:0,cur:0,dest:0},transform=!options.enableNativeScroll,hPos={start:0,end:0,cur:0},scrollSource=o.scrollSource?o.scrollSource:frameElement,dragSourceElement=o.dragSource?o.dragSource:frameElement,animation={},dragging={released:1},scrolling={last:0,delta:0,resetTime:200};frame=frameElement,self.initialized=0,self.frame=frame,self.slidee=slideeElement,self.options=o,self.dragging=dragging;var pnum=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,rnumnonpx=new RegExp("^("+pnum+")(?!px)[a-z%]+$","i");self.reload=function(){load()};var scrollEvent=new CustomEvent("scroll");self.getPos=function(item){var slideeOffset=getBoundingClientRect(slideeElement),itemOffset=getBoundingClientRect(item),offset=o.horizontal?itemOffset.left-slideeOffset.left:itemOffset.top-slideeOffset.top,size=o.horizontal?itemOffset.width:itemOffset.height;size||0===size||(size=item[o.horizontal?"offsetWidth":"offsetHeight"]);var centerOffset=o.centerOffset||0;return transform||(centerOffset=0,offset+=o.horizontal?slideeElement.scrollLeft:slideeElement.scrollTop),{start:offset,center:offset+centerOffset-frameSize/2+size/2,end:offset-frameSize+size,size:size}},self.getCenterPosition=function(item){var pos=self.getPos(item);return within(pos.center,pos.start,pos.end)},self.slideBy=function(delta,immediate){delta&&slideTo(pos.dest+delta,immediate)},self.slideTo=function(pos,immediate){slideTo(pos,immediate)},self.toStart=function(item,immediate){to("start",item,immediate)},self.toEnd=function(item,immediate){to("end",item,immediate)},self.toCenter=function(item,immediate){to("center",item,immediate)},self.destroy=function(){return dom.removeEventListener(window,"resize",onResize,{passive:!0}),dom.removeEventListener(frameElement,"scroll",resetScroll,{passive:!0}),dom.removeEventListener(scrollSource,wheelEvent,scrollHandler,{passive:!0}),dom.removeEventListener(dragSourceElement,"touchstart",dragInitSlidee,{passive:!0}),dom.removeEventListener(frameElement,"click",onFrameClick,{passive:!0,capture:!0}),dom.removeEventListener(dragSourceElement,"mousedown",dragInitSlidee,{}),self.initialized=0,self},self.init=function(){if(!self.initialized){if(frame.sly)throw new Error("There is already a Sly instance on this element");frame.sly=!0;var movables=[];return slideeElement&&movables.push(slideeElement),transform?(slideeElement.style["will-change"]="transform",o.horizontal?slideeElement.classList.add("animatedScrollX"):slideeElement.classList.add("animatedScrollY")):o.horizontal?layoutManager.desktop?slideeElement.classList.add("smoothScrollX"):slideeElement.classList.add("hiddenScrollX"):layoutManager.desktop?slideeElement.classList.add("smoothScrollY"):slideeElement.classList.add("hiddenScrollY"),(o.horizontal||transform)&&dom.addEventListener(dragSourceElement,"mousedown",dragInitSlidee,{}),transform?(dom.addEventListener(dragSourceElement,"touchstart",dragInitSlidee,{passive:!0}),o.scrollWidth||dom.addEventListener(window,"resize",onResize,{passive:!0}),o.horizontal||dom.addEventListener(frameElement,"scroll",resetScroll,{passive:!0}),dom.addEventListener(scrollSource,wheelEvent,scrollHandler,{passive:!0})):o.horizontal&&dom.addEventListener(scrollSource,wheelEvent,scrollHandler,{passive:!0}),dom.addEventListener(frameElement,"click",onFrameClick,{passive:!0,capture:!0}),self.initialized=1,load(!0),self}}});return scrollerFactory.create=function(frame,options){var instance=new scrollerFactory(frame,options);return Promise.resolve(instance)},scrollerFactory}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-us.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-us.json index b45fec28e1..3bf1eca801 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-us.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-us.json @@ -384,5 +384,6 @@ "Disconnect": "Disconnect", "EnableDisplayMirroring": "Enable display mirroring", "HeaderSelectPlayer": "Select Player", - "Quality": "Quality" + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/hlsjs/dist/hls.min.js b/dashboard-ui/bower_components/hlsjs/dist/hls.min.js index 35bfb2fe84..c25a4fdd41 100644 --- a/dashboard-ui/bower_components/hlsjs/dist/hls.min.js +++ b/dashboard-ui/bower_components/hlsjs/dist/hls.min.js @@ -1,7 +1,7 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Hls=e()}}(function(){var e;return function e(t,r,i){function a(s,o){if(!r[s]){if(!t[s]){var l="function"==typeof require&&require;if(!o&&l)return l(s,!0);if(n)return n(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var d=r[s]={exports:{}};t[s][0].call(d.exports,function(e){var r=t[s][1][e];return a(r?r:e)},d,d.exports,e,t,r,i)}return r[s].exports}for(var n="function"==typeof require&&require,s=0;s0&&this._events[e].length>r&&(this._events[e].warned=!0,"function"==typeof console.trace)),this},i.prototype.on=i.prototype.addListener,i.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!a(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},i.prototype.removeListener=function(e,t){var r,i,n,o;if(!a(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],n=r.length,i=-1,r===t||a(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(s(r)){for(o=n;o-- >0;)if(r[o]===t||r[o].listener&&r[o].listener===t){i=o;break}if(i<0)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},i.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],a(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},i.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?a(this._events[e])?[this._events[e]]:this._events[e].slice():[]},i.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(a(t))return 1;if(t)return t.length}return 0},i.listenerCount=function(e,t){return e.listenerCount(t)}},{}],2:[function(t,r,i){!function(t){var a={buildAbsoluteURL:function(e,t){if(t=t.trim(),/^[a-z]+:/i.test(t))return t;var r=null,i=null,n=/^([^#]*)(.*)$/.exec(t);n&&(i=n[2],t=n[1]);var s=/^([^\?]*)(.*)$/.exec(t);s&&(r=s[2],t=s[1]);var o=/^([^#]*)(.*)$/.exec(e);o&&(e=o[1]);var l=/^([^\?]*)(.*)$/.exec(e);l&&(e=l[1]);var u=/^(([a-z]+:)?\/\/[a-z0-9\.\-_~]+(:[0-9]+)?)?(\/.*)$/i.exec(e);if(!u)throw new Error("Error trying to parse base URL.");var d=u[2]||"",f=u[1]||"",h=u[4],c=null;return c=/^\/\//.test(t)?d+"//"+a.buildAbsolutePath("",t.substring(2)):/^\//.test(t)?f+"/"+a.buildAbsolutePath("",t.substring(1)):a.buildAbsolutePath(f+h,t),r&&(c+=r),i&&(c+=i),c},buildAbsolutePath:function(e,t){for(var r,i,a=t,n="",s=e.replace(/[^\/]*$/,a.replace(/(\/|^)(?:\.?\/+)+/g,"$1")),o=0;i=s.indexOf("/../",o),i>-1;o=i+r)r=/^\/(?:\.\.\/)*/.exec(s.slice(i))[0].length,n=(n+s.substring(o,i)).replace(new RegExp("(?:\\/+[^\\/]*){0,"+(r-1)/3+"}$"),"/");return n+s.substr(o)}};"object"==typeof i&&"object"==typeof r?r.exports=a:"function"==typeof e&&e.amd?e([],function(){return a}):"object"==typeof i?i.URLToolkit=a:t.URLToolkit=a}(this)},{}],3:[function(e,t,r){var i=arguments[3],a=arguments[4],n=arguments[5],s=JSON.stringify;t.exports=function(e,t){function r(e){p[e]=!0;for(var t in a[e][1]){var i=a[e][1][t];p[i]||r(i)}}for(var o,l=Object.keys(n),u=0,d=l.length;u500*r.duration/o){var l=e.levels,d=Math.max(1,n.bw?n.bw/8:1e3*n.loaded/s),f=n.total?n.total:Math.max(n.loaded,Math.round(r.duration*l[r.level].bitrate/8)),h=t.currentTime,g=(f-n.loaded)/d,p=(c.default.bufferInfo(t,h,e.config.maxBufferHole).end-h)/o;if(p<2*r.duration/o&&g>p){var y=void 0,m=void 0;for(m=r.level-1;m>a&&(y=r.duration*l[m].bitrate/(6.4*d),!(y=i;u--){var d=l[u],f=d.details,h=f?f.totalduration/f.fragments.length:t,c=!!f&&f.live,g=void 0;g=u<=e?s*r:o*r;var p=l[u].bitrate,y=p*h/g;if(v.logger.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+u+"/"+Math.round(g)+"/"+p+"/"+h+"/"+n+"/"+y),g>p&&(!y||c||yr)return a;return 0}},{key:"maxAutoLevel",get:function(){var e,t=this.hls.levels,r=this._autoLevelCapping;return e=r===-1&&t&&t.length?t.length-1:r}},{key:"nextABRAutoLevel",get:function(){var e=this.hls,t=this.maxAutoLevel,r=e.levels,i=e.config,a=this.minAutoLevel,n=e.media,s=this.lastLoadedFragLevel,o=this.fragCurrent?this.fragCurrent.duration:0,l=n?n.currentTime:0,u=n&&0!==n.playbackRate?Math.abs(n.playbackRate):1,d=this.bwEstimator?this.bwEstimator.getEstimate():i.abrEwmaDefaultEstimate,f=(c.default.bufferInfo(n,l,i.maxBufferHole).end-l)/u,h=this.findBestLevel(s,o,d,a,t,f,i.abrBandWidthFactor,i.abrBandWidthUpFactor,r);if(h>=0)return h;v.logger.trace("rebuffering expected to happen, lets try to find a quality level minimizing the rebuffering");var g=i.maxStarvationDelay,p=i.abrBandWidthFactor,y=i.abrBandWidthUpFactor;if(0===f){var m=this.bitrateTestDelay;m&&(g=i.maxLoadingDelay-m,v.logger.trace("bitrate test took "+Math.round(1e3*m)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*g)+" ms"),p=y=1)}return h=this.findBestLevel(s,o,d,a,t,f+g,p,y,r),Math.max(h,0)}}]),t}(f.default);r.default=m},{26:26,27:27,28:28,30:30,45:45,9:9}],5:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l=function(){function e(e,t){for(var r=0;r0&&e===-1?(k.logger.log("audio:override startPosition with lastCurrentTime @"+t.toFixed(3)),this.state=A.IDLE):(this.lastCurrentTime=this.startPosition?this.startPosition:e,this.state=A.STARTING),this.nextLoadPosition=this.startPosition=this.lastCurrentTime,this.tick()}else this.startPosition=e,this.state=A.STOPPED}},{key:"stopLoad",value:function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=A.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){var e,t,r,i,a,n,s=this,l=this.hls,u=l.config,f=function(){switch(s.state){case A.ERROR:case A.PAUSED:case A.BUFFER_FLUSHING:break;case A.STARTING:s.state=A.WAITING_TRACK,s.loadedmetadata=!1;break;case A.IDLE:if(!s.media&&(s.startFragRequested||!u.startFragPrefetch))break;e=s.loadedmetadata?s.media.currentTime:s.nextLoadPosition;var o=s.mediaBuffer?s.mediaBuffer:s.media,f=h.default.bufferInfo(o,e,u.maxBufferHole),c=f.len,g=f.end,v=s.fragPrevious,y=u.maxMaxBufferLength,m=s.audioSwitch;if(cR||f.nextStart))return{v:void 0};k.logger.log("alt audio track ahead of main track, seek to start of alt audio track"),s.media.currentTime=R+.05}if(g_-t&&(t=0),e=d.default.search(E,function(e){return e.start+e.duration-t<=g?1:e.start-t>g?-1:0})):e=E[b-1],e&&(S=e,R=e.start,v&&S.level===v.level&&S.sn===v.sn&&(S.snL&&Math.abs(s.fragLoadIdx-S.loadIdx)=a||n)&&(k.logger.log("audioStreamController: retryDate reached, switch back to IDLE state"),s.state=A.IDLE);break;case A.WAITING_INIT_PTS:case A.STOPPED:case A.FRAG_LOADING:case A.PARSING:case A.PARSED:case A.ENDED:}}();if("object"===("undefined"==typeof f?"undefined":o(f)))return f.v}},{key:"onMediaAttached",value:function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("ended",this.onvended);var r=this.config;this.tracks&&r.autoStartLoad&&this.startLoad(r.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(k.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.tracks;t&&t.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){this.state===A.ENDED&&(this.state=A.IDLE),this.media&&(this.lastCurrentTime=this.media.currentTime),void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onMediaEnded",value:function(){this.startPosition=this.lastCurrentTime=0}},{key:"onAudioTracksUpdated",value:function(e){k.logger.log("audio tracks updated"),this.tracks=e.audioTracks}},{key:"onAudioTrackSwitching",value:function(e){var t=!!e.url;this.trackId=e.id,this.state=A.IDLE,this.fragCurrent=null,this.state=A.PAUSED,this.waitingFragment=null,t?this.timer||(this.timer=setInterval(this.ontick,100)):this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),t&&(this.audioSwitch=!0,this.state=A.IDLE,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onAudioTrackLoaded",value:function(e){var t=e.details,r=e.id,i=this.tracks[r],a=t.totalduration,n=0;if(k.logger.log("track "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+a),t.live){var s=i.details;s&&t.fragments.length>0?(b.default.mergeDetails(s,t),n=t.fragments[0].start,t.PTSKnown?k.logger.log("live audio playlist sliding:"+n.toFixed(3)):k.logger.log("live audio playlist - outdated PTS, unknown sliding")):(t.PTSKnown=!1,k.logger.log("live audio playlist - first load, unknown sliding"))}else t.PTSKnown=!1;if(i.details=t,!this.startFragRequested){if(this.startPosition===-1){var o=t.startTimeOffset;isNaN(o)?this.startPosition=0:(k.logger.log("start time offset found in playlist, adjust startPosition to "+o),this.startPosition=o)}this.nextLoadPosition=this.startPosition}this.state===A.WAITING_TRACK&&(this.state=A.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===A.KEY_LOADING&&(this.state=A.IDLE,this.tick())}},{key:"onFragLoaded",value:function(e){var t=this.fragCurrent;if(this.state===A.FRAG_LOADING&&t&&"audio"===e.frag.type&&e.frag.level===t.level&&e.frag.sn===t.sn){this.state=A.PARSING,this.stats=e.stats;var r=this.tracks[this.trackId],i=r.details,a=i.totalduration,n=t.start,s=t.level,o=t.sn,l=t.cc,u=this.config.defaultAudioCodec||r.audioCodec;this.appended=!1,this.demuxer||(this.demuxer=new g.default(this.hls,"audio"));var d=this.initPTS[l];if(void 0!==d){this.pendingBuffering=!0,k.logger.log("Demuxing "+o+" of ["+i.startSN+" ,"+i.endSN+"],track "+s);var f=!1;this.demuxer.push(e.payload,u,null,n,l,s,o,a,t.decryptdata,f,d)}else k.logger.log("unknown video PTS for continuity counter "+l+", waiting for video PTS before demuxing audio frag "+o+" of ["+i.startSN+" ,"+i.endSN+"],track "+s),this.waitingFragment=e,this.state=A.WAITING_INIT_PTS}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(e){var t=this.fragCurrent;if(t&&"audio"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===A.PARSING){var r=e.tracks,i=void 0;if(r.video&&delete r.video,i=r.audio){i.levelCodec="mp4a.40.2",i.id=e.id,this.hls.trigger(p.default.BUFFER_CODECS,r),k.logger.log("audio track:audio,container:"+i.container+",codecs[level/parsed]=["+i.levelCodec+"/"+i.codec+"]");var a=i.initSegment;if(a){var n={type:"audio",data:a,parent:"audio",content:"initSegment"};this.audioSwitch?this.pendingData=[n]:(this.appended=!0,this.pendingBuffering=!0,this.hls.trigger(p.default.BUFFER_APPENDING,n))}this.tick()}}}},{key:"onFragParsingData",value:function(e){var t=this,r=this.fragCurrent;r&&"audio"===e.id&&"audio"===e.type&&e.sn===r.sn&&e.level===r.level&&this.state===A.PARSING&&!function(){var r=t.trackId,i=t.tracks[r],a=t.fragCurrent,n=t.hls;k.logger.log("parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb),b.default.updateFragPTSDTS(i.details,a.sn,e.startPTS,e.endPTS);var s=t.audioSwitch,o=t.media,l=!1;if(s&&o)if(o.readyState){var u=o.currentTime;k.logger.log("switching audio track : currentTime:"+u),u>=e.startPTS&&(k.logger.log("switching audio track : flushing all audio"),t.state=A.BUFFER_FLUSHING,n.trigger(p.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),l=!0,t.audioSwitch=!1,n.trigger(p.default.AUDIO_TRACK_SWITCHED,{id:r}))}else t.audioSwitch=!1,n.trigger(p.default.AUDIO_TRACK_SWITCHED,{id:r});var d=t.pendingData;t.audioSwitch||([e.data1,e.data2].forEach(function(t){t&&d.push({type:e.type,data:t,parent:"audio",content:"data"})}),!l&&d.length&&(d.forEach(function(e){t.pendingBuffering=!0,t.hls.trigger(p.default.BUFFER_APPENDING,e)}),t.pendingData=[],t.appended=!0)),t.tick()}()}},{key:"onFragParsed",value:function(e){var t=this.fragCurrent;t&&"audio"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===A.PARSING&&(this.stats.tparsed=performance.now(),this.state=A.PARSED,this._checkAppendedParsed())}},{key:"onBufferCreated",value:function(e){var t=e.tracks.audio;t&&(this.mediaBuffer=t.buffer,this.loadedmetadata=!0)}},{key:"onBufferAppended",value:function(e){if("audio"===e.parent){var t=this.state;t!==A.PARSING&&t!==A.PARSED||(this.pendingBuffering=e.pending>0,this._checkAppendedParsed())}}},{key:"_checkAppendedParsed",value:function(){if(!(this.state!==A.PARSED||this.appended&&this.pendingBuffering)){var e=this.fragCurrent,t=this.stats,r=this.hls;if(e){this.fragPrevious=e,t.tbuffered=performance.now(),r.trigger(p.default.FRAG_BUFFERED,{stats:t,frag:e,id:"audio"});var i=this.mediaBuffer?this.mediaBuffer:this.media;k.logger.log("audio buffered : "+_.default.toString(i.buffered)),this.audioSwitch&&this.appended&&(this.audioSwitch=!1,r.trigger(p.default.AUDIO_TRACK_SWITCHED,{id:this.trackId})),this.state=A.IDLE}this.tick()}}},{key:"onError",value:function(e){var t=e.frag;if(!t||"audio"===t.type)switch(e.details){case T.ErrorDetails.FRAG_LOAD_ERROR:case T.ErrorDetails.FRAG_LOAD_TIMEOUT:if(!e.fatal){var r=this.fragLoadError;r?r++:r=1;var i=this.config;if(r<=i.fragLoadingMaxRetry){this.fragLoadError=r,t.loadCounter=0;var a=Math.min(Math.pow(2,r-1)*i.fragLoadingRetryDelay,i.fragLoadingMaxRetryTimeout);k.logger.warn("audioStreamController: frag loading failed, retry in "+a+" ms"),this.retryDate=performance.now()+a,this.state=A.FRAG_LOADING_WAITING_RETRY}else k.logger.error("audioStreamController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.hls.trigger(p.default.ERROR,e),this.state=A.ERROR}break;case T.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case T.ErrorDetails.AUDIO_TRACK_LOAD_ERROR:case T.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:case T.ErrorDetails.KEY_LOAD_ERROR:case T.ErrorDetails.KEY_LOAD_TIMEOUT:this.state!==A.ERROR&&(this.state=e.fatal?A.ERROR:A.IDLE,k.logger.warn("audioStreamController: "+e.details+" while loading frag,switch to "+this.state+" state ..."))}}},{key:"onBufferFlushed",value:function(){var e=this,t=this.pendingData;t&&t.length?(k.logger.log("appending pending audio data on Buffer Flushed"),t.forEach(function(t){e.hls.trigger(p.default.BUFFER_APPENDING,t)}),this.appended=!0,this.pendingData=[],this.state=A.PARSED):(this.state=A.IDLE,this.fragPrevious=null,this.tick())}}]),t}(m.default);r.default=S},{22:22,26:26,27:27,28:28,30:30,31:31,41:41,45:45,46:46}],6:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){this.updateTrack(this.trackId)}},{key:"onManifestLoading",value:function(){this.tracks=[],this.trackId=-1}},{key:"onManifestLoaded",value:function(e){var t=this,r=e.audioTracks||[],i=!1;this.tracks=r,this.hls.trigger(u.default.AUDIO_TRACKS_UPDATED,{audioTracks:r});var a=0;r.forEach(function(e){return e.default?(t.audioTrack=a,void(i=!0)):void a++}),i===!1&&r.length&&(h.logger.log("no default audio track defined, use first audio track as default"),this.audioTrack=0)}},{key:"onAudioTrackLoaded",value:function(e){e.id=0&&e=0&&e.1){var n=i.updating;try{i.abort()}catch(e){n=!0,h.logger.warn("can not abort audio buffer: "+e); -}n?this.audioTimestampOffset=e.start:(h.logger.warn("change mpeg audio timestamp offset from "+i.timestampOffset+" to "+e.start),i.timestampOffset=e.start)}}}},{key:"onManifestParsed",value:function(e){var t=e.audio,r=e.video,i=0;e.altAudio&&(t||r)&&(i=(t?1:0)+(r?1:0),h.logger.log(i+" sourceBuffer(s) expected")),this.sourceBufferNb=i}},{key:"onMediaAttaching",value:function(e){var t=this.media=e.media;if(t){var r=this.mediaSource=new MediaSource;this.onmso=this.onMediaSourceOpen.bind(this),this.onmse=this.onMediaSourceEnded.bind(this),this.onmsc=this.onMediaSourceClose.bind(this),r.addEventListener("sourceopen",this.onmso),r.addEventListener("sourceended",this.onmse),r.addEventListener("sourceclose",this.onmsc),t.src=URL.createObjectURL(r)}}},{key:"onMediaDetaching",value:function(){h.logger.log("media source detaching");var e=this.mediaSource;if(e){if("open"===e.readyState)try{e.endOfStream()}catch(e){h.logger.warn("onMediaDetaching:"+e.message+" while calling endOfStream")}e.removeEventListener("sourceopen",this.onmso),e.removeEventListener("sourceended",this.onmse),e.removeEventListener("sourceclose",this.onmsc),this.media&&(URL.revokeObjectURL(this.media.src),this.media.removeAttribute("src"),this.media.load()),this.mediaSource=null,this.media=null,this.pendingTracks={},this.tracks={},this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0}this.onmso=this.onmse=this.onmsc=null,this.hls.trigger(u.default.MEDIA_DETACHED)}},{key:"onMediaSourceOpen",value:function(){h.logger.log("media source opened"),this.hls.trigger(u.default.MEDIA_ATTACHED,{media:this.media});var e=this.mediaSource;e&&e.removeEventListener("sourceopen",this.onmso),this.checkPendingTracks()}},{key:"checkPendingTracks",value:function(){var e=this.pendingTracks,t=Object.keys(e).length;t&&(this.sourceBufferNb<=t||0===this.sourceBufferNb)&&(this.createSourceBuffers(e),this.pendingTracks={},this.doAppending())}},{key:"onMediaSourceClose",value:function(){h.logger.log("media source closed")}},{key:"onMediaSourceEnded",value:function(){h.logger.log("media source ended")}},{key:"onSBUpdateEnd",value:function(){if(this.audioTimestampOffset){var e=this.sourceBuffer.audio;h.logger.warn("change mpeg audio timestamp offset from "+e.timestampOffset+" to "+this.audioTimestampOffset),e.timestampOffset=this.audioTimestampOffset,delete this.audioTimestampOffset}this._needsFlush&&this.doFlush(),this._needsEos&&this.checkEos(),this.appending=!1;var t=this.parent,r=this.segments.reduce(function(e,r){return r.parent===t?e+1:e},0);this.hls.trigger(u.default.BUFFER_APPENDED,{parent:t,pending:r}),this._needsFlush||this.doAppending(),this.updateMediaElementDuration()}},{key:"onSBUpdateError",value:function(e){h.logger.error("sourceBuffer error:"+e),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_APPENDING_ERROR,fatal:!1})}},{key:"onBufferReset",value:function(){var e=this.sourceBuffer;for(var t in e){var r=e[t];try{this.mediaSource.removeSourceBuffer(r),r.removeEventListener("updateend",this.onsbue),r.removeEventListener("error",this.onsbe)}catch(e){}}this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0}},{key:"onBufferCodecs",value:function(e){if(0===Object.keys(this.sourceBuffer).length){for(var t in e)this.pendingTracks[t]=e[t];var r=this.mediaSource;r&&"open"===r.readyState&&this.checkPendingTracks()}}},{key:"createSourceBuffers",value:function(e){var t=this.sourceBuffer,r=this.mediaSource;for(var i in e)if(!t[i]){var a=e[i],n=a.levelCodec||a.codec,s=a.container+";codecs="+n;h.logger.log("creating sourceBuffer("+s+")");try{var o=t[i]=r.addSourceBuffer(s);o.addEventListener("updateend",this.onsbue),o.addEventListener("error",this.onsbe),this.tracks[i]={codec:n,container:a.container},a.buffer=o}catch(e){h.logger.error("error while trying to add sourceBuffer:"+e.message),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_ADD_CODEC_ERROR,fatal:!1,err:e,mimeType:s})}}this.hls.trigger(u.default.BUFFER_CREATED,{tracks:e})}},{key:"onBufferAppending",value:function(e){this._needsFlush||(this.segments?this.segments.push(e):this.segments=[e],this.doAppending())}},{key:"onBufferAppendFail",value:function(e){h.logger.error("sourceBuffer error:",e.event),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_APPENDING_ERROR,fatal:!1,frag:this.fragCurrent})}},{key:"onBufferEos",value:function(e){var t=this.sourceBuffer,r=e.type;for(var i in t)r&&i!==r||t[i].ended||(t[i].ended=!0,h.logger.log(i+" sourceBuffer now EOS"));this.checkEos()}},{key:"checkEos",value:function(){var e=this.sourceBuffer,t=this.mediaSource;if(!t||"open"!==t.readyState)return void(this._needsEos=!1);for(var r in e){var i=e[r];if(!i.ended)return;if(i.updating)return void(this._needsEos=!0)}h.logger.log("all media data available, signal endOfStream() to MediaSource and stop loading fragment");try{t.endOfStream()}catch(e){h.logger.warn("exception while calling mediaSource.endOfStream()")}this._needsEos=!1}},{key:"onBufferFlushing",value:function(e){this.flushRange.push({start:e.startOffset,end:e.endOffset,type:e.type}),this.flushBufferCounter=0,this.doFlush()}},{key:"onLevelUpdated",value:function(e){var t=e.details;0!==t.fragments.length&&(this._levelDuration=t.totalduration+t.fragments[0].start,this.updateMediaElementDuration())}},{key:"updateMediaElementDuration",value:function(){var e=this.media,t=this.mediaSource,r=this.sourceBuffer,i=this._levelDuration;if(null!==i&&e&&t&&r&&0!==e.readyState&&"open"===t.readyState){for(var a in r)if(r[a].updating)return;null===this._msDuration&&(this._msDuration=t.duration);var n=e.duration;(i>this._msDuration&&i>n||n===1/0||isNaN(n))&&(h.logger.log("Updating mediasource duration to "+i.toFixed(3)),this._msDuration=t.duration=i)}}},{key:"doFlush",value:function(){for(;this.flushRange.length;){var e=this.flushRange[0];if(!this.flushBuffer(e.start,e.end,e.type))return void(this._needsFlush=!0);this.flushRange.shift(),this.flushBufferCounter=0}if(0===this.flushRange.length){this._needsFlush=!1;var t=0,r=this.sourceBuffer;try{for(var i in r)t+=r[i].buffered.length}catch(e){h.logger.error("error while accessing sourceBuffer.buffered")}this.appended=t,this.hls.trigger(u.default.BUFFER_FLUSHED)}}},{key:"doAppending",value:function(){var e=this.hls,t=this.sourceBuffer,r=this.segments;if(Object.keys(t).length){if(this.media.error)return this.segments=[],void h.logger.error("trying to append although a media error occured, flush segment and abort");if(this.appending)return;if(r&&r.length){var i=r.shift();try{var a=i.type,n=t[a];n?n.updating?r.unshift(i):(n.ended=!1,this.parent=i.parent,n.appendBuffer(i.data),this.appendError=0,this.appended++,this.appending=!0):this.onSBUpdateEnd()}catch(t){h.logger.error("error while trying to append buffer:"+t.message),r.unshift(i);var s={type:c.ErrorTypes.MEDIA_ERROR};if(22===t.code)return this.segments=[],s.details=c.ErrorDetails.BUFFER_FULL_ERROR,s.fatal=!1,void e.trigger(u.default.ERROR,s);if(this.appendError?this.appendError++:this.appendError=1,s.details=c.ErrorDetails.BUFFER_APPEND_ERROR,s.frag=this.fragCurrent,this.appendError>e.config.appendErrorMaxRetry)return h.logger.log("fail "+e.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),r=[],s.fatal=!0,void e.trigger(u.default.ERROR,s);s.fatal=!1,e.trigger(u.default.ERROR,s)}}}}},{key:"flushBuffer",value:function(e,t,r){var i,a,n,s,o,l,u=this.sourceBuffer;if(Object.keys(u).length){if(h.logger.log("flushBuffer,pos/start/end: "+this.media.currentTime.toFixed(3)+"/"+e+"/"+t),this.flushBufferCounter.5)return this.flushBufferCounter++,h.logger.log("flush "+d+" ["+o+","+l+"], of ["+n+","+s+"], pos:"+this.media.currentTime),i.remove(o,l),!1}catch(e){h.logger.warn("exception while accessing sourcebuffer, it might have been removed from MediaSource")}}}else h.logger.warn("abort flushing too many retries");h.logger.log("buffer flushed")}return!0}}]),t}(f.default);r.default=g},{26:26,27:27,28:28,45:45}],8:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;rthis.autoLevelCapping&&t.streamController.nextLevelSwitch(),this.autoLevelCapping=t.autoLevelCapping}}}},{key:"getMaxLevel",value:function(e){var t=0,r=void 0,i=void 0,a=this.mediaWidth,n=this.mediaHeight,s=0,o=0;for(r=0;r<=e&&(i=this.levels[r],!this.isLevelRestricted(r))&&(t=r,s=i.width,o=i.height,!(a<=s||n<=o));r++);return t}},{key:"isLevelRestricted",value:function(e){return!(!this.restrictedLevels||this.restrictedLevels.indexOf(e)===-1)}},{key:"contentScaleFactor",get:function(){var e=1;try{e=window.devicePixelRatio}catch(e){}return e}},{key:"mediaWidth",get:function(){var e=void 0,t=this.media;return t&&(e=t.width||t.clientWidth||t.offsetWidth,e*=this.contentScaleFactor),e}},{key:"mediaHeight",get:function(){var e=void 0,t=this.media;return t&&(e=t.height||t.clientHeight||t.offsetHeight,e*=this.contentScaleFactor),e}}]),t}(f.default);r.default=h},{27:27,28:28}],9:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r=this.minWeight_}},{key:"getEstimate",value:function(){return this.canEstimate()?Math.min(this.fast_.getEstimate(),this.slow_.getEstimate()):this.defaultEstimate_}},{key:"destroy",value:function(){}}]),e}();r.default=l},{44:44}],10:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0&&n>l.config.fpsDroppedMonitoringThreshold*s){var d=l.currentLevel;h.logger.warn("drop FPS ratio greater than max allowed value for currentLevel: "+d),d>0&&(l.autoLevelCapping===-1||l.autoLevelCapping>=d)&&(d-=1,l.trigger(u.default.FPS_DROP_LEVEL_CAPPING,{level:d,droppedLevel:l.currentLevel}),l.autoLevelCapping=d,l.streamController.nextLevelSwitch())}}this.lastTime=i,this.lastDroppedFrames=r,this.lastDecodedFrames=t}}},{key:"checkFPSInterval",value:function(){var e=this.video;if(e)if(this.isVideoPlaybackQualityAvailable){var t=e.getVideoPlaybackQuality();this.checkFPS(e,t.totalVideoFrames,t.droppedVideoFrames)}else this.checkFPS(e,e.webkitDecodedFrameCount,e.webkitDroppedFrameCount)}}]),t}(f.default);r.default=c},{27:27,28:28,45:45}],11:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0})}else o.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR,fatal:!0,url:o.url,reason:"no level with compatible codecs found in manifest"})}},{key:"setLevelInternal",value:function(e){var t=this._levels;if(e>=0&&e1&&a.loadErrore&&(this._level===e&&void 0!==t[e].details||this.setLevelInternal(e))}},{key:"manualLevel",get:function(){return this._manualLevel},set:function(e){this._manualLevel=e,void 0===this._startLevel&&(this._startLevel=e),e!==-1&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){if(void 0===this._startLevel){var e=this.hls.config.startLevel;return void 0!==e?e:this._firstLevel}return this._startLevel},set:function(e){e!==-1&&(e=Math.max(e,this.hls.abrController.minAutoLevel)),this._startLevel=e}},{key:"nextLoadLevel",get:function(){return this._manualLevel!==-1?this._manualLevel:this.hls.abrController.nextAutoLevel},set:function(e){this.level=e,this._manualLevel===-1&&(this.hls.abrController.nextAutoLevel=e)}}]),t}(f.default);r.default=p},{26:26,27:27,28:28,30:30,45:45}],12:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0&&e===-1&&(T.logger.log("override startPosition with lastCurrentTime @"+t.toFixed(3)),e=t),this.state=k.IDLE,this.nextLoadPosition=this.startPosition=this.lastCurrentTime=e,this.tick()}else T.logger.warn("cannot start loading as manifest not parsed yet"),this.state=k.STOPPED}},{key:"stopLoad",value:function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=k.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){switch(this.state){case k.ERROR:break;case k.BUFFER_FLUSHING:this.fragLoadError=0;break;case k.IDLE:if(!this._doTickIdle())return;break;case k.WAITING_LEVEL:var e=this.levels[this.level];e&&e.details&&(this.state=k.IDLE);break;case k.FRAG_LOADING_WAITING_RETRY:var t=performance.now(),r=this.retryDate;(!r||t>=r||this.media&&this.media.seeking)&&(T.logger.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=k.IDLE);break;case k.ERROR:case k.STOPPED:case k.FRAG_LOADING:case k.PARSING:case k.PARSED:case k.ENDED:}this._checkBuffer(),this._checkFragmentChanged()}},{key:"_doTickIdle",value:function(){var e=this.hls,t=e.config,r=this.media;if(void 0!==this.levelLastLoaded&&!r&&(this.startFragRequested||!t.startFragPrefetch))return!0;var i=void 0;i=this.loadedmetadata?r.currentTime:this.nextLoadPosition;var a=e.nextLoadLevel,n=this.levels[a],s=n.bitrate,o=void 0;o=s?Math.max(8*t.maxBufferSize/s,t.maxBufferLength):t.maxBufferLength,o=Math.min(o,t.maxMaxBufferLength);var l=f.default.bufferInfo(this.mediaBuffer?this.mediaBuffer:r,i,t.maxBufferHole),u=l.len;if(u>=o)return!0;T.logger.trace("buffer length of "+u.toFixed(3)+" is below max of "+o.toFixed(3)+". checking for more payload ..."),this.level=e.nextLoadLevel=a;var d=n.details;if("undefined"==typeof d||d.live&&this.levelLastLoaded!==a)return this.state=k.WAITING_LEVEL,!0;var h=this.fragPrevious;if(!d.live&&h&&h.sn===d.endSN&&r.duration-Math.max(l.end,h.start)<=Math.max(.1,h.duration/2)){var c={};return this.altAudio&&(c.type="video"),this.hls.trigger(v.default.BUFFER_EOS,c),this.state=k.ENDED,!0}return this._fetchPayloadOrEos({pos:i,bufferInfo:l,levelDetails:d})}},{key:"_fetchPayloadOrEos",value:function(e){var t=e.pos,r=e.bufferInfo,i=e.levelDetails,a=this.fragPrevious,n=this.level,s=i.fragments,o=s.length;if(0===o)return!1;var l=s[0].start,u=s[o-1].start+s[o-1].duration,d=r.end,f=void 0;if(i.live){var h=this.config.initialLiveManifestSize;if(oh&&(u.currentTime=h)}if(t.PTSKnown&&r>a&&u&&u.readyState)return null;if(this.startFragRequested&&!t.PTSKnown){if(n){var c=n.sn+1;c>=t.startSN&&c<=t.endSN&&(d=s[c-t.startSN],T.logger.log("live playlist, switching playlist, load frag with next SN: "+d.sn))}d||(d=s[Math.min(o-1,Math.round(o/2))],T.logger.log("live playlist, switching playlist, unknown, load middle frag : "+d.sn))}return d}},{key:"_findFragment",value:function(e){var t=e.start,r=e.fragPrevious,i=e.fragLen,a=e.fragments,n=e.bufferEnd,s=e.end,o=e.levelDetails,l=this.hls.config,d=void 0,f=void 0,h=l.maxFragLookUpTolerance;if(ns-h&&(h=0),f=u.default.search(a,function(e){return e.start+e.duration-h<=n?1:e.start-h>n&&e.start?-1:0})):f=a[i-1],f&&(d=f,t=f.start,r&&d.level===r.level&&d.sn===r.sn))if(d.snl.maxBufferHole&&r.dropped&&g?(d=a[g-1],T.logger.warn("SN just loaded, with large PTS gap between audio and video, maybe frag is not starting with a keyframe ? load previous one to try to overcome this"),r.loadCounter--):(d=a[g+1],T.logger.log("SN just loaded, load next one: "+d.sn))}else d=null;return d}},{key:"_loadFragmentOrKey",value:function(e){var t=e.frag,r=e.level,i=e.levelDetails,a=e.pos,n=e.bufferEnd,s=this.hls,o=s.config;if(null==t.decryptdata.uri||null!=t.decryptdata.key){if(T.logger.log("Loading "+t.sn+" of ["+i.startSN+" ,"+i.endSN+"],level "+r+", currentTime:"+a.toFixed(3)+",bufferEnd:"+n.toFixed(3)),void 0!==this.fragLoadIdx?this.fragLoadIdx++:this.fragLoadIdx=0,t.loadCounter){t.loadCounter++;var l=o.fragLoadingLoopThreshold;if(t.loadCounter>l&&Math.abs(this.fragLoadIdx-t.loadIdx)t.end?1:0})}},{key:"followingBufferRange",value:function(e){return e?this.getBufferRange(e.end+.5):null}},{key:"_checkFragmentChanged",value:function(){var e,t,r=this.media;if(r&&r.readyState&&r.seeking===!1&&(t=r.currentTime,t>r.playbackRate*this.lastCurrentTime&&(this.lastCurrentTime=t),f.default.isBuffered(r,t)?e=this.getBufferRange(t):f.default.isBuffered(r,t+.1)&&(e=this.getBufferRange(t+.1)),e)){var i=e.frag;i!==this.fragPlaying&&(this.fragPlaying=i,this.hls.trigger(v.default.FRAG_CHANGED,{frag:i}))}}},{key:"immediateLevelSwitch",value:function(){if(T.logger.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var e=this.media,t=void 0;e?(t=e.paused,e.pause()):t=!0,this.previouslyPaused=t}var r=this.fragCurrent;r&&r.loader&&r.loader.abort(),this.fragCurrent=null,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.flushMainBuffer(0,Number.POSITIVE_INFINITY)}},{key:"immediateLevelSwitchEnd",value:function(){var e=this.media;e&&e.buffered.length&&(this.immediateSwitch=!1,f.default.isBuffered(e,e.currentTime)&&(e.currentTime-=1e-4),this.previouslyPaused||e.play())}},{key:"nextLevelSwitch",value:function(){var e=this.media;if(e&&e.readyState){var t=void 0,r=void 0,i=void 0;if(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,r=this.getBufferRange(e.currentTime),r&&r.start>1&&this.flushMainBuffer(0,r.start-1),e.paused)t=0;else{var a=this.hls.nextLoadLevel,n=this.levels[a],s=this.fragLastKbps;t=s&&this.fragCurrent?this.fragCurrent.duration*n.bitrate/(1e3*s)+1:0; -}if(i=this.getBufferRange(e.currentTime+t),i&&(i=this.followingBufferRange(i))){var o=this.fragCurrent;o&&o.loader&&o.loader.abort(),this.fragCurrent=null,this.flushMainBuffer(i.start,Number.POSITIVE_INFINITY)}}}},{key:"flushMainBuffer",value:function(e,t){this.state=k.BUFFER_FLUSHING;var r={startOffset:e,endOffset:t};this.altAudio&&(r.type="video"),this.hls.trigger(v.default.BUFFER_FLUSHING,r)}},{key:"onMediaAttached",value:function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("seeked",this.onvseeked),t.addEventListener("ended",this.onvended);var r=this.config;this.levels&&r.autoStartLoad&&this.hls.startLoad(r.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(T.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.levels;t&&t.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){var e=this.media,t=e?e.currentTime:void 0,r=this.config;if(T.logger.log("media seeking to "+t.toFixed(3)),this.state===k.FRAG_LOADING){var i=this.mediaBuffer?this.mediaBuffer:e,a=f.default.bufferInfo(i,t,this.config.maxBufferHole),n=this.fragCurrent;if(0===a.len&&n){var s=r.maxFragLookUpTolerance,o=n.start-s,l=n.start+n.duration+s;tl?(n.loader&&(T.logger.log("seeking outside of buffer while fragment load in progress, cancel fragment load"),n.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.state=k.IDLE):T.logger.log("seeking outside of buffer but within currently loaded fragment range")}}else this.state===k.ENDED&&(this.state=k.IDLE);e&&(this.lastCurrentTime=t),this.state!==k.FRAG_LOADING&&void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*r.fragLoadingLoopThreshold),this.loadedmetadata||(this.nextLoadPosition=this.startPosition=t),this.tick()}},{key:"onMediaSeeked",value:function(){T.logger.log("media seeked to "+this.media.currentTime.toFixed(3)),this.tick()}},{key:"onMediaEnded",value:function(){T.logger.log("media ended"),this.startPosition=this.lastCurrentTime=0}},{key:"onManifestLoading",value:function(){T.logger.log("trigger BUFFER_RESET"),this.hls.trigger(v.default.BUFFER_RESET),this.bufferRange=[],this.stalled=!1,this.startPosition=this.lastCurrentTime=0}},{key:"onManifestParsed",value:function(e){var t,r=!1,i=!1;e.levels.forEach(function(e){t=e.audioCodec,t&&(t.indexOf("mp4a.40.2")!==-1&&(r=!0),t.indexOf("mp4a.40.5")!==-1&&(i=!0))}),this.audioCodecSwitch=r&&i,this.audioCodecSwitch&&T.logger.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=e.levels,this.startLevelLoaded=!1,this.startFragRequested=!1;var a=this.config;a.autoStartLoad&&this.hls.startLoad(a.startPosition)}},{key:"onLevelLoaded",value:function(e){var t=e.details,r=e.level,i=this.levels[r],a=t.totalduration,n=0;if(T.logger.log("level "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+a),this.levelLastLoaded=r,t.live){var s=i.details;s&&t.fragments.length>0?(E.default.mergeDetails(s,t),n=t.fragments[0].start,this.liveSyncPosition=this.computeLivePosition(n,s),t.PTSKnown?T.logger.log("live playlist sliding:"+n.toFixed(3)):T.logger.log("live playlist - outdated PTS, unknown sliding")):(t.PTSKnown=!1,T.logger.log("live playlist - first load, unknown sliding"))}else t.PTSKnown=!1;if(i.details=t,this.hls.trigger(v.default.LEVEL_UPDATED,{details:t,level:r}),this.startFragRequested===!1){if(this.startPosition===-1||this.lastCurrentTime===-1){var o=t.startTimeOffset;isNaN(o)?t.live?(this.startPosition=this.computeLivePosition(n,t),T.logger.log("configure startPosition to "+this.startPosition)):this.startPosition=0:(o<0&&(T.logger.log("negative start time offset "+o+", count from end of last fragment"),o=n+a+o),T.logger.log("start time offset found in playlist, adjust startPosition to "+o),this.startPosition=o),this.lastCurrentTime=this.startPosition}this.nextLoadPosition=this.startPosition}this.state===k.WAITING_LEVEL&&(this.state=k.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===k.KEY_LOADING&&(this.state=k.IDLE,this.tick())}},{key:"onFragLoaded",value:function(e){var t=this.fragCurrent,r=e.frag;if(this.state===k.FRAG_LOADING&&t&&"main"===r.type&&r.level===t.level&&r.sn===t.sn){var i=e.stats,a=this.levels[t.level],n=a.details;if(T.logger.log("Loaded "+t.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+t.level),this.bitrateTest=!1,r.bitrateTest===!0&&this.hls.nextLoadLevel)this.state=k.IDLE,this.startFragRequested=!1,i.tparsed=i.tbuffered=performance.now(),this.hls.trigger(v.default.FRAG_BUFFERED,{stats:i,frag:t,id:"main"}),this.tick();else{this.state=k.PARSING,this.stats=i;var s=n.totalduration,o=isNaN(t.startDTS)?t.start:t.startDTS,l=t.level,u=t.sn,d=this.config.defaultAudioCodec||a.audioCodec;this.audioCodecSwap&&(T.logger.log("swapping playlist audio codec"),void 0===d&&(d=this.lastAudioCodec),d&&(d=d.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5")),this.pendingBuffering=!0,this.appended=!1,T.logger.log("Parsing "+u+" of ["+n.startSN+" ,"+n.endSN+"],level "+l+", cc "+t.cc);var f=this.demuxer;f||(f=this.demuxer=new c.default(this.hls,"main"));var h=this.media,g=h&&h.seeking,p=!g&&(n.PTSKnown||!n.live);f.push(e.payload,d,a.videoCodec,o,t.cc,l,u,s,t.decryptdata,p,null)}}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(e){var t=this.fragCurrent;if(t&&"main"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===k.PARSING){var r,i,a=e.tracks;if(a.audio&&this.altAudio&&delete a.audio,i=a.audio){var n=this.levels[this.level].audioCodec,s=navigator.userAgent.toLowerCase();n&&this.audioCodecSwap&&(T.logger.log("swapping playlist audio codec"),n=n.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==i.metadata.channelCount&&s.indexOf("firefox")===-1&&(n="mp4a.40.5"),s.indexOf("android")!==-1&&"audio/mpeg"!==i.container&&(n="mp4a.40.2",T.logger.log("Android: force audio codec to "+n)),i.levelCodec=n,i.id=e.id}if(i=a.video,i&&(i.levelCodec=this.levels[this.level].videoCodec,i.id=e.id),e.unique){var o={codec:"",levelCodec:""};for(r in e.tracks)i=a[r],o.container=i.container,o.codec&&(o.codec+=",",o.levelCodec+=","),i.codec&&(o.codec+=i.codec),i.levelCodec&&(o.levelCodec+=i.levelCodec);a={audiovideo:o}}this.hls.trigger(v.default.BUFFER_CODECS,a);for(r in a){i=a[r],T.logger.log("main track:"+r+",container:"+i.container+",codecs[level/parsed]=["+i.levelCodec+"/"+i.codec+"]");var l=i.initSegment;l&&(this.appended=!0,this.pendingBuffering=!0,this.hls.trigger(v.default.BUFFER_APPENDING,{type:r,data:l,parent:"main",content:"initSegment"}))}this.tick()}}},{key:"onFragParsingData",value:function(e){var t=this,r=this.fragCurrent;if(r&&"main"===e.id&&e.sn===r.sn&&e.level===r.level&&("audio"!==e.type||!this.altAudio)&&this.state===k.PARSING){var i=this.levels[this.level],a=this.fragCurrent;T.logger.log("Parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb+",dropped:"+(e.dropped||0));var n=E.default.updateFragPTSDTS(i.details,a.sn,e.startPTS,e.endPTS,e.startDTS,e.endDTS),s=this.hls;s.trigger(v.default.LEVEL_PTS_UPDATED,{details:i.details,level:this.level,drift:n,type:e.type,start:e.startPTS,end:e.endPTS}),"video"===e.type&&(a.dropped=e.dropped),[e.data1,e.data2].forEach(function(r){r&&(t.appended=!0,t.pendingBuffering=!0,s.trigger(v.default.BUFFER_APPENDING,{type:e.type,data:r,parent:"main",content:"data"}))}),this.tick()}}},{key:"onFragParsed",value:function(e){var t=this.fragCurrent;t&&"main"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===k.PARSING&&(this.stats.tparsed=performance.now(),this.state=k.PARSED,this._checkAppendedParsed())}},{key:"onAudioTrackSwitching",value:function(e){var t=!!e.url,r=e.id;if(!t){if(this.mediaBuffer!==this.media){T.logger.log("switching on main audio, use media.buffered to schedule main fragment loading"),this.mediaBuffer=this.media;var i=this.fragCurrent;i.loader&&(T.logger.log("switching to main audio track, cancel main fragment load"),i.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=k.IDLE}var a=this.hls;a.trigger(v.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),a.trigger(v.default.AUDIO_TRACK_SWITCHED,{id:r}),this.altAudio=!1}}},{key:"onAudioTrackSwitched",value:function(e){var t=e.id,r=!!this.hls.audioTracks[t].url;if(r){var i=this.videoBuffer;i&&this.mediaBuffer!==i&&(T.logger.log("switching on alternate audio, use video.buffered to schedule main fragment loading"),this.mediaBuffer=i)}this.altAudio=r,this.tick()}},{key:"onBufferCreated",value:function(e){var t=e.tracks,r=void 0,i=void 0,a=!1;for(var n in t){var s=t[n];"main"===s.id?(i=n,r=s,"video"===n&&(this.videoBuffer=t[n].buffer)):a=!0}a&&r?(T.logger.log("alternate track found, use "+i+".buffered to schedule main fragment loading"),this.mediaBuffer=r.buffer):this.mediaBuffer=this.media}},{key:"onBufferAppended",value:function(e){if("main"===e.parent){var t=this.state;t!==k.PARSING&&t!==k.PARSED||(this.pendingBuffering=e.pending>0,this._checkAppendedParsed())}}},{key:"_checkAppendedParsed",value:function(){var e=this;if(!(this.state!==k.PARSED||this.appended&&this.pendingBuffering)){var t=this.fragCurrent;t&&!function(){var r=e.mediaBuffer?e.mediaBuffer:e.media;T.logger.log("main buffered : "+R.default.toString(r.buffered));var i=e.bufferRange.filter(function(e){return f.default.isBuffered(r,(e.start+e.end)/2)});i.push({type:t.type,start:t.startPTS,end:t.endPTS,frag:t}),e.bufferRange=i.sort(function(e,t){return e.start-t.start}),e.fragPrevious=t;var a=e.stats;a.tbuffered=performance.now(),e.fragLastKbps=Math.round(8*a.total/(a.tbuffered-a.tfirst)),e.hls.trigger(v.default.FRAG_BUFFERED,{stats:a,frag:t,id:"main"}),e.state=k.IDLE}(),this.tick()}}},{key:"onError",value:function(e){var t=e.frag||this.fragCurrent;if(!t||"main"===t.type){var r=this.media,i=r&&f.default.isBuffered(r,r.currentTime)&&f.default.isBuffered(r,r.currentTime+.5);switch(e.details){case _.ErrorDetails.FRAG_LOAD_ERROR:case _.ErrorDetails.FRAG_LOAD_TIMEOUT:case _.ErrorDetails.KEY_LOAD_ERROR:case _.ErrorDetails.KEY_LOAD_TIMEOUT:if(!e.fatal){var a=this.fragLoadError;a?a++:a=1;var n=this.config;if(a<=n.fragLoadingMaxRetry||i||t.autoLevel&&t.level){this.fragLoadError=a,t.loadCounter=0;var s=Math.min(Math.pow(2,a-1)*n.fragLoadingRetryDelay,n.fragLoadingMaxRetryTimeout);T.logger.warn("mediaController: frag loading failed, retry in "+s+" ms"),this.retryDate=performance.now()+s,this.loadedmetadata||(this.startFragRequested=!1,this.nextLoadPosition=this.startPosition),this.state=k.FRAG_LOADING_WAITING_RETRY}else T.logger.error("mediaController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.hls.trigger(v.default.ERROR,e),this.state=k.ERROR}break;case _.ErrorDetails.FRAG_LOOP_LOADING_ERROR:e.fatal||(i?(this._reduceMaxBufferLength(t.duration),this.state=k.IDLE):t.autoLevel&&0!==t.level||(e.fatal=!0,this.hls.trigger(v.default.ERROR,e),this.state=k.ERROR));break;case _.ErrorDetails.LEVEL_LOAD_ERROR:case _.ErrorDetails.LEVEL_LOAD_TIMEOUT:this.state!==k.ERROR&&(e.fatal?(this.state=k.ERROR,T.logger.warn("streamController: "+e.details+",switch to "+this.state+" state ...")):this.state===k.WAITING_LEVEL&&(this.state=k.IDLE));break;case _.ErrorDetails.BUFFER_FULL_ERROR:this.state!==k.PARSING&&this.state!==k.PARSED||(i?(this._reduceMaxBufferLength(t.duration),this.state=k.IDLE):(T.logger.warn("buffer full error also media.currentTime is not buffered, flush everything"),this.fragCurrent=null,this.flushMainBuffer(0,Number.POSITIVE_INFINITY)))}}}},{key:"_reduceMaxBufferLength",value:function(e){var t=this.config;t.maxMaxBufferLength>=e&&(t.maxMaxBufferLength/=2,T.logger.warn("reduce max buffer length to "+t.maxMaxBufferLength+"s and switch to IDLE state"),this.fragLoadIdx+=2*t.fragLoadingLoopThreshold)}},{key:"_checkBuffer",value:function(){var e=this.media;if(e&&e.readyState){var t=e.currentTime,r=this.mediaBuffer?this.mediaBuffer:e,i=r.buffered;if(this.loadedmetadata||!i.length||e.seeking)if(this.immediateSwitch)this.immediateLevelSwitchEnd();else{var a=f.default.bufferInfo(e,t,0),n=!(e.paused||e.ended||0===e.buffered.length),s=.5,o=t>e.playbackRate*this.lastCurrentTime,l=this.config;if(o)this.stalled&&(this.stallReported&&(T.logger.warn("playback not stuck anymore @"+t+", after "+Math.round(performance.now()-this.stalled)+"ms"),this.stallReported=!1),this.stalled=void 0);else if(n){var u=performance.now(),d=this.hls;if(this.stalled){var h=u-this.stalled,c=a.len;if(c<=s&&h>1e3*l.lowBufferWatchdogPeriod){this.stallReported||(this.stallReported=!0,T.logger.warn("playback stalling in low buffer @"+t),d.trigger(v.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1,buffer:c}));var g=a.nextStart,p=g-t;if(g&&p0){var y=this.nudgeRetry++,m=y*l.nudgeOffset;T.logger.log("adjust currentTime from "+e.currentTime+" to next buffered @ "+g+" + nudge "+m);var E=g+m-e.currentTime;e.currentTime=g+m,this.stalled=void 0,d.trigger(v.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_SEEK_OVER_HOLE,fatal:!1,hole:E})}}else if(c>s&&h>1e3*l.highBufferWatchdogPeriod){T.logger.warn("playback stalling in high buffer @"+t),d.trigger(v.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1,buffer:c}),this.stalled=void 0;var b=this.nudgeRetry++;if(b0;)e.removeCue(e.cues[0])}},{key:"getExistingTrack",value:function(e){var t=this.media;if(t)for(var r=0;r>>8^255&g^99,e[f]=g,t[g]=f;var v=d[f],p=d[v],y=d[p],m=257*d[g]^16843008*g;r[f]=m<<24|m>>>8,i[f]=m<<16|m>>>16,a[f]=m<<8|m>>>24,n[f]=m,m=16843009*y^65537*p^257*v^16843008*f,s[g]=m<<24|m>>>8,o[g]=m<<16|m>>>16,l[g]=m<<8|m>>>24,u[g]=m,f?(f=v^d[d[d[y^v]]],h^=d[d[h]]):f=h=1}}},{key:"expandKey",value:function(e){for(var t=this.uint8ArrayToUint32Array_(e),r=!0,i=0;i>8|e>>>24}},{key:"decrypt",value:function(e,t,r){for(var i,a,n=this.keySize+6,s=this.invKeySchedule,o=this.invSBox,l=this.invSubMix[0],u=this.invSubMix[1],d=this.invSubMix[2],f=this.invSubMix[3],h=this.uint8ArrayToUint32Array_(r),c=h[0],g=h[1],v=h[2],p=h[3],y=new Int32Array(e),m=new Int32Array(y.length),E=void 0,b=void 0,R=void 0,_=void 0,T=void 0,k=void 0,A=void 0,S=void 0,L=void 0,D=void 0,w=void 0,O=void 0;t>>24]^u[k>>16&255]^d[A>>8&255]^f[255&S]^s[i],b=l[k>>>24]^u[A>>16&255]^d[S>>8&255]^f[255&T]^s[i+1],R=l[A>>>24]^u[S>>16&255]^d[T>>8&255]^f[255&k]^s[i+2],_=l[S>>>24]^u[T>>16&255]^d[k>>8&255]^f[255&A]^s[i+3],T=E,k=b,A=R,S=_,i+=4;E=o[T>>>24]<<24^o[k>>16&255]<<16^o[A>>8&255]<<8^o[255&S]^s[i],b=o[k>>>24]<<24^o[A>>16&255]<<16^o[S>>8&255]<<8^o[255&T]^s[i+1],R=o[A>>>24]<<24^o[S>>16&255]<<16^o[T>>8&255]<<8^o[255&k]^s[i+2],_=o[S>>>24]<<24^o[T>>16&255]<<16^o[k>>8&255]<<8^o[255&A]^s[i+3],i+=3,m[t]=this.networkToHostOrderSwap(E^c),m[t+1]=this.networkToHostOrderSwap(_^g),m[t+2]=this.networkToHostOrderSwap(R^v),m[t+3]=this.networkToHostOrderSwap(b^p),c=L,g=D,v=w,p=O,t+=4}return m.buffer}},{key:"destroy",value:function(){this.key=void 0,this.keySize=void 0,this.ksRows=void 0,this.sBox=void 0,this.invSBox=void 0,this.subMix=void 0,this.invSubMix=void 0,this.keySchedule=void 0,this.invKeySchedule=void 0,this.rcon=void 0}}]),e}();r.default=n},{}],16:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r>>5,v-=E,v>0&&m+E+v<=R);)for(b=k+y*p,_={unit:e.subarray(m+E,m+E+v),pts:b,dts:b},c.samples.push(_),c.len+=v,m+=v+E,y++;m>>6)+1,o=(60&t[r+2])>>>2,o>c.length-1?void e.trigger(Event.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+o}):(u=(1&t[r+2])<<2,u|=(192&t[r+3])>>>6,n.logger.log("manifest codec:"+i+",ADTS data:type:"+a+",sampleingIndex:"+o+"["+c[o]+"Hz],channelConfig:"+u),/firefox|OPR/i.test(f)?o>=6?(a=5,d=new Array(4),l=o-3):(a=2,d=new Array(2),l=o):f.indexOf("android")!==-1?(a=2,d=new Array(2),l=o):(a=5,d=new Array(4),i&&(i.indexOf("mp4a.40.29")!==-1||i.indexOf("mp4a.40.5")!==-1)||!i&&o>=6?l=o-3:((i&&i.indexOf("mp4a.40.2")!==-1&&o>=6&&1===u||!i&&1===u)&&(a=2,d=new Array(2)),l=o)),d[0]=a<<3,d[0]|=(14&o)>>1,d[1]|=(1&o)<<7,d[1]|=u<<3,5===a&&(d[1]|=(14&l)>>1,d[2]=(1&l)<<7,d[2]|=8,d[3]=0),/Vivaldi|OPR/i.test(f)&&(h="mp4a.40.2"),{config:d,samplerate:c[o],channelCount:u,codec:"mp4a.40."+a,manifestCodec:h})}}]),e}();r.default=o},{26:26,45:45}],20:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r3&&void 0!==arguments[3]?arguments[3]:null;a(this,e),this.hls=t,this.id=r,this.config=this.hls.config||n,this.typeSupported=i}return n(e,[{key:"destroy",value:function(){var e=this.demuxer;e&&e.destroy(); -}},{key:"push",value:function(e,t,r,i,a,n,s,l,u,f,h){if(e.byteLength>0&&null!=u&&null!=u.key&&"AES-128"===u.method){null==this.decrypter&&(this.decrypter=new d.default(this.hls,this.config));var c,g=this;try{c=performance.now()}catch(e){c=Date.now()}this.decrypter.decrypt(e,u.key.buffer,u.iv.buffer,function(e){var u;try{u=performance.now()}catch(e){u=Date.now()}g.hls.trigger(o.default.FRAG_DECRYPTED,{level:n,sn:s,stats:{tstart:c,tdecrypt:u}}),g.pushDecrypted(new Uint8Array(e),t,r,i,a,n,s,l,f,h)})}else this.pushDecrypted(new Uint8Array(e),t,r,i,a,n,s,l,f,h)}},{key:"pushDecrypted",value:function(e,t,r,i,a,n,s,u,d,f){var c=this.demuxer;if(!c||a!==this.cc&&!c.probe(e)){var v=this.hls,y=this.id,E=this.config,b=this.typeSupported;if(g.default.probe(e))c=this.typeSupported.mp2t===!0?new g.default(v,y,m.default,E,b):new g.default(v,y,p.default,E,b),c.probe=g.default.probe;else{if(!h.default.probe(e))return void v.trigger(o.default.ERROR,{type:l.ErrorTypes.MEDIA_ERROR,id:y,details:l.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"no demux matching with content found"});c=new h.default(v,y,p.default,E,b),c.probe=h.default.probe}this.demuxer=c}c.push(e,t,r,i,a,n,s,u,d,f),this.cc=a}}]),e}();r.default=E},{16:16,18:18,25:25,26:26,28:28,38:38,39:39}],21:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(r,"__esModule",{value:!0});var a=e(20),n=i(a),s=e(28),o=i(s),l=e(45),u=e(1),d=i(u),f=function(e){var t=new d.default;t.trigger=function(e){for(var r=arguments.length,i=Array(r>1?r-1:0),a=1;a1?r-1:0),a=1;ae?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,t=e>>3,e-=t>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)}},{key:"readBits",value:function(e){var t=Math.min(this.bitsAvailable,e),r=this.word>>>32-t;return e>32&&n.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=t,this.bitsAvailable>0?this.word<<=t:this.bytesAvailable>0&&this.loadWord(),t=e-t,t>0&&this.bitsAvailable?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()}},{key:"skipUEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"skipEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"readUEG",value:function(){var e=this.skipLZ();return this.readBits(e+1)-1}},{key:"readEG",value:function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)}},{key:"readBoolean",value:function(){return 1===this.readBits(1)}},{key:"readUByte",value:function(){return this.readBits(8)}},{key:"readUShort",value:function(){return this.readBits(16)}},{key:"readUInt",value:function(){return this.readBits(32)}},{key:"skipScalingList",value:function(e){var t,r,i=8,a=8;for(t=0;t>4,p>1){if(y=f+5+e[f+4],y===f+188)continue}else y=f+4;switch(v){case S:if(g){if(O&&(m=x(O))&&(F(m,!1),b&&T.codec&&(L===-1||k.codec)))return void this.remux(n,s,a,e,i);O={data:[],size:0}}O&&(O.data.push(e.subarray(y,f+188)),O.size+=f+188-y);break;case L:if(g){if(I&&(m=x(I))&&(k.isAAC?N(m):U(m),b&&k.codec&&(S===-1||T.codec)))return void this.remux(n,s,a,e,i);I={data:[],size:0}}I&&(I.data.push(e.subarray(y,f+188)),I.size+=f+188-y);break;case D:g&&(P&&(m=x(P))&&G(m),P={data:[],size:0}),P&&(P.data.push(e.subarray(y,f+188)),P.size+=f+188-y);break;case 0:g&&(y+=e[y]+1),w=this._pmtId=C(e,y);break;case w:g&&(y+=e[y]+1);var B=M(e,y,this.typeSupported.mpeg===!0||this.typeSupported.mp3===!0);S=B.avc,S>0&&(T.id=S),L=B.audio,L>0&&(k.id=L,k.isAAC=B.isAAC),D=B.id3,D>0&&(A.id=D),R&&!_&&(h.logger.log("reparse from beginning"),R=!1,f=-188),_=this.pmtParsed=!0;break;case 17:case 8191:break;default:R=!0}}else this.observer.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,id:this.id,details:c.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});O&&(m=x(O))?(F(m,!0),T.pesData=null):T.pesData=O,I&&(m=x(I))?(k.isAAC?N(m):U(m),k.pesData=null):(I&&I.size&&h.logger.log("last AAC PES packet truncated,might overlap between fragments"),k.pesData=I),P&&(m=x(P))?(G(m),A.pesData=null):A.pesData=P,this.remux(n,s,a,null,i,d)}},{key:"remux",value:function(e,t,r,i,a,n){for(var s=this._avcTrack,o=s.samples,l=0,u=0,d=0;d1;){var c=new Uint8Array(f[0].length+f[1].length);c.set(f[0]),c.set(f[1],f[0].length),f[0]=c,f.splice(1,1)}if(t=f[0],i=(t[0]<<16)+(t[1]<<8)+t[2],1===i){if(a=(t[4]<<8)+t[5],a&&a>e.size-6)return null;r=t[7],192&r&&(o=536870912*(14&t[9])+4194304*(255&t[10])+16384*(254&t[11])+128*(255&t[12])+(254&t[13])/2,o>4294967295&&(o-=8589934592),64&r?(l=536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2,l>4294967295&&(l-=8589934592),o-l>54e5&&(h.logger.warn(Math.round((o-l)/9e4)+"s delta between PTS and DTS, align them"),o=l)):l=o),n=t[8],u=n+9,e.size-=u,s=new Uint8Array(e.size);for(var g=0,v=f.length;gp){u-=p;continue}t=t.subarray(u),p-=u,u=0}s.set(t,d),d+=p}return a&&(a-=n+3),{data:s,pts:o,dts:l,len:a}}return null}},{key:"pushAccesUnit",value:function(e,t){e.units.units.length&&e.frame&&(!this.config.forceKeyFrameOnDiscontinuity||e.key===!0||t.sps&&(t.samples.length||this.contiguous)?t.samples.push(e):t.dropped++),e.debug.length&&h.logger.log(e.pts+"/"+e.dts+":"+e.debug+","+e.units.length)}},{key:"_parseAVCPES",value:function(e,t){var r,i,a,n=this,s=this._avcTrack,o=this._parseAVCNALu(e.data),l=!1,u=this.avcSample;e.data=null,o.forEach(function(t){switch(t.type){case 1:i=!0,l&&u&&(u.debug+="NDR "),u.frame=!0;var o=t.data;if(o.length>4){var d=new f.default(o).readSliceType();2!==d&&4!==d&&7!==d&&9!==d||(u.key=!0)}break;case 5:i=!0,u||(u=n.avcSample=n._createAVCSample(!0,e.pts,e.dts,"")),l&&(u.debug+="IDR "),u.key=!0,u.frame=!0;break;case 6:i=!0,l&&u&&(u.debug+="SEI "),r=new f.default(n.discardEPB(t.data)),r.readUByte();for(var h=0,c=0,g=!1,v=0;!g&&r.bytesAvailable>1;){h=0;do v=r.readUByte(),h+=v;while(255===v);c=0;do v=r.readUByte(),c+=v;while(255===v);if(4===h&&0!==r.bytesAvailable){g=!0;var p=r.readUByte();if(181===p){var y=r.readUShort();if(49===y){var m=r.readUInt();if(1195456820===m){var E=r.readUByte();if(3===E){var b=r.readUByte(),R=r.readUByte(),_=31&b,T=[b,R];for(a=0;a<_;a++)T.push(r.readUByte()),T.push(r.readUByte()),T.push(r.readUByte());n._insertSampleInOrder(n._txtTrack.samples,{type:3,pts:e.pts,bytes:T})}}}}}else if(c0){if(t.pts>=e[r-1].pts)e.push(t);else for(var i=r-1;i>=0;i--)if(t.pts=0)i={data:e.subarray(h,s-u-1),type:n},f.push(i);else{var c=this._getLastNalUnit();if(c&&(d&&s<=4-d&&c.state&&(c.data=c.data.subarray(0,c.data.byteLength-d)),r=s-u-1,r>0)){var g=new Uint8Array(c.data.byteLength+r);g.set(c.data,0),g.set(e.subarray(0,r),c.data.byteLength),c.data=g}}s=0&&u>=0&&(i={data:e.subarray(h,o),type:n,state:u},f.push(i)),0===f.length){var v=this._getLastNalUnit();if(v){var p=new Uint8Array(v.data.byteLength+e.byteLength);p.set(v.data,0),p.set(e,v.data.byteLength),v.data=p}}return l.naluState=u,f}},{key:"discardEPB",value:function(e){for(var t,r,i=e.byteLength,a=[],n=1;n1&&(h.logger.log("AAC: align PTS for overlapping frames by "+Math.round((k-p)/90)),p=k)}for(;n+5>>5,r-=s,r>0&&n+s+r<=d);)for(l=p+a*i,f={unit:v.subarray(n+s,n+s+r),pts:l,dts:l},g.samples.push(f),g.len+=r,n+=r+s,a++;n0;)s+=t}},{key:"_onMpegFrame",value:function(e,t,r,i,a,n){var s=1152/r*1e3,o=n+a*s,l=this._audioTrack;l.config=[],l.channelCount=i,l.audiosamplerate=r,l.duration=this._duration,l.samples.push({unit:e,pts:o,dts:o}),l.len+=e.length}},{key:"_onMpegNoise",value:function(e){h.logger.warn("mpeg audio has noise: "+e.length+" bytes")}},{key:"_parseMpeg",value:function(e,t,r,i,a){var n=[32,64,96,128,160,192,224,256,288,320,352,384,416,448,32,48,56,64,80,96,112,128,160,192,224,256,320,384,32,40,48,56,64,80,96,112,128,160,192,224,256,320,32,48,56,64,80,96,112,128,144,160,176,192,224,256,8,16,24,32,40,48,56,64,80,96,112,128,144,160],s=[44100,48e3,32e3,22050,24e3,16e3,11025,12e3,8e3];if(t+2>r)return-1;if(255===e[t]||224===(224&e[t+1])){if(t+24>r)return-1;var o=e[t+1]>>3&3,l=e[t+1]>>1&3,u=e[t+2]>>4&15,d=e[t+2]>>2&3,f=!!(2&e[t+2]);if(1!==o&&0!==u&&15!==u&&3!==d){var h=3===o?3-l:3===l?3:4,c=1e3*n[14*h+u-1],g=3===o?0:2===o?1:2,v=s[3*g+d],p=f?1:0,y=e[t+3]>>6===3?1:2,m=3===l?(3===o?12:6)*c/v+p<<2:(3===o?144:72)*c/v+p|0;return t+m>r?-1:(this._onMpegFrame&&this._onMpegFrame(e.subarray(t,t+m),c,v,y,i,a),m)}}for(var E=t+2;E=564&&71===e[0]&&71===e[188]&&71===e[376]}}]),e}();r.default=g},{19:19,23:23,26:26,28:28,45:45}],26:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.ErrorTypes={NETWORK_ERROR:"networkError",MEDIA_ERROR:"mediaError",MUX_ERROR:"muxError",OTHER_ERROR:"otherError"},r.ErrorDetails={MANIFEST_LOAD_ERROR:"manifestLoadError",MANIFEST_LOAD_TIMEOUT:"manifestLoadTimeOut",MANIFEST_PARSING_ERROR:"manifestParsingError",MANIFEST_INCOMPATIBLE_CODECS_ERROR:"manifestIncompatibleCodecsError",LEVEL_LOAD_ERROR:"levelLoadError",LEVEL_LOAD_TIMEOUT:"levelLoadTimeOut",LEVEL_SWITCH_ERROR:"levelSwitchError",AUDIO_TRACK_LOAD_ERROR:"audioTrackLoadError",AUDIO_TRACK_LOAD_TIMEOUT:"audioTrackLoadTimeOut",FRAG_LOAD_ERROR:"fragLoadError",FRAG_LOOP_LOADING_ERROR:"fragLoopLoadingError",FRAG_LOAD_TIMEOUT:"fragLoadTimeOut",FRAG_DECRYPT_ERROR:"fragDecryptError",FRAG_PARSING_ERROR:"fragParsingError",REMUX_ALLOC_ERROR:"remuxAllocError",KEY_LOAD_ERROR:"keyLoadError",KEY_LOAD_TIMEOUT:"keyLoadTimeOut",BUFFER_ADD_CODEC_ERROR:"bufferAddCodecError",BUFFER_APPEND_ERROR:"bufferAppendError",BUFFER_APPENDING_ERROR:"bufferAppendingError",BUFFER_STALLED_ERROR:"bufferStalledError",BUFFER_FULL_ERROR:"bufferFullError",BUFFER_SEEK_OVER_HOLE:"bufferSeekOverHole",BUFFER_NUDGE_ON_STALL:"bufferNudgeOnStall",INTERNAL_EXCEPTION:"internalException"}},{}],27:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=function(){function e(e,t){for(var r=0;r1?r-1:0),n=1;n=r.start(i)&&t<=r.end(i))return!0;return!1}},{key:"bufferInfo",value:function(e,t,r){if(e){var i,a=e.buffered,n=[];for(i=0;id&&(l[u-1].end=e[o].end):l.push(e[o])}else l.push(e[o])}for(o=0,i=0,a=n=t;o=f&&t=0&&ot.endSN)return 0;if(o=r-t.startSN,l=t.fragments,u=l[o],!isNaN(u.startPTS)){var f=Math.abs(u.startPTS-i);isNaN(u.deltaPTS)?u.deltaPTS=f:u.deltaPTS=Math.max(f,u.deltaPTS), -i=Math.min(i,u.startPTS),a=Math.max(a,u.endPTS),n=Math.min(n,u.startDTS),s=Math.max(s,u.endDTS)}var h=i-u.start;for(u.start=u.startPTS=i,u.endPTS=a,u.startDTS=n,u.endDTS=s,u.duration=a-i,d=o;d>0;d--)e.updatePTS(l,d,d-1);for(d=o;dt?a.start=i.start+i.duration:a.start=i.start-a.duration:r>t?(i.duration=s-i.start,i.duration<0&&n.logger.warn("negative duration computed for frag "+i.sn+",level "+i.level+", there should be some duration drift between playlist and fragment!")):(a.duration=i.start-s,a.duration<0&&n.logger.warn("negative duration computed for frag "+a.sn+",level "+a.level+", there should be some duration drift between playlist and fragment!"))}}]),e}();r.default=s},{45:45}],32:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:{};a(this,e);var r=e.DefaultConfig;if((t.liveSyncDurationCount||t.liveMaxLatencyDurationCount)&&(t.liveSyncDuration||t.liveMaxLatencyDuration))throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration");for(var i in r)i in t||(t[i]=r[i]);if(void 0!==t.liveMaxLatencyDurationCount&&t.liveMaxLatencyDurationCount<=t.liveSyncDurationCount)throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be gt "liveSyncDurationCount"');if(void 0!==t.liveMaxLatencyDuration&&(t.liveMaxLatencyDuration<=t.liveSyncDuration||void 0===t.liveSyncDuration))throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be gt "liveSyncDuration"');(0,I.enableLogs)(t.debug),this.config=t;var n=this.observer=new x.default;n.trigger=function(e){for(var t=arguments.length,r=Array(t>1?t-1:0),i=1;i1?t-1:0),i=1;i0&&void 0!==arguments[0]?arguments[0]:-1;I.logger.log("startLoad("+e+")"),this.levelController.startLoad(),this.streamController.startLoad(e),this.audioStreamController.startLoad(e)}},{key:"stopLoad",value:function(){I.logger.log("stopLoad"),this.levelController.stopLoad(),this.streamController.stopLoad(),this.audioStreamController.stopLoad()}},{key:"swapAudioCodec",value:function(){I.logger.log("swapAudioCodec"),this.streamController.swapAudioCodec()}},{key:"recoverMediaError",value:function(){I.logger.log("recoverMediaError");var e=this.media;this.detachMedia(),this.attachMedia(e)}},{key:"levels",get:function(){return this.levelController.levels}},{key:"currentLevel",get:function(){return this.streamController.currentLevel},set:function(e){I.logger.log("set currentLevel:"+e),this.loadLevel=e,this.streamController.immediateLevelSwitch()}},{key:"nextLevel",get:function(){return this.streamController.nextLevel},set:function(e){I.logger.log("set nextLevel:"+e),this.levelController.manualLevel=e,this.streamController.nextLevelSwitch()}},{key:"loadLevel",get:function(){return this.levelController.level},set:function(e){I.logger.log("set loadLevel:"+e),this.levelController.manualLevel=e}},{key:"nextLoadLevel",get:function(){return this.levelController.nextLoadLevel},set:function(e){this.levelController.nextLoadLevel=e}},{key:"firstLevel",get:function(){return Math.max(this.levelController.firstLevel,this.abrController.minAutoLevel)},set:function(e){I.logger.log("set firstLevel:"+e),this.levelController.firstLevel=e}},{key:"startLevel",get:function(){return this.levelController.startLevel},set:function(e){I.logger.log("set startLevel:"+e),this.levelController.startLevel=e}},{key:"autoLevelCapping",get:function(){return this.abrController.autoLevelCapping},set:function(e){I.logger.log("set autoLevelCapping:"+e),this.abrController.autoLevelCapping=e}},{key:"autoLevelEnabled",get:function(){return this.levelController.manualLevel===-1}},{key:"manualLevel",get:function(){return this.levelController.manualLevel}},{key:"audioTracks",get:function(){return this.audioTrackController.audioTracks}},{key:"audioTrack",get:function(){return this.audioTrackController.audioTrack},set:function(e){this.audioTrackController.audioTrack=e}},{key:"liveSyncPosition",get:function(){return this.streamController.liveSyncPosition}}]),e}();r.default=B},{1:1,10:10,11:11,12:12,13:13,26:26,28:28,34:34,35:35,36:36,4:4,43:43,45:45,47:47,5:5,6:6,7:7,8:8}],33:[function(e,t,r){"use strict";t.exports=e(32).default},{32:32}],34:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r>8*(15-r)&255;return t}},{key:"fragmentDecryptdataFromLevelkey",value:function(e,t){var r=e;return e&&e.method&&e.uri&&!e.iv&&(r=new _,r.method=e.method,r.baseuri=e.baseuri,r.reluri=e.reluri,r.iv=this.createInitializationVector(t)),r}},{key:"cloneObj",value:function(e){return JSON.parse(JSON.stringify(e))}},{key:"url",get:function(){return!this._url&&this.relurl&&(this._url=u.default.buildAbsoluteURL(this.baseurl,this.relurl)),this._url},set:function(e){this._url=e}},{key:"programDateTime",get:function(){return!this._programDateTime&&this.rawProgramDateTime&&(this._programDateTime=new Date(Date.parse(this.rawProgramDateTime))),this._programDateTime}},{key:"byteRange",get:function(){if(!this._byteRange){var e=this._byteRange=[];if(this.rawByteRange){var t=this.rawByteRange.split("@",2);if(1===t.length){var r=this.lastByteRangeEndOffset;e[0]=r?r:0}else e[0]=parseInt(t[1]);e[1]=parseInt(t[0])+e[0]}}return this._byteRange}},{key:"byteRangeStartOffset",get:function(){return this.byteRange[0]}},{key:"byteRangeEndOffset",get:function(){return this.byteRange[1]}},{key:"decryptdata",get:function(){return this._decryptdata||(this._decryptdata=this.fragmentDecryptdataFromLevelkey(this.levelkey,this.sn)),this._decryptdata}}]),e}(),k=function(e){function t(e){s(this,t);var r=a(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,f.default.MANIFEST_LOADING,f.default.LEVEL_LOADING,f.default.AUDIO_TRACK_LOADING));return r.loaders={},r}return n(t,e),o(t,[{key:"destroy",value:function(){for(var e in this.loaders){var t=this.loaders[e];t&&t.destroy()}this.loaders={},c.default.prototype.destroy.call(this)}},{key:"onManifestLoading",value:function(e){this.load(e.url,{type:"manifest"})}},{key:"onLevelLoading",value:function(e){this.load(e.url,{type:"level",level:e.level,id:e.id})}},{key:"onAudioTrackLoading",value:function(e){this.load(e.url,{type:"audioTrack",id:e.id})}},{key:"load",value:function(e,t){var r=this.loaders[t.type];if(r){var i=r.context;if(i&&i.url===e)return void y.logger.trace("playlist request ongoing");y.logger.warn("abort previous loader for type:"+t.type),r.abort()}var a=this.hls.config,n=void 0,s=void 0,o=void 0,l=void 0;"manifest"===t.type?(n=a.manifestLoadingMaxRetry,s=a.manifestLoadingTimeOut,o=a.manifestLoadingRetryDelay,l=a.manifestLoadingMaxRetryTimeout):(n=a.levelLoadingMaxRetry,s=a.levelLoadingTimeOut,o=a.levelLoadingRetryDelay,l=a.levelLoadingMaxRetryTimeout,y.logger.log("loading playlist for "+t.type+" "+(t.level||t.id))),r=this.loaders[t.type]=t.loader="undefined"!=typeof a.pLoader?new a.pLoader(a):new a.loader(a),t.url=e,t.responseType="";var u=void 0,d=void 0;u={timeout:s,maxRetry:n,retryDelay:o,maxRetryDelay:l},d={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this)},r.load(t,u,d)}},{key:"resolve",value:function(e,t){return u.default.buildAbsoluteURL(t,e)}},{key:"parseMasterPlaylist",value:function(e,t){var r=[],i=void 0;for(m.lastIndex=0;null!=(i=m.exec(e));){var a={},n=a.attrs=new p.default(i[1]);a.url=this.resolve(i[2],t);var s=n.decimalResolution("RESOLUTION");s&&(a.width=s.width,a.height=s.height),a.bitrate=n.decimalInteger("AVERAGE-BANDWIDTH")||n.decimalInteger("BANDWIDTH"),a.name=n.NAME;var o=n.CODECS;if(o){o=o.split(/[ ,]+/);for(var l=0;l2?(t=r.shift()+".",t+=parseInt(r.shift()).toString(16),t+=("000"+parseInt(r.shift()).toString(16)).substr(-4)):t=e,t}},{key:"parseLevelPlaylist",value:function(e,t,r,i){var a,n,s=0,o=0,l={type:null,version:null,url:t,fragments:[],live:!0,startSN:0},u=new _,d=0,f=null,h=new T;for(h.tagList=[],b.lastIndex=0;null!==(a=b.exec(e));){var c=a[1];if(c){h.duration=parseFloat(c);var g=(" "+a[2]).slice(1);h.title=g?g:null,h.tagList.push(g?["INF",c,g]:["INF",c])}else if(a[3]){if(!isNaN(h.duration)){var v=s++;h.type=i,h.start=o,h.levelkey=u,h.sn=v,h.level=r,h.cc=d,h.baseurl=t,h.relurl=(" "+a[3]).slice(1),l.fragments.push(h),f=h,o+=h.duration,h=new T,h.tagList=[]}}else if(a[4]){if(h.rawByteRange=(" "+a[4]).slice(1),f){var m=f.byteRangeEndOffset;m&&(h.lastByteRangeEndOffset=m)}}else if(a[5])h.rawProgramDateTime=(" "+a[5]).slice(1),h.tagList.push(["PROGRAM-DATE-TIME",h.rawProgramDateTime]);else{for(a=a[0].match(R),n=1;n0){var u="audioTrack"!==n,d=this.parseLevelPlaylist(i,a,(u?o:s)||0,u?"main":"audio");"manifest"===n&&l.trigger(f.default.MANIFEST_LOADED,{levels:[{url:a,details:d}],audioTracks:[],url:a,stats:t}),t.tparsed=performance.now(),d.targetduration?u?l.trigger(f.default.LEVEL_LOADED,{details:d,level:o||0,id:s||0,stats:t}):l.trigger(f.default.AUDIO_TRACK_LOADED,{details:d,id:s,stats:t}):l.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:g.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"invalid targetduration"})}else{var h=this.parseMasterPlaylist(i,a);if(h.length){var c=this.parseMasterPlaylistMedia(i,a,"AUDIO");if(c.length){var v=!1;c.forEach(function(e){e.url||(v=!0)}),v===!1&&h[0].audioCodec&&!h[0].attrs.AUDIO&&(y.logger.log("audio codec signaled in quality level, but no embedded audio track signaled, create one"),c.unshift({type:"main",name:"main"}))}l.trigger(f.default.MANIFEST_LOADED,{levels:h,audioTracks:c,url:a,stats:t})}else l.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:g.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"no level found in manifest"})}else l.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:g.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"no EXTM3U delimiter"})}},{key:"loaderror",value:function(e,t){var r,i,a=t.loader;switch(t.type){case"manifest":r=g.ErrorDetails.MANIFEST_LOAD_ERROR,i=!0;break;case"level":r=g.ErrorDetails.LEVEL_LOAD_ERROR,i=!1;break;case"audioTrack":r=g.ErrorDetails.AUDIO_TRACK_LOAD_ERROR,i=!1}a&&(a.abort(),this.loaders[t.type]=void 0),this.hls.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:r,fatal:i,url:a.url,loader:a,response:e,context:t})}},{key:"loadtimeout",value:function(e,t){var r,i,a=t.loader;switch(t.type){case"manifest":r=g.ErrorDetails.MANIFEST_LOAD_TIMEOUT,i=!0;break;case"level":r=g.ErrorDetails.LEVEL_LOAD_TIMEOUT,i=!1;break;case"audioTrack":r=g.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT,i=!1}a&&(a.abort(),this.loaders[t.type]=void 0),this.hls.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:r,fatal:i,url:a.url,loader:a,context:t})}}]),t}(c.default);r.default=k},{2:2,26:26,27:27,28:28,40:40,45:45}],37:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r>24&255,t[1]=i>>16&255,t[2]=i>>8&255,t[3]=255&i,t.set(e,4),a=0,i=8;a>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,85,196,0,0]))}},{key:"mdia",value:function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))}},{key:"mfhd",value:function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))}},{key:"minf",value:function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))}},{key:"moof",value:function(t,r,i){return e.box(e.types.moof,e.mfhd(t),e.traf(i,r))}},{key:"moov",value:function(t){for(var r=t.length,i=[];r--;)i[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(i).concat(e.mvex(t)))}},{key:"mvex",value:function(t){for(var r=t.length,i=[];r--;)i[r]=e.trex(t[r]);return e.box.apply(null,[e.types.mvex].concat(i))}},{key:"mvhd",value:function(t,r){r*=t;var i=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24&255,r>>16&255,r>>8&255,255&r,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,i)}},{key:"sdtp",value:function(t){var r,i,a=t.samples||[],n=new Uint8Array(4+a.length);for(i=0;i>>8&255),n.push(255&a),n=n.concat(Array.prototype.slice.call(i));for(r=0;r>>8&255),s.push(255&a),s=s.concat(Array.prototype.slice.call(i));var o=e.box(e.types.avcC,new Uint8Array([1,n[3],n[4],n[5],255,224|t.sps.length].concat(n).concat([t.pps.length]).concat(s))),l=t.width,u=t.height,d=t.pixelRatio[0],f=t.pixelRatio[1];return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,l>>8&255,255&l,u>>8&255,255&u,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),o,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])),e.box(e.types.pasp,new Uint8Array([d>>24,d>>16&255,d>>8&255,255&d,f>>24,f>>16&255,f>>8&255,255&f])))}},{key:"esds",value:function(e){var t=e.config.length;return new Uint8Array([0,0,0,0,3,23+t,0,1,0,4,15+t,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([t]).concat(e.config).concat([6,1,2]))}},{key:"mp4a",value:function(t){var r=t.audiosamplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))}},{key:"mp3",value:function(t){var r=t.audiosamplerate;return e.box(e.types[".mp3"],new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]))}},{key:"stsd",value:function(t){return"audio"===t.type?t.isAAC||"mp3"!==t.codec?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.mp3(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))}},{key:"tkhd",value:function(t){var r=t.id,i=t.duration*t.timescale,a=t.width,n=t.height;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,i>>24,i>>16&255,i>>8&255,255&i,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,a>>8&255,255&a,0,0,n>>8&255,255&n,0,0]))}},{key:"traf",value:function(t,r){var i=e.sdtp(t),a=t.id;return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,a>>24,a>>16&255,a>>8&255,255&a])),e.box(e.types.tfdt,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r])),e.trun(t,i.length+16+16+8+16+8+8),i)}},{key:"trak",value:function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))}},{key:"trex",value:function(t){var r=t.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))}},{key:"trun",value:function(t,r){var i,a,n,s,o,l,u=t.samples||[],d=u.length,f=12+16*d,h=new Uint8Array(f);for(r+=8+f,h.set([0,0,15,1,d>>>24&255,d>>>16&255,d>>>8&255,255&d,r>>>24&255,r>>>16&255,r>>>8&255,255&r],0),i=0;i>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,o.isLeading<<2|o.dependsOn,o.isDependedOn<<6|o.hasRedundancy<<4|o.paddingValue<<1|o.isNonSync,61440&o.degradPrio,15&o.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*i); +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Hls=e()}}(function(){var e;return function e(t,r,i){function a(s,o){if(!r[s]){if(!t[s]){var l="function"==typeof require&&require;if(!o&&l)return l(s,!0);if(n)return n(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var d=r[s]={exports:{}};t[s][0].call(d.exports,function(e){var r=t[s][1][e];return a(r?r:e)},d,d.exports,e,t,r,i)}return r[s].exports}for(var n="function"==typeof require&&require,s=0;s0&&this._events[e].length>r&&(this._events[e].warned=!0,"function"==typeof console.trace)),this},i.prototype.on=i.prototype.addListener,i.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!a(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},i.prototype.removeListener=function(e,t){var r,i,n,o;if(!a(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],n=r.length,i=-1,r===t||a(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(s(r)){for(o=n;o-- >0;)if(r[o]===t||r[o].listener&&r[o].listener===t){i=o;break}if(i<0)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},i.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],a(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},i.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?a(this._events[e])?[this._events[e]]:this._events[e].slice():[]},i.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(a(t))return 1;if(t)return t.length}return 0},i.listenerCount=function(e,t){return e.listenerCount(t)}},{}],2:[function(t,r,i){!function(t){var a={buildAbsoluteURL:function(e,t){if(t=t.trim(),/^[a-z]+:/i.test(t))return t;var r=null,i=null,n=/^([^#]*)(.*)$/.exec(t);n&&(i=n[2],t=n[1]);var s=/^([^\?]*)(.*)$/.exec(t);s&&(r=s[2],t=s[1]);var o=/^([^#]*)(.*)$/.exec(e);o&&(e=o[1]);var l=/^([^\?]*)(.*)$/.exec(e);l&&(e=l[1]);var u=/^(([a-z]+:)?\/\/[a-z0-9\.\-_~]+(:[0-9]+)?)?(\/.*)$/i.exec(e);if(!u)throw new Error("Error trying to parse base URL.");var d=u[2]||"",f=u[1]||"",h=u[4],c=null;return c=/^\/\//.test(t)?d+"//"+a.buildAbsolutePath("",t.substring(2)):/^\//.test(t)?f+"/"+a.buildAbsolutePath("",t.substring(1)):a.buildAbsolutePath(f+h,t),r&&(c+=r),i&&(c+=i),c},buildAbsolutePath:function(e,t){for(var r,i,a=t,n="",s=e.replace(/[^\/]*$/,a.replace(/(\/|^)(?:\.?\/+)+/g,"$1")),o=0;i=s.indexOf("/../",o),i>-1;o=i+r)r=/^\/(?:\.\.\/)*/.exec(s.slice(i))[0].length,n=(n+s.substring(o,i)).replace(new RegExp("(?:\\/+[^\\/]*){0,"+(r-1)/3+"}$"),"/");return n+s.substr(o)}};"object"==typeof i&&"object"==typeof r?r.exports=a:"function"==typeof e&&e.amd?e([],function(){return a}):"object"==typeof i?i.URLToolkit=a:t.URLToolkit=a}(this)},{}],3:[function(e,t,r){var i=arguments[3],a=arguments[4],n=arguments[5],s=JSON.stringify;t.exports=function(e,t){function r(e){p[e]=!0;for(var t in a[e][1]){var i=a[e][1][t];p[i]||r(i)}}for(var o,l=Object.keys(n),u=0,d=l.length;u500*r.duration/o){var l=e.levels,d=Math.max(1,n.bw?n.bw/8:1e3*n.loaded/s),f=n.total?n.total:Math.max(n.loaded,Math.round(r.duration*l[r.level].bitrate/8)),h=t.currentTime,g=(f-n.loaded)/d,p=(c.default.bufferInfo(t,h,e.config.maxBufferHole).end-h)/o;if(p<2*r.duration/o&&g>p){var y=void 0,m=void 0;for(m=r.level-1;m>a&&(y=r.duration*l[m].bitrate/(6.4*d),!(y=i;u--){var d=l[u],f=d.details,h=f?f.totalduration/f.fragments.length:t,c=!!f&&f.live,g=void 0;g=u<=e?s*r:o*r;var p=l[u].bitrate,y=p*h/g;if(v.logger.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+u+"/"+Math.round(g)+"/"+p+"/"+h+"/"+n+"/"+y),g>p&&(!y||c||yr)return a;return 0}},{key:"maxAutoLevel",get:function(){var e,t=this.hls.levels,r=this._autoLevelCapping;return e=r===-1&&t&&t.length?t.length-1:r}},{key:"nextABRAutoLevel",get:function(){var e=this.hls,t=this.maxAutoLevel,r=e.levels,i=e.config,a=this.minAutoLevel,n=e.media,s=this.lastLoadedFragLevel,o=this.fragCurrent?this.fragCurrent.duration:0,l=n?n.currentTime:0,u=n&&0!==n.playbackRate?Math.abs(n.playbackRate):1,d=this.bwEstimator?this.bwEstimator.getEstimate():i.abrEwmaDefaultEstimate,f=(c.default.bufferInfo(n,l,i.maxBufferHole).end-l)/u,h=this.findBestLevel(s,o,d,a,t,f,i.abrBandWidthFactor,i.abrBandWidthUpFactor,r);if(h>=0)return h;v.logger.trace("rebuffering expected to happen, lets try to find a quality level minimizing the rebuffering");var g=i.maxStarvationDelay,p=i.abrBandWidthFactor,y=i.abrBandWidthUpFactor;if(0===f){var m=this.bitrateTestDelay;m&&(g=i.maxLoadingDelay-m,v.logger.trace("bitrate test took "+Math.round(1e3*m)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*g)+" ms"),p=y=1)}return h=this.findBestLevel(s,o,d,a,t,f+g,p,y,r),Math.max(h,0)}}]),t}(f.default);r.default=m},{26:26,27:27,28:28,30:30,45:45,9:9}],5:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l=function(){function e(e,t){for(var r=0;r0&&e===-1?(k.logger.log("audio:override startPosition with lastCurrentTime @"+t.toFixed(3)),this.state=A.IDLE):(this.lastCurrentTime=this.startPosition?this.startPosition:e,this.state=A.STARTING),this.nextLoadPosition=this.startPosition=this.lastCurrentTime,this.tick()}else this.startPosition=e,this.state=A.STOPPED}},{key:"stopLoad",value:function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=A.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){var e,t,r,i,a,n,s=this,l=this.hls,u=l.config,f=function(){switch(s.state){case A.ERROR:case A.PAUSED:case A.BUFFER_FLUSHING:break;case A.STARTING:s.state=A.WAITING_TRACK,s.loadedmetadata=!1;break;case A.IDLE:if(!s.media&&(s.startFragRequested||!u.startFragPrefetch))break;e=s.loadedmetadata?s.media.currentTime:s.nextLoadPosition;var o=s.mediaBuffer?s.mediaBuffer:s.media,f=h.default.bufferInfo(o,e,u.maxBufferHole),c=f.len,g=f.end,v=s.fragPrevious,y=u.maxMaxBufferLength,m=s.audioSwitch;if(cR||f.nextStart))return{v:void 0};k.logger.log("alt audio track ahead of main track, seek to start of alt audio track"),s.media.currentTime=R+.05}if(g<=R){if(S=E[0],r.live&&S.loadIdx&&S.loadIdx===s.fragLoadIdx){var L=f.nextStart?f.nextStart:R;return k.logger.log("no alt audio available @currentTime:"+s.media.currentTime+", seeking @"+(L+.05)),s.media.currentTime=L+.05,{v:void 0}}}else!function(){var e=void 0,t=u.maxFragLookUpTolerance;g<_?(g>_-t&&(t=0),e=d.default.search(E,function(e){return e.start+e.duration-t<=g?1:e.start-t>g?-1:0}),e||k.logger.log("frag not found @bufferEnd/start:"+g+"/"+R)):e=E[b-1],e&&(S=e,R=e.start,v&&S.level===v.level&&S.sn===v.sn&&(S.snD&&Math.abs(s.fragLoadIdx-S.loadIdx)=a||n)&&(k.logger.log("audioStreamController: retryDate reached, switch back to IDLE state"),s.state=A.IDLE);break;case A.WAITING_INIT_PTS:case A.STOPPED:case A.FRAG_LOADING:case A.PARSING:case A.PARSED:case A.ENDED:}}();if("object"===("undefined"==typeof f?"undefined":o(f)))return f.v}},{key:"onMediaAttached",value:function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("ended",this.onvended);var r=this.config;this.tracks&&r.autoStartLoad&&this.startLoad(r.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(k.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.tracks;t&&t.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){this.state===A.ENDED&&(this.state=A.IDLE),this.media&&(this.lastCurrentTime=this.media.currentTime),void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onMediaEnded",value:function(){this.startPosition=this.lastCurrentTime=0}},{key:"onAudioTracksUpdated",value:function(e){k.logger.log("audio tracks updated"),this.tracks=e.audioTracks}},{key:"onAudioTrackSwitching",value:function(e){var t=!!e.url;this.trackId=e.id,this.state=A.IDLE,this.fragCurrent=null,this.state=A.PAUSED,this.waitingFragment=null,t?this.timer||(this.timer=setInterval(this.ontick,100)):this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),t&&(this.audioSwitch=!0,this.state=A.IDLE,void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold)),this.tick()}},{key:"onAudioTrackLoaded",value:function(e){var t=e.details,r=e.id,i=this.tracks[r],a=t.totalduration,n=0;if(k.logger.log("track "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+a),t.live){var s=i.details;s&&t.fragments.length>0?(b.default.mergeDetails(s,t),n=t.fragments[0].start,t.PTSKnown?k.logger.log("live audio playlist sliding:"+n.toFixed(3)):k.logger.log("live audio playlist - outdated PTS, unknown sliding")):(t.PTSKnown=!1,k.logger.log("live audio playlist - first load, unknown sliding"))}else t.PTSKnown=!1;if(i.details=t,!this.startFragRequested){if(this.startPosition===-1){var o=t.startTimeOffset;isNaN(o)?this.startPosition=0:(k.logger.log("start time offset found in playlist, adjust startPosition to "+o),this.startPosition=o)}this.nextLoadPosition=this.startPosition}this.state===A.WAITING_TRACK&&(this.state=A.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===A.KEY_LOADING&&(this.state=A.IDLE,this.tick())}},{key:"onFragLoaded",value:function(e){var t=this.fragCurrent;if(this.state===A.FRAG_LOADING&&t&&"audio"===e.frag.type&&e.frag.level===t.level&&e.frag.sn===t.sn){this.state=A.PARSING,this.stats=e.stats;var r=this.tracks[this.trackId],i=r.details,a=i.totalduration,n=t.start,s=t.level,o=t.sn,l=t.cc,u=this.config.defaultAudioCodec||r.audioCodec;this.appended=!1,this.demuxer||(this.demuxer=new g.default(this.hls,"audio"));var d=this.initPTS[l];if(void 0!==d){this.pendingBuffering=!0,k.logger.log("Demuxing "+o+" of ["+i.startSN+" ,"+i.endSN+"],track "+s);var f=!1;this.demuxer.push(e.payload,u,null,n,l,s,o,a,t.decryptdata,f,d)}else k.logger.log("unknown video PTS for continuity counter "+l+", waiting for video PTS before demuxing audio frag "+o+" of ["+i.startSN+" ,"+i.endSN+"],track "+s),this.waitingFragment=e,this.state=A.WAITING_INIT_PTS}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(e){var t=this.fragCurrent;if(t&&"audio"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===A.PARSING){var r=e.tracks,i=void 0;if(r.video&&delete r.video,i=r.audio){i.levelCodec="mp4a.40.2",i.id=e.id,this.hls.trigger(p.default.BUFFER_CODECS,r),k.logger.log("audio track:audio,container:"+i.container+",codecs[level/parsed]=["+i.levelCodec+"/"+i.codec+"]");var a=i.initSegment;if(a){var n={type:"audio",data:a,parent:"audio",content:"initSegment"};this.audioSwitch?this.pendingData=[n]:(this.appended=!0,this.pendingBuffering=!0,this.hls.trigger(p.default.BUFFER_APPENDING,n))}this.tick()}}}},{key:"onFragParsingData",value:function(e){var t=this,r=this.fragCurrent;r&&"audio"===e.id&&"audio"===e.type&&e.sn===r.sn&&e.level===r.level&&this.state===A.PARSING&&!function(){var r=t.trackId,i=t.tracks[r],a=t.fragCurrent,n=t.hls;k.logger.log("parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb),b.default.updateFragPTSDTS(i.details,a.sn,e.startPTS,e.endPTS);var s=t.audioSwitch,o=t.media,l=!1;if(s&&o)if(o.readyState){var u=o.currentTime;k.logger.log("switching audio track : currentTime:"+u),u>=e.startPTS&&(k.logger.log("switching audio track : flushing all audio"),t.state=A.BUFFER_FLUSHING,n.trigger(p.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),l=!0,t.audioSwitch=!1,n.trigger(p.default.AUDIO_TRACK_SWITCHED,{id:r}))}else t.audioSwitch=!1,n.trigger(p.default.AUDIO_TRACK_SWITCHED,{id:r});var d=t.pendingData;t.audioSwitch||([e.data1,e.data2].forEach(function(t){t&&d.push({type:e.type,data:t,parent:"audio",content:"data"})}),!l&&d.length&&(d.forEach(function(e){t.pendingBuffering=!0,t.hls.trigger(p.default.BUFFER_APPENDING,e)}),t.pendingData=[],t.appended=!0)),t.tick()}()}},{key:"onFragParsed",value:function(e){var t=this.fragCurrent;t&&"audio"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===A.PARSING&&(this.stats.tparsed=performance.now(),this.state=A.PARSED,this._checkAppendedParsed())}},{key:"onBufferCreated",value:function(e){var t=e.tracks.audio;t&&(this.mediaBuffer=t.buffer,this.loadedmetadata=!0)}},{key:"onBufferAppended",value:function(e){if("audio"===e.parent){var t=this.state;t!==A.PARSING&&t!==A.PARSED||(this.pendingBuffering=e.pending>0,this._checkAppendedParsed())}}},{key:"_checkAppendedParsed",value:function(){if(!(this.state!==A.PARSED||this.appended&&this.pendingBuffering)){var e=this.fragCurrent,t=this.stats,r=this.hls;if(e){this.fragPrevious=e,t.tbuffered=performance.now(),r.trigger(p.default.FRAG_BUFFERED,{stats:t,frag:e,id:"audio"});var i=this.mediaBuffer?this.mediaBuffer:this.media;k.logger.log("audio buffered : "+_.default.toString(i.buffered)),this.audioSwitch&&this.appended&&(this.audioSwitch=!1,r.trigger(p.default.AUDIO_TRACK_SWITCHED,{id:this.trackId})),this.state=A.IDLE}this.tick()}}},{key:"onError",value:function(e){var t=e.frag;if(!t||"audio"===t.type)switch(e.details){case T.ErrorDetails.FRAG_LOAD_ERROR:case T.ErrorDetails.FRAG_LOAD_TIMEOUT:if(!e.fatal){var r=this.fragLoadError;r?r++:r=1;var i=this.config;if(r<=i.fragLoadingMaxRetry){this.fragLoadError=r,t.loadCounter=0;var a=Math.min(Math.pow(2,r-1)*i.fragLoadingRetryDelay,i.fragLoadingMaxRetryTimeout);k.logger.warn("audioStreamController: frag loading failed, retry in "+a+" ms"),this.retryDate=performance.now()+a,this.state=A.FRAG_LOADING_WAITING_RETRY}else k.logger.error("audioStreamController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.hls.trigger(p.default.ERROR,e),this.state=A.ERROR}break;case T.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case T.ErrorDetails.AUDIO_TRACK_LOAD_ERROR:case T.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:case T.ErrorDetails.KEY_LOAD_ERROR:case T.ErrorDetails.KEY_LOAD_TIMEOUT:this.state!==A.ERROR&&(this.state=e.fatal?A.ERROR:A.IDLE,k.logger.warn("audioStreamController: "+e.details+" while loading frag,switch to "+this.state+" state ..."))}}},{key:"onBufferFlushed",value:function(){var e=this,t=this.pendingData;t&&t.length?(k.logger.log("appending pending audio data on Buffer Flushed"),t.forEach(function(t){e.hls.trigger(p.default.BUFFER_APPENDING,t)}),this.appended=!0,this.pendingData=[],this.state=A.PARSED):(this.state=A.IDLE,this.fragPrevious=null,this.tick())}},{key:"state",set:function(e){if(this.state!==e){var t=this.state;this._state=e,k.logger.log("audio:switch from "+t+" to "+e)}},get:function(){return this._state}}]),t}(m.default);r.default=S},{22:22,26:26,27:27,28:28,30:30,31:31,41:41,45:45,46:46}],6:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){this.updateTrack(this.trackId)}},{key:"onManifestLoading",value:function(){this.tracks=[],this.trackId=-1}},{key:"onManifestLoaded",value:function(e){var t=this,r=e.audioTracks||[],i=!1;this.tracks=r,this.hls.trigger(u.default.AUDIO_TRACKS_UPDATED,{audioTracks:r});var a=0;r.forEach(function(e){return e.default?(t.audioTrack=a,void(i=!0)):void a++}),i===!1&&r.length&&(h.logger.log("no default audio track defined, use first audio track as default"),this.audioTrack=0)}},{key:"onAudioTrackLoaded",value:function(e){e.id=0&&e=0&&e.1){var n=i.updating;try{i.abort()}catch(e){n=!0,h.logger.warn("can not abort audio buffer: "+e)}n?this.audioTimestampOffset=e.start:(h.logger.warn("change mpeg audio timestamp offset from "+i.timestampOffset+" to "+e.start),i.timestampOffset=e.start)}}}},{key:"onManifestParsed",value:function(e){var t=e.audio,r=e.video,i=0;e.altAudio&&(t||r)&&(i=(t?1:0)+(r?1:0),h.logger.log(i+" sourceBuffer(s) expected")),this.sourceBufferNb=i}},{key:"onMediaAttaching",value:function(e){var t=this.media=e.media;if(t){var r=this.mediaSource=new MediaSource;this.onmso=this.onMediaSourceOpen.bind(this),this.onmse=this.onMediaSourceEnded.bind(this),this.onmsc=this.onMediaSourceClose.bind(this),r.addEventListener("sourceopen",this.onmso),r.addEventListener("sourceended",this.onmse),r.addEventListener("sourceclose",this.onmsc),t.src=URL.createObjectURL(r)}}},{key:"onMediaDetaching",value:function(){h.logger.log("media source detaching");var e=this.mediaSource;if(e){if("open"===e.readyState)try{e.endOfStream()}catch(e){h.logger.warn("onMediaDetaching:"+e.message+" while calling endOfStream")}e.removeEventListener("sourceopen",this.onmso),e.removeEventListener("sourceended",this.onmse),e.removeEventListener("sourceclose",this.onmsc),this.media&&(URL.revokeObjectURL(this.media.src),this.media.removeAttribute("src"),this.media.load()),this.mediaSource=null,this.media=null,this.pendingTracks={},this.tracks={},this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0}this.onmso=this.onmse=this.onmsc=null,this.hls.trigger(u.default.MEDIA_DETACHED)}},{key:"onMediaSourceOpen",value:function(){h.logger.log("media source opened"),this.hls.trigger(u.default.MEDIA_ATTACHED,{media:this.media});var e=this.mediaSource;e&&e.removeEventListener("sourceopen",this.onmso),this.checkPendingTracks()}},{key:"checkPendingTracks",value:function(){var e=this.pendingTracks,t=Object.keys(e).length;t&&(this.sourceBufferNb<=t||0===this.sourceBufferNb)&&(this.createSourceBuffers(e),this.pendingTracks={},this.doAppending())}},{key:"onMediaSourceClose",value:function(){h.logger.log("media source closed")}},{key:"onMediaSourceEnded",value:function(){h.logger.log("media source ended")}},{key:"onSBUpdateEnd",value:function(){if(this.audioTimestampOffset){var e=this.sourceBuffer.audio;h.logger.warn("change mpeg audio timestamp offset from "+e.timestampOffset+" to "+this.audioTimestampOffset),e.timestampOffset=this.audioTimestampOffset,delete this.audioTimestampOffset}this._needsFlush&&this.doFlush(),this._needsEos&&this.checkEos(),this.appending=!1;var t=this.parent,r=this.segments.reduce(function(e,r){return r.parent===t?e+1:e},0);this.hls.trigger(u.default.BUFFER_APPENDED,{parent:t,pending:r}),this._needsFlush||this.doAppending(),this.updateMediaElementDuration()}},{key:"onSBUpdateError",value:function(e){h.logger.error("sourceBuffer error:"+e),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_APPENDING_ERROR,fatal:!1})}},{key:"onBufferReset",value:function(){var e=this.sourceBuffer;for(var t in e){var r=e[t];try{this.mediaSource.removeSourceBuffer(r),r.removeEventListener("updateend",this.onsbue),r.removeEventListener("error",this.onsbe)}catch(e){}}this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0}},{key:"onBufferCodecs",value:function(e){if(0===Object.keys(this.sourceBuffer).length){for(var t in e)this.pendingTracks[t]=e[t];var r=this.mediaSource;r&&"open"===r.readyState&&this.checkPendingTracks()}}},{key:"createSourceBuffers",value:function(e){var t=this.sourceBuffer,r=this.mediaSource;for(var i in e)if(!t[i]){var a=e[i],n=a.levelCodec||a.codec,s=a.container+";codecs="+n;h.logger.log("creating sourceBuffer("+s+")");try{var o=t[i]=r.addSourceBuffer(s);o.addEventListener("updateend",this.onsbue),o.addEventListener("error",this.onsbe),this.tracks[i]={codec:n,container:a.container},a.buffer=o}catch(e){h.logger.error("error while trying to add sourceBuffer:"+e.message),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_ADD_CODEC_ERROR,fatal:!1,err:e,mimeType:s})}}this.hls.trigger(u.default.BUFFER_CREATED,{tracks:e})}},{key:"onBufferAppending",value:function(e){this._needsFlush||(this.segments?this.segments.push(e):this.segments=[e],this.doAppending())}},{key:"onBufferAppendFail",value:function(e){h.logger.error("sourceBuffer error:",e.event),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_APPENDING_ERROR,fatal:!1,frag:this.fragCurrent})}},{key:"onBufferEos",value:function(e){var t=this.sourceBuffer,r=e.type;for(var i in t)r&&i!==r||t[i].ended||(t[i].ended=!0,h.logger.log(i+" sourceBuffer now EOS"));this.checkEos()}},{key:"checkEos",value:function(){var e=this.sourceBuffer,t=this.mediaSource;if(!t||"open"!==t.readyState)return void(this._needsEos=!1);for(var r in e){var i=e[r];if(!i.ended)return;if(i.updating)return void(this._needsEos=!0)}h.logger.log("all media data available, signal endOfStream() to MediaSource and stop loading fragment");try{t.endOfStream()}catch(e){h.logger.warn("exception while calling mediaSource.endOfStream()")}this._needsEos=!1}},{key:"onBufferFlushing",value:function(e){this.flushRange.push({start:e.startOffset,end:e.endOffset,type:e.type}),this.flushBufferCounter=0,this.doFlush()}},{key:"onLevelUpdated",value:function(e){var t=e.details;0!==t.fragments.length&&(this._levelDuration=t.totalduration+t.fragments[0].start,this.updateMediaElementDuration())}},{key:"updateMediaElementDuration",value:function(){var e=this.media,t=this.mediaSource,r=this.sourceBuffer,i=this._levelDuration;if(null!==i&&e&&t&&r&&0!==e.readyState&&"open"===t.readyState){for(var a in r)if(r[a].updating)return;null===this._msDuration&&(this._msDuration=t.duration);var n=e.duration;(i>this._msDuration&&i>n||n===1/0||isNaN(n))&&(h.logger.log("Updating mediasource duration to "+i.toFixed(3)),this._msDuration=t.duration=i)}}},{key:"doFlush",value:function(){for(;this.flushRange.length;){var e=this.flushRange[0];if(!this.flushBuffer(e.start,e.end,e.type))return void(this._needsFlush=!0);this.flushRange.shift(),this.flushBufferCounter=0}if(0===this.flushRange.length){this._needsFlush=!1;var t=0,r=this.sourceBuffer;try{for(var i in r)t+=r[i].buffered.length}catch(e){h.logger.error("error while accessing sourceBuffer.buffered")}this.appended=t,this.hls.trigger(u.default.BUFFER_FLUSHED)}}},{key:"doAppending",value:function(){var e=this.hls,t=this.sourceBuffer,r=this.segments;if(Object.keys(t).length){if(this.media.error)return this.segments=[],void h.logger.error("trying to append although a media error occured, flush segment and abort");if(this.appending)return;if(r&&r.length){var i=r.shift();try{var a=i.type,n=t[a];n?n.updating?r.unshift(i):(n.ended=!1,this.parent=i.parent,n.appendBuffer(i.data),this.appendError=0,this.appended++,this.appending=!0):this.onSBUpdateEnd()}catch(t){h.logger.error("error while trying to append buffer:"+t.message),r.unshift(i);var s={type:c.ErrorTypes.MEDIA_ERROR};if(22===t.code)return this.segments=[],s.details=c.ErrorDetails.BUFFER_FULL_ERROR,s.fatal=!1,void e.trigger(u.default.ERROR,s);if(this.appendError?this.appendError++:this.appendError=1,s.details=c.ErrorDetails.BUFFER_APPEND_ERROR,s.frag=this.fragCurrent,this.appendError>e.config.appendErrorMaxRetry)return h.logger.log("fail "+e.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),r=[],s.fatal=!0,void e.trigger(u.default.ERROR,s);s.fatal=!1,e.trigger(u.default.ERROR,s)}}}}},{key:"flushBuffer",value:function(e,t,r){var i,a,n,s,o,l,u=this.sourceBuffer;if(Object.keys(u).length){if(h.logger.log("flushBuffer,pos/start/end: "+this.media.currentTime.toFixed(3)+"/"+e+"/"+t),this.flushBufferCounter.5)return this.flushBufferCounter++,h.logger.log("flush "+d+" ["+o+","+l+"], of ["+n+","+s+"], pos:"+this.media.currentTime),i.remove(o,l),!1}catch(e){h.logger.warn("exception while accessing sourcebuffer, it might have been removed from MediaSource")}}}else h.logger.warn("abort flushing too many retries");h.logger.log("buffer flushed")}return!0}}]),t}(f.default);r.default=g},{26:26,27:27,28:28,45:45}],8:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;rthis.autoLevelCapping&&t.streamController.nextLevelSwitch(),this.autoLevelCapping=t.autoLevelCapping}}}},{key:"getMaxLevel",value:function(e){var t=0,r=void 0,i=void 0,a=this.mediaWidth,n=this.mediaHeight,s=0,o=0;for(r=0;r<=e&&(i=this.levels[r],!this.isLevelRestricted(r))&&(t=r,s=i.width,o=i.height,!(a<=s||n<=o));r++);return t}},{key:"isLevelRestricted",value:function(e){return!(!this.restrictedLevels||this.restrictedLevels.indexOf(e)===-1)}},{key:"contentScaleFactor",get:function(){var e=1;try{e=window.devicePixelRatio}catch(e){}return e}},{key:"mediaWidth",get:function(){var e=void 0,t=this.media;return t&&(e=t.width||t.clientWidth||t.offsetWidth,e*=this.contentScaleFactor),e}},{key:"mediaHeight",get:function(){var e=void 0,t=this.media;return t&&(e=t.height||t.clientHeight||t.offsetHeight,e*=this.contentScaleFactor),e}}]),t}(f.default);r.default=h},{27:27,28:28}],9:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r=this.minWeight_}},{key:"getEstimate",value:function(){return this.canEstimate()?Math.min(this.fast_.getEstimate(),this.slow_.getEstimate()):this.defaultEstimate_}},{key:"destroy",value:function(){}}]),e}();r.default=l},{44:44}],10:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0&&n>l.config.fpsDroppedMonitoringThreshold*s){var d=l.currentLevel;h.logger.warn("drop FPS ratio greater than max allowed value for currentLevel: "+d),d>0&&(l.autoLevelCapping===-1||l.autoLevelCapping>=d)&&(d-=1,l.trigger(u.default.FPS_DROP_LEVEL_CAPPING,{level:d,droppedLevel:l.currentLevel}),l.autoLevelCapping=d,l.streamController.nextLevelSwitch())}}this.lastTime=i,this.lastDroppedFrames=r,this.lastDecodedFrames=t}}},{key:"checkFPSInterval",value:function(){var e=this.video;if(e)if(this.isVideoPlaybackQualityAvailable){var t=e.getVideoPlaybackQuality();this.checkFPS(e,t.totalVideoFrames,t.droppedVideoFrames)}else this.checkFPS(e,e.webkitDecodedFrameCount,e.webkitDroppedFrameCount)}}]),t}(f.default);r.default=c},{27:27,28:28,45:45}],11:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0})}else o.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR,fatal:!0,url:o.url,reason:"no level with compatible codecs found in manifest"})}},{key:"setLevelInternal",value:function(e){var t=this._levels;if(e>=0&&e1&&a.loadErrore&&(this._level===e&&void 0!==t[e].details||this.setLevelInternal(e))}},{key:"manualLevel",get:function(){return this._manualLevel},set:function(e){this._manualLevel=e,void 0===this._startLevel&&(this._startLevel=e),e!==-1&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){if(void 0===this._startLevel){var e=this.hls.config.startLevel;return void 0!==e?e:this._firstLevel}return this._startLevel},set:function(e){e!==-1&&(e=Math.max(e,this.hls.abrController.minAutoLevel)),this._startLevel=e}},{key:"nextLoadLevel",get:function(){return this._manualLevel!==-1?this._manualLevel:this.hls.abrController.nextAutoLevel},set:function(e){this.level=e,this._manualLevel===-1&&(this.hls.abrController.nextAutoLevel=e)}}]),t}(f.default);r.default=p},{26:26,27:27,28:28,30:30,45:45}],12:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0&&e===-1&&(T.logger.log("override startPosition with lastCurrentTime @"+t.toFixed(3)),e=t),this.state=k.IDLE,this.nextLoadPosition=this.startPosition=this.lastCurrentTime=e,this.tick()}else T.logger.warn("cannot start loading as manifest not parsed yet"),this.state=k.STOPPED}},{key:"stopLoad",value:function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=k.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){switch(this.state){case k.ERROR:break;case k.BUFFER_FLUSHING:this.fragLoadError=0;break;case k.IDLE:if(!this._doTickIdle())return;break;case k.WAITING_LEVEL:var e=this.levels[this.level];e&&e.details&&(this.state=k.IDLE);break;case k.FRAG_LOADING_WAITING_RETRY:var t=performance.now(),r=this.retryDate;(!r||t>=r||this.media&&this.media.seeking)&&(T.logger.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=k.IDLE);break;case k.ERROR:case k.STOPPED:case k.FRAG_LOADING:case k.PARSING:case k.PARSED:case k.ENDED:}this._checkBuffer(),this._checkFragmentChanged()}},{key:"_doTickIdle",value:function(){var e=this.hls,t=e.config,r=this.media;if(void 0!==this.levelLastLoaded&&!r&&(this.startFragRequested||!t.startFragPrefetch))return!0;var i=void 0;i=this.loadedmetadata?r.currentTime:this.nextLoadPosition;var a=e.nextLoadLevel,n=this.levels[a],s=n.bitrate,o=void 0;o=s?Math.max(8*t.maxBufferSize/s,t.maxBufferLength):t.maxBufferLength,o=Math.min(o,t.maxMaxBufferLength);var l=f.default.bufferInfo(this.mediaBuffer?this.mediaBuffer:r,i,t.maxBufferHole),u=l.len;if(u>=o)return!0;T.logger.trace("buffer length of "+u.toFixed(3)+" is below max of "+o.toFixed(3)+". checking for more payload ..."),this.level=e.nextLoadLevel=a;var d=n.details;if("undefined"==typeof d||d.live&&this.levelLastLoaded!==a)return this.state=k.WAITING_LEVEL,!0;var h=this.fragPrevious;if(!d.live&&h&&h.sn===d.endSN&&r.duration-Math.max(l.end,h.start)<=Math.max(.1,h.duration/2)){var c={};return this.altAudio&&(c.type="video"),this.hls.trigger(v.default.BUFFER_EOS,c),this.state=k.ENDED,!0}return this._fetchPayloadOrEos(i,l,d)}},{key:"_fetchPayloadOrEos",value:function(e,t,r){var i=this.fragPrevious,a=this.level,n=r.fragments,s=n.length;if(0===s)return!1;var o=n[0].start,l=n[s-1].start+n[s-1].duration,u=t.end,d=void 0;if(r.live){var f=this.config.initialLiveManifestSize;if(sf&&(l.currentTime=f)}if(e.PTSKnown&&t>i&&l&&l.readyState)return null;if(this.startFragRequested&&!e.PTSKnown){if(a){var h=a.sn+1;h>=e.startSN&&h<=e.endSN&&(u=n[h-e.startSN],T.logger.log("live playlist, switching playlist, load frag with next SN: "+u.sn))}u||(u=n[Math.min(s-1,Math.round(s/2))],T.logger.log("live playlist, switching playlist, unknown, load middle frag : "+u.sn))}return u}},{key:"_findFragment",value:function(e,t,r,i,a,n,s){var o=this.hls.config,l=void 0,d=void 0,f=o.maxFragLookUpTolerance;if(an-f&&(f=0),d=u.default.search(i,function(e){return e.start+e.duration-f<=a?1:e.start-f>a&&e.start?-1:0})):d=i[r-1],d&&(l=d,e=d.start,t&&l.level===t.level&&l.sn===t.sn))if(l.sno.maxBufferHole&&t.dropped&&c?(l=i[c-1],T.logger.warn("SN just loaded, with large PTS gap between audio and video, maybe frag is not starting with a keyframe ? load previous one to try to overcome this"),t.loadCounter--):(l=i[c+1],T.logger.log("SN just loaded, load next one: "+l.sn))}else l=null;return l}},{key:"_loadFragmentOrKey",value:function(e,t,r,i,a){var n=this.hls,s=n.config;if(null==e.decryptdata.uri||null!=e.decryptdata.key){if(T.logger.log("Loading "+e.sn+" of ["+r.startSN+" ,"+r.endSN+"],level "+t+", currentTime:"+i.toFixed(3)+",bufferEnd:"+a.toFixed(3)),void 0!==this.fragLoadIdx?this.fragLoadIdx++:this.fragLoadIdx=0,e.loadCounter){e.loadCounter++;var o=s.fragLoadingLoopThreshold;if(e.loadCounter>o&&Math.abs(this.fragLoadIdx-e.loadIdx)t.end?1:0})}},{key:"followingBufferRange",value:function(e){return e?this.getBufferRange(e.end+.5):null}},{key:"_checkFragmentChanged",value:function(){var e,t,r=this.media;if(r&&r.readyState&&r.seeking===!1&&(t=r.currentTime,t>r.playbackRate*this.lastCurrentTime&&(this.lastCurrentTime=t),f.default.isBuffered(r,t)?e=this.getBufferRange(t):f.default.isBuffered(r,t+.1)&&(e=this.getBufferRange(t+.1)),e)){var i=e.frag;i!==this.fragPlaying&&(this.fragPlaying=i,this.hls.trigger(v.default.FRAG_CHANGED,{frag:i}))}}},{key:"immediateLevelSwitch",value:function(){if(T.logger.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var e=this.media,t=void 0;e?(t=e.paused,e.pause()):t=!0,this.previouslyPaused=t}var r=this.fragCurrent;r&&r.loader&&r.loader.abort(),this.fragCurrent=null,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.flushMainBuffer(0,Number.POSITIVE_INFINITY)}},{key:"immediateLevelSwitchEnd",value:function(){var e=this.media;e&&e.buffered.length&&(this.immediateSwitch=!1,f.default.isBuffered(e,e.currentTime)&&(e.currentTime-=1e-4),this.previouslyPaused||e.play())}},{key:"nextLevelSwitch",value:function(){var e=this.media;if(e&&e.readyState){var t=void 0,r=void 0,i=void 0;if(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,r=this.getBufferRange(e.currentTime),r&&r.start>1&&this.flushMainBuffer(0,r.start-1),e.paused)t=0;else{var a=this.hls.nextLoadLevel,n=this.levels[a],s=this.fragLastKbps;t=s&&this.fragCurrent?this.fragCurrent.duration*n.bitrate/(1e3*s)+1:0; +}if(i=this.getBufferRange(e.currentTime+t),i&&(i=this.followingBufferRange(i))){var o=this.fragCurrent;o&&o.loader&&o.loader.abort(),this.fragCurrent=null,this.flushMainBuffer(i.start,Number.POSITIVE_INFINITY)}}}},{key:"flushMainBuffer",value:function(e,t){this.state=k.BUFFER_FLUSHING;var r={startOffset:e,endOffset:t};this.altAudio&&(r.type="video"),this.hls.trigger(v.default.BUFFER_FLUSHING,r)}},{key:"onMediaAttached",value:function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("seeked",this.onvseeked),t.addEventListener("ended",this.onvended);var r=this.config;this.levels&&r.autoStartLoad&&this.hls.startLoad(r.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(T.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.levels;t&&t.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){var e=this.media,t=e?e.currentTime:void 0,r=this.config;if(T.logger.log("media seeking to "+t.toFixed(3)),this.state===k.FRAG_LOADING){var i=this.mediaBuffer?this.mediaBuffer:e,a=f.default.bufferInfo(i,t,this.config.maxBufferHole),n=this.fragCurrent;if(0===a.len&&n){var s=r.maxFragLookUpTolerance,o=n.start-s,l=n.start+n.duration+s;tl?(n.loader&&(T.logger.log("seeking outside of buffer while fragment load in progress, cancel fragment load"),n.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.state=k.IDLE):T.logger.log("seeking outside of buffer but within currently loaded fragment range")}}else this.state===k.ENDED&&(this.state=k.IDLE);e&&(this.lastCurrentTime=t),this.state!==k.FRAG_LOADING&&void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*r.fragLoadingLoopThreshold),this.loadedmetadata||(this.nextLoadPosition=this.startPosition=t),this.tick()}},{key:"onMediaSeeked",value:function(){T.logger.log("media seeked to "+this.media.currentTime.toFixed(3)),this.tick()}},{key:"onMediaEnded",value:function(){T.logger.log("media ended"),this.startPosition=this.lastCurrentTime=0}},{key:"onManifestLoading",value:function(){T.logger.log("trigger BUFFER_RESET"),this.hls.trigger(v.default.BUFFER_RESET),this.bufferRange=[],this.stalled=!1,this.startPosition=this.lastCurrentTime=0}},{key:"onManifestParsed",value:function(e){var t,r=!1,i=!1;e.levels.forEach(function(e){t=e.audioCodec,t&&(t.indexOf("mp4a.40.2")!==-1&&(r=!0),t.indexOf("mp4a.40.5")!==-1&&(i=!0))}),this.audioCodecSwitch=r&&i,this.audioCodecSwitch&&T.logger.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=e.levels,this.startLevelLoaded=!1,this.startFragRequested=!1;var a=this.config;a.autoStartLoad&&this.hls.startLoad(a.startPosition)}},{key:"onLevelLoaded",value:function(e){var t=e.details,r=e.level,i=this.levels[r],a=t.totalduration,n=0;if(T.logger.log("level "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+a),this.levelLastLoaded=r,t.live){var s=i.details;s&&t.fragments.length>0?(E.default.mergeDetails(s,t),n=t.fragments[0].start,this.liveSyncPosition=this.computeLivePosition(n,s),t.PTSKnown?T.logger.log("live playlist sliding:"+n.toFixed(3)):T.logger.log("live playlist - outdated PTS, unknown sliding")):(t.PTSKnown=!1,T.logger.log("live playlist - first load, unknown sliding"))}else t.PTSKnown=!1;if(i.details=t,this.hls.trigger(v.default.LEVEL_UPDATED,{details:t,level:r}),this.startFragRequested===!1){if(this.startPosition===-1||this.lastCurrentTime===-1){var o=t.startTimeOffset;isNaN(o)?t.live?(this.startPosition=this.computeLivePosition(n,t),T.logger.log("configure startPosition to "+this.startPosition)):this.startPosition=0:(o<0&&(T.logger.log("negative start time offset "+o+", count from end of last fragment"),o=n+a+o),T.logger.log("start time offset found in playlist, adjust startPosition to "+o),this.startPosition=o),this.lastCurrentTime=this.startPosition}this.nextLoadPosition=this.startPosition}this.state===k.WAITING_LEVEL&&(this.state=k.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===k.KEY_LOADING&&(this.state=k.IDLE,this.tick())}},{key:"onFragLoaded",value:function(e){var t=this.fragCurrent,r=e.frag;if(this.state===k.FRAG_LOADING&&t&&"main"===r.type&&r.level===t.level&&r.sn===t.sn){var i=e.stats,a=this.levels[t.level],n=a.details;if(T.logger.log("Loaded "+t.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+t.level),this.bitrateTest=!1,r.bitrateTest===!0&&this.hls.nextLoadLevel)this.state=k.IDLE,this.startFragRequested=!1,i.tparsed=i.tbuffered=performance.now(),this.hls.trigger(v.default.FRAG_BUFFERED,{stats:i,frag:t,id:"main"}),this.tick();else{this.state=k.PARSING,this.stats=i;var s=n.totalduration,o=isNaN(t.startDTS)?t.start:t.startDTS,l=t.level,u=t.sn,d=this.config.defaultAudioCodec||a.audioCodec;this.audioCodecSwap&&(T.logger.log("swapping playlist audio codec"),void 0===d&&(d=this.lastAudioCodec),d&&(d=d.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5")),this.pendingBuffering=!0,this.appended=!1,T.logger.log("Parsing "+u+" of ["+n.startSN+" ,"+n.endSN+"],level "+l+", cc "+t.cc);var f=this.demuxer;f||(f=this.demuxer=new c.default(this.hls,"main"));var h=this.media,g=h&&h.seeking,p=!g&&(n.PTSKnown||!n.live);f.push(e.payload,d,a.videoCodec,o,t.cc,l,u,s,t.decryptdata,p,null)}}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(e){var t=this.fragCurrent;if(t&&"main"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===k.PARSING){var r,i,a=e.tracks;if(a.audio&&this.altAudio&&delete a.audio,i=a.audio){var n=this.levels[this.level].audioCodec,s=navigator.userAgent.toLowerCase();n&&this.audioCodecSwap&&(T.logger.log("swapping playlist audio codec"),n=n.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==i.metadata.channelCount&&s.indexOf("firefox")===-1&&(n="mp4a.40.5"),s.indexOf("android")!==-1&&"audio/mpeg"!==i.container&&(n="mp4a.40.2",T.logger.log("Android: force audio codec to "+n)),i.levelCodec=n,i.id=e.id}if(i=a.video,i&&(i.levelCodec=this.levels[this.level].videoCodec,i.id=e.id),e.unique){var o={codec:"",levelCodec:""};for(r in e.tracks)i=a[r],o.container=i.container,o.codec&&(o.codec+=",",o.levelCodec+=","),i.codec&&(o.codec+=i.codec),i.levelCodec&&(o.levelCodec+=i.levelCodec);a={audiovideo:o}}this.hls.trigger(v.default.BUFFER_CODECS,a);for(r in a){i=a[r],T.logger.log("main track:"+r+",container:"+i.container+",codecs[level/parsed]=["+i.levelCodec+"/"+i.codec+"]");var l=i.initSegment;l&&(this.appended=!0,this.pendingBuffering=!0,this.hls.trigger(v.default.BUFFER_APPENDING,{type:r,data:l,parent:"main",content:"initSegment"}))}this.tick()}}},{key:"onFragParsingData",value:function(e){var t=this,r=this.fragCurrent;if(r&&"main"===e.id&&e.sn===r.sn&&e.level===r.level&&("audio"!==e.type||!this.altAudio)&&this.state===k.PARSING){var i=this.levels[this.level],a=this.fragCurrent;T.logger.log("Parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb+",dropped:"+(e.dropped||0));var n=E.default.updateFragPTSDTS(i.details,a.sn,e.startPTS,e.endPTS,e.startDTS,e.endDTS),s=this.hls;s.trigger(v.default.LEVEL_PTS_UPDATED,{details:i.details,level:this.level,drift:n,type:e.type,start:e.startPTS,end:e.endPTS}),"video"===e.type&&(a.dropped=e.dropped),[e.data1,e.data2].forEach(function(r){r&&(t.appended=!0,t.pendingBuffering=!0,s.trigger(v.default.BUFFER_APPENDING,{type:e.type,data:r,parent:"main",content:"data"}))}),this.tick()}}},{key:"onFragParsed",value:function(e){var t=this.fragCurrent;t&&"main"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===k.PARSING&&(this.stats.tparsed=performance.now(),this.state=k.PARSED,this._checkAppendedParsed())}},{key:"onAudioTrackSwitching",value:function(e){var t=!!e.url,r=e.id;if(!t){if(this.mediaBuffer!==this.media){T.logger.log("switching on main audio, use media.buffered to schedule main fragment loading"),this.mediaBuffer=this.media;var i=this.fragCurrent;i.loader&&(T.logger.log("switching to main audio track, cancel main fragment load"),i.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=k.IDLE}var a=this.hls;a.trigger(v.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),a.trigger(v.default.AUDIO_TRACK_SWITCHED,{id:r}),this.altAudio=!1}}},{key:"onAudioTrackSwitched",value:function(e){var t=e.id,r=!!this.hls.audioTracks[t].url;if(r){var i=this.videoBuffer;i&&this.mediaBuffer!==i&&(T.logger.log("switching on alternate audio, use video.buffered to schedule main fragment loading"),this.mediaBuffer=i)}this.altAudio=r,this.tick()}},{key:"onBufferCreated",value:function(e){var t=e.tracks,r=void 0,i=void 0,a=!1;for(var n in t){var s=t[n];"main"===s.id?(i=n,r=s,"video"===n&&(this.videoBuffer=t[n].buffer)):a=!0}a&&r?(T.logger.log("alternate track found, use "+i+".buffered to schedule main fragment loading"),this.mediaBuffer=r.buffer):this.mediaBuffer=this.media}},{key:"onBufferAppended",value:function(e){if("main"===e.parent){var t=this.state;t!==k.PARSING&&t!==k.PARSED||(this.pendingBuffering=e.pending>0,this._checkAppendedParsed())}}},{key:"_checkAppendedParsed",value:function(){var e=this;if(!(this.state!==k.PARSED||this.appended&&this.pendingBuffering)){var t=this.fragCurrent;t&&!function(){var r=e.mediaBuffer?e.mediaBuffer:e.media;T.logger.log("main buffered : "+R.default.toString(r.buffered));var i=e.bufferRange.filter(function(e){return f.default.isBuffered(r,(e.start+e.end)/2)});i.push({type:t.type,start:t.startPTS,end:t.endPTS,frag:t}),e.bufferRange=i.sort(function(e,t){return e.start-t.start}),e.fragPrevious=t;var a=e.stats;a.tbuffered=performance.now(),e.fragLastKbps=Math.round(8*a.total/(a.tbuffered-a.tfirst)),e.hls.trigger(v.default.FRAG_BUFFERED,{stats:a,frag:t,id:"main"}),e.state=k.IDLE}(),this.tick()}}},{key:"onError",value:function(e){var t=e.frag||this.fragCurrent;if(!t||"main"===t.type){var r=this.media,i=r&&f.default.isBuffered(r,r.currentTime)&&f.default.isBuffered(r,r.currentTime+.5);switch(e.details){case _.ErrorDetails.FRAG_LOAD_ERROR:case _.ErrorDetails.FRAG_LOAD_TIMEOUT:case _.ErrorDetails.KEY_LOAD_ERROR:case _.ErrorDetails.KEY_LOAD_TIMEOUT:if(!e.fatal){var a=this.fragLoadError;a?a++:a=1;var n=this.config;if(a<=n.fragLoadingMaxRetry||i||t.autoLevel&&t.level){this.fragLoadError=a,t.loadCounter=0;var s=Math.min(Math.pow(2,a-1)*n.fragLoadingRetryDelay,n.fragLoadingMaxRetryTimeout);T.logger.warn("mediaController: frag loading failed, retry in "+s+" ms"),this.retryDate=performance.now()+s,this.loadedmetadata||(this.startFragRequested=!1,this.nextLoadPosition=this.startPosition),this.state=k.FRAG_LOADING_WAITING_RETRY}else T.logger.error("mediaController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.hls.trigger(v.default.ERROR,e),this.state=k.ERROR}break;case _.ErrorDetails.FRAG_LOOP_LOADING_ERROR:e.fatal||(i?(this._reduceMaxBufferLength(t.duration),this.state=k.IDLE):t.autoLevel&&0!==t.level||(e.fatal=!0,this.hls.trigger(v.default.ERROR,e),this.state=k.ERROR));break;case _.ErrorDetails.LEVEL_LOAD_ERROR:case _.ErrorDetails.LEVEL_LOAD_TIMEOUT:this.state!==k.ERROR&&(e.fatal?(this.state=k.ERROR,T.logger.warn("streamController: "+e.details+",switch to "+this.state+" state ...")):this.state===k.WAITING_LEVEL&&(this.state=k.IDLE));break;case _.ErrorDetails.BUFFER_FULL_ERROR:this.state!==k.PARSING&&this.state!==k.PARSED||(i?(this._reduceMaxBufferLength(t.duration),this.state=k.IDLE):(T.logger.warn("buffer full error also media.currentTime is not buffered, flush everything"),this.fragCurrent=null,this.flushMainBuffer(0,Number.POSITIVE_INFINITY)))}}}},{key:"_reduceMaxBufferLength",value:function(e){var t=this.config;t.maxMaxBufferLength>=e&&(t.maxMaxBufferLength/=2,T.logger.warn("reduce max buffer length to "+t.maxMaxBufferLength+"s and switch to IDLE state"),this.fragLoadIdx+=2*t.fragLoadingLoopThreshold)}},{key:"_checkBuffer",value:function(){var e=this.media;if(e&&e.readyState){var t=e.currentTime,r=this.mediaBuffer?this.mediaBuffer:e,i=r.buffered;if(this.loadedmetadata||!i.length||e.seeking)if(this.immediateSwitch)this.immediateLevelSwitchEnd();else{var a=f.default.bufferInfo(e,t,0),n=!(e.paused||e.ended||0===e.buffered.length),s=.5,o=t!==this.lastCurrentTime,l=this.config;if(o)this.stallReported&&(T.logger.warn("playback not stuck anymore @"+t+", after "+Math.round(performance.now()-this.stalled)+"ms"),this.stallReported=!1),this.stalled=void 0,this.nudgeRetry=0;else if(n){var u=performance.now(),d=this.hls;if(this.stalled){var h=u-this.stalled,c=a.len,g=this.nudgeRetry||0;if(c<=s&&h>1e3*l.lowBufferWatchdogPeriod){this.stallReported||(this.stallReported=!0,T.logger.warn("playback stalling in low buffer @"+t),d.trigger(v.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1,buffer:c}));var p=a.nextStart,y=p-t;if(p&&y0){this.nudgeRetry=g++;var m=g*l.nudgeOffset;T.logger.log("adjust currentTime from "+e.currentTime+" to next buffered @ "+p+" + nudge "+m),e.currentTime=p+m,this.stalled=void 0,d.trigger(v.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_SEEK_OVER_HOLE,fatal:!1,hole:p+m-t})}}else if(c>s&&h>1e3*l.highBufferWatchdogPeriod)if(this.stallReported||(this.stallReported=!0,T.logger.warn("playback stalling in high buffer @"+t),d.trigger(v.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1,buffer:c})),this.stalled=void 0,this.nudgeRetry=g++,g0;)e.removeCue(e.cues[0])}},{key:"getExistingTrack",value:function(e){var t=this.media;if(t)for(var r=0;r>>8^255&g^99,e[f]=g,t[g]=f;var v=d[f],p=d[v],y=d[p],m=257*d[g]^16843008*g;r[f]=m<<24|m>>>8,i[f]=m<<16|m>>>16,a[f]=m<<8|m>>>24,n[f]=m,m=16843009*y^65537*p^257*v^16843008*f,s[g]=m<<24|m>>>8,o[g]=m<<16|m>>>16,l[g]=m<<8|m>>>24,u[g]=m,f?(f=v^d[d[d[y^v]]],h^=d[d[h]]):f=h=1}}},{key:"expandKey",value:function(e){for(var t=this.uint8ArrayToUint32Array_(e),r=!0,i=0;i>8|e>>>24}},{key:"decrypt",value:function(e,t,r){for(var i,a,n=this.keySize+6,s=this.invKeySchedule,o=this.invSBox,l=this.invSubMix[0],u=this.invSubMix[1],d=this.invSubMix[2],f=this.invSubMix[3],h=this.uint8ArrayToUint32Array_(r),c=h[0],g=h[1],v=h[2],p=h[3],y=new Int32Array(e),m=new Int32Array(y.length),E=void 0,b=void 0,R=void 0,_=void 0,T=void 0,k=void 0,A=void 0,S=void 0,L=void 0,D=void 0,w=void 0,O=void 0;t>>24]^u[k>>16&255]^d[A>>8&255]^f[255&S]^s[i],b=l[k>>>24]^u[A>>16&255]^d[S>>8&255]^f[255&T]^s[i+1],R=l[A>>>24]^u[S>>16&255]^d[T>>8&255]^f[255&k]^s[i+2],_=l[S>>>24]^u[T>>16&255]^d[k>>8&255]^f[255&A]^s[i+3],T=E,k=b,A=R,S=_,i+=4;E=o[T>>>24]<<24^o[k>>16&255]<<16^o[A>>8&255]<<8^o[255&S]^s[i],b=o[k>>>24]<<24^o[A>>16&255]<<16^o[S>>8&255]<<8^o[255&T]^s[i+1],R=o[A>>>24]<<24^o[S>>16&255]<<16^o[T>>8&255]<<8^o[255&k]^s[i+2],_=o[S>>>24]<<24^o[T>>16&255]<<16^o[k>>8&255]<<8^o[255&A]^s[i+3],i+=3,m[t]=this.networkToHostOrderSwap(E^c),m[t+1]=this.networkToHostOrderSwap(_^g),m[t+2]=this.networkToHostOrderSwap(R^v),m[t+3]=this.networkToHostOrderSwap(b^p),c=L,g=D,v=w,p=O,t+=4}return m.buffer}},{key:"destroy",value:function(){this.key=void 0,this.keySize=void 0,this.ksRows=void 0,this.sBox=void 0,this.invSBox=void 0,this.subMix=void 0,this.invSubMix=void 0,this.keySchedule=void 0,this.invKeySchedule=void 0,this.rcon=void 0}}]),e}();r.default=n},{}],16:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r>>5,v-=E,v>0&&m+E+v<=R);)for(b=k+y*p,_={unit:e.subarray(m+E,m+E+v),pts:b,dts:b},c.samples.push(_),c.len+=v,m+=v+E,y++;m>>6)+1,o=(60&t[r+2])>>>2,o>c.length-1?void e.trigger(Event.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+o}):(u=(1&t[r+2])<<2,u|=(192&t[r+3])>>>6,n.logger.log("manifest codec:"+i+",ADTS data:type:"+a+",sampleingIndex:"+o+"["+c[o]+"Hz],channelConfig:"+u),/firefox|OPR/i.test(f)?o>=6?(a=5,d=new Array(4),l=o-3):(a=2,d=new Array(2),l=o):f.indexOf("android")!==-1?(a=2,d=new Array(2),l=o):(a=5,d=new Array(4),i&&(i.indexOf("mp4a.40.29")!==-1||i.indexOf("mp4a.40.5")!==-1)||!i&&o>=6?l=o-3:((i&&i.indexOf("mp4a.40.2")!==-1&&o>=6&&1===u||!i&&1===u)&&(a=2,d=new Array(2)),l=o)),d[0]=a<<3,d[0]|=(14&o)>>1,d[1]|=(1&o)<<7,d[1]|=u<<3,5===a&&(d[1]|=(14&l)>>1,d[2]=(1&l)<<7,d[2]|=8,d[3]=0),/Vivaldi|OPR/i.test(f)&&(h="mp4a.40.2"),{config:d,samplerate:c[o],channelCount:u,codec:"mp4a.40."+a,manifestCodec:h})}}]),e}();r.default=o},{26:26,45:45}],20:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r3&&void 0!==arguments[3]?arguments[3]:null;a(this,e),this.hls=t,this.id=r,this.config=this.hls.config||n,this.typeSupported=i; +}return n(e,[{key:"destroy",value:function(){var e=this.demuxer;e&&e.destroy()}},{key:"push",value:function(e,t,r,i,a,n,s,l,u,f,h){if(e.byteLength>0&&null!=u&&null!=u.key&&"AES-128"===u.method){null==this.decrypter&&(this.decrypter=new d.default(this.hls,this.config));var c,g=this;try{c=performance.now()}catch(e){c=Date.now()}this.decrypter.decrypt(e,u.key.buffer,u.iv.buffer,function(e){var u;try{u=performance.now()}catch(e){u=Date.now()}g.hls.trigger(o.default.FRAG_DECRYPTED,{level:n,sn:s,stats:{tstart:c,tdecrypt:u}}),g.pushDecrypted(new Uint8Array(e),t,r,i,a,n,s,l,f,h)})}else this.pushDecrypted(new Uint8Array(e),t,r,i,a,n,s,l,f,h)}},{key:"pushDecrypted",value:function(e,t,r,i,a,n,s,u,d,f){var c=this.demuxer;if(!c||a!==this.cc&&!c.probe(e)){var v=this.hls,y=this.id,E=this.config,b=this.typeSupported;if(g.default.probe(e))c=this.typeSupported.mp2t===!0?new g.default(v,y,m.default,E,b):new g.default(v,y,p.default,E,b),c.probe=g.default.probe;else{if(!h.default.probe(e))return void v.trigger(o.default.ERROR,{type:l.ErrorTypes.MEDIA_ERROR,id:y,details:l.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"no demux matching with content found"});c=new h.default(v,y,p.default,E,b),c.probe=h.default.probe}this.demuxer=c}c.push(e,t,r,i,a,n,s,u,d,f),this.cc=a}}]),e}();r.default=E},{16:16,18:18,25:25,26:26,28:28,38:38,39:39}],21:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(r,"__esModule",{value:!0});var a=e(20),n=i(a),s=e(28),o=i(s),l=e(45),u=e(1),d=i(u),f=function(e){var t=new d.default;t.trigger=function(e){for(var r=arguments.length,i=Array(r>1?r-1:0),a=1;a1?r-1:0),a=1;ae?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,t=e>>3,e-=t>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)}},{key:"readBits",value:function(e){var t=Math.min(this.bitsAvailable,e),r=this.word>>>32-t;return e>32&&n.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=t,this.bitsAvailable>0?this.word<<=t:this.bytesAvailable>0&&this.loadWord(),t=e-t,t>0&&this.bitsAvailable?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()}},{key:"skipUEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"skipEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"readUEG",value:function(){var e=this.skipLZ();return this.readBits(e+1)-1}},{key:"readEG",value:function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)}},{key:"readBoolean",value:function(){return 1===this.readBits(1)}},{key:"readUByte",value:function(){return this.readBits(8)}},{key:"readUShort",value:function(){return this.readBits(16)}},{key:"readUInt",value:function(){return this.readBits(32)}},{key:"skipScalingList",value:function(e){var t,r,i=8,a=8;for(t=0;t>4,p>1){if(y=f+5+e[f+4],y===f+188)continue}else y=f+4;switch(v){case S:if(g){if(O&&(m=x(O))&&(F(m,!1),b&&T.codec&&(L===-1||k.codec)))return void this.remux(n,s,a,e,i);O={data:[],size:0}}O&&(O.data.push(e.subarray(y,f+188)),O.size+=f+188-y);break;case L:if(g){if(I&&(m=x(I))&&(k.isAAC?N(m):U(m),b&&k.codec&&(S===-1||T.codec)))return void this.remux(n,s,a,e,i);I={data:[],size:0}}I&&(I.data.push(e.subarray(y,f+188)),I.size+=f+188-y);break;case D:g&&(P&&(m=x(P))&&G(m),P={data:[],size:0}),P&&(P.data.push(e.subarray(y,f+188)),P.size+=f+188-y);break;case 0:g&&(y+=e[y]+1),w=this._pmtId=C(e,y);break;case w:g&&(y+=e[y]+1);var B=M(e,y,this.typeSupported.mpeg===!0||this.typeSupported.mp3===!0);S=B.avc,S>0&&(T.id=S),L=B.audio,L>0&&(k.id=L,k.isAAC=B.isAAC),D=B.id3,D>0&&(A.id=D),R&&!_&&(h.logger.log("reparse from beginning"),R=!1,f=-188),_=this.pmtParsed=!0;break;case 17:case 8191:break;default:R=!0}}else this.observer.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,id:this.id,details:c.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});O&&(m=x(O))?(F(m,!0),T.pesData=null):T.pesData=O,I&&(m=x(I))?(k.isAAC?N(m):U(m),k.pesData=null):(I&&I.size&&h.logger.log("last AAC PES packet truncated,might overlap between fragments"),k.pesData=I),P&&(m=x(P))?(G(m),A.pesData=null):A.pesData=P,this.remux(n,s,a,null,i,d)}},{key:"remux",value:function(e,t,r,i,a,n){for(var s=this._avcTrack,o=s.samples,l=0,u=0,d=0;d1;){var c=new Uint8Array(f[0].length+f[1].length);c.set(f[0]),c.set(f[1],f[0].length),f[0]=c,f.splice(1,1)}if(t=f[0],i=(t[0]<<16)+(t[1]<<8)+t[2],1===i){if(a=(t[4]<<8)+t[5],a&&a>e.size-6)return null;r=t[7],192&r&&(o=536870912*(14&t[9])+4194304*(255&t[10])+16384*(254&t[11])+128*(255&t[12])+(254&t[13])/2,o>4294967295&&(o-=8589934592),64&r?(l=536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2,l>4294967295&&(l-=8589934592),o-l>54e5&&(h.logger.warn(Math.round((o-l)/9e4)+"s delta between PTS and DTS, align them"),o=l)):l=o),n=t[8],u=n+9,e.size-=u,s=new Uint8Array(e.size);for(var g=0,v=f.length;gp){u-=p;continue}t=t.subarray(u),p-=u,u=0}s.set(t,d),d+=p}return a&&(a-=n+3),{data:s,pts:o,dts:l,len:a}}return null}},{key:"pushAccesUnit",value:function(e,t){e.units.units.length&&e.frame&&(!this.config.forceKeyFrameOnDiscontinuity||e.key===!0||t.sps&&(t.samples.length||this.contiguous)?t.samples.push(e):t.dropped++),e.debug.length&&h.logger.log(e.pts+"/"+e.dts+":"+e.debug+","+e.units.length)}},{key:"_parseAVCPES",value:function(e,t){var r,i,a,n=this,s=this._avcTrack,o=this._parseAVCNALu(e.data),l=!1,u=this.avcSample;e.data=null,o.forEach(function(t){switch(t.type){case 1:i=!0,l&&u&&(u.debug+="NDR "),u.frame=!0;var o=t.data;if(o.length>4){var d=new f.default(o).readSliceType();2!==d&&4!==d&&7!==d&&9!==d||(u.key=!0)}break;case 5:i=!0,u||(u=n.avcSample=n._createAVCSample(!0,e.pts,e.dts,"")),l&&(u.debug+="IDR "),u.key=!0,u.frame=!0;break;case 6:i=!0,l&&u&&(u.debug+="SEI "),r=new f.default(n.discardEPB(t.data)),r.readUByte();for(var h=0,c=0,g=!1,v=0;!g&&r.bytesAvailable>1;){h=0;do v=r.readUByte(),h+=v;while(255===v);c=0;do v=r.readUByte(),c+=v;while(255===v);if(4===h&&0!==r.bytesAvailable){g=!0;var p=r.readUByte();if(181===p){var y=r.readUShort();if(49===y){var m=r.readUInt();if(1195456820===m){var E=r.readUByte();if(3===E){var b=r.readUByte(),R=r.readUByte(),_=31&b,T=[b,R];for(a=0;a<_;a++)T.push(r.readUByte()),T.push(r.readUByte()),T.push(r.readUByte());n._insertSampleInOrder(n._txtTrack.samples,{type:3,pts:e.pts,bytes:T})}}}}}else if(c0){if(t.pts>=e[r-1].pts)e.push(t);else for(var i=r-1;i>=0;i--)if(t.pts=0)i={data:e.subarray(h,s-u-1),type:n},f.push(i);else{var c=this._getLastNalUnit();if(c&&(d&&s<=4-d&&c.state&&(c.data=c.data.subarray(0,c.data.byteLength-d)),r=s-u-1,r>0)){var g=new Uint8Array(c.data.byteLength+r);g.set(c.data,0),g.set(e.subarray(0,r),c.data.byteLength),c.data=g}}s=0&&u>=0&&(i={data:e.subarray(h,o),type:n,state:u},f.push(i)),0===f.length){var v=this._getLastNalUnit();if(v){var p=new Uint8Array(v.data.byteLength+e.byteLength);p.set(v.data,0),p.set(e,v.data.byteLength),v.data=p}}return l.naluState=u,f}},{key:"discardEPB",value:function(e){for(var t,r,i=e.byteLength,a=[],n=1;n1&&(h.logger.log("AAC: align PTS for overlapping frames by "+Math.round((k-p)/90)),p=k)}for(;n+5>>5,r-=s,r>0&&n+s+r<=d);)for(l=p+a*i,f={unit:v.subarray(n+s,n+s+r),pts:l,dts:l},g.samples.push(f),g.len+=r,n+=r+s,a++;n0;)s+=t}},{key:"_onMpegFrame",value:function(e,t,r,i,a,n){var s=1152/r*1e3,o=n+a*s,l=this._audioTrack;l.config=[],l.channelCount=i,l.audiosamplerate=r,l.duration=this._duration,l.samples.push({unit:e,pts:o,dts:o}),l.len+=e.length}},{key:"_onMpegNoise",value:function(e){h.logger.warn("mpeg audio has noise: "+e.length+" bytes")}},{key:"_parseMpeg",value:function(e,t,r,i,a){var n=[32,64,96,128,160,192,224,256,288,320,352,384,416,448,32,48,56,64,80,96,112,128,160,192,224,256,320,384,32,40,48,56,64,80,96,112,128,160,192,224,256,320,32,48,56,64,80,96,112,128,144,160,176,192,224,256,8,16,24,32,40,48,56,64,80,96,112,128,144,160],s=[44100,48e3,32e3,22050,24e3,16e3,11025,12e3,8e3];if(t+2>r)return-1;if(255===e[t]||224===(224&e[t+1])){if(t+24>r)return-1;var o=e[t+1]>>3&3,l=e[t+1]>>1&3,u=e[t+2]>>4&15,d=e[t+2]>>2&3,f=!!(2&e[t+2]);if(1!==o&&0!==u&&15!==u&&3!==d){var h=3===o?3-l:3===l?3:4,c=1e3*n[14*h+u-1],g=3===o?0:2===o?1:2,v=s[3*g+d],p=f?1:0,y=e[t+3]>>6===3?1:2,m=3===l?(3===o?12:6)*c/v+p<<2:(3===o?144:72)*c/v+p|0;return t+m>r?-1:(this._onMpegFrame&&this._onMpegFrame(e.subarray(t,t+m),c,v,y,i,a),m)}}for(var E=t+2;E=564&&71===e[0]&&71===e[188]&&71===e[376]}}]),e}();r.default=g},{19:19,23:23,26:26,28:28,45:45}],26:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.ErrorTypes={NETWORK_ERROR:"networkError",MEDIA_ERROR:"mediaError",MUX_ERROR:"muxError",OTHER_ERROR:"otherError"},r.ErrorDetails={MANIFEST_LOAD_ERROR:"manifestLoadError",MANIFEST_LOAD_TIMEOUT:"manifestLoadTimeOut",MANIFEST_PARSING_ERROR:"manifestParsingError",MANIFEST_INCOMPATIBLE_CODECS_ERROR:"manifestIncompatibleCodecsError",LEVEL_LOAD_ERROR:"levelLoadError",LEVEL_LOAD_TIMEOUT:"levelLoadTimeOut",LEVEL_SWITCH_ERROR:"levelSwitchError",AUDIO_TRACK_LOAD_ERROR:"audioTrackLoadError",AUDIO_TRACK_LOAD_TIMEOUT:"audioTrackLoadTimeOut",FRAG_LOAD_ERROR:"fragLoadError",FRAG_LOOP_LOADING_ERROR:"fragLoopLoadingError",FRAG_LOAD_TIMEOUT:"fragLoadTimeOut",FRAG_DECRYPT_ERROR:"fragDecryptError",FRAG_PARSING_ERROR:"fragParsingError",REMUX_ALLOC_ERROR:"remuxAllocError",KEY_LOAD_ERROR:"keyLoadError",KEY_LOAD_TIMEOUT:"keyLoadTimeOut",BUFFER_ADD_CODEC_ERROR:"bufferAddCodecError",BUFFER_APPEND_ERROR:"bufferAppendError",BUFFER_APPENDING_ERROR:"bufferAppendingError",BUFFER_STALLED_ERROR:"bufferStalledError",BUFFER_FULL_ERROR:"bufferFullError",BUFFER_SEEK_OVER_HOLE:"bufferSeekOverHole",BUFFER_NUDGE_ON_STALL:"bufferNudgeOnStall",INTERNAL_EXCEPTION:"internalException"}},{}],27:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=function(){function e(e,t){for(var r=0;r1?r-1:0),n=1;n=r.start(i)&&t<=r.end(i))return!0;return!1}},{key:"bufferInfo",value:function(e,t,r){if(e){var i,a=e.buffered,n=[];for(i=0;id&&(l[u-1].end=e[o].end):l.push(e[o])}else l.push(e[o])}for(o=0,i=0,a=n=t;o=f&&t=0&&ot.endSN)return 0;if(o=r-t.startSN,l=t.fragments,u=l[o],!isNaN(u.startPTS)){ +var f=Math.abs(u.startPTS-i);isNaN(u.deltaPTS)?u.deltaPTS=f:u.deltaPTS=Math.max(f,u.deltaPTS),i=Math.min(i,u.startPTS),a=Math.max(a,u.endPTS),n=Math.min(n,u.startDTS),s=Math.max(s,u.endDTS)}var h=i-u.start;for(u.start=u.startPTS=i,u.endPTS=a,u.startDTS=n,u.endDTS=s,u.duration=a-i,d=o;d>0;d--)e.updatePTS(l,d,d-1);for(d=o;dt?a.start=i.start+i.duration:a.start=i.start-a.duration:r>t?(i.duration=s-i.start,i.duration<0&&n.logger.warn("negative duration computed for frag "+i.sn+",level "+i.level+", there should be some duration drift between playlist and fragment!")):(a.duration=i.start-s,a.duration<0&&n.logger.warn("negative duration computed for frag "+a.sn+",level "+a.level+", there should be some duration drift between playlist and fragment!"))}}]),e}();r.default=s},{45:45}],32:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:{};a(this,e);var r=e.DefaultConfig;if((t.liveSyncDurationCount||t.liveMaxLatencyDurationCount)&&(t.liveSyncDuration||t.liveMaxLatencyDuration))throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration");for(var i in r)i in t||(t[i]=r[i]);if(void 0!==t.liveMaxLatencyDurationCount&&t.liveMaxLatencyDurationCount<=t.liveSyncDurationCount)throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be gt "liveSyncDurationCount"');if(void 0!==t.liveMaxLatencyDuration&&(t.liveMaxLatencyDuration<=t.liveSyncDuration||void 0===t.liveSyncDuration))throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be gt "liveSyncDuration"');(0,I.enableLogs)(t.debug),this.config=t;var n=this.observer=new x.default;n.trigger=function(e){for(var t=arguments.length,r=Array(t>1?t-1:0),i=1;i1?t-1:0),i=1;i0&&void 0!==arguments[0]?arguments[0]:-1;I.logger.log("startLoad("+e+")"),this.levelController.startLoad(),this.streamController.startLoad(e),this.audioStreamController.startLoad(e)}},{key:"stopLoad",value:function(){I.logger.log("stopLoad"),this.levelController.stopLoad(),this.streamController.stopLoad(),this.audioStreamController.stopLoad()}},{key:"swapAudioCodec",value:function(){I.logger.log("swapAudioCodec"),this.streamController.swapAudioCodec()}},{key:"recoverMediaError",value:function(){I.logger.log("recoverMediaError");var e=this.media;this.detachMedia(),this.attachMedia(e)}},{key:"levels",get:function(){return this.levelController.levels}},{key:"currentLevel",get:function(){return this.streamController.currentLevel},set:function(e){I.logger.log("set currentLevel:"+e),this.loadLevel=e,this.streamController.immediateLevelSwitch()}},{key:"nextLevel",get:function(){return this.streamController.nextLevel},set:function(e){I.logger.log("set nextLevel:"+e),this.levelController.manualLevel=e,this.streamController.nextLevelSwitch()}},{key:"loadLevel",get:function(){return this.levelController.level},set:function(e){I.logger.log("set loadLevel:"+e),this.levelController.manualLevel=e}},{key:"nextLoadLevel",get:function(){return this.levelController.nextLoadLevel},set:function(e){this.levelController.nextLoadLevel=e}},{key:"firstLevel",get:function(){return Math.max(this.levelController.firstLevel,this.abrController.minAutoLevel)},set:function(e){I.logger.log("set firstLevel:"+e),this.levelController.firstLevel=e}},{key:"startLevel",get:function(){return this.levelController.startLevel},set:function(e){I.logger.log("set startLevel:"+e),this.levelController.startLevel=e}},{key:"autoLevelCapping",get:function(){return this.abrController.autoLevelCapping},set:function(e){I.logger.log("set autoLevelCapping:"+e),this.abrController.autoLevelCapping=e}},{key:"autoLevelEnabled",get:function(){return this.levelController.manualLevel===-1}},{key:"manualLevel",get:function(){return this.levelController.manualLevel}},{key:"audioTracks",get:function(){return this.audioTrackController.audioTracks}},{key:"audioTrack",get:function(){return this.audioTrackController.audioTrack},set:function(e){this.audioTrackController.audioTrack=e}},{key:"liveSyncPosition",get:function(){return this.streamController.liveSyncPosition}}]),e}();r.default=B},{1:1,10:10,11:11,12:12,13:13,26:26,28:28,34:34,35:35,36:36,4:4,43:43,45:45,47:47,5:5,6:6,7:7,8:8}],33:[function(e,t,r){"use strict";t.exports=e(32).default},{32:32}],34:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r>8*(15-r)&255;return t}},{key:"fragmentDecryptdataFromLevelkey",value:function(e,t){var r=e;return e&&e.method&&e.uri&&!e.iv&&(r=new _,r.method=e.method,r.baseuri=e.baseuri,r.reluri=e.reluri,r.iv=this.createInitializationVector(t)),r}},{key:"cloneObj",value:function(e){return JSON.parse(JSON.stringify(e))}},{key:"url",get:function(){return!this._url&&this.relurl&&(this._url=u.default.buildAbsoluteURL(this.baseurl,this.relurl)),this._url},set:function(e){this._url=e}},{key:"programDateTime",get:function(){return!this._programDateTime&&this.rawProgramDateTime&&(this._programDateTime=new Date(Date.parse(this.rawProgramDateTime))),this._programDateTime}},{key:"byteRange",get:function(){if(!this._byteRange){var e=this._byteRange=[];if(this.rawByteRange){var t=this.rawByteRange.split("@",2);if(1===t.length){var r=this.lastByteRangeEndOffset;e[0]=r?r:0}else e[0]=parseInt(t[1]);e[1]=parseInt(t[0])+e[0]}}return this._byteRange}},{key:"byteRangeStartOffset",get:function(){return this.byteRange[0]}},{key:"byteRangeEndOffset",get:function(){return this.byteRange[1]}},{key:"decryptdata",get:function(){return this._decryptdata||(this._decryptdata=this.fragmentDecryptdataFromLevelkey(this.levelkey,this.sn)),this._decryptdata}}]),e}(),k=function(e){function t(e){s(this,t);var r=a(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,f.default.MANIFEST_LOADING,f.default.LEVEL_LOADING,f.default.AUDIO_TRACK_LOADING));return r.loaders={},r}return n(t,e),o(t,[{key:"destroy",value:function(){for(var e in this.loaders){var t=this.loaders[e];t&&t.destroy()}this.loaders={},c.default.prototype.destroy.call(this)}},{key:"onManifestLoading",value:function(e){this.load(e.url,{type:"manifest"})}},{key:"onLevelLoading",value:function(e){this.load(e.url,{type:"level",level:e.level,id:e.id})}},{key:"onAudioTrackLoading",value:function(e){this.load(e.url,{type:"audioTrack",id:e.id})}},{key:"load",value:function(e,t){var r=this.loaders[t.type];if(r){var i=r.context;if(i&&i.url===e)return void y.logger.trace("playlist request ongoing");y.logger.warn("abort previous loader for type:"+t.type),r.abort()}var a=this.hls.config,n=void 0,s=void 0,o=void 0,l=void 0;"manifest"===t.type?(n=a.manifestLoadingMaxRetry,s=a.manifestLoadingTimeOut,o=a.manifestLoadingRetryDelay,l=a.manifestLoadingMaxRetryTimeout):(n=a.levelLoadingMaxRetry,s=a.levelLoadingTimeOut,o=a.levelLoadingRetryDelay,l=a.levelLoadingMaxRetryTimeout,y.logger.log("loading playlist for "+t.type+" "+(t.level||t.id))),r=this.loaders[t.type]=t.loader="undefined"!=typeof a.pLoader?new a.pLoader(a):new a.loader(a),t.url=e,t.responseType="";var u=void 0,d=void 0;u={timeout:s,maxRetry:n,retryDelay:o,maxRetryDelay:l},d={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this)},r.load(t,u,d)}},{key:"resolve",value:function(e,t){return u.default.buildAbsoluteURL(t,e)}},{key:"parseMasterPlaylist",value:function(e,t){var r=[],i=void 0;for(m.lastIndex=0;null!=(i=m.exec(e));){var a={},n=a.attrs=new p.default(i[1]);a.url=this.resolve(i[2],t);var s=n.decimalResolution("RESOLUTION");s&&(a.width=s.width,a.height=s.height),a.bitrate=n.decimalInteger("AVERAGE-BANDWIDTH")||n.decimalInteger("BANDWIDTH"),a.name=n.NAME;var o=n.CODECS;if(o){o=o.split(/[ ,]+/);for(var l=0;l2?(t=r.shift()+".",t+=parseInt(r.shift()).toString(16),t+=("000"+parseInt(r.shift()).toString(16)).substr(-4)):t=e,t}},{key:"parseLevelPlaylist",value:function(e,t,r,i){var a,n,s=0,o=0,l={type:null,version:null,url:t,fragments:[],live:!0,startSN:0},u=new _,d=0,f=null,h=new T;for(h.tagList=[],b.lastIndex=0;null!==(a=b.exec(e));){var c=a[1];if(c){h.duration=parseFloat(c);var g=(" "+a[2]).slice(1);h.title=g?g:null,h.tagList.push(g?["INF",c,g]:["INF",c])}else if(a[3]){if(!isNaN(h.duration)){var v=s++;h.type=i,h.start=o,h.levelkey=u,h.sn=v,h.level=r,h.cc=d,h.baseurl=t,h.relurl=(" "+a[3]).slice(1),l.fragments.push(h),f=h,o+=h.duration,h=new T,h.tagList=[]}}else if(a[4]){if(h.rawByteRange=(" "+a[4]).slice(1),f){var m=f.byteRangeEndOffset;m&&(h.lastByteRangeEndOffset=m)}}else if(a[5])h.rawProgramDateTime=(" "+a[5]).slice(1),h.tagList.push(["PROGRAM-DATE-TIME",h.rawProgramDateTime]);else{for(a=a[0].match(R),n=1;n0){var u="audioTrack"!==n,d=this.parseLevelPlaylist(i,a,(u?o:s)||0,u?"main":"audio");"manifest"===n&&l.trigger(f.default.MANIFEST_LOADED,{levels:[{url:a,details:d}],audioTracks:[],url:a,stats:t}),t.tparsed=performance.now(),d.targetduration?u?l.trigger(f.default.LEVEL_LOADED,{details:d,level:o||0,id:s||0,stats:t}):l.trigger(f.default.AUDIO_TRACK_LOADED,{details:d,id:s,stats:t}):l.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:g.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"invalid targetduration"})}else{var h=this.parseMasterPlaylist(i,a);if(h.length){var c=this.parseMasterPlaylistMedia(i,a,"AUDIO");if(c.length){var v=!1;c.forEach(function(e){e.url||(v=!0)}),v===!1&&h[0].audioCodec&&!h[0].attrs.AUDIO&&(y.logger.log("audio codec signaled in quality level, but no embedded audio track signaled, create one"),c.unshift({type:"main",name:"main"}))}l.trigger(f.default.MANIFEST_LOADED,{levels:h,audioTracks:c,url:a,stats:t})}else l.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:g.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"no level found in manifest"})}else l.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:g.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"no EXTM3U delimiter"})}},{key:"loaderror",value:function(e,t){var r,i,a=t.loader;switch(t.type){case"manifest":r=g.ErrorDetails.MANIFEST_LOAD_ERROR,i=!0;break;case"level":r=g.ErrorDetails.LEVEL_LOAD_ERROR,i=!1;break;case"audioTrack":r=g.ErrorDetails.AUDIO_TRACK_LOAD_ERROR,i=!1}a&&(a.abort(),this.loaders[t.type]=void 0),this.hls.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:r,fatal:i,url:a.url,loader:a,response:e,context:t})}},{key:"loadtimeout",value:function(e,t){var r,i,a=t.loader;switch(t.type){case"manifest":r=g.ErrorDetails.MANIFEST_LOAD_TIMEOUT,i=!0;break;case"level":r=g.ErrorDetails.LEVEL_LOAD_TIMEOUT,i=!1;break;case"audioTrack":r=g.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT,i=!1}a&&(a.abort(),this.loaders[t.type]=void 0),this.hls.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:r,fatal:i,url:a.url,loader:a,context:t})}}]),t}(c.default);r.default=k},{2:2,26:26,27:27,28:28,40:40,45:45}],37:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r>24&255,t[1]=i>>16&255,t[2]=i>>8&255,t[3]=255&i,t.set(e,4),a=0,i=8;a>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,85,196,0,0]))}},{key:"mdia",value:function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))}},{key:"mfhd",value:function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))}},{key:"minf",value:function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))}},{key:"moof",value:function(t,r,i){return e.box(e.types.moof,e.mfhd(t),e.traf(i,r))}},{key:"moov",value:function(t){for(var r=t.length,i=[];r--;)i[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(i).concat(e.mvex(t)))}},{key:"mvex",value:function(t){for(var r=t.length,i=[];r--;)i[r]=e.trex(t[r]);return e.box.apply(null,[e.types.mvex].concat(i))}},{key:"mvhd",value:function(t,r){r*=t;var i=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24&255,r>>16&255,r>>8&255,255&r,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,i)}},{key:"sdtp",value:function(t){var r,i,a=t.samples||[],n=new Uint8Array(4+a.length);for(i=0;i>>8&255),n.push(255&a),n=n.concat(Array.prototype.slice.call(i));for(r=0;r>>8&255),s.push(255&a),s=s.concat(Array.prototype.slice.call(i));var o=e.box(e.types.avcC,new Uint8Array([1,n[3],n[4],n[5],255,224|t.sps.length].concat(n).concat([t.pps.length]).concat(s))),l=t.width,u=t.height,d=t.pixelRatio[0],f=t.pixelRatio[1];return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,l>>8&255,255&l,u>>8&255,255&u,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),o,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])),e.box(e.types.pasp,new Uint8Array([d>>24,d>>16&255,d>>8&255,255&d,f>>24,f>>16&255,f>>8&255,255&f])))}},{key:"esds",value:function(e){var t=e.config.length;return new Uint8Array([0,0,0,0,3,23+t,0,1,0,4,15+t,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([t]).concat(e.config).concat([6,1,2]))}},{key:"mp4a",value:function(t){var r=t.audiosamplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))}},{key:"mp3",value:function(t){var r=t.audiosamplerate;return e.box(e.types[".mp3"],new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]))}},{key:"stsd",value:function(t){return"audio"===t.type?t.isAAC||"mp3"!==t.codec?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.mp3(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))}},{key:"tkhd",value:function(t){var r=t.id,i=t.duration*t.timescale,a=t.width,n=t.height;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,i>>24,i>>16&255,i>>8&255,255&i,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,a>>8&255,255&a,0,0,n>>8&255,255&n,0,0]))}},{key:"traf",value:function(t,r){var i=e.sdtp(t),a=t.id;return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,a>>24,a>>16&255,a>>8&255,255&a])),e.box(e.types.tfdt,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r])),e.trun(t,i.length+16+16+8+16+8+8),i)}},{key:"trak",value:function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))}},{key:"trex",value:function(t){var r=t.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))}},{key:"trun",value:function(t,r){var i,a,n,s,o,l,u=t.samples||[],d=u.length,f=12+16*d,h=new Uint8Array(f);for(r+=8+f,h.set([0,0,15,1,d>>>24&255,d>>>16&255,d>>>8&255,255&d,r>>>24&255,r>>>16&255,r>>>8&255,255&r],0),i=0;i>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,o.isLeading<<2|o.dependsOn,o.isDependedOn<<6|o.hasRedundancy<<4|o.paddingValue<<1|o.isNonSync,61440&o.degradPrio,15&o.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*i); return e.box(e.types.trun,h)}},{key:"initSegment",value:function(t){e.types||e.init();var r,i=e.moov(t);return r=new Uint8Array(e.FTYP.byteLength+i.byteLength),r.set(e.FTYP),r.set(i,e.FTYP.byteLength),r}}]),e}();r.default=n},{}],38:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;rMath.pow(2,32)&&!function(){var t=function e(t,r){return r?e(r,t%r):t};e.timescale=e.audiosamplerate/t(e.audiosamplerate,e.isAAC?1024:1152)}(),d.logger.log("audio mp4 timescale :"+e.timescale),e.isAAC||(g.mpeg?(v="audio/mpeg",e.codec=""):g.mp3&&(e.codec="mp3")),p.audio={container:v,codec:e.codec,initSegment:!e.isAAC&&g.mpeg?new Uint8Array:h.default.initSegment([e]),metadata:{channelCount:e.channelCount}},m&&(a=n=o[0].pts-f*r)),t.sps&&t.pps&&l.length&&(t.timescale=this.MP4_TIMESCALE,p.video={container:"video/mp4",codec:t.codec,initSegment:h.default.initSegment([t]),metadata:{width:t.width,height:t.height}},m&&(a=Math.min(a,l[0].pts-f*r),n=Math.min(n,l[0].dts-f*r),this.observer.trigger(u.default.INIT_PTS_FOUND,{id:this.id,initPTS:a,cc:i}))),Object.keys(p).length?(s.trigger(u.default.FRAG_PARSING_INIT_SEGMENT,y),this.ISGenerated=!0,m&&(this._initPTS=a,this._initDTS=n)):s.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,id:this.id,details:c.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"no audio/video samples found"})}},{key:"remuxVideo",value:function(e,t,r,i){var a,n,s,o,l,f,g,v,p=8,y=this.PES_TIMESCALE,m=this.PES2MP4SCALEFACTOR,E=e.samples,b=[],R=E.length,_=this._PTSNormalize,T=this._initDTS;E.sort(function(e,t){var r=e.dts-t.dts;return r?r:e.pts-t.pts});var k=E.reduce(function(e,t){return Math.max(Math.min(e,t.pts-t.dts),-18e3)},0);if(k<0){d.logger.warn("PTS < DTS detected in video samples, shifting DTS by "+Math.round(k/90)+" ms to overcome this issue");for(var A=0;A1?d.logger.log("AVC:"+D+" ms hole between fragments detected,filling it"):D<-1&&d.logger.log("AVC:"+-D+" ms overlapping between fragments detected"),l=S,E[0].dts=l+T,o=Math.max(o-D,S),E[0].pts=o+T,d.logger.log("Video/PTS/DTS adjusted: "+Math.round(o/90)+"/"+Math.round(l/90)+",delta:"+D+" ms")),f=l,L=E[E.length-1],v=Math.max(_(L.dts-T,S),0),g=Math.max(_(L.pts-T,S),0),g=Math.max(g,v);var w=navigator.vendor,O=navigator.userAgent,I=w&&w.indexOf("Apple")>-1&&O&&!O.match("CriOS");I&&(a=Math.round((v-l)/(m*(E.length-1))));for(var P=0;P0?F-1:F].dts;if(Y.stretchShortVideoTrack){var X=Y.maxBufferHole,z=Y.maxSeekHole,$=Math.floor(Math.min(X,z)*y),J=(i?o+i*y:this.nextAudioPts)-N.pts;J>$?(a=J-q,a<0&&(a=q),d.logger.log("It is approximately "+J/90+" ms to the next segment; using duration "+a/90+" ms for the last video frame.")):a=q}else a=q}a/=m,B=Math.round((N.pts-N.dts)/m)}b.push({size:G,duration:a,cts:B,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0,dependsOn:N.key?2:1,isNonSync:N.key?0:1}})}this.nextAvcDts=v+a*m;var Q=e.dropped;if(e.len=0,e.nbNalu=0,e.dropped=0,b.length&&navigator.userAgent.toLowerCase().indexOf("chrome")>-1){var Z=b[0].flags;Z.dependsOn=2,Z.isNonSync=0}e.samples=b,s=h.default.moof(e.sequenceNumber++,l/m,e),e.samples=[];var ee={id:this.id,level:this.level,sn:this.sn,data1:s,data2:n,startPTS:o/y,endPTS:(g+m*a)/y,startDTS:l/y,endDTS:this.nextAvcDts/y,type:"video",nb:b.length,dropped:Q};return this.observer.trigger(u.default.FRAG_PARSING_DATA,ee),ee}},{key:"remuxAudio",value:function(e,t,r,i){var a,n,s,l,f,g,v,p,y,m,E,b,R,_,T,k,A=this.PES_TIMESCALE,S=e.timescale,L=A/S,D=e.timescale*(e.isAAC?1024:1152)/e.audiosamplerate,w=D*L,O=this._PTSNormalize,I=this._initDTS,P=!e.isAAC&&this.typeSupported.mpeg,C=P?0:8,M=[],x=[];if(e.samples.sort(function(e,t){return e.pts-t.pts}),x=e.samples,k=this.nextAudioPts,r|=x.length&&k&&(Math.abs(t-k/A)<.1||Math.abs(x[0].pts-k-this._initDTS)<20*w),r||(k=t*A),i&&e.isAAC)for(var F=0,N=k;F=w){var j=Math.round(B/w);d.logger.warn("Injecting "+j+" audio frame @ "+Math.round(N/90)/1e3+"s due to "+Math.round(B/90)+" ms gap.");for(var H=0;H.1*w,N+=w,0===F?U.pts=U.dts=I+k:U.pts=U.dts=x[F-1].pts+w,F+=1}for(var K=0,W=x.length;K0)Y=Math.round((b-k)/w),d.logger.log(V+" ms hole between AAC samples detected,filling it"),Y>0&&(_=o.default.getSilentFrame(e.manifestCodec||e.codec,e.channelCount),_||(_=l.subarray()),e.len+=Y*_.length);else if(V<-12){d.logger.log(-V+" ms overlapping between AAC samples detected, drop frame"),e.len-=l.byteLength;continue}b=R=k}if(v=Math.max(0,b),p=Math.max(0,R),!(e.len>0))return;var q=P?e.len:e.len+8;try{f=new Uint8Array(q)}catch(e){return void this.observer.trigger(u.default.ERROR,{type:c.ErrorTypes.MUX_ERROR,level:this.level,id:this.id,details:c.ErrorDetails.REMUX_ALLOC_ERROR,fatal:!1,bytes:q,reason:"fail allocating audio mdat "+q})}P||(a=new DataView(f.buffer),a.setUint32(0,q),f.set(h.default.types.mdat,4));for(var X=0;X=2&&($=M[J-2].duration,s.duration=$),J){this.nextAudioPts=b+L*$,e.len=0,e.samples=M,g=P?new Uint8Array:h.default.moof(e.sequenceNumber++,p/L,e),e.samples=[];var Q={id:this.id,level:this.level,sn:this.sn,data1:g,data2:f,startPTS:v/A,endPTS:this.nextAudioPts/A,startDTS:p/A,endDTS:(R+L*$)/A,type:"audio",nb:J};return this.observer.trigger(u.default.FRAG_PARSING_DATA,Q),Q}return null}},{key:"remuxEmptyAudio",value:function(e,t,r,i){var a=this.PES_TIMESCALE,n=e.timescale?e.timescale:e.audiosamplerate,s=a/n,l=this.nextAudioPts,u=(void 0!==l?l:i.startDTS*a)+this._initDTS,f=i.endDTS*a+this._initDTS,h=1024,c=s*h,g=Math.ceil((f-u)/c),v=o.default.getSilentFrame(e.manifestCodec||e.codec,e.channelCount);if(d.logger.warn("remux empty Audio"),!v)return void d.logger.trace("Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec!");for(var p=[],y=0;y4294967296;)e+=r;return e}},{key:"passthrough",get:function(){return!1}}]),e}();r.default=g},{26:26,28:28,29:29,37:37,45:45}],39:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;rNumber.MAX_SAFE_INTEGER?1/0:t}},{key:"hexadecimalInteger",value:function(e){if(this[e]){var t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;for(var r=new Uint8Array(t.length/2),i=0;iNumber.MAX_SAFE_INTEGER?1/0:t}},{key:"decimalFloatingPoint",value:function(e){return parseFloat(this[e])}},{key:"enumeratedString",value:function(e){return this[e]}},{key:"decimalResolution",value:function(e){var t=n.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}}}],[{key:"parseAttrList",value:function(e){var t,r={};for(s.lastIndex=0;null!==(t=s.exec(e));){var i=t[2],a='"';0===i.indexOf(a)&&i.lastIndexOf(a)===i.length-1&&(i=i.slice(1,-1)),r[t[1]]=i}return r}}]),e}();r.default=o},{}],41:[function(e,t,r){"use strict";var i={search:function(e,t){for(var r=0,i=e.length-1,a=null,n=null;r<=i;){a=(r+i)/2|0,n=e[a];var s=t(n);if(s>0)r=a+1;else{if(!(s<0))return n;i=a-1}}return null}};t.exports=i},{}],42:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r=r}},v=function(e){for(var t=[],r=0;rl&&(g.log("ERROR","Too large cursor position "+this.pos),this.pos=l)}},{key:"moveCursor",value:function(e){var t=this.pos+e;if(e>1)for(var r=this.pos+1;r=144&&this.backSpace();var t=s(e);return this.pos>=l?void g.log("ERROR","Cannot insert "+e.toString(16)+" ("+t+") at position "+this.pos+". Skipping it!"):(this.chars[this.pos].setChar(t,this.currPenState),void this.moveCursor(1))}},{key:"clearFromPos",value:function(e){var t;for(t=e;t0&&(r=e?"["+t.join(" | ")+"]":t.join("\n")),r}},{key:"getTextAndFormat",value:function(){return this.rows}}]),e}(),b=function(){function e(t,r){i(this,e),this.chNr=t,this.outputFilter=r,this.mode=null,this.verbose=0,this.displayedMemory=new E,this.nonDisplayedMemory=new E,this.lastOutputScreen=new E,this.currRollUpRow=this.displayedMemory.rows[o-1],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null}return a(e,[{key:"reset",value:function(){this.mode=null,this.displayedMemory.reset(),this.nonDisplayedMemory.reset(),this.lastOutputScreen.reset(),this.currRollUpRow=this.displayedMemory.rows[o-1],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null,this.lastCueEndTime=null}},{key:"getHandler",value:function(){return this.outputFilter}},{key:"setHandler",value:function(e){this.outputFilter=e}},{key:"setPAC",value:function(e){this.writeScreen.setPAC(e,this.lastOutputScreen)}},{key:"setBkgData",value:function(e){this.writeScreen.setBkgData(e)}},{key:"setMode",value:function(e){e!==this.mode&&(this.mode=e,g.log("INFO","MODE="+e),"MODE_POP-ON"===this.mode?this.writeScreen=this.nonDisplayedMemory:(this.writeScreen=this.displayedMemory,this.writeScreen.reset(),this.lastOutputScreen.reset()),"MODE_ROLL-UP"!==this.mode&&(this.displayedMemory.nrRollUpRows=null,this.nonDisplayedMemory.nrRollUpRows=null),this.mode=e)}},{key:"insertChars",value:function(e){for(var t=0;t=46,t.italics)t.foreground="white";else{var r=Math.floor(e/2)-16,i=["white","green","blue","cyan","red","yellow","magenta"];t.foreground=i[r]}g.log("INFO","MIDROW: "+JSON.stringify(t)),this.writeScreen.setPen(t)}},{key:"outputDataUpdate",value:function(){var e=g.time;null!==e&&this.outputFilter&&(this.outputFilter.updateData&&this.outputFilter.updateData(e,this.displayedMemory),null!==this.cueStartTime||this.displayedMemory.isEmpty()?this.displayedMemory.equals(this.lastOutputScreen)||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,e,this.lastOutputScreen),this.cueStartTime=this.displayedMemory.isEmpty()?null:e):this.cueStartTime=e,this.lastOutputScreen.copy(this.displayedMemory))}},{key:"cueSplitAtTime",value:function(e){this.outputFilter&&(this.displayedMemory.isEmpty()||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,e,this.displayedMemory),this.cueStartTime=e))}}]),e}(),R=function(){function e(t,r,a){i(this,e),this.field=t||1,this.outputs=[r,a],this.channels=[new b(1,r),new b(2,a)],this.currChNr=-1,this.lastCmdA=null,this.lastCmdB=null,this.bufferedData=[],this.startTime=null,this.lastTime=null,this.dataCounters={padding:0,char:0,cmd:0,other:0}}return a(e,[{key:"getHandler",value:function(e){return this.channels[e].getHandler()}},{key:"setHandler",value:function(e,t){this.channels[e].setHandler(t)}},{key:"addData",value:function(e,t){var r,i,a,n=!1;this.lastTime=e,g.setTime(e);for(var s=0;s ("+v([i,a])+")"),r=this.parseCmd(i,a),r||(r=this.parseMidrow(i,a)),r||(r=this.parsePAC(i,a)),r||(r=this.parseBackgroundAttributes(i,a)),!r&&(n=this.parseChars(i,a)))if(this.currChNr&&this.currChNr>=0){var o=this.channels[this.currChNr-1];o.insertChars(n)}else g.log("WARNING","No channel found yet. TEXT-MODE?");r?this.dataCounters.cmd+=2:n?this.dataCounters.char+=2:(this.dataCounters.other+=2,g.log("WARNING","Couldn't parse cleaned data "+v([i,a])+" orig: "+v([t[s],t[s+1]])))}else this.dataCounters.padding+=2}},{key:"parseCmd",value:function(e,t){var r=null,i=(20===e||28===e)&&32<=t&&t<=47,a=(23===e||31===e)&&33<=t&&t<=35;if(!i&&!a)return!1;if(e===this.lastCmdA&&t===this.lastCmdB)return this.lastCmdA=null,this.lastCmdB=null,g.log("DEBUG","Repeated command ("+v([e,t])+") is dropped"),!0;r=20===e||23===e?1:2;var n=this.channels[r-1];return 20===e||28===e?32===t?n.ccRCL():33===t?n.ccBS():34===t?n.ccAOF():35===t?n.ccAON():36===t?n.ccDER():37===t?n.ccRU(2):38===t?n.ccRU(3):39===t?n.ccRU(4):40===t?n.ccFON():41===t?n.ccRDC():42===t?n.ccTR():43===t?n.ccRTD():44===t?n.ccEDM():45===t?n.ccCR():46===t?n.ccENM():47===t&&n.ccEOC():n.ccTO(t-32),this.lastCmdA=e,this.lastCmdB=t,this.currChNr=r,!0}},{key:"parseMidrow",value:function(e,t){var r=null;if((17===e||25===e)&&32<=t&&t<=47){if(r=17===e?1:2,r!==this.currChNr)return g.log("ERROR","Mismatch channel in midrow parsing"),!1;var i=this.channels[r-1];return i.ccMIDROW(t),g.log("DEBUG","MIDROW ("+v([e,t])+")"),!0}return!1}},{key:"parsePAC",value:function(e,t){var r=null,i=null,a=(17<=e&&e<=23||25<=e&&e<=31)&&64<=t&&t<=127,n=(16===e||24===e)&&64<=t&&t<=95;if(!a&&!n)return!1;if(e===this.lastCmdA&&t===this.lastCmdB)return this.lastCmdA=null,this.lastCmdB=null,!0;r=e<=23?1:2,i=64<=t&&t<=95?1===r?u[e]:f[e]:1===r?d[e]:h[e];var s=this.interpretPAC(i,t),o=this.channels[r-1];return o.setPAC(s),this.lastCmdA=e,this.lastCmdB=t,this.currChNr=r,!0}},{key:"interpretPAC",value:function(e,t){var r=t,i={color:null,italics:!1,indent:null,underline:!1,row:e};return r=t>95?t-96:t-64,i.underline=1===(1&r),r<=13?i.color=["white","green","blue","cyan","red","yellow","magenta","white"][Math.floor(r/2)]:r<=15?(i.italics=!0,i.color="white"):i.indent=4*Math.floor((r-16)/2),i}},{key:"parseChars",value:function(e,t){var r=null,i=null,a=null;if(e>=25?(r=2,a=e-8):(r=1,a=e),17<=a&&a<=19){var n=t;n=17===a?t+80:18===a?t+112:t+144,g.log("INFO","Special char '"+s(n)+"' in channel "+r),i=[n]}else 32<=e&&e<=127&&(i=0===t?[e]:[e,t]);if(i){var o=v(i);g.log("DEBUG","Char codes = "+o.join(",")),this.lastCmdA=null,this.lastCmdB=null}return i}},{key:"parseBackgroundAttributes",value:function(e,t){var r,i,a,n,s=(16===e||24===e)&&32<=t&&t<=47,o=(23===e||31===e)&&45<=t&&t<=47;return!(!s&&!o)&&(r={},16===e||24===e?(i=Math.floor((t-32)/2),r.background=c[i],t%2===1&&(r.background=r.background+"_semi")):45===t?r.background="transparent":(r.foreground="black",47===t&&(r.underline=!0)),a=e<24?1:2,n=this.channels[a-1],n.setBkgData(r),this.lastCmdA=null,this.lastCmdB=null,!0)}},{key:"reset",value:function(){for(var e=0;e=16?o--:o++,navigator.userAgent.match(/Firefox\//)?n.line=d+1:n.line=d>7?d-2:d+1,n.align="left",n.position=Math.max(0,Math.min(100,100*(o/32)+(navigator.userAgent.match(/Firefox\//)?50:0))),e.addCue(n)}}};t.exports=i},{}],44:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r "+t}function n(e){var t=self.console[e];return t?function(){for(var r=arguments.length,i=Array(r),n=0;n1?t-1:0),i=1;i=2)if(window.clearTimeout(this.requestTimeout),0===i.tfirst&&(i.tfirst=Math.max(performance.now(),i.trequest)),4===r){var o=t.status;if(o>=200&&o<300){i.tload=Math.max(i.tfirst,performance.now());var l=void 0,u=void 0;"arraybuffer"===a.responseType?(l=t.response,u=l.byteLength):(l=t.responseText,u=l.length),i.loaded=i.total=u;var d={url:t.responseURL,data:l};this.callbacks.onSuccess(d,i,a)}else i.retry>=s.maxRetry||o>=400&&o<499?(n.logger.error(o+" while loading "+a.url),this.callbacks.onError({code:o,text:t.statusText},a)):(n.logger.warn(o+" while loading "+a.url+", retrying in "+this.retryDelay+"..."),this.destroy(),this.retryTimeout=window.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,s.maxRetryDelay),i.retry++)}else this.requestTimeout=window.setTimeout(this.loadtimeout.bind(this),s.timeout)}},{key:"loadtimeout",value:function(){n.logger.warn("timeout while loading "+this.context.url),this.callbacks.onTimeout(this.stats,this.context)}},{key:"loadprogress",value:function(e){var t=this.stats;t.loaded=e.loaded,e.lengthComputable&&(t.total=e.total);var r=this.callbacks.onProgress;r&&r(t,this.context,null)}}]),e}();r.default=s},{45:45}]},{},[33])(33)}); diff --git a/dashboard-ui/components/apphost.js b/dashboard-ui/components/apphost.js index a7dfd1d3bc..d759ef0d98 100644 --- a/dashboard-ui/components/apphost.js +++ b/dashboard-ui/components/apphost.js @@ -1 +1 @@ -define(["appStorage","browser"],function(appStorage,browser){"use strict";function getDeviceProfile(){return null}function getCapabilities(){var caps={PlayableMediaTypes:["Audio","Video"],SupportsPersistentIdentifier:!1,DeviceProfile:getDeviceProfile()};return caps}function generateDeviceId(){return new Promise(function(resolve,reject){require(["cryptojs-sha1"],function(){var keys=[];keys.push(navigator.userAgent),keys.push((new Date).getTime()),resolve(CryptoJS.SHA1(keys.join("|")).toString())})})}function getDeviceId(){var key="_deviceId2",deviceId=appStorage.getItem(key);return deviceId?Promise.resolve(deviceId):generateDeviceId().then(function(deviceId){return appStorage.setItem(key,deviceId),deviceId})}function getDeviceName(){var deviceName;return deviceName=browser.tizen?"Samsung Smart TV":browser.web0S?"LG Smart TV":browser.operaTv?"Opera TV":browser.xboxOne?"Xbox One":browser.ps4?"Sony PS4":browser.chrome?"Chrome":browser.edge?"Edge":browser.firefox?"Firefox":browser.msie?"Internet Explorer":"Web Browser",browser.version&&(deviceName+=" "+browser.version),browser.ipad?deviceName+=" Ipad":browser.iphone?deviceName+=" Iphone":browser.android&&(deviceName+=" Android"),deviceName}function supportsVoiceInput(){return!browser.tv&&(window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.oSpeechRecognition||window.msSpeechRecognition)}function supportsFullscreen(){if(browser.tv)return!1;var element=document.documentElement;return element.requestFullscreen||element.mozRequestFullScreen||element.webkitRequestFullscreen||element.msRequestFullscreen}function getSyncProfile(){return new Promise(function(resolve,reject){require(["browserdeviceprofile","appSettings"],function(profileBuilder,appSettings){var profile=profileBuilder();profile.MaxStaticMusicBitrate=appSettings.maxStaticMusicBitrate(),resolve(profile)})})}function supportsHtmlMediaAutoplay(){if(browser.edgeUwp||browser.tv||browser.ps4||browser.xboxOne)return!0;if(browser.mobile)return!1;var savedResult=appStorage.getItem(htmlMediaAutoplayAppStorageKey);return"true"===savedResult||"false"!==savedResult&&null}var htmlMediaAutoplayAppStorageKey="supportshtmlmediaautoplay1",supportedFeatures=function(){var features=["filedownload","sharing","externalpremium"];return browser.operaTv||browser.tizen||browser.web0s?features.push("exit"):features.push("exitmenu"),browser.operaTv||features.push("externallinks"),supportsVoiceInput()&&features.push("voiceinput"),supportsHtmlMediaAutoplay()&&(features.push("htmlaudioautoplay"),features.push("htmlvideoautoplay")),window.SyncRegistered,supportsFullscreen()&&features.push("fullscreenchange"),(browser.chrome||browser.edge&&!browser.slow)&&features.push("imageanalysis"),Dashboard.isConnectMode()&&features.push("multiserver"),(browser.tv||browser.xboxOne||browser.ps4||browser.mobile)&&features.push("physicalvolumecontrol"),browser.tv||browser.xboxOne||browser.ps4||features.push("remotecontrol"),features}();supportedFeatures.indexOf("htmlvideoautoplay")===-1&&supportsHtmlMediaAutoplay!==!1&&require(["autoPlayDetect"],function(autoPlayDetect){autoPlayDetect.supportsHtmlMediaAutoplay().then(function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"true"),supportedFeatures.push("htmlvideoautoplay"),supportedFeatures.push("htmlaudioautoplay")},function(){alert(0),appStorage.setItem(htmlMediaAutoplayAppStorageKey,"false")})});var appInfo,version=window.dashboardVersion||"3.0";return{getWindowState:function(){return document.windowState||"Normal"},setWindowState:function(state){alert("setWindowState is not supported and should not be called")},exit:function(){if(browser.tizen)try{tizen.application.getCurrentApplication().exit()}catch(err){console.log("error closing application: "+err)}else window.close()},supports:function(command){return supportedFeatures.indexOf(command.toLowerCase())!=-1},appInfo:function(){return appInfo?Promise.resolve(appInfo):getDeviceId().then(function(deviceId){return appInfo={deviceId:deviceId,deviceName:getDeviceName(),appName:"Emby Mobile",appVersion:version}})},capabilities:getCapabilities,preferVisualCards:browser.android||browser.chrome,moreIcon:browser.safari||browser.edge?"dots-horiz":"dots-vert",getSyncProfile:getSyncProfile}}); \ No newline at end of file +define(["appStorage","browser"],function(appStorage,browser){"use strict";function getDeviceProfile(){return null}function getCapabilities(){var caps={PlayableMediaTypes:["Audio","Video"],SupportsPersistentIdentifier:!1,DeviceProfile:getDeviceProfile()};return caps}function generateDeviceId(){return new Promise(function(resolve,reject){require(["cryptojs-sha1"],function(){var keys=[];keys.push(navigator.userAgent),keys.push((new Date).getTime()),resolve(CryptoJS.SHA1(keys.join("|")).toString())})})}function getDeviceId(){var key="_deviceId2",deviceId=appStorage.getItem(key);return deviceId?Promise.resolve(deviceId):generateDeviceId().then(function(deviceId){return appStorage.setItem(key,deviceId),deviceId})}function getDeviceName(){var deviceName;return deviceName=browser.tizen?"Samsung Smart TV":browser.web0S?"LG Smart TV":browser.operaTv?"Opera TV":browser.xboxOne?"Xbox One":browser.ps4?"Sony PS4":browser.chrome?"Chrome":browser.edge?"Edge":browser.firefox?"Firefox":browser.msie?"Internet Explorer":"Web Browser",browser.version&&(deviceName+=" "+browser.version),browser.ipad?deviceName+=" Ipad":browser.iphone?deviceName+=" Iphone":browser.android&&(deviceName+=" Android"),deviceName}function supportsVoiceInput(){return!browser.tv&&(window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.oSpeechRecognition||window.msSpeechRecognition)}function supportsFullscreen(){if(browser.tv)return!1;var element=document.documentElement;return element.requestFullscreen||element.mozRequestFullScreen||element.webkitRequestFullscreen||element.msRequestFullscreen}function getSyncProfile(){return new Promise(function(resolve,reject){require(["browserdeviceprofile","appSettings"],function(profileBuilder,appSettings){var profile=profileBuilder();profile.MaxStaticMusicBitrate=appSettings.maxStaticMusicBitrate(),resolve(profile)})})}function supportsHtmlMediaAutoplay(){if(browser.edgeUwp||browser.tv||browser.ps4||browser.xboxOne)return!0;if(browser.mobile)return!1;var savedResult=appStorage.getItem(htmlMediaAutoplayAppStorageKey);return"true"===savedResult||"false"!==savedResult&&null}var htmlMediaAutoplayAppStorageKey="supportshtmlmediaautoplay0",supportedFeatures=function(){var features=["filedownload","sharing","externalpremium"];return browser.operaTv||browser.tizen||browser.web0s?features.push("exit"):features.push("exitmenu"),browser.operaTv||features.push("externallinks"),supportsVoiceInput()&&features.push("voiceinput"),supportsHtmlMediaAutoplay()&&(features.push("htmlaudioautoplay"),features.push("htmlvideoautoplay")),window.SyncRegistered,supportsFullscreen()&&features.push("fullscreenchange"),(browser.chrome||browser.edge&&!browser.slow)&&features.push("imageanalysis"),Dashboard.isConnectMode()&&features.push("multiserver"),(browser.tv||browser.xboxOne||browser.ps4||browser.mobile)&&features.push("physicalvolumecontrol"),browser.tv||browser.xboxOne||browser.ps4||features.push("remotecontrol"),features}();supportedFeatures.indexOf("htmlvideoautoplay")===-1&&supportsHtmlMediaAutoplay()!==!1&&require(["autoPlayDetect"],function(autoPlayDetect){autoPlayDetect.supportsHtmlMediaAutoplay().then(function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"true"),supportedFeatures.push("htmlvideoautoplay"),supportedFeatures.push("htmlaudioautoplay")},function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"false")})});var appInfo,version=window.dashboardVersion||"3.0";return{getWindowState:function(){return document.windowState||"Normal"},setWindowState:function(state){alert("setWindowState is not supported and should not be called")},exit:function(){if(browser.tizen)try{tizen.application.getCurrentApplication().exit()}catch(err){console.log("error closing application: "+err)}else window.close()},supports:function(command){return supportedFeatures.indexOf(command.toLowerCase())!=-1},appInfo:function(){return appInfo?Promise.resolve(appInfo):getDeviceId().then(function(deviceId){return appInfo={deviceId:deviceId,deviceName:getDeviceName(),appName:"Emby Mobile",appVersion:version}})},capabilities:getCapabilities,preferVisualCards:browser.android||browser.chrome,moreIcon:browser.safari||browser.edge?"dots-horiz":"dots-vert",getSyncProfile:getSyncProfile}}); \ No newline at end of file diff --git a/dashboard-ui/components/remotecontrol.js b/dashboard-ui/components/remotecontrol.js index 37648df5cc..fdf45cd118 100644 --- a/dashboard-ui/components/remotecontrol.js +++ b/dashboard-ui/components/remotecontrol.js @@ -1 +1 @@ -define(["browser","datetime","backdrop","libraryBrowser","listView","userdataButtons","imageLoader","playbackManager","nowPlayingHelper","events","connectionManager","apphost","globalize","cardStyle","emby-itemscontainer","css!css/nowplaying.css"],function(browser,datetime,backdrop,libraryBrowser,listView,userdataButtons,imageLoader,playbackManager,nowPlayingHelper,events,connectionManager,appHost,globalize){"use strict";function showAudioMenu(context,player,button,item){var currentIndex=playbackManager.getAudioStreamIndex(player),streams=(item.MediaStreams||[]).filter(function(i){return"Audio"==i.Type}),menuItems=streams.map(function(s){var menuItem={name:s.DisplayTitle,id:s.Index};return s.Index==currentIndex&&(menuItem.selected=!0),menuItem});require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:button,callback:function(id){playbackManager.setAudioStreamIndex(parseInt(id),player)}})})}function showSubtitleMenu(context,player,button,item){var currentIndex=playbackManager.getSubtitleStreamIndex(player),streams=(item.MediaStreams||[]).filter(function(i){return"Subtitle"==i.Type}),menuItems=streams.map(function(s){var menuItem={name:s.DisplayTitle,id:s.Index};return s.Index==currentIndex&&(menuItem.selected=!0),menuItem});menuItems.unshift({id:-1,name:globalize.translate("ButtonOff"),selected:null==currentIndex}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:button,callback:function(id){playbackManager.setSubtitleStreamIndex(parseInt(id),player)}})})}function hasStreams(item,type){return item&&item.MediaStreams&&item.MediaStreams.filter(function(i){return i.Type==type}).length>0}function getNowPlayingNameHtml(nowPlayingItem,includeNonNameInfo){var names=nowPlayingHelper.getNowPlayingNames(nowPlayingItem,includeNonNameInfo);return names.map(function(i){return i.text}).join("
")}function seriesImageUrl(item,options){if("Episode"!==item.Type)return null;if(options=options||{},options.type=options.type||"Primary","Primary"===options.type&&item.SeriesPrimaryImageTag)return options.tag=item.SeriesPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if("Thumb"===options.type){if(item.SeriesThumbImageTag)return options.tag=item.SeriesThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if(item.ParentThumbImageTag)return options.tag=item.ParentThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId,options)}return null}function imageUrl(item,options){return options=options||{},options.type=options.type||"Primary",item.ImageTags&&item.ImageTags[options.type]?(options.tag=item.ImageTags[options.type],connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId||item.Id,options)):item.AlbumId&&item.AlbumPrimaryImageTag?(options.tag=item.AlbumPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId,options)):null}function updateNowPlayingInfo(context,state){var item=state.NowPlayingItem,displayName=item?getNowPlayingNameHtml(item).replace("
"," - "):"";context.querySelector(".nowPlayingPageTitle").innerHTML=displayName,displayName.length>0?context.querySelector(".nowPlayingPageTitle").classList.remove("hide"):context.querySelector(".nowPlayingPageTitle").classList.add("hide");var url=item?seriesImageUrl(item,{maxHeight:300})||imageUrl(item,{maxHeight:300}):null;url!==currentImgUrl&&(setImageUrl(context,url),item?(backdrop.setBackdrops([item]),ApiClient.getItem(Dashboard.getCurrentUserId(),item.Id).then(function(fullItem){userdataButtons.fill({item:fullItem,includePlayed:!1,style:"icon",element:context.querySelector(".nowPlayingPageUserDataButtons")})})):(backdrop.clear(),userdataButtons.destroy({element:context.querySelector(".nowPlayingPageUserDataButtons")})))}function setImageUrl(context,url){currentImgUrl=url;var imgContainer=context.querySelector(".nowPlayingPageImageContainer");url?(imgContainer.innerHTML='',imgContainer.classList.remove("hide")):(imgContainer.classList.add("hide"),imgContainer.innerHTML="")}function buttonEnabled(btn,enabled){btn.disabled=!enabled}function buttonVisible(btn,enabled){enabled?btn.classList.remove("hide"):btn.classList.add("hide")}function updateSupportedCommands(context,commands){for(var all=context.querySelectorAll(".btnCommand"),i=0,length=all.length;irepeat",toggleRepeatButton.classList.add("nowPlayingPageRepeatActive")):"RepeatOne"==repeatMode?(toggleRepeatButton.innerHTML="repeat_one",toggleRepeatButton.classList.add("nowPlayingPageRepeatActive")):(toggleRepeatButton.innerHTML="repeat",toggleRepeatButton.classList.remove("nowPlayingPageRepeatActive"))}function updatePlayerVolumeState(context,isMuted,volumeLevel){var view=context,supportedCommands=currentPlayerSupportedCommands,showMuteButton=!0,showVolumeSlider=!0;supportedCommands.indexOf("Mute")===-1&&(showMuteButton=!1),supportedCommands.indexOf("SetVolume")===-1&&(showVolumeSlider=!1),currentPlayer.isLocalPlayer&&appHost.supports("physicalvolumecontrol")&&(showMuteButton=!1,showVolumeSlider=!1),isMuted?(view.querySelector(".buttonMute").setAttribute("title",globalize.translate("Unmute")),view.querySelector(".buttonMute i").innerHTML=""):(view.querySelector(".buttonMute").setAttribute("title",globalize.translate("Mute")),view.querySelector(".buttonMute i").innerHTML=""),showMuteButton?view.querySelector(".buttonMute").classList.remove("hide"):view.querySelector(".buttonMute").classList.add("hide");var nowPlayingVolumeSlider=context.querySelector(".nowPlayingVolumeSlider"),nowPlayingVolumeSliderContainer=context.querySelector(".nowPlayingVolumeSliderContainer");nowPlayingVolumeSlider&&(showVolumeSlider?nowPlayingVolumeSliderContainer.classList.remove("hide"):nowPlayingVolumeSliderContainer.classList.add("hide"),nowPlayingVolumeSlider.dragging||(nowPlayingVolumeSlider.value=volumeLevel||0))}function updatePlayPauseState(isPaused,isActive){var context=dlg,btnPlayPause=context.querySelector(".btnPlayPause");isPaused?btnPlayPause.querySelector("i").innerHTML="play_arrow":btnPlayPause.querySelector("i").innerHTML="pause",buttonVisible(btnPlayPause,isActive)}function updateTimeDisplay(positionTicks,runtimeTicks){var context=dlg,positionSlider=context.querySelector(".nowPlayingPositionSlider");if(positionSlider&&!positionSlider.dragging)if(runtimeTicks){var pct=positionTicks/runtimeTicks;pct*=100,positionSlider.value=pct}else positionSlider.value=0;null==positionTicks?context.querySelector(".positionTime").innerHTML="--:--":context.querySelector(".positionTime").innerHTML=datetime.getDisplayRunningTime(positionTicks),null!=runtimeTicks?context.querySelector(".runtime").innerHTML=datetime.getDisplayRunningTime(runtimeTicks):context.querySelector(".runtime").innerHTML="--:--"}function getPlaylistItems(player){return playbackManager.getPlaylist(player)}function loadPlaylist(context,player){getPlaylistItems(player).then(function(items){var html="";html+=listView.getListViewHtml({items:items,smallIcon:!0,action:"setplaylistindex",enableUserDataButtons:!1,rightButtons:[{icon:"",title:globalize.translate("ButtonRemove"),id:"remove"}],dragHandle:!0}),items.length?context.querySelector(".playlistSection").classList.remove("hide"):context.querySelector(".playlistSection").classList.add("hide");var itemsContainer=context.querySelector(".playlist");itemsContainer.innerHTML=html;var playlistItemId=playbackManager.getCurrentPlaylistItemId(player);if(playlistItemId){var img=itemsContainer.querySelector('.listItem[data-playlistItemId="'+playlistItemId+'"] .listItemImage');img&&(img.classList.remove("lazy"),img.classList.add("playlistIndexIndicatorImage"))}imageLoader.lazyChildren(itemsContainer)})}function onPlaybackStart(e,state){console.log("remotecontrol event: "+e.type);var player=this;onStateChanged.call(player,e,state)}function onRepeatModeChange(e){var player=this;updateRepeatModeDisplay(playbackManager.getRepeatMode(player))}function onPlaylistUpdate(e){var player=this;loadPlaylist(dlg,player)}function onPlaylistItemRemoved(e,info){for(var context=dlg,playlistItemIds=info.playlistItemIds,i=0,length=playlistItemIds.length;i0}function getNowPlayingNameHtml(nowPlayingItem,includeNonNameInfo){var names=nowPlayingHelper.getNowPlayingNames(nowPlayingItem,includeNonNameInfo);return names.map(function(i){return i.text}).join("
")}function seriesImageUrl(item,options){if("Episode"!==item.Type)return null;if(options=options||{},options.type=options.type||"Primary","Primary"===options.type&&item.SeriesPrimaryImageTag)return options.tag=item.SeriesPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if("Thumb"===options.type){if(item.SeriesThumbImageTag)return options.tag=item.SeriesThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if(item.ParentThumbImageTag)return options.tag=item.ParentThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId,options)}return null}function imageUrl(item,options){return options=options||{},options.type=options.type||"Primary",item.ImageTags&&item.ImageTags[options.type]?(options.tag=item.ImageTags[options.type],connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId||item.Id,options)):item.AlbumId&&item.AlbumPrimaryImageTag?(options.tag=item.AlbumPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId,options)):null}function updateNowPlayingInfo(context,state){var item=state.NowPlayingItem,displayName=item?getNowPlayingNameHtml(item).replace("
"," - "):"";context.querySelector(".nowPlayingPageTitle").innerHTML=displayName,displayName.length>0?context.querySelector(".nowPlayingPageTitle").classList.remove("hide"):context.querySelector(".nowPlayingPageTitle").classList.add("hide");var url=item?seriesImageUrl(item,{maxHeight:300})||imageUrl(item,{maxHeight:300}):null;url!==currentImgUrl&&(setImageUrl(context,url),item?(backdrop.setBackdrops([item]),ApiClient.getItem(Dashboard.getCurrentUserId(),item.Id).then(function(fullItem){userdataButtons.fill({item:fullItem,includePlayed:!1,style:"icon",element:context.querySelector(".nowPlayingPageUserDataButtons")})})):(backdrop.clear(),userdataButtons.destroy({element:context.querySelector(".nowPlayingPageUserDataButtons")})))}function setImageUrl(context,url){currentImgUrl=url;var imgContainer=context.querySelector(".nowPlayingPageImageContainer");url?(imgContainer.innerHTML='',imgContainer.classList.remove("hide")):(imgContainer.classList.add("hide"),imgContainer.innerHTML="")}function buttonEnabled(btn,enabled){btn.disabled=!enabled}function buttonVisible(btn,enabled){enabled?btn.classList.remove("hide"):btn.classList.add("hide")}function updateSupportedCommands(context,commands){for(var all=context.querySelectorAll(".btnCommand"),i=0,length=all.length;irepeat",toggleRepeatButton.classList.add("nowPlayingPageRepeatActive")):"RepeatOne"==repeatMode?(toggleRepeatButton.innerHTML="repeat_one",toggleRepeatButton.classList.add("nowPlayingPageRepeatActive")):(toggleRepeatButton.innerHTML="repeat",toggleRepeatButton.classList.remove("nowPlayingPageRepeatActive"))}function updatePlayerVolumeState(context,isMuted,volumeLevel){var view=context,supportedCommands=currentPlayerSupportedCommands,showMuteButton=!0,showVolumeSlider=!0;supportedCommands.indexOf("Mute")===-1&&(showMuteButton=!1),supportedCommands.indexOf("SetVolume")===-1&&(showVolumeSlider=!1),currentPlayer.isLocalPlayer&&appHost.supports("physicalvolumecontrol")&&(showMuteButton=!1,showVolumeSlider=!1),isMuted?(view.querySelector(".buttonMute").setAttribute("title",globalize.translate("Unmute")),view.querySelector(".buttonMute i").innerHTML=""):(view.querySelector(".buttonMute").setAttribute("title",globalize.translate("Mute")),view.querySelector(".buttonMute i").innerHTML=""),showMuteButton?view.querySelector(".buttonMute").classList.remove("hide"):view.querySelector(".buttonMute").classList.add("hide");var nowPlayingVolumeSlider=context.querySelector(".nowPlayingVolumeSlider"),nowPlayingVolumeSliderContainer=context.querySelector(".nowPlayingVolumeSliderContainer");nowPlayingVolumeSlider&&(showVolumeSlider?nowPlayingVolumeSliderContainer.classList.remove("hide"):nowPlayingVolumeSliderContainer.classList.add("hide"),nowPlayingVolumeSlider.dragging||(nowPlayingVolumeSlider.value=volumeLevel||0))}function updatePlayPauseState(isPaused,isActive){var context=dlg,btnPlayPause=context.querySelector(".btnPlayPause");isPaused?btnPlayPause.querySelector("i").innerHTML="play_arrow":btnPlayPause.querySelector("i").innerHTML="pause",buttonVisible(btnPlayPause,isActive)}function updateTimeDisplay(positionTicks,runtimeTicks){var context=dlg,positionSlider=context.querySelector(".nowPlayingPositionSlider");if(positionSlider&&!positionSlider.dragging)if(runtimeTicks){var pct=positionTicks/runtimeTicks;pct*=100,positionSlider.value=pct}else positionSlider.value=0;null==positionTicks?context.querySelector(".positionTime").innerHTML="--:--":context.querySelector(".positionTime").innerHTML=datetime.getDisplayRunningTime(positionTicks),null!=runtimeTicks?context.querySelector(".runtime").innerHTML=datetime.getDisplayRunningTime(runtimeTicks):context.querySelector(".runtime").innerHTML="--:--"}function getPlaylistItems(player){return playbackManager.getPlaylist(player)}function loadPlaylist(context,player){getPlaylistItems(player).then(function(items){var html="";html+=listView.getListViewHtml({items:items,smallIcon:!0,action:"setplaylistindex",enableUserDataButtons:!1,rightButtons:[{icon:"",title:globalize.translate("ButtonRemove"),id:"remove"}],dragHandle:!0}),items.length?context.querySelector(".playlistSection").classList.remove("hide"):context.querySelector(".playlistSection").classList.add("hide");var itemsContainer=context.querySelector(".playlist");itemsContainer.innerHTML=html;var playlistItemId=playbackManager.getCurrentPlaylistItemId(player);if(playlistItemId){var img=itemsContainer.querySelector('.listItem[data-playlistItemId="'+playlistItemId+'"] .listItemImage');img&&(img.classList.remove("lazy"),img.classList.add("playlistIndexIndicatorImage"))}imageLoader.lazyChildren(itemsContainer)})}function onPlaybackStart(e,state){console.log("remotecontrol event: "+e.type);var player=this;onStateChanged.call(player,e,state)}function onRepeatModeChange(e){var player=this;updateRepeatModeDisplay(playbackManager.getRepeatMode(player))}function onPlaylistUpdate(e){var player=this;loadPlaylist(dlg,player)}function onPlaylistItemRemoved(e,info){for(var context=dlg,playlistItemIds=info.playlistItemIds,i=0,length=playlistItemIds.length;i
-
-
-
-
+
+
\ No newline at end of file diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index 931440a29e..8bbb48db95 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -1,2 +1,2 @@ -define(["layoutManager","cardBuilder","datetime","mediaInfo","backdrop","listView","itemContextMenu","itemHelper","userdataButtons","dom","indicators","apphost","imageLoader","libraryMenu","globalize","browser","events","scrollHelper","playbackManager","scrollStyles","emby-itemscontainer","emby-checkbox"],function(layoutManager,cardBuilder,datetime,mediaInfo,backdrop,listView,itemContextMenu,itemHelper,userdataButtons,dom,indicators,appHost,imageLoader,libraryMenu,globalize,browser,events,scrollHelper,playbackManager){"use strict";function getPromise(params){var id=params.id;if(id)return ApiClient.getItem(Dashboard.getCurrentUserId(),id);if(params.seriesTimerId)return ApiClient.getLiveTvSeriesTimer(params.seriesTimerId);var name=params.genre;if(name)return ApiClient.getGenre(name,Dashboard.getCurrentUserId());if(name=params.musicgenre)return ApiClient.getMusicGenre(name,Dashboard.getCurrentUserId());if(name=params.gamegenre)return ApiClient.getGameGenre(name,Dashboard.getCurrentUserId());if(name=params.musicartist)return ApiClient.getArtist(name,Dashboard.getCurrentUserId());throw new Error("Invalid request")}function reload(page,params){Dashboard.showLoadingMsg(),getPromise(params).then(function(item){reloadFromItem(page,params,item)})}function hideAll(page,className,show){var i,length,elems=page.querySelectorAll("."+className);for(i=0,length=elems.length;i"}function renderSeriesTimerSchedule(page,seriesTimerId){ApiClient.getLiveTvTimers({UserId:ApiClient.getCurrentUserId(),ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb",SortBy:"StartDate",EnableTotalRecordCount:!1,EnableUserData:!1,SeriesTimerId:seriesTimerId,Fields:"ChannelInfo"}).then(function(result){result.Items.length&&result.Items[0].SeriesTimerId!=seriesTimerId&&(result.Items=[]);var html=getProgramScheduleHtml(result.Items),scheduleTab=page.querySelector(".seriesTimerSchedule");scheduleTab.innerHTML=html,imageLoader.lazyChildren(scheduleTab)})}function renderSeriesTimerEditor(page,item,user){if("SeriesTimer"===item.Type){if(!user.Policy.EnableLiveTvManagement)return page.querySelector(".seriesTimerScheduleSection").classList.add("hide"),void page.querySelector(".btnCancelSeriesTimer").classList.add("hide");require(["seriesRecordingEditor"],function(seriesRecordingEditor){seriesRecordingEditor.embed(item,ApiClient.serverId(),{context:page.querySelector(".seriesRecordingEditor")})}),page.querySelector(".seriesTimerScheduleSection").classList.remove("hide"),page.querySelector(".btnCancelSeriesTimer").classList.remove("hide"),renderSeriesTimerSchedule(page,item.Id)}}function reloadFromItem(page,params,item){currentItem=item;var context=params.context;LibraryBrowser.renderName(item,page.querySelector(".itemName"),!1,context),LibraryBrowser.renderParentName(item,page.querySelector(".parentName"),context),libraryMenu.setTitle(""),Dashboard.getCurrentUser().then(function(user){window.scrollTo(0,0),renderSeriesTimerEditor(page,item,user),renderImage(page,item,user),renderLogo(page,item,ApiClient),setInitialCollapsibleState(page,item,context,user),renderDetails(page,item,context),dom.getWindowSize().innerWidth>=800?backdrop.setBackdrops([item]):backdrop.clear(),LibraryBrowser.renderDetailPageBackdrop(page,item,imageLoader),libraryMenu.setTransparentMenu(!0);var canPlay=!1;if("Program"==item.Type){var now=new Date;now>=datetime.parseISO8601Date(item.StartDate,!0)&&now0)}else hideAll(page,"btnPlay"),hideAll(page,"btnResume"),hideAll(page,"btnInstantMix"),hideAll(page,"btnShuffle");var hasAnyButton=canPlay;(item.LocalTrailerCount||item.RemoteTrailers&&item.RemoteTrailers.length)&&"Full"==item.PlayAccess?(hideAll(page,"btnPlayTrailer",!0),hasAnyButton=!0):hideAll(page,"btnPlayTrailer"),item.CanDelete&&!item.IsFolder?(hideAll(page,"btnDeleteItem",!0),hasAnyButton=!0):hideAll(page,"btnDeleteItem"),renderSyncLocalContainer(page,params,user,item),hasAnyButton||"Program"!==item.Type?hideAll(page,"mainDetailButtons",!0):hideAll(page,"mainDetailButtons"),showRecordingFields(page,item,user);var groupedVersions=(item.MediaSources||[]).filter(function(g){return"Grouping"==g.Type});user.Policy.IsAdministrator&&groupedVersions.length?page.querySelector(".splitVersionContainer").classList.remove("hide"):page.querySelector(".splitVersionContainer").classList.add("hide"),itemContextMenu.getCommands(getContextMenuOptions(item)).then(function(commands){commands.length?hideAll(page,"btnMoreCommands",!0):hideAll(page,"btnMoreCommands")});var itemBirthday=page.querySelector("#itemBirthday");if("Person"==item.Type&&item.PremiereDate)try{var birthday=datetime.parseISO8601Date(item.PremiereDate,!0).toDateString();itemBirthday.classList.remove("hide"),itemBirthday.innerHTML=globalize.translate("BirthDateValue").replace("{0}",birthday)}catch(err){itemBirthday.classList.add("hide")}else itemBirthday.classList.add("hide");var itemDeathDate=page.querySelector("#itemDeathDate");if("Person"==item.Type&&item.EndDate)try{var deathday=datetime.parseISO8601Date(item.EndDate,!0).toDateString();itemDeathDate.classList.remove("hide"),itemDeathDate.innerHTML=globalize.translate("DeathDateValue").replace("{0}",deathday)}catch(err){itemDeathDate.classList.add("hide")}var itemBirthLocation=page.querySelector("#itemBirthLocation");if("Person"==item.Type&&item.ProductionLocations&&item.ProductionLocations.length){var gmap=''+item.ProductionLocations[0]+"";itemBirthLocation.classList.remove("hide"),itemBirthLocation.innerHTML=globalize.translate("BirthPlaceValue").replace("{0}",gmap)}else itemBirthLocation.classList.add("hide")}),setPeopleHeader(page,item),page.dispatchEvent(new CustomEvent("displayingitem",{detail:{item:item,context:context},bubbles:!0})),Dashboard.hideLoadingMsg()}function logoImageUrl(item,apiClient,options){return options=options||{},options.type="Logo",item.ImageTags&&item.ImageTags.Logo?(options.tag=item.ImageTags.Logo,apiClient.getScaledImageUrl(item.Id,options)):item.ParentLogoImageTag?(options.tag=item.ParentLogoImageTag,apiClient.getScaledImageUrl(item.ParentLogoItemId,options)):null}function renderLogo(page,item,apiClient){var url=logoImageUrl(item,apiClient,{maxWidth:300}),detailLogo=page.querySelector(".detailLogo");url?(detailLogo.classList.remove("hide"),detailLogo.classList.add("lazy"),detailLogo.setAttribute("data-src",url),imageLoader.lazyImage(detailLogo)):detailLogo.classList.add("hide")}function showRecordingFields(page,item,user){if(!currentRecordingFields){var recordingFieldsElement=page.querySelector(".recordingFields");"Program"==item.Type&&user.Policy.EnableLiveTvManagement?require(["recordingFields"],function(recordingFields){currentRecordingFields=new recordingFields({parent:recordingFieldsElement,programId:item.Id,serverId:item.ServerId}),recordingFieldsElement.classList.remove("hide")}):(recordingFieldsElement.classList.add("hide"),recordingFieldsElement.innerHTML="")}}function renderLinks(linksElem,item){var links=[];if(item.HomePageUrl&&links.push(''+globalize.translate("ButtonWebsite")+""),item.ExternalUrls)for(var i=0,length=item.ExternalUrls.length;i'+url.Name+"")}if(links.length){var html=links.join('');linksElem.innerHTML=html,linksElem.classList.remove("hide")}else linksElem.classList.add("hide")}function renderImage(page,item,user){var container=page.querySelector(".detailImageContainer");LibraryBrowser.renderDetailImage(container,item,user.Policy.IsAdministrator&&"Photo"!=item.MediaType,null,imageLoader,indicators)}function refreshDetailImageUserData(elem,item){var detailImageProgressContainer=elem.querySelector(".detailImageProgressContainer");detailImageProgressContainer.innerHTML=indicators.getProgressBarHtml(item)}function refreshImage(page,item,user){refreshDetailImageUserData(page.querySelector(".detailImageContainer"),item)}function setPeopleHeader(page,item){"Audio"==item.MediaType||"MusicAlbum"==item.Type||"Book"==item.MediaType||"Photo"==item.MediaType?page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderPeople"):page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderCastAndCrew")}function renderNextUp(page,item,user){var section=page.querySelector(".nextUpSection");return"Series"!=item.Type?void section.classList.add("hide"):void ApiClient.getNextUpEpisodes({SeriesId:item.Id,UserId:user.Id}).then(function(result){result.Items.length?section.classList.remove("hide"):section.classList.add("hide");var html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(!1),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,overlayText:!0,lazy:!0,overlayPlayButton:!0}),itemsContainer=section.querySelector(".nextUpItems");itemsContainer.innerHTML=html,imageLoader.lazyChildren(itemsContainer)})}function setInitialCollapsibleState(page,item,context,user){page.querySelector(".collectionItems").innerHTML="","TvChannel"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderChannelGuide(page,item,user)):"Playlist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderPlaylistItems(page,item,user)):"Studio"==item.Type||"Person"==item.Type||"Genre"==item.Type||"MusicGenre"==item.Type||"GameGenre"==item.Type||"MusicArtist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderItemsByName(page,item,user)):item.IsFolder||"Episode"==item.Type?("BoxSet"==item.Type&&page.querySelector("#childrenCollapsible").classList.add("hide"),renderChildren(page,item)):page.querySelector("#childrenCollapsible").classList.add("hide"),"Series"==item.Type&&renderSeriesSchedule(page,item,user),"Series"==item.Type?renderNextUp(page,item,user):page.querySelector(".nextUpSection").classList.add("hide"),item.MediaSources&&item.MediaSources.length&&renderMediaSources(page,user,item),renderScenes(page,item),item.SpecialFeatureCount&&0!=item.SpecialFeatureCount&&"Series"!=item.Type?(page.querySelector("#specialsCollapsible").classList.remove("hide"),renderSpecials(page,item,user,6)):page.querySelector("#specialsCollapsible").classList.add("hide"),item.People&&item.People.length?(page.querySelector("#castCollapsible").classList.remove("hide"),renderCast(page,item,context,enableScrollX()?null:12)):page.querySelector("#castCollapsible").classList.add("hide"),item.PartCount&&item.PartCount>1?(page.querySelector("#additionalPartsCollapsible").classList.remove("hide"),renderAdditionalParts(page,item,user)):page.querySelector("#additionalPartsCollapsible").classList.add("hide"),page.querySelector("#themeSongsCollapsible").classList.add("hide"),page.querySelector("#themeVideosCollapsible").classList.add("hide"),"MusicAlbum"==item.Type?renderMusicVideos(page,item,user):page.querySelector("#musicVideosCollapsible").classList.add("hide"),renderThemeMedia(page,item,user),enableScrollX()?renderCriticReviews(page,item):renderCriticReviews(page,item,1)}function renderOverview(elems,item){for(var i=0,length=elems.length;i'+text+"
":'
'+text+"
"}).join("");return view.querySelector(".mediaInfoIcons").innerHTML=html,html}function renderPhotoInfo(page,item){var html="",attributes=[];if(item.CameraMake&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraMake"),item.CameraMake)),item.CameraModel&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraModel"),item.CameraModel)),item.Altitude&&attributes.push(createAttribute(globalize.translate("MediaInfoAltitude"),item.Altitude.toFixed(1))),item.Aperture&&attributes.push(createAttribute(globalize.translate("MediaInfoAperture"),"F"+item.Aperture.toFixed(1))),item.ExposureTime){var val=1/item.ExposureTime;attributes.push(createAttribute(globalize.translate("MediaInfoExposureTime"),"1/"+val+" s"))}item.FocalLength&&attributes.push(createAttribute(globalize.translate("MediaInfoFocalLength"),item.FocalLength.toFixed(1)+" mm")),item.ImageOrientation,item.IsoSpeedRating&&attributes.push(createAttribute(globalize.translate("MediaInfoIsoSpeedRating"),item.IsoSpeedRating)),item.Latitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLatitude"),item.Latitude.toFixed(1))),item.Longitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLongitude"),item.Longitude.toFixed(1))),item.ShutterSpeed&&attributes.push(createAttribute(globalize.translate("MediaInfoShutterSpeed"),item.ShutterSpeed)),item.Software&&attributes.push(createAttribute(globalize.translate("MediaInfoSoftware"),item.Software)),html+=attributes.join("
"),page.querySelector(".photoInfoContent").innerHTML=html}function getArtistLinksHtml(artists,context){for(var html=[],i=0,length=artists.length;i'+artist.Name+"")}return html=html.join(" / "),1==artists.length?globalize.translate("ValueArtist",html):artists.length>1?globalize.translate("ValueArtists",html):html}function enableScrollX(){return browserInfo.mobile&&screen.availWidth<=1e3}function getPortraitShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowPortrait":"portrait"}function getSquareShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowSquare":"square"}function getThumbShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowBackdrop":"backdrop"}function renderMoreFromItems(page,item){var moreFromSection=page.querySelector("#moreFromSection");if(moreFromSection)return"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length?void ApiClient.getItems(Dashboard.getCurrentUserId(),{IncludeItemTypes:"MusicAlbum",ArtistIds:item.AlbumArtists[0].Id,Recursive:!0,ExcludeItemIds:item.Id}).then(function(result){if(!result.Items.length)return void moreFromSection.classList.add("hide");moreFromSection.classList.remove("hide"),moreFromSection.querySelector(".moreFromHeader").innerHTML=globalize.translate("MoreFromValue",item.AlbumArtists[0].Name);var html="";html+=enableScrollX()?'
':'
';var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!supportsImageAnalysis,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
";var similarContent=page.querySelector("#moreFromItems");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)}):void moreFromSection.classList.add("hide")}function renderSimilarItems(page,item,context){var similarCollapsible=page.querySelector("#similarCollapsible");if(similarCollapsible){if("Movie"!=item.Type&&"Trailer"!=item.Type&&"Series"!=item.Type&&"Program"!=item.Type&&"Recording"!=item.Type&&"Game"!=item.Type&&"MusicAlbum"!=item.Type&&"MusicArtist"!=item.Type&&"ChannelVideoItem"!=item.Type)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),options={userId:Dashboard.getCurrentUserId(),limit:"MusicAlbum"==item.Type||"MusicArtist"==item.Type?8:10,fields:"PrimaryImageAspectRatio,UserData,CanDelete"};"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length&&(options.ExcludeArtistIds=item.AlbumArtists[0].Id),enableScrollX()&&(options.limit=12),ApiClient.getSimilarItems(item.Id,options).then(function(result){if(!result.Items.length)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var html="";html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis&&("MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type);html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!cardLayout,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,context:context,lazy:!0,showDetailsMenu:!0,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:cardLayout,vibrant:cardLayout&&supportsImageAnalysis}),html+="
";var similarContent=similarCollapsible.querySelector(".similarContent");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)})}}function renderSeriesAirTime(page,item,isStatic){var seriesAirTime=page.querySelector("#seriesAirTime");if("Series"!=item.Type)return void seriesAirTime.classList.add("hide");var html="";if(item.AirDays&&item.AirDays.length&&(html+=7==item.AirDays.length?"daily":item.AirDays.map(function(a){return a+"s"}).join(",")),item.AirTime&&(html+=" at "+item.AirTime),item.Studios.length)if(isStatic)html+=" on "+item.Studios[0].Name;else{var context=inferContext(item),href=LibraryBrowser.getHref(item.Studios[0],context);html+=' on '+item.Studios[0].Name+""}html?(html=("Ended"==item.Status?"Aired ":"Airs ")+html,seriesAirTime.innerHTML=html,seriesAirTime.classList.remove("hide")):seriesAirTime.classList.add("hide")}function renderTags(page,item){var itemTags=page.querySelector(".itemTags");if(item.Tags&&item.Tags.length){for(var html="",i=0,length=item.Tags.length;i'+item.Tags[i]+"
";itemTags.innerHTML=html,itemTags.classList.remove("hide")}else itemTags.classList.add("hide")}function getEpisodesFunction(seriesId,query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getEpisodes(seriesId,query)}}function getAlbumSongsFunction(query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getItems(Dashboard.getCurrentUserId(),query)}}function renderChildren(page,item){_childrenItemsFunction=null;var fields="ItemCounts,AudioInfo,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete",query={ParentId:item.Id,Fields:fields};"BoxSet"!==item.Type&&(query.SortBy="SortName");var promise,userId=Dashboard.getCurrentUserId();"Series"==item.Type?promise=ApiClient.getSeasons(item.Id,{userId:userId,Fields:fields}):"Season"==item.Type?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields})):"Episode"==item.Type&&item.SeriesId&&item.SeasonId?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields})):"MusicAlbum"==item.Type&&(_childrenItemsFunction=getAlbumSongsFunction(query)),promise=promise||ApiClient.getItems(Dashboard.getCurrentUserId(),query),promise.then(function(result){var html="",scrollX=!1,isList=!1,scrollClass="hiddenScrollX",childrenItemsContainer=page.querySelector(".childrenItemsContainer");if("MusicAlbum"==item.Type)html=listView.getListViewHtml({items:result.Items,smallIcon:!0,showIndex:!0,index:"disc",showIndexNumber:!0,playFromHere:!0,action:"playallfromhere",image:!1,artist:"auto",containerAlbumArtist:item.AlbumArtist,addToListButton:!0}),isList=!0;else if("Series"==item.Type)scrollX=enableScrollX(),html=cardBuilder.getCardsHtml({items:result.Items,shape:getPortraitShape(),showTitle:!0,centerText:!0,lazy:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX});else if("Season"==item.Type||"Episode"==item.Type){if("Episode"===item.Type&&childrenItemsContainer.classList.add("darkScroller"),scrollX="Episode"==item.Type,browser.touch||(scrollClass="smoothScrollX"),1==result.Items.length&&"Episode"===item.Type)return;html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(scrollX),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,playFromHere:!0,overlayText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX,includeParentInfoInTitle:!1})}else"GameSystem"==item.Type&&(html=cardBuilder.getCardsHtml({items:result.Items,shape:"auto",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0}));if(page.querySelector("#childrenCollapsible").classList.remove("hide"),scrollX?(childrenItemsContainer.classList.add(scrollClass),childrenItemsContainer.classList.remove("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list")):(childrenItemsContainer.classList.remove("hiddenScrollX"),childrenItemsContainer.classList.remove("smoothScrollX"),isList?(childrenItemsContainer.classList.add("vertical-list"),childrenItemsContainer.classList.remove("vertical-wrap")):(childrenItemsContainer.classList.add("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list"))),childrenItemsContainer.innerHTML=html,imageLoader.lazyChildren(childrenItemsContainer),"BoxSet"==item.Type){var collectionItemTypes=[{name:globalize.translate("HeaderMovies"),type:"Movie"},{name:globalize.translate("HeaderSeries"),type:"Series"},{name:globalize.translate("HeaderAlbums"),type:"MusicAlbum"},{name:globalize.translate("HeaderGames"),type:"Game"},{name:globalize.translate("HeaderBooks"),type:"Book"}];renderCollectionItems(page,item,collectionItemTypes,result.Items)}else if("Episode"===item.Type){var card=childrenItemsContainer.querySelector('.card[data-id="'+item.Id+'"]');card&&scrollHelper.toStart(childrenItemsContainer,card.previousSibling||card,!0)}}),"Season"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderEpisodes"):"Episode"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("MoreFromValue",item.SeasonName):"Series"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderSeasons"):"MusicAlbum"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderTracks"):"GameSystem"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderGames"):page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderItems"),"MusicAlbum"==item.Type?page.querySelector(".childrenSectionHeader",page).classList.add("hide"):page.querySelector(".childrenSectionHeader",page).classList.remove("hide")}function renderItemsByName(page,item,user){require("scripts/itembynamedetailpage".split(","),function(){window.ItemsByName.renderItems(page,item)})}function renderPlaylistItems(page,item,user){require("scripts/playlistedit".split(","),function(){PlaylistViewer.render(page,item)})}function renderChannelGuide(page,item,user){require("scripts/livetvchannel,scripts/livetvcomponents,livetvcss".split(","),function(liveTvChannelPage){liveTvChannelPage.renderPrograms(page,item.Id)})}function renderSeriesSchedule(page,item,user){}function inferContext(item){return"Movie"==item.Type||"BoxSet"==item.Type?"movies":"Series"==item.Type||"Season"==item.Type||"Episode"==item.Type?"tvshows":"Game"==item.Type||"GameSystem"==item.Type?"games":"Game"==item.Type||"GameSystem"==item.Type?"games":"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"music":null}function renderStudios(elem,item,isStatic){var context=inferContext(item);if(item.Studios&&item.Studios.length&&"Series"!=item.Type,1)elem.classList.add("hide");else{for(var html="",i=0,length=item.Studios.length;i0&&(html+="  /  "),isStatic)html+=item.Studios[i].Name;else{item.Studios[i].Type="Studio";var href=LibraryBrowser.getHref(item.Studios[i],context);html+=''+item.Studios[i].Name+""}var translationKey=item.Studios.length>1?"ValueStudios":"ValueStudio";html=globalize.translate(translationKey,html),elem.innerHTML=html,elem.classList.remove("hide")}}function renderGenres(elem,item,limit,isStatic){for(var context=inferContext(item),html="",genres=item.Genres||[],i=0,length=genres.length;i=limit);i++){i>0&&(html+='');var param="Audio"==item.Type||"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"musicgenre":"genre";if("Game"==item.MediaType&&(param="gamegenre"),isStatic)html+=genres[i];else{var type;switch(context){case"tvshows":type="Series";break;case"games":type="Game";break;case"music":type="MusicAlbum";break;default:type="Movie"}var url="secondaryitems.html?type="+type+"&"+param+"="+ApiClient.encodeName(genres[i]);html+=''+genres[i]+""}}elem.innerHTML=html}function renderAwardSummary(elem,item){item.AwardSummary?(elem.classList.remove("hide"),elem.innerHTML=globalize.translate("ValueAwards",item.AwardSummary)):elem.classList.add("hide")}function renderCollectionItems(page,parentItem,types,items){page.querySelector(".collectionItems").innerHTML="";var i,length;for(i=0,length=types.length;i",html+="",html+='',html+="
",html+='
';var shape="MusicAlbum"==type.type?getSquareShape(!1):getPortraitShape(!1);html+=cardBuilder.getCardsHtml({items:items,shape:shape,showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayMoreButton:!0,showAddToCollection:!1,showRemoveFromCollection:!0,collectionId:parentItem.Id}),html+="
",html+="
";var collectionItems=page.querySelector(".collectionItems");collectionItems.insertAdjacentHTML("beforeend",html), -imageLoader.lazyChildren(collectionItems),collectionItems.querySelector(".btnAddToCollection").addEventListener("click",function(){require(["alert"],function(alert){alert({text:globalize.translate("AddItemToCollectionHelp"),html:globalize.translate("AddItemToCollectionHelp")+'

'+globalize.translate("ButtonLearnMore")+""})})})}function renderUserDataIcons(page,item){for(var userDataIcons=page.querySelectorAll(".userDataIcons"),i=0,length=userDataIcons.length;i',html+='
',null!=review.Score||null!=review.Likes&&(html+=review.Likes?"
":"
"),html+='
',html+='

'+review.Caption+"

";var vals=[];if(review.ReviewerName&&vals.push(review.ReviewerName),review.Publisher&&vals.push(review.Publisher),html+='
'+vals.join(", ")+".",review.Date)try{var date=datetime.toLocaleDateString(datetime.parseISO8601Date(review.Date,!0));html+=''+date+""}catch(error){}html+="
",review.Url&&(html+='"),html+="
",html+="
",html+="
"}limit&&result.TotalRecordCount>limit&&(html+='

");var criticReviewsContent=page.querySelector("#criticReviewsContent");criticReviewsContent.innerHTML=html,enableScrollX()?criticReviewsContent.classList.add("hiddenScrollX"):criticReviewsContent.classList.remove("hiddenScrollX")}function renderThemeMedia(page,item){"SeriesTimer"!==item.Type&&"Timer"!==item.Type&&"Genre"!==item.Type&&"MusicGenre"!==item.Type&&"GameGenre"!==item.Type&&"Studio"!==item.Type&&"Person"!==item.Type&&ApiClient.getThemeMedia(Dashboard.getCurrentUserId(),item.Id,!0).then(function(result){var themeSongs=result.ThemeSongsResult.OwnerId==item.Id?result.ThemeSongsResult.Items:[],themeVideos=result.ThemeVideosResult.OwnerId==item.Id?result.ThemeVideosResult.Items:[];renderThemeSongs(page,themeSongs),renderThemeVideos(page,themeVideos)})}function renderThemeSongs(page,items){if(items.length){page.querySelector("#themeSongsCollapsible").classList.remove("hide");var html=listView.getListViewHtml({items:items});page.querySelector("#themeSongsContent").innerHTML=html}else page.querySelector("#themeSongsCollapsible").classList.add("hide")}function renderThemeVideos(page,items,user){if(items.length){page.querySelector("#themeVideosCollapsible").classList.remove("hide");var themeVideosContent=page.querySelector("#themeVideosContent");themeVideosContent.innerHTML=getVideosHtml(items,user),imageLoader.lazyChildren(themeVideosContent)}else page.querySelector("#themeVideosCollapsible").classList.add("hide")}function renderMusicVideos(page,item,user){ApiClient.getItems(user.Id,{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"MusicVideo",Recursive:!0,Fields:"DateCreated,CanDelete",Albums:item.Name}).then(function(result){if(result.Items.length){page.querySelector("#musicVideosCollapsible").classList.remove("hide");var musicVideosContent=page.querySelector(".musicVideosContent");musicVideosContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(musicVideosContent)}else page.querySelector("#musicVideosCollapsible").classList.add("hide")})}function renderAdditionalParts(page,item,user){ApiClient.getAdditionalVideoParts(user.Id,item.Id).then(function(result){if(result.Items.length){page.querySelector("#additionalPartsCollapsible").classList.remove("hide");var additionalPartsContent=page.querySelector("#additionalPartsContent");additionalPartsContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(additionalPartsContent)}else page.querySelector("#additionalPartsCollapsible").classList.add("hide")})}function renderScenes(page,item){var chapters=item.Chapters||[];if(chapters.length&&!chapters[0].ImageTag&&(chapters=[]),chapters.length){page.querySelector("#scenesCollapsible").classList.remove("hide");var scenesContent=page.querySelector("#scenesContent");enableScrollX()?scenesContent.classList.add("smoothScrollX"):scenesContent.classList.add("vertical-wrap"),require(["chaptercardbuilder"],function(chaptercardbuilder){chaptercardbuilder.buildChapterCards(item,chapters,{itemsContainer:scenesContent,coverImage:!0,width:400,backdropShape:getThumbShape(),squareShape:getSquareShape()})})}else page.querySelector("#scenesCollapsible").classList.add("hide")}function renderMediaSources(page,user,item){var html=item.MediaSources.map(function(v){return getMediaSourceHtml(user,item,v)}).join('
');item.MediaSources.length>1&&(html="
"+html);var mediaInfoContent=page.querySelector("#mediaInfoContent");mediaInfoContent.innerHTML=html}function getMediaSourceHtml(user,item,version){var html="";version.Name&&item.MediaSources.length>1&&(html+='
'+version.Name+"

");for(var i=0,length=version.MediaStreams.length;i';var displayType=globalize.translate("MediaInfoStreamType"+stream.Type);html+='

'+displayType+"

";var attributes=[];stream.Language&&"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoLanguage"),stream.Language)),stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoCodec"),stream.Codec.toUpperCase())),stream.CodecTag&&attributes.push(createAttribute(globalize.translate("MediaInfoCodecTag"),stream.CodecTag)),null!=stream.IsAVC&&attributes.push(createAttribute("AVC",stream.IsAVC?"Yes":"No")),stream.Profile&&attributes.push(createAttribute(globalize.translate("MediaInfoProfile"),stream.Profile)),stream.Level&&attributes.push(createAttribute(globalize.translate("MediaInfoLevel"),stream.Level)),(stream.Width||stream.Height)&&attributes.push(createAttribute(globalize.translate("MediaInfoResolution"),stream.Width+"x"+stream.Height)),stream.AspectRatio&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoAspectRatio"),stream.AspectRatio)),"Video"==stream.Type&&(null!=stream.IsAnamorphic&&attributes.push(createAttribute(globalize.translate("MediaInfoAnamorphic"),stream.IsAnamorphic?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoInterlaced"),stream.IsInterlaced?"Yes":"No"))),(stream.AverageFrameRate||stream.RealFrameRate)&&attributes.push(createAttribute(globalize.translate("MediaInfoFramerate"),stream.AverageFrameRate||stream.RealFrameRate)),stream.ChannelLayout&&attributes.push(createAttribute(globalize.translate("MediaInfoLayout"),stream.ChannelLayout)),stream.Channels&&attributes.push(createAttribute(globalize.translate("MediaInfoChannels"),stream.Channels+" ch")),stream.BitRate&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoBitrate"),parseInt(stream.BitRate/1e3)+" kbps")),stream.SampleRate&&attributes.push(createAttribute(globalize.translate("MediaInfoSampleRate"),stream.SampleRate+" Hz")),stream.BitDepth&&attributes.push(createAttribute(globalize.translate("MediaInfoBitDepth"),stream.BitDepth+" bit")),stream.PixelFormat&&attributes.push(createAttribute(globalize.translate("MediaInfoPixelFormat"),stream.PixelFormat)),stream.RefFrames&&attributes.push(createAttribute(globalize.translate("MediaInfoRefFrames"),stream.RefFrames)),stream.NalLengthSize&&attributes.push(createAttribute("NAL",stream.NalLengthSize)),"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoDefault"),stream.IsDefault?"Yes":"No")),"Subtitle"==stream.Type&&(attributes.push(createAttribute(globalize.translate("MediaInfoForced"),stream.IsForced?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoExternal"),stream.IsExternal?"Yes":"No"))),"Video"==stream.Type&&version.Timestamp&&attributes.push(createAttribute(globalize.translate("MediaInfoTimestamp"),version.Timestamp)),stream.DisplayTitle&&attributes.push(createAttribute("Title",stream.DisplayTitle)),html+=attributes.join("
"),html+="
"}}if(version.Container&&(html+='
'+globalize.translate("MediaInfoContainer")+''+version.Container+"
"),version.Formats&&version.Formats.length,version.Path&&"Http"!=version.Protocol&&user&&user.Policy.IsAdministrator&&(html+='
'+globalize.translate("MediaInfoPath")+''+version.Path+"
"),version.Size){var size=(version.Size/1048576).toFixed(0);html+='
'+globalize.translate("MediaInfoSize")+''+size+" MB
"}return html}function createAttribute(label,value){return''+label+''+value+""}function getVideosHtml(items,user,limit,moreButtonClass){var html=cardBuilder.getCardsHtml({items:items,shape:"auto",showTitle:!0,action:"play",overlayText:!0,showRuntime:!0});return limit&&items.length>limit&&(html+='

"),html}function renderSpecials(page,item,user,limit){ApiClient.getSpecialFeatures(user.Id,item.Id).then(function(specials){var specialsContent=page.querySelector("#specialsContent");specialsContent.innerHTML=getVideosHtml(specials,user,limit,"moreSpecials"),imageLoader.lazyChildren(specialsContent)})}function renderCast(page,item,context,limit,isStatic){var people=item.People||[],castContent=page.querySelector("#castContent");enableScrollX()?(castContent.classList.add("smoothScrollX"),limit=32):castContent.classList.add("vertical-wrap");var limitExceeded=limit&&people.length>limit;limitExceeded&&(people=people.slice(0),people.length=Math.min(limit,people.length)),require(["peoplecardbuilder"],function(peoplecardbuilder){peoplecardbuilder.buildPeopleCards(people,{itemsContainer:castContent,coverImage:!0,serverId:item.ServerId,width:160,shape:getPortraitShape()})});var morePeopleButton=page.querySelector(".morePeople");morePeopleButton&&(limitExceeded&&!enableScrollX()?morePeopleButton.classList.remove("hide"):morePeopleButton.classList.add("hide"))}function play(startPosition){playbackManager.play({items:[currentItem],startPositionTicks:startPosition})}function splitVersions(page,params){require(["confirm"],function(confirm){confirm("Are you sure you wish to split the media sources into separate items?","Split Media Apart").then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Videos/"+params.id+"/AlternateSources")}).then(function(){Dashboard.hideLoadingMsg(),reload(page,params)})})})}function playTrailer(page){playbackManager.playTrailers(currentItem)}function showPlayMenu(item,target){require(["playMenu"],function(playMenu){playMenu.show({item:item,positionTo:target})})}function playCurrentItem(button,mode){var item=currentItem;return"Program"===item.Type?void ApiClient.getLiveTvChannel(item.ChannelId,Dashboard.getCurrentUserId()).then(function(channel){playbackManager.play({items:[channel]})}):void("playmenu"===mode?showPlayMenu(item,button):playbackManager.play({items:[item],startPositionTicks:item.UserData&&"resume"===mode?item.UserData.PlaybackPositionTicks:0}))}function itemDetailPage(){var self=this;self.play=play,self.setInitialCollapsibleState=setInitialCollapsibleState,self.renderDetails=renderDetails,self.renderCriticReviews=renderCriticReviews,self.renderCast=renderCast,self.renderScenes=renderScenes,self.renderMediaSources=renderMediaSources}function onPlayClick(){var mode=this.getAttribute("data-mode");playCurrentItem(this,mode)}function onInstantMixClick(){playbackManager.instantMix(currentItem)}function onShuffleClick(){playbackManager.shuffle(currentItem)}function onDeleteClick(){require(["deleteHelper"],function(deleteHelper){deleteHelper.deleteItem({item:currentItem,navigate:!0})})}function onCancelSeriesTimerClick(){require(["recordingHelper"],function(recordingHelper){recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id,currentItem.ServerId).then(function(){Dashboard.navigate("livetv.html")})})}var currentItem,currentRecordingFields,_childrenItemsFunction=null;return window.ItemDetailPage=new itemDetailPage,function(view,params){function onPlayTrailerClick(){playTrailer(view)}function onMoreCommandsClick(){var button=this;itemContextMenu.show(getContextMenuOptions(currentItem,button)).then(function(result){result.deleted?Emby.Page.goHome():result.updated&&reload(view,params)})}function editImages(){return new Promise(function(resolve,reject){require(["imageEditor"],function(imageEditor){imageEditor.show({itemId:currentItem.Id,serverId:currentItem.ServerId}).then(resolve,reject)})})}function onWebSocketMessage(e,data){var msg=data;if("UserDataChanged"===msg.MessageType&¤tItem&&msg.Data.UserId==Dashboard.getCurrentUserId()){var key=currentItem.UserData.Key,userData=msg.Data.UserDataList.filter(function(u){return u.Key==key})[0];userData&&(currentItem.UserData=userData,Dashboard.getCurrentUser().then(function(user){refreshImage(view,currentItem,user)}))}}var i,length,elems=view.querySelectorAll(".btnPlay");for(i=0,length=elems.length;i"}function renderSeriesTimerSchedule(page,seriesTimerId){ApiClient.getLiveTvTimers({UserId:ApiClient.getCurrentUserId(),ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb",SortBy:"StartDate",EnableTotalRecordCount:!1,EnableUserData:!1,SeriesTimerId:seriesTimerId,Fields:"ChannelInfo"}).then(function(result){result.Items.length&&result.Items[0].SeriesTimerId!=seriesTimerId&&(result.Items=[]);var html=getProgramScheduleHtml(result.Items),scheduleTab=page.querySelector(".seriesTimerSchedule");scheduleTab.innerHTML=html,imageLoader.lazyChildren(scheduleTab)})}function renderSeriesTimerEditor(page,item,user){if("SeriesTimer"===item.Type){if(!user.Policy.EnableLiveTvManagement)return page.querySelector(".seriesTimerScheduleSection").classList.add("hide"),void page.querySelector(".btnCancelSeriesTimer").classList.add("hide");require(["seriesRecordingEditor"],function(seriesRecordingEditor){seriesRecordingEditor.embed(item,ApiClient.serverId(),{context:page.querySelector(".seriesRecordingEditor")})}),page.querySelector(".seriesTimerScheduleSection").classList.remove("hide"),page.querySelector(".btnCancelSeriesTimer").classList.remove("hide"),renderSeriesTimerSchedule(page,item.Id)}}function reloadFromItem(page,params,item){currentItem=item;var context=params.context;LibraryBrowser.renderName(item,page.querySelector(".itemName"),!1,context),LibraryBrowser.renderParentName(item,page.querySelector(".parentName"),context),libraryMenu.setTitle(""),Dashboard.getCurrentUser().then(function(user){window.scrollTo(0,0),renderSeriesTimerEditor(page,item,user),renderImage(page,item,user),renderLogo(page,item,ApiClient),setInitialCollapsibleState(page,item,context,user),renderDetails(page,item,context),dom.getWindowSize().innerWidth>=800?backdrop.setBackdrops([item]):backdrop.clear(),LibraryBrowser.renderDetailPageBackdrop(page,item,imageLoader),libraryMenu.setTransparentMenu(!0);var canPlay=!1;if("Program"==item.Type){var now=new Date;now>=datetime.parseISO8601Date(item.StartDate,!0)&&now0)}else hideAll(page,"btnPlay"),hideAll(page,"btnResume"),hideAll(page,"btnInstantMix"),hideAll(page,"btnShuffle");var hasAnyButton=canPlay;(item.LocalTrailerCount||item.RemoteTrailers&&item.RemoteTrailers.length)&&"Full"==item.PlayAccess?(hideAll(page,"btnPlayTrailer",!0),hasAnyButton=!0):hideAll(page,"btnPlayTrailer"),item.CanDelete&&!item.IsFolder?(hideAll(page,"btnDeleteItem",!0),hasAnyButton=!0):hideAll(page,"btnDeleteItem"),renderSyncLocalContainer(page,params,user,item),hasAnyButton||"Program"!==item.Type?hideAll(page,"mainDetailButtons",!0):hideAll(page,"mainDetailButtons"),showRecordingFields(page,item,user);var groupedVersions=(item.MediaSources||[]).filter(function(g){return"Grouping"==g.Type});user.Policy.IsAdministrator&&groupedVersions.length?page.querySelector(".splitVersionContainer").classList.remove("hide"):page.querySelector(".splitVersionContainer").classList.add("hide"),itemContextMenu.getCommands(getContextMenuOptions(item)).then(function(commands){commands.length?hideAll(page,"btnMoreCommands",!0):hideAll(page,"btnMoreCommands")});var itemBirthday=page.querySelector("#itemBirthday");if("Person"==item.Type&&item.PremiereDate)try{var birthday=datetime.parseISO8601Date(item.PremiereDate,!0).toDateString();itemBirthday.classList.remove("hide"),itemBirthday.innerHTML=globalize.translate("BirthDateValue").replace("{0}",birthday)}catch(err){itemBirthday.classList.add("hide")}else itemBirthday.classList.add("hide");var itemDeathDate=page.querySelector("#itemDeathDate");if("Person"==item.Type&&item.EndDate)try{var deathday=datetime.parseISO8601Date(item.EndDate,!0).toDateString();itemDeathDate.classList.remove("hide"),itemDeathDate.innerHTML=globalize.translate("DeathDateValue").replace("{0}",deathday)}catch(err){itemDeathDate.classList.add("hide")}var itemBirthLocation=page.querySelector("#itemBirthLocation");if("Person"==item.Type&&item.ProductionLocations&&item.ProductionLocations.length){var gmap=''+item.ProductionLocations[0]+"";itemBirthLocation.classList.remove("hide"),itemBirthLocation.innerHTML=globalize.translate("BirthPlaceValue").replace("{0}",gmap)}else itemBirthLocation.classList.add("hide")}),setPeopleHeader(page,item),page.dispatchEvent(new CustomEvent("displayingitem",{detail:{item:item,context:context},bubbles:!0})),Dashboard.hideLoadingMsg()}function logoImageUrl(item,apiClient,options){return options=options||{},options.type="Logo",item.ImageTags&&item.ImageTags.Logo?(options.tag=item.ImageTags.Logo,apiClient.getScaledImageUrl(item.Id,options)):item.ParentLogoImageTag?(options.tag=item.ParentLogoImageTag,apiClient.getScaledImageUrl(item.ParentLogoItemId,options)):null}function renderLogo(page,item,apiClient){var url=logoImageUrl(item,apiClient,{maxWidth:300}),detailLogo=page.querySelector(".detailLogo");url?(detailLogo.classList.remove("hide"),detailLogo.classList.add("lazy"),detailLogo.setAttribute("data-src",url),imageLoader.lazyImage(detailLogo)):detailLogo.classList.add("hide")}function showRecordingFields(page,item,user){if(!currentRecordingFields){var recordingFieldsElement=page.querySelector(".recordingFields");"Program"==item.Type&&user.Policy.EnableLiveTvManagement?require(["recordingFields"],function(recordingFields){currentRecordingFields=new recordingFields({parent:recordingFieldsElement,programId:item.Id,serverId:item.ServerId}),recordingFieldsElement.classList.remove("hide")}):(recordingFieldsElement.classList.add("hide"),recordingFieldsElement.innerHTML="")}}function renderLinks(linksElem,item){var links=[];if(item.HomePageUrl&&links.push(''+globalize.translate("ButtonWebsite")+""),item.ExternalUrls)for(var i=0,length=item.ExternalUrls.length;i'+url.Name+"")}if(links.length){var html=links.join('');linksElem.innerHTML=html,linksElem.classList.remove("hide")}else linksElem.classList.add("hide")}function renderImage(page,item,user){var container=page.querySelector(".detailImageContainer");LibraryBrowser.renderDetailImage(container,item,user.Policy.IsAdministrator&&"Photo"!=item.MediaType,null,imageLoader,indicators)}function refreshDetailImageUserData(elem,item){var detailImageProgressContainer=elem.querySelector(".detailImageProgressContainer");detailImageProgressContainer.innerHTML=indicators.getProgressBarHtml(item)}function refreshImage(page,item,user){refreshDetailImageUserData(page.querySelector(".detailImageContainer"),item)}function setPeopleHeader(page,item){"Audio"==item.MediaType||"MusicAlbum"==item.Type||"Book"==item.MediaType||"Photo"==item.MediaType?page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderPeople"):page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderCastAndCrew")}function renderNextUp(page,item,user){var section=page.querySelector(".nextUpSection");return"Series"!=item.Type?void section.classList.add("hide"):void ApiClient.getNextUpEpisodes({SeriesId:item.Id,UserId:user.Id}).then(function(result){result.Items.length?section.classList.remove("hide"):section.classList.add("hide");var html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(!1),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,overlayText:!0,lazy:!0,overlayPlayButton:!0}),itemsContainer=section.querySelector(".nextUpItems");itemsContainer.innerHTML=html,imageLoader.lazyChildren(itemsContainer)})}function setInitialCollapsibleState(page,item,context,user){page.querySelector(".collectionItems").innerHTML="","TvChannel"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderChannelGuide(page,item,user)):"Playlist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderPlaylistItems(page,item,user)):"Studio"==item.Type||"Person"==item.Type||"Genre"==item.Type||"MusicGenre"==item.Type||"GameGenre"==item.Type||"MusicArtist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderItemsByName(page,item,user)):item.IsFolder||"Episode"==item.Type?("BoxSet"==item.Type&&page.querySelector("#childrenCollapsible").classList.add("hide"),renderChildren(page,item)):page.querySelector("#childrenCollapsible").classList.add("hide"),"Series"==item.Type&&renderSeriesSchedule(page,item,user),"Series"==item.Type?renderNextUp(page,item,user):page.querySelector(".nextUpSection").classList.add("hide"),item.MediaSources&&item.MediaSources.length&&renderMediaSources(page,user,item),renderScenes(page,item),item.SpecialFeatureCount&&0!=item.SpecialFeatureCount&&"Series"!=item.Type?(page.querySelector("#specialsCollapsible").classList.remove("hide"),renderSpecials(page,item,user,6)):page.querySelector("#specialsCollapsible").classList.add("hide"),item.People&&item.People.length?(page.querySelector("#castCollapsible").classList.remove("hide"),renderCast(page,item,context,enableScrollX()?null:12)):page.querySelector("#castCollapsible").classList.add("hide"),item.PartCount&&item.PartCount>1?(page.querySelector("#additionalPartsCollapsible").classList.remove("hide"),renderAdditionalParts(page,item,user)):page.querySelector("#additionalPartsCollapsible").classList.add("hide"),page.querySelector("#themeSongsCollapsible").classList.add("hide"),page.querySelector("#themeVideosCollapsible").classList.add("hide"),"MusicAlbum"==item.Type?renderMusicVideos(page,item,user):page.querySelector("#musicVideosCollapsible").classList.add("hide"),renderThemeMedia(page,item,user),enableScrollX()?renderCriticReviews(page,item):renderCriticReviews(page,item,1)}function renderOverview(elems,item){for(var i=0,length=elems.length;i'+text+"
":'
'+text+"
"}).join("");return view.querySelector(".mediaInfoIcons").innerHTML=html,html}function renderPhotoInfo(page,item){var html="",attributes=[];if(item.CameraMake&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraMake"),item.CameraMake)),item.CameraModel&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraModel"),item.CameraModel)),item.Altitude&&attributes.push(createAttribute(globalize.translate("MediaInfoAltitude"),item.Altitude.toFixed(1))),item.Aperture&&attributes.push(createAttribute(globalize.translate("MediaInfoAperture"),"F"+item.Aperture.toFixed(1))),item.ExposureTime){var val=1/item.ExposureTime;attributes.push(createAttribute(globalize.translate("MediaInfoExposureTime"),"1/"+val+" s"))}item.FocalLength&&attributes.push(createAttribute(globalize.translate("MediaInfoFocalLength"),item.FocalLength.toFixed(1)+" mm")),item.ImageOrientation,item.IsoSpeedRating&&attributes.push(createAttribute(globalize.translate("MediaInfoIsoSpeedRating"),item.IsoSpeedRating)),item.Latitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLatitude"),item.Latitude.toFixed(1))),item.Longitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLongitude"),item.Longitude.toFixed(1))),item.ShutterSpeed&&attributes.push(createAttribute(globalize.translate("MediaInfoShutterSpeed"),item.ShutterSpeed)),item.Software&&attributes.push(createAttribute(globalize.translate("MediaInfoSoftware"),item.Software)),html+=attributes.join("
"),page.querySelector(".photoInfoContent").innerHTML=html}function getArtistLinksHtml(artists,context){for(var html=[],i=0,length=artists.length;i'+artist.Name+"")}return html=html.join(" / "),1==artists.length?globalize.translate("ValueArtist",html):artists.length>1?globalize.translate("ValueArtists",html):html}function enableScrollX(){return browserInfo.mobile&&screen.availWidth<=1e3}function getPortraitShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowPortrait":"portrait"}function getSquareShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowSquare":"square"}function getThumbShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowBackdrop":"backdrop"}function renderMoreFromItems(page,item){var moreFromSection=page.querySelector("#moreFromSection");if(moreFromSection)return"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length?void ApiClient.getItems(Dashboard.getCurrentUserId(),{IncludeItemTypes:"MusicAlbum",ArtistIds:item.AlbumArtists[0].Id,Recursive:!0,ExcludeItemIds:item.Id}).then(function(result){if(!result.Items.length)return void moreFromSection.classList.add("hide");moreFromSection.classList.remove("hide"),moreFromSection.querySelector(".moreFromHeader").innerHTML=globalize.translate("MoreFromValue",item.AlbumArtists[0].Name);var html="";html+=enableScrollX()?'
':'
';var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!supportsImageAnalysis,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
";var similarContent=page.querySelector("#moreFromItems");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)}):void moreFromSection.classList.add("hide")}function renderSimilarItems(page,item,context){var similarCollapsible=page.querySelector("#similarCollapsible");if(similarCollapsible){if("Movie"!=item.Type&&"Trailer"!=item.Type&&"Series"!=item.Type&&"Program"!=item.Type&&"Recording"!=item.Type&&"Game"!=item.Type&&"MusicAlbum"!=item.Type&&"MusicArtist"!=item.Type&&"ChannelVideoItem"!=item.Type)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),options={userId:Dashboard.getCurrentUserId(),limit:"MusicAlbum"==item.Type||"MusicArtist"==item.Type?8:10,fields:"PrimaryImageAspectRatio,UserData,CanDelete"};"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length&&(options.ExcludeArtistIds=item.AlbumArtists[0].Id),enableScrollX()&&(options.limit=12),ApiClient.getSimilarItems(item.Id,options).then(function(result){if(!result.Items.length)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var html="";html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis&&("MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type);html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!cardLayout,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,context:context,lazy:!0,showDetailsMenu:!0,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:cardLayout,vibrant:cardLayout&&supportsImageAnalysis}),html+="
";var similarContent=similarCollapsible.querySelector(".similarContent");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)})}}function renderSeriesAirTime(page,item,isStatic){var seriesAirTime=page.querySelector("#seriesAirTime");if("Series"!=item.Type)return void seriesAirTime.classList.add("hide");var html="";if(item.AirDays&&item.AirDays.length&&(html+=7==item.AirDays.length?"daily":item.AirDays.map(function(a){return a+"s"}).join(",")),item.AirTime&&(html+=" at "+item.AirTime),item.Studios.length)if(isStatic)html+=" on "+item.Studios[0].Name;else{var context=inferContext(item),href=LibraryBrowser.getHref(item.Studios[0],context);html+=' on '+item.Studios[0].Name+""}html?(html=("Ended"==item.Status?"Aired ":"Airs ")+html,seriesAirTime.innerHTML=html,seriesAirTime.classList.remove("hide")):seriesAirTime.classList.add("hide")}function renderTags(page,item){var itemTags=page.querySelector(".itemTags");if(item.Tags&&item.Tags.length){for(var html="",i=0,length=item.Tags.length;i'+item.Tags[i]+"
";itemTags.innerHTML=html,itemTags.classList.remove("hide")}else itemTags.classList.add("hide")}function getEpisodesFunction(seriesId,query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getEpisodes(seriesId,query)}}function getAlbumSongsFunction(query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getItems(Dashboard.getCurrentUserId(),query)}}function renderChildren(page,item){_childrenItemsFunction=null;var fields="ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete",query={ParentId:item.Id,Fields:fields};"BoxSet"!==item.Type&&(query.SortBy="SortName");var promise,userId=Dashboard.getCurrentUserId();"Series"==item.Type?promise=ApiClient.getSeasons(item.Id,{userId:userId,Fields:fields}):"Season"==item.Type?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields})):"Episode"==item.Type&&item.SeriesId&&item.SeasonId?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields})):"MusicAlbum"==item.Type&&(_childrenItemsFunction=getAlbumSongsFunction(query)),promise=promise||ApiClient.getItems(Dashboard.getCurrentUserId(),query),promise.then(function(result){var html="",scrollX=!1,isList=!1,scrollClass="hiddenScrollX",childrenItemsContainer=page.querySelector(".childrenItemsContainer");if("MusicAlbum"==item.Type)html=listView.getListViewHtml({items:result.Items,smallIcon:!0,showIndex:!0,index:"disc",showIndexNumber:!0,playFromHere:!0,action:"playallfromhere",image:!1,artist:"auto",containerAlbumArtist:item.AlbumArtist,addToListButton:!0}),isList=!0;else if("Series"==item.Type)scrollX=enableScrollX(),html=cardBuilder.getCardsHtml({items:result.Items,shape:getPortraitShape(),showTitle:!0,centerText:!0,lazy:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX});else if("Season"==item.Type||"Episode"==item.Type){if("Episode"===item.Type&&childrenItemsContainer.classList.add("darkScroller"),scrollX="Episode"==item.Type,browser.touch||(scrollClass="smoothScrollX"),1==result.Items.length&&"Episode"===item.Type)return;html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(scrollX),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,playFromHere:!0,overlayText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX,includeParentInfoInTitle:!1})}else"GameSystem"==item.Type&&(html=cardBuilder.getCardsHtml({items:result.Items,shape:"auto",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0}));if(page.querySelector("#childrenCollapsible").classList.remove("hide"),scrollX?(childrenItemsContainer.classList.add(scrollClass),childrenItemsContainer.classList.remove("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list")):(childrenItemsContainer.classList.remove("hiddenScrollX"),childrenItemsContainer.classList.remove("smoothScrollX"),isList?(childrenItemsContainer.classList.add("vertical-list"),childrenItemsContainer.classList.remove("vertical-wrap")):(childrenItemsContainer.classList.add("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list"))),childrenItemsContainer.innerHTML=html,imageLoader.lazyChildren(childrenItemsContainer),"BoxSet"==item.Type){var collectionItemTypes=[{name:globalize.translate("HeaderMovies"),type:"Movie"},{name:globalize.translate("HeaderSeries"),type:"Series"},{name:globalize.translate("HeaderAlbums"),type:"MusicAlbum"},{name:globalize.translate("HeaderGames"),type:"Game"},{name:globalize.translate("HeaderBooks"),type:"Book"}];renderCollectionItems(page,item,collectionItemTypes,result.Items)}else if("Episode"===item.Type){var card=childrenItemsContainer.querySelector('.card[data-id="'+item.Id+'"]');card&&scrollHelper.toStart(childrenItemsContainer,card.previousSibling||card,!0)}}),"Season"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderEpisodes"):"Episode"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("MoreFromValue",item.SeasonName):"Series"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderSeasons"):"MusicAlbum"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderTracks"):"GameSystem"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderGames"):page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderItems"),"MusicAlbum"==item.Type?page.querySelector(".childrenSectionHeader",page).classList.add("hide"):page.querySelector(".childrenSectionHeader",page).classList.remove("hide")}function renderItemsByName(page,item,user){require("scripts/itembynamedetailpage".split(","),function(){window.ItemsByName.renderItems(page,item)})}function renderPlaylistItems(page,item,user){require("scripts/playlistedit".split(","),function(){PlaylistViewer.render(page,item)})}function renderChannelGuide(page,item,user){require("scripts/livetvchannel,scripts/livetvcomponents,livetvcss".split(","),function(liveTvChannelPage){liveTvChannelPage.renderPrograms(page,item.Id)})}function renderSeriesSchedule(page,item,user){}function inferContext(item){return"Movie"==item.Type||"BoxSet"==item.Type?"movies":"Series"==item.Type||"Season"==item.Type||"Episode"==item.Type?"tvshows":"Game"==item.Type||"GameSystem"==item.Type?"games":"Game"==item.Type||"GameSystem"==item.Type?"games":"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"music":null}function renderStudios(elem,item,isStatic){var context=inferContext(item);if(item.Studios&&item.Studios.length&&"Series"!=item.Type,1)elem.classList.add("hide");else{for(var html="",i=0,length=item.Studios.length;i0&&(html+="  /  "),isStatic)html+=item.Studios[i].Name;else{item.Studios[i].Type="Studio";var href=LibraryBrowser.getHref(item.Studios[i],context);html+=''+item.Studios[i].Name+""}var translationKey=item.Studios.length>1?"ValueStudios":"ValueStudio";html=globalize.translate(translationKey,html),elem.innerHTML=html,elem.classList.remove("hide")}}function renderGenres(elem,item,limit,isStatic){for(var context=inferContext(item),html="",genres=item.Genres||[],i=0,length=genres.length;i=limit);i++){i>0&&(html+='');var param="Audio"==item.Type||"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"musicgenre":"genre";if("Game"==item.MediaType&&(param="gamegenre"),isStatic)html+=genres[i];else{var type;switch(context){case"tvshows":type="Series";break;case"games":type="Game";break;case"music":type="MusicAlbum";break;default:type="Movie"}var url="secondaryitems.html?type="+type+"&"+param+"="+ApiClient.encodeName(genres[i]);html+=''+genres[i]+""}}elem.innerHTML=html}function renderAwardSummary(elem,item){item.AwardSummary?(elem.classList.remove("hide"),elem.innerHTML=globalize.translate("ValueAwards",item.AwardSummary)):elem.classList.add("hide")}function renderCollectionItems(page,parentItem,types,items){page.querySelector(".collectionItems").innerHTML="";var i,length;for(i=0,length=types.length;i",html+="",html+='',html+="
",html+='
';var shape="MusicAlbum"==type.type?getSquareShape(!1):getPortraitShape(!1);html+=cardBuilder.getCardsHtml({items:items,shape:shape,showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayMoreButton:!0,showAddToCollection:!1,showRemoveFromCollection:!0,collectionId:parentItem.Id}),html+="
",html+="
";var collectionItems=page.querySelector(".collectionItems");collectionItems.insertAdjacentHTML("beforeend",html),imageLoader.lazyChildren(collectionItems), +collectionItems.querySelector(".btnAddToCollection").addEventListener("click",function(){require(["alert"],function(alert){alert({text:globalize.translate("AddItemToCollectionHelp"),html:globalize.translate("AddItemToCollectionHelp")+'

'+globalize.translate("ButtonLearnMore")+""})})})}function renderUserDataIcons(page,item){for(var userDataIcons=page.querySelectorAll(".userDataIcons"),i=0,length=userDataIcons.length;i',html+='
',null!=review.Score||null!=review.Likes&&(html+=review.Likes?"
":"
"),html+='
',html+='

'+review.Caption+"

";var vals=[];if(review.ReviewerName&&vals.push(review.ReviewerName),review.Publisher&&vals.push(review.Publisher),html+='
'+vals.join(", ")+".",review.Date)try{var date=datetime.toLocaleDateString(datetime.parseISO8601Date(review.Date,!0));html+=''+date+""}catch(error){}html+="
",review.Url&&(html+='"),html+="
",html+="
",html+="
"}limit&&result.TotalRecordCount>limit&&(html+='

");var criticReviewsContent=page.querySelector("#criticReviewsContent");criticReviewsContent.innerHTML=html,enableScrollX()?criticReviewsContent.classList.add("hiddenScrollX"):criticReviewsContent.classList.remove("hiddenScrollX")}function renderThemeMedia(page,item){"SeriesTimer"!==item.Type&&"Timer"!==item.Type&&"Genre"!==item.Type&&"MusicGenre"!==item.Type&&"GameGenre"!==item.Type&&"Studio"!==item.Type&&"Person"!==item.Type&&ApiClient.getThemeMedia(Dashboard.getCurrentUserId(),item.Id,!0).then(function(result){var themeSongs=result.ThemeSongsResult.OwnerId==item.Id?result.ThemeSongsResult.Items:[],themeVideos=result.ThemeVideosResult.OwnerId==item.Id?result.ThemeVideosResult.Items:[];renderThemeSongs(page,themeSongs),renderThemeVideos(page,themeVideos)})}function renderThemeSongs(page,items){if(items.length){page.querySelector("#themeSongsCollapsible").classList.remove("hide");var html=listView.getListViewHtml({items:items});page.querySelector("#themeSongsContent").innerHTML=html}else page.querySelector("#themeSongsCollapsible").classList.add("hide")}function renderThemeVideos(page,items,user){if(items.length){page.querySelector("#themeVideosCollapsible").classList.remove("hide");var themeVideosContent=page.querySelector("#themeVideosContent");themeVideosContent.innerHTML=getVideosHtml(items,user),imageLoader.lazyChildren(themeVideosContent)}else page.querySelector("#themeVideosCollapsible").classList.add("hide")}function renderMusicVideos(page,item,user){ApiClient.getItems(user.Id,{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"MusicVideo",Recursive:!0,Fields:"DateCreated,CanDelete",Albums:item.Name}).then(function(result){if(result.Items.length){page.querySelector("#musicVideosCollapsible").classList.remove("hide");var musicVideosContent=page.querySelector(".musicVideosContent");musicVideosContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(musicVideosContent)}else page.querySelector("#musicVideosCollapsible").classList.add("hide")})}function renderAdditionalParts(page,item,user){ApiClient.getAdditionalVideoParts(user.Id,item.Id).then(function(result){if(result.Items.length){page.querySelector("#additionalPartsCollapsible").classList.remove("hide");var additionalPartsContent=page.querySelector("#additionalPartsContent");additionalPartsContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(additionalPartsContent)}else page.querySelector("#additionalPartsCollapsible").classList.add("hide")})}function renderScenes(page,item){var chapters=item.Chapters||[];if(chapters.length&&!chapters[0].ImageTag&&(chapters=[]),chapters.length){page.querySelector("#scenesCollapsible").classList.remove("hide");var scenesContent=page.querySelector("#scenesContent");enableScrollX()?scenesContent.classList.add("smoothScrollX"):scenesContent.classList.add("vertical-wrap"),require(["chaptercardbuilder"],function(chaptercardbuilder){chaptercardbuilder.buildChapterCards(item,chapters,{itemsContainer:scenesContent,coverImage:!0,width:400,backdropShape:getThumbShape(),squareShape:getSquareShape()})})}else page.querySelector("#scenesCollapsible").classList.add("hide")}function renderMediaSources(page,user,item){var html=item.MediaSources.map(function(v){return getMediaSourceHtml(user,item,v)}).join('
');item.MediaSources.length>1&&(html="
"+html);var mediaInfoContent=page.querySelector("#mediaInfoContent");mediaInfoContent.innerHTML=html}function getMediaSourceHtml(user,item,version){var html="";version.Name&&item.MediaSources.length>1&&(html+='
'+version.Name+"

");for(var i=0,length=version.MediaStreams.length;i';var displayType=globalize.translate("MediaInfoStreamType"+stream.Type);html+='

'+displayType+"

";var attributes=[];stream.Language&&"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoLanguage"),stream.Language)),stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoCodec"),stream.Codec.toUpperCase())),stream.CodecTag&&attributes.push(createAttribute(globalize.translate("MediaInfoCodecTag"),stream.CodecTag)),null!=stream.IsAVC&&attributes.push(createAttribute("AVC",stream.IsAVC?"Yes":"No")),stream.Profile&&attributes.push(createAttribute(globalize.translate("MediaInfoProfile"),stream.Profile)),stream.Level&&attributes.push(createAttribute(globalize.translate("MediaInfoLevel"),stream.Level)),(stream.Width||stream.Height)&&attributes.push(createAttribute(globalize.translate("MediaInfoResolution"),stream.Width+"x"+stream.Height)),stream.AspectRatio&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoAspectRatio"),stream.AspectRatio)),"Video"==stream.Type&&(null!=stream.IsAnamorphic&&attributes.push(createAttribute(globalize.translate("MediaInfoAnamorphic"),stream.IsAnamorphic?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoInterlaced"),stream.IsInterlaced?"Yes":"No"))),(stream.AverageFrameRate||stream.RealFrameRate)&&attributes.push(createAttribute(globalize.translate("MediaInfoFramerate"),stream.AverageFrameRate||stream.RealFrameRate)),stream.ChannelLayout&&attributes.push(createAttribute(globalize.translate("MediaInfoLayout"),stream.ChannelLayout)),stream.Channels&&attributes.push(createAttribute(globalize.translate("MediaInfoChannels"),stream.Channels+" ch")),stream.BitRate&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoBitrate"),parseInt(stream.BitRate/1e3)+" kbps")),stream.SampleRate&&attributes.push(createAttribute(globalize.translate("MediaInfoSampleRate"),stream.SampleRate+" Hz")),stream.BitDepth&&attributes.push(createAttribute(globalize.translate("MediaInfoBitDepth"),stream.BitDepth+" bit")),stream.PixelFormat&&attributes.push(createAttribute(globalize.translate("MediaInfoPixelFormat"),stream.PixelFormat)),stream.RefFrames&&attributes.push(createAttribute(globalize.translate("MediaInfoRefFrames"),stream.RefFrames)),stream.NalLengthSize&&attributes.push(createAttribute("NAL",stream.NalLengthSize)),"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoDefault"),stream.IsDefault?"Yes":"No")),"Subtitle"==stream.Type&&(attributes.push(createAttribute(globalize.translate("MediaInfoForced"),stream.IsForced?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoExternal"),stream.IsExternal?"Yes":"No"))),"Video"==stream.Type&&version.Timestamp&&attributes.push(createAttribute(globalize.translate("MediaInfoTimestamp"),version.Timestamp)),stream.DisplayTitle&&attributes.push(createAttribute("Title",stream.DisplayTitle)),html+=attributes.join("
"),html+="
"}}if(version.Container&&(html+='
'+globalize.translate("MediaInfoContainer")+''+version.Container+"
"),version.Formats&&version.Formats.length,version.Path&&"Http"!=version.Protocol&&user&&user.Policy.IsAdministrator&&(html+='
'+globalize.translate("MediaInfoPath")+''+version.Path+"
"),version.Size){var size=(version.Size/1048576).toFixed(0);html+='
'+globalize.translate("MediaInfoSize")+''+size+" MB
"}return html}function createAttribute(label,value){return''+label+''+value+""}function getVideosHtml(items,user,limit,moreButtonClass){var html=cardBuilder.getCardsHtml({items:items,shape:"auto",showTitle:!0,action:"play",overlayText:!0,showRuntime:!0});return limit&&items.length>limit&&(html+='

"),html}function renderSpecials(page,item,user,limit){ApiClient.getSpecialFeatures(user.Id,item.Id).then(function(specials){var specialsContent=page.querySelector("#specialsContent");specialsContent.innerHTML=getVideosHtml(specials,user,limit,"moreSpecials"),imageLoader.lazyChildren(specialsContent)})}function renderCast(page,item,context,limit,isStatic){var people=item.People||[],castContent=page.querySelector("#castContent");enableScrollX()?(castContent.classList.add("smoothScrollX"),limit=32):castContent.classList.add("vertical-wrap");var limitExceeded=limit&&people.length>limit;limitExceeded&&(people=people.slice(0),people.length=Math.min(limit,people.length)),require(["peoplecardbuilder"],function(peoplecardbuilder){peoplecardbuilder.buildPeopleCards(people,{itemsContainer:castContent,coverImage:!0,serverId:item.ServerId,width:160,shape:getPortraitShape()})});var morePeopleButton=page.querySelector(".morePeople");morePeopleButton&&(limitExceeded&&!enableScrollX()?morePeopleButton.classList.remove("hide"):morePeopleButton.classList.add("hide"))}function play(startPosition){playbackManager.play({items:[currentItem],startPositionTicks:startPosition})}function splitVersions(page,params){require(["confirm"],function(confirm){confirm("Are you sure you wish to split the media sources into separate items?","Split Media Apart").then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Videos/"+params.id+"/AlternateSources")}).then(function(){Dashboard.hideLoadingMsg(),reload(page,params)})})})}function playTrailer(page){playbackManager.playTrailers(currentItem)}function showPlayMenu(item,target){require(["playMenu"],function(playMenu){playMenu.show({item:item,positionTo:target})})}function playCurrentItem(button,mode){var item=currentItem;return"Program"===item.Type?void ApiClient.getLiveTvChannel(item.ChannelId,Dashboard.getCurrentUserId()).then(function(channel){playbackManager.play({items:[channel]})}):void("playmenu"===mode?showPlayMenu(item,button):playbackManager.play({items:[item],startPositionTicks:item.UserData&&"resume"===mode?item.UserData.PlaybackPositionTicks:0}))}function itemDetailPage(){var self=this;self.play=play,self.setInitialCollapsibleState=setInitialCollapsibleState,self.renderDetails=renderDetails,self.renderCriticReviews=renderCriticReviews,self.renderCast=renderCast,self.renderScenes=renderScenes,self.renderMediaSources=renderMediaSources}function onPlayClick(){var mode=this.getAttribute("data-mode");playCurrentItem(this,mode)}function onInstantMixClick(){playbackManager.instantMix(currentItem)}function onShuffleClick(){playbackManager.shuffle(currentItem)}function onDeleteClick(){require(["deleteHelper"],function(deleteHelper){deleteHelper.deleteItem({item:currentItem,navigate:!0})})}function onCancelSeriesTimerClick(){require(["recordingHelper"],function(recordingHelper){recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id,currentItem.ServerId).then(function(){Dashboard.navigate("livetv.html")})})}var currentItem,currentRecordingFields,_childrenItemsFunction=null;return window.ItemDetailPage=new itemDetailPage,function(view,params){function onPlayTrailerClick(){playTrailer(view)}function onMoreCommandsClick(){var button=this;itemContextMenu.show(getContextMenuOptions(currentItem,button)).then(function(result){result.deleted?Emby.Page.goHome():result.updated&&reload(view,params)})}function editImages(){return new Promise(function(resolve,reject){require(["imageEditor"],function(imageEditor){imageEditor.show({itemId:currentItem.Id,serverId:currentItem.ServerId}).then(resolve,reject)})})}function onWebSocketMessage(e,data){var msg=data;if("UserDataChanged"===msg.MessageType&¤tItem&&msg.Data.UserId==Dashboard.getCurrentUserId()){var key=currentItem.UserData.Key,userData=msg.Data.UserDataList.filter(function(u){return u.Key==key})[0];userData&&(currentItem.UserData=userData,Dashboard.getCurrentUser().then(function(user){refreshImage(view,currentItem,user)}))}}var i,length,elems=view.querySelectorAll(".btnPlay");for(i=0,length=elems.length;i';return html+=text,html+=""}function seriesImageUrl(item,options){if(!item)throw new Error("item cannot be null!");if("Episode"!==item.Type)return null;if(options=options||{},options.type=options.type||"Primary","Primary"===options.type&&item.SeriesPrimaryImageTag)return options.tag=item.SeriesPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if("Thumb"===options.type){if(item.SeriesThumbImageTag)return options.tag=item.SeriesThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if(item.ParentThumbImageTag)return options.tag=item.ParentThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId,options)}return null}function imageUrl(item,options){if(!item)throw new Error("item cannot be null!");return options=options||{},options.type=options.type||"Primary",item.ImageTags&&item.ImageTags[options.type]?(options.tag=item.ImageTags[options.type],connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId||item.Id,options)):item.AlbumId&&item.AlbumPrimaryImageTag?(options.tag=item.AlbumPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId,options)):null}function updateNowPlayingInfo(state){var nowPlayingItem=state.NowPlayingItem;nowPlayingTextElement.innerHTML=nowPlayingItem?nowPlayingHelper.getNowPlayingNames(nowPlayingItem).map(function(nowPlayingName){return nowPlayingName.item?"
"+getTextActionButton(nowPlayingName.item,nowPlayingName.text)+"
":"
"+nowPlayingName.text+"
"}).join(""):"";var imgHeight=70,url=nowPlayingItem?seriesImageUrl(nowPlayingItem,{height:imgHeight})||imageUrl(nowPlayingItem,{height:imgHeight}):null;url!==currentImgUrl&&(currentImgUrl=url,imageLoader.lazyImage(nowPlayingImageElement,url)),nowPlayingItem.Id?ApiClient.getItem(Dashboard.getCurrentUserId(),nowPlayingItem.Id).then(function(item){userdataButtons.fill({item:item,includePlayed:!1,element:nowPlayingUserData})}):userdataButtons.destroy({element:nowPlayingUserData})}function onPlaybackStart(e,state){console.log("nowplaying event: "+e.type);var player=this;onStateChanged.call(player,e,state)}function onRepeatModeChange(e){var player=this;updateRepeatModeDisplay(playbackManager.getRepeatMode(player))}function showNowPlayingBar(){getNowPlayingBar().then(slideUp)}function hideNowPlayingBar(){isEnabled=!1;var elem=document.getElementsByClassName("nowPlayingBar")[0];elem&&(document.body.classList.contains("hiddenNowPlayingBar")?(dom.removeEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0}),elem.classList.add("hide"),elem.classList.add("nowPlayingBar-hidden")):slideDown(elem))}function onPlaybackStopped(e,stopInfo){console.log("nowplaying event: "+e.type);"Audio"!==stopInfo.nextMediaType&&hideNowPlayingBar()}function onPlayPauseStateChanged(e){if(isEnabled){var player=this;updatePlayPauseState(player.paused())}}function onStateChanged(event,state){var player=this;return state.NowPlayingItem?player.isLocalPlayer&&state.NowPlayingItem&&"Video"==state.NowPlayingItem.MediaType?void hideNowPlayingBar():(isEnabled=!0,nowPlayingBarElement?void updatePlayerStateInternal(event,state):void getNowPlayingBar().then(function(){updatePlayerStateInternal(event,state)})):void hideNowPlayingBar()}function onTimeUpdate(e){if(isEnabled){var now=(new Date).getTime();if(!(now-lastUpdateTime<700)){lastUpdateTime=now;var player=this;currentRuntimeTicks=playbackManager.duration(player),updateTimeDisplay(playbackManager.currentTime(player),currentRuntimeTicks)}}}function releaseCurrentPlayer(){var player=currentPlayer;player&&(events.off(player,"playbackstart",onPlaybackStart),events.off(player,"statechange",onPlaybackStart),events.off(player,"repeatmodechange",onRepeatModeChange),events.off(player,"playbackstop",onPlaybackStopped),events.off(player,"volumechange",onVolumeChanged),events.off(player,"pause",onPlayPauseStateChanged),events.off(player,"playing",onPlayPauseStateChanged),events.off(player,"timeupdate",onTimeUpdate),currentPlayer=null,hideNowPlayingBar())}function onVolumeChanged(e){if(isEnabled){var player=this;updatePlayerVolumeState(player.isMuted(),player.getVolume())}}function bindToPlayer(player){player!==currentPlayer&&(releaseCurrentPlayer(),currentPlayer=player,player&&(playbackManager.getPlayerState(player).then(function(state){onStateChanged.call(player,{type:"init"},state)}),events.on(player,"playbackstart",onPlaybackStart),events.on(player,"statechange",onPlaybackStart),events.on(player,"repeatmodechange",onRepeatModeChange),events.on(player,"playbackstop",onPlaybackStopped),events.on(player,"volumechange",onVolumeChanged),events.on(player,"pause",onPlayPauseStateChanged),events.on(player,"playing",onPlayPauseStateChanged),events.on(player,"timeupdate",onTimeUpdate)))}var currentPlayer,currentTimeElement,nowPlayingImageElement,nowPlayingTextElement,nowPlayingUserData,muteButton,volumeSlider,volumeSliderContainer,playPauseButtons,positionSlider,toggleRepeatButton,toggleRepeatButtonIcon,isEnabled,nowPlayingBarElement,currentImgUrl,currentPlayerSupportedCommands=[],lastUpdateTime=0,lastPlayerState={},currentRuntimeTicks=0;events.on(playbackManager,"playerchange",function(){bindToPlayer(playbackManager.getCurrentPlayer())}),bindToPlayer(playbackManager.getCurrentPlayer())}); \ No newline at end of file +define(["datetime","userdataButtons","itemHelper","events","browser","imageLoader","playbackManager","nowPlayingHelper","apphost","dom","connectionManager","paper-icon-button-light"],function(datetime,userdataButtons,itemHelper,events,browser,imageLoader,playbackManager,nowPlayingHelper,appHost,dom,connectionManager){"use strict";function getNowPlayingBarHtml(){var html="";return html+='
',html+='
',html+='
',html+='',html+="
",html+='
',html+='
',html+='
',html+="
",html+='
',html+='',html+='',html+='',html+='',html+='
',html+="
",html+='
',html+='',html+='
',html+='',html+="
",html+='',html+='
',html+="
",html+='',html+='',html+="
",html+="
",html+="
"}function onSlideDownComplete(){this.classList.add("hide")}function slideDown(elem){requestAnimationFrame(function(){void elem.offsetWidth,elem.classList.add("nowPlayingBar-hidden"),dom.addEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0})})}function slideUp(elem){elem.classList.remove("hide"),dom.removeEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0}),requestAnimationFrame(function(){void elem.offsetWidth,elem.classList.remove("nowPlayingBar-hidden")})}function onPlayPauseClick(){playbackManager.playPause(currentPlayer)}function bindEvents(elem){currentTimeElement=elem.querySelector(".nowPlayingBarCurrentTime"),nowPlayingImageElement=elem.querySelector(".nowPlayingImage"),nowPlayingTextElement=elem.querySelector(".nowPlayingBarText"),nowPlayingUserData=elem.querySelector(".nowPlayingBarUserDataButtons"),muteButton=elem.querySelector(".muteButton"),muteButton.addEventListener("click",function(){currentPlayer&&playbackManager.toggleMute(currentPlayer)}),elem.querySelector(".stopButton").addEventListener("click",function(){currentPlayer&&playbackManager.stop(currentPlayer)});var i,length;for(playPauseButtons=elem.querySelectorAll(".playPauseButton"),i=0,length=playPauseButtons.length;i';return html+=text,html+=""}function seriesImageUrl(item,options){if(!item)throw new Error("item cannot be null!");if("Episode"!==item.Type)return null;if(options=options||{},options.type=options.type||"Primary","Primary"===options.type&&item.SeriesPrimaryImageTag)return options.tag=item.SeriesPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if("Thumb"===options.type){if(item.SeriesThumbImageTag)return options.tag=item.SeriesThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if(item.ParentThumbImageTag)return options.tag=item.ParentThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId,options)}return null}function imageUrl(item,options){if(!item)throw new Error("item cannot be null!");return options=options||{},options.type=options.type||"Primary",item.ImageTags&&item.ImageTags[options.type]?(options.tag=item.ImageTags[options.type],connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId||item.Id,options)):item.AlbumId&&item.AlbumPrimaryImageTag?(options.tag=item.AlbumPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId,options)):null}function updateNowPlayingInfo(state){var nowPlayingItem=state.NowPlayingItem;nowPlayingTextElement.innerHTML=nowPlayingItem?nowPlayingHelper.getNowPlayingNames(nowPlayingItem).map(function(nowPlayingName){return nowPlayingName.item?"
"+getTextActionButton(nowPlayingName.item,nowPlayingName.text)+"
":"
"+nowPlayingName.text+"
"}).join(""):"";var imgHeight=70,url=nowPlayingItem?seriesImageUrl(nowPlayingItem,{height:imgHeight})||imageUrl(nowPlayingItem,{height:imgHeight}):null;url!==currentImgUrl&&(currentImgUrl=url,imageLoader.lazyImage(nowPlayingImageElement,url)),nowPlayingItem.Id?ApiClient.getItem(Dashboard.getCurrentUserId(),nowPlayingItem.Id).then(function(item){userdataButtons.fill({item:item,includePlayed:!1,element:nowPlayingUserData})}):userdataButtons.destroy({element:nowPlayingUserData})}function onPlaybackStart(e,state){console.log("nowplaying event: "+e.type);var player=this;onStateChanged.call(player,e,state)}function onRepeatModeChange(e){var player=this;updateRepeatModeDisplay(playbackManager.getRepeatMode(player))}function showNowPlayingBar(){getNowPlayingBar().then(slideUp)}function hideNowPlayingBar(){isEnabled=!1;var elem=document.getElementsByClassName("nowPlayingBar")[0];elem&&(document.body.classList.contains("hiddenNowPlayingBar")?(dom.removeEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0}),elem.classList.add("hide"),elem.classList.add("nowPlayingBar-hidden")):slideDown(elem))}function onPlaybackStopped(e,state){console.log("nowplaying event: "+e.type);var player=this;player.isLocalPlayer?"Audio"!==state.NextMediaType&&hideNowPlayingBar():state.NextMediaType||hideNowPlayingBar()}function onPlayPauseStateChanged(e){if(isEnabled){var player=this;updatePlayPauseState(player.paused())}}function onStateChanged(event,state){var player=this;return state.NowPlayingItem?player.isLocalPlayer&&state.NowPlayingItem&&"Video"==state.NowPlayingItem.MediaType?void hideNowPlayingBar():(isEnabled=!0,nowPlayingBarElement?void updatePlayerStateInternal(event,state):void getNowPlayingBar().then(function(){updatePlayerStateInternal(event,state)})):void hideNowPlayingBar()}function onTimeUpdate(e){if(isEnabled){var now=(new Date).getTime();if(!(now-lastUpdateTime<700)){lastUpdateTime=now;var player=this;currentRuntimeTicks=playbackManager.duration(player),updateTimeDisplay(playbackManager.currentTime(player),currentRuntimeTicks)}}}function releaseCurrentPlayer(){var player=currentPlayer;player&&(events.off(player,"playbackstart",onPlaybackStart),events.off(player,"statechange",onPlaybackStart),events.off(player,"repeatmodechange",onRepeatModeChange),events.off(player,"playbackstop",onPlaybackStopped),events.off(player,"volumechange",onVolumeChanged),events.off(player,"pause",onPlayPauseStateChanged),events.off(player,"playing",onPlayPauseStateChanged),events.off(player,"timeupdate",onTimeUpdate),currentPlayer=null,hideNowPlayingBar())}function onVolumeChanged(e){if(isEnabled){var player=this;updatePlayerVolumeState(player.isMuted(),player.getVolume())}}function bindToPlayer(player){player!==currentPlayer&&(releaseCurrentPlayer(),currentPlayer=player,player&&(playbackManager.getPlayerState(player).then(function(state){onStateChanged.call(player,{type:"init"},state)}),events.on(player,"playbackstart",onPlaybackStart),events.on(player,"statechange",onPlaybackStart),events.on(player,"repeatmodechange",onRepeatModeChange),events.on(player,"playbackstop",onPlaybackStopped),events.on(player,"volumechange",onVolumeChanged),events.on(player,"pause",onPlayPauseStateChanged),events.on(player,"playing",onPlayPauseStateChanged),events.on(player,"timeupdate",onTimeUpdate)))}var currentPlayer,currentTimeElement,nowPlayingImageElement,nowPlayingTextElement,nowPlayingUserData,muteButton,volumeSlider,volumeSliderContainer,playPauseButtons,positionSlider,toggleRepeatButton,toggleRepeatButtonIcon,isEnabled,nowPlayingBarElement,currentImgUrl,currentPlayerSupportedCommands=[],lastUpdateTime=0,lastPlayerState={},currentRuntimeTicks=0;events.on(playbackManager,"playerchange",function(){bindToPlayer(playbackManager.getCurrentPlayer())}),bindToPlayer(playbackManager.getCurrentPlayer())}); \ No newline at end of file diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 976cd9befc..20d585e9d6 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -1,2 +1,2 @@ -function getWindowLocationSearch(win){"use strict";var search=(win||window).location.search;if(!search){var index=window.location.href.indexOf("?");index!=-1&&(search=window.location.href.substring(index))}return search||""}function getParameterByName(name,url){"use strict";name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regexS="[\\?&]"+name+"=([^&#]*)",regex=new RegExp(regexS,"i"),results=regex.exec(url||getWindowLocationSearch());return null==results?"":decodeURIComponent(results[1].replace(/\+/g," "))}function pageClassOn(eventName,className,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.classList.contains(className)&&fn.call(target,e)})}function pageIdOn(eventName,id,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.id==id&&fn.call(target,e)})}var Dashboard={isConnectMode:function(){if(AppInfo.isNativeApp)return!0;var url=window.location.href.toLowerCase();return url.indexOf("mediabrowser.tv")!=-1||url.indexOf("emby.media")!=-1},isRunningInCordova:function(){return"cordova"==window.appMode},onRequestFail:function(e,data){if(401==data.status&&"ParentalControl"==data.errorCode){var currentView=ViewManager.currentView();currentView&&!currentView.classList.contains(".standalonePage")&&Dashboard.alert({message:Globalize.translate("MessageLoggedOutParentalControl"),callback:function(){Dashboard.logout(!1)}})}},getCurrentUser:function(){return window.ApiClient.getCurrentUser()},serverAddress:function(){if(Dashboard.isConnectMode()){var apiClient=window.ApiClient;return apiClient?apiClient.serverAddress():null}var urlLower=window.location.href.toLowerCase(),index=urlLower.lastIndexOf("/web");if(index!=-1)return urlLower.substring(0,index);var loc=window.location,address=loc.protocol+"//"+loc.hostname;return loc.port&&(address+=":"+loc.port),address},getCurrentUserId:function(){var apiClient=window.ApiClient;return apiClient?apiClient.getCurrentUserId():null},onServerChanged:function(userId,accessToken,apiClient){apiClient=apiClient||window.ApiClient,window.ApiClient=apiClient},logout:function(logoutWithServer){function onLogoutDone(){var loginPage;Dashboard.isConnectMode()?(loginPage="connectlogin.html",window.ApiClient=null):loginPage="login.html",Dashboard.navigate(loginPage)}logoutWithServer===!1?onLogoutDone():ConnectionManager.logout().then(onLogoutDone)},getConfigurationPageUrl:function(name){return"configurationpage?name="+encodeURIComponent(name)},navigate:function(url,preserveQueryString){if(!url)throw new Error("url cannot be null or empty");var queryString=getWindowLocationSearch();return preserveQueryString&&queryString&&(url+=queryString),Emby.Page.show(url)},showLoadingMsg:function(){Dashboard.loadingVisible=!0,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},hideLoadingMsg:function(){Dashboard.loadingVisible=!1,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},processPluginConfigurationUpdateResult:function(){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processServerConfigurationUpdateResult:function(result){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processErrorResponse:function(response){Dashboard.hideLoadingMsg();var status=""+response.status;response.statusText&&(status=response.statusText),Dashboard.alert({title:status,message:response.headers?response.headers.get("X-Application-Error-Code"):null})},alert:function(options){return"string"==typeof options?void require(["toast"],function(toast){toast({text:options})}):void require(["alert"],function(alert){alert({title:options.title||Globalize.translate("HeaderAlert"),text:options.message}).then(options.callback||function(){})})},restartServer:function(){var apiClient=window.ApiClient;apiClient&&(Dashboard.suppressAjaxErrors=!0,Dashboard.showLoadingMsg(),apiClient.restartServer().then(function(){setTimeout(function(){Dashboard.reloadPageWhenServerAvailable()},250)},function(){Dashboard.suppressAjaxErrors=!1}))},reloadPageWhenServerAvailable:function(retryCount){var apiClient=window.ApiClient;apiClient&&apiClient.getJSON(apiClient.getUrl("System/Info")).then(function(info){info.HasPendingRestart?Dashboard.retryReload(retryCount):window.location.reload(!0)},function(){Dashboard.retryReload(retryCount)})},retryReload:function(retryCount){setTimeout(function(){retryCount=retryCount||0,retryCount++,retryCount<10?Dashboard.reloadPageWhenServerAvailable(retryCount):Dashboard.suppressAjaxErrors=!1},500)},showUserFlyout:function(){Dashboard.navigate("mypreferencesmenu.html")},getPluginSecurityInfo:function(){var apiClient=window.ApiClient;if(!apiClient)return Promise.reject();var cachedInfo=Dashboard.pluginSecurityInfo;return cachedInfo?Promise.resolve(cachedInfo):apiClient.ajax({type:"GET",url:apiClient.getUrl("Plugins/SecurityInfo"),dataType:"json",error:function(){}}).then(function(result){return Dashboard.pluginSecurityInfo=result,result})},resetPluginSecurityInfo:function(){Dashboard.pluginSecurityInfo=null},ensureHeader:function(page){page.classList.contains("standalonePage")&&!page.classList.contains("noHeaderPage")&&Dashboard.renderHeader(page)},renderHeader:function(page){var header=page.querySelector(".header");if(!header){var headerHtml="";headerHtml+='",page.insertAdjacentHTML("afterbegin",headerHtml)}},getToolsLinkHtml:function(item){var menuHtml="",pageIds=item.pageIds?item.pageIds.join(","):"";return pageIds=pageIds?' data-pageids="'+pageIds+'"':"",menuHtml+='",menuHtml+='',menuHtml+=item.name,menuHtml+="",menuHtml+=""},getToolsMenuHtml:function(page){var i,length,item,items=Dashboard.getToolsMenuLinks(page),menuHtml="";for(menuHtml+='
',i=0,length=items.length;i
"),item.href?menuHtml+=Dashboard.getToolsLinkHtml(item):(menuHtml+='
',menuHtml+=item.name,menuHtml+="
");return menuHtml+="
"},getToolsMenuLinks:function(){return[{name:Globalize.translate("TabServer")},{name:Globalize.translate("TabDashboard"),href:"dashboard.html",pageIds:["dashboardPage"],icon:"dashboard"},{name:Globalize.translate("TabSettings"),href:"dashboardgeneral.html",pageIds:["dashboardGeneralPage"],icon:"settings"},{name:Globalize.translate("TabDevices"),href:"devices.html",pageIds:["devicesPage","devicePage"],icon:"tablet"},{name:Globalize.translate("TabUsers"),href:"userprofiles.html",pageIds:["userProfilesPage","newUserPage","editUserPage","userLibraryAccessPage","userParentalControlPage","userPasswordPage"],icon:"people"},{name:"Emby Premiere",href:"supporterkey.html",pageIds:["supporterKeyPage"],icon:"star"},{divider:!0,name:Globalize.translate("TabLibrary"),href:"library.html",pageIds:["mediaLibraryPage","librarySettingsPage","libraryDisplayPage","metadataImagesConfigurationPage","metadataNfoPage"],icon:"folder",color:"#38c"},{name:Globalize.translate("TabSubtitles"),href:"metadatasubtitles.html",pageIds:["metadataSubtitlesPage"],icon:"closed_caption"},{name:Globalize.translate("TabPlayback"),icon:"play_circle_filled",color:"#E5342E",href:"cinemamodeconfiguration.html",pageIds:["cinemaModeConfigurationPage","playbackConfigurationPage","streamingSettingsPage"]},{name:Globalize.translate("TabSync"),icon:"sync",href:"syncactivity.html",pageIds:["syncActivityPage","syncJobPage","devicesUploadPage","syncSettingsPage"],color:"#009688"},{name:Globalize.translate("TabTranscoding"),icon:"transform",href:"encodingsettings.html",pageIds:["encodingSettingsPage"]},{divider:!0,name:Globalize.translate("TabExtras")},{name:Globalize.translate("TabAutoOrganize"),color:"#01C0DD",href:"autoorganizelog.html",pageIds:["libraryFileOrganizerPage","libraryFileOrganizerSmartMatchPage","libraryFileOrganizerLogPage"],icon:"folder"},{name:Globalize.translate("DLNA"),href:"dlnasettings.html",pageIds:["dlnaSettingsPage","dlnaProfilesPage","dlnaProfilePage"],icon:"settings"},{name:Globalize.translate("TabLiveTV"),href:"livetvstatus.html",pageIds:["liveTvStatusPage","liveTvSettingsPage","liveTvTunerProviderHdHomerunPage","liveTvTunerProviderM3UPage","liveTvTunerProviderSatPage"],icon:"dvr"},{name:Globalize.translate("TabNotifications"),icon:"notifications",color:"brown",href:"notificationsettings.html",pageIds:["notificationSettingsPage","notificationSettingPage"]},{name:Globalize.translate("TabPlugins"),icon:"add_shopping_cart",color:"#9D22B1",href:"plugins.html",pageIds:["pluginsPage","pluginCatalogPage"]},{divider:!0,name:Globalize.translate("TabExpert")},{name:Globalize.translate("TabAdvanced"),icon:"settings",href:"dashboardhosting.html",color:"#F16834",pageIds:["dashboardHostingPage","serverSecurityPage"]},{name:Globalize.translate("TabLogs"),href:"log.html",pageIds:["logPage"],icon:"folder_open"},{name:Globalize.translate("TabScheduledTasks"),href:"scheduledtasks.html",pageIds:["scheduledTasksPage","scheduledTaskPage"],icon:"schedule"},{name:Globalize.translate("MetadataManager"),href:"edititemmetadata.html",pageIds:[],icon:"mode_edit"},{name:Globalize.translate("ButtonReports"),href:"reports.html",pageIds:[],icon:"insert_chart"}]},getSupportedRemoteCommands:function(){return["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"]},capabilities:function(){var caps={PlayableMediaTypes:["Audio","Video"],SupportedCommands:Dashboard.getSupportedRemoteCommands(),SupportsPersistentIdentifier:Dashboard.isRunningInCordova(),SupportsMediaControl:!0,SupportedLiveMediaTypes:["Audio","Video"]};return Dashboard.isRunningInCordova()&&!browserInfo.safari&&(caps.SupportsSync=!0,caps.SupportsContentUploading=!0),caps},normalizeImageOptions:function(options){AppInfo.hasLowImageBandwidth&&(options.enableImageEnhancers=!1);var setQuality;if(options.maxWidth&&(setQuality=!0),options.width&&(setQuality=!0),options.maxHeight&&(setQuality=!0),options.height&&(setQuality=!0),setQuality){var quality=90,isBackdrop="backdrop"==(options.type||"").toLowerCase();isBackdrop&&(quality-=10),browserInfo.slow&&(quality-=40),AppInfo.hasLowImageBandwidth&&!isBackdrop&&(quality-=10),options.quality=quality}}},AppInfo={};!function(){"use strict";function setAppInfo(){var isCordova=Dashboard.isRunningInCordova();AppInfo.enableHomeTabs=!0,AppInfo.enableAutoSave=browserInfo.touch,AppInfo.enableAppStorePolicy=isCordova;var isIOS=browserInfo.ipad||browserInfo.iphone,isAndroid=browserInfo.android;isIOS&&(AppInfo.hasLowImageBandwidth=!0),isCordova?(AppInfo.isNativeApp=!0,AppInfo.enableHomeTabs=!1,isAndroid&&(AppInfo.supportsExternalPlayers=!0)):AppInfo.enableSupporterMembership=!0,AppInfo.supportsFileInput=!(AppInfo.isNativeApp&&isAndroid),isCordova&&isIOS?AppInfo.moreIcon="more-horiz":AppInfo.moreIcon="more-vert",AppInfo.supportsUserDisplayLanguageSetting=Dashboard.isConnectMode()}function initializeApiClient(apiClient){AppInfo.enableAppStorePolicy&&(apiClient.getAvailablePlugins=function(){return Promise.resolve([])},apiClient.getInstalledPlugins=function(){return Promise.resolve([])}),apiClient.normalizeImageOptions=Dashboard.normalizeImageOptions,Events.off(apiClient,"requestfail",Dashboard.onRequestFail),Events.on(apiClient,"requestfail",Dashboard.onRequestFail)}function onApiClientCreated(e,newApiClient){initializeApiClient(newApiClient),window.$&&($.ajax=newApiClient.ajax)}function defineConnectionManager(connectionManager){window.ConnectionManager=connectionManager,define("connectionManager",[],function(){return connectionManager})}function bindConnectionManagerEvents(connectionManager,events,userSettings){window.Events=events,events.on(ConnectionManager,"apiclientcreated",onApiClientCreated),connectionManager.currentApiClient=function(){if(!localApiClient){var server=connectionManager.getLastUsedServer();server&&(localApiClient=connectionManager.getApiClient(server.Id))}return localApiClient},connectionManager.onLocalUserSignedIn=function(user){return localApiClient=connectionManager.getApiClient(user.ServerId),window.ApiClient=localApiClient,userSettings.setUserInfo(user.Id,localApiClient)},events.on(connectionManager,"localusersignedout",function(){userSettings.setUserInfo(null,null)})}function createConnectionManager(){return new Promise(function(resolve,reject){require(["connectionManagerFactory","apphost","credentialprovider","events","userSettings"],function(connectionManagerExports,apphost,credentialProvider,events,userSettings){window.MediaBrowser=Object.assign(window.MediaBrowser||{},connectionManagerExports);var credentialProviderInstance=new credentialProvider,promises=[apphost.getSyncProfile(),apphost.appInfo()];Promise.all(promises).then(function(responses){var deviceProfile=responses[0],appInfo=responses[1],capabilities=Dashboard.capabilities();capabilities.DeviceProfile=deviceProfile;var connectionManager=new MediaBrowser.ConnectionManager(credentialProviderInstance,appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,capabilities,window.devicePixelRatio);return defineConnectionManager(connectionManager),bindConnectionManagerEvents(connectionManager,events,userSettings),Dashboard.isConnectMode()?void resolve():(console.log("loading ApiClient singleton"),getRequirePromise(["apiclient"]).then(function(apiClientFactory){console.log("creating ApiClient singleton");var apiClient=new apiClientFactory(Dashboard.serverAddress(),appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,window.devicePixelRatio);apiClient.enableAutomaticNetworking=!1,connectionManager.addApiClient(apiClient),require(["css!"+apiClient.getUrl("Branding/Css")]),window.ApiClient=apiClient,localApiClient=apiClient,console.log("loaded ApiClient singleton"),resolve()}))})})})}function setDocumentClasses(browser){var elem=document.documentElement;AppInfo.enableSupporterMembership||elem.classList.add("supporterMembershipDisabled")}function loadTheme(){var name=getParameterByName("theme");if(name)return void require(["themes/"+name+"/theme"]);if(!AppInfo.isNativeApp){var date=new Date,month=date.getMonth(),day=date.getDate();return 9==month&&day>=30?void require(["themes/halloween/theme"]):void 0}}function returnFirstDependency(obj){return obj}function getBowerPath(){return"bower_components"}function getLayoutManager(layoutManager){return layoutManager.init(),layoutManager}function getAppStorage(basePath){try{return localStorage.setItem("_test","0"),localStorage.removeItem("_test"),basePath+"/appstorage-localstorage"}catch(e){return basePath+"/appstorage-memory"}}function createWindowHeadroom(){var headroom=new Headroom([],{tolerance:{down:0,up:0},classes:{}});return headroom.init(),headroom}function createMainContentHammer(Hammer){var hammer=new Hammer(document.querySelector(".mainDrawerPanelContent"),null);return hammer}function createSharedAppFooter(appFooter){var footer=new appFooter({});return footer}function initRequire(){var urlArgs="v="+(window.dashboardVersion||(new Date).getDate()),bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents",paths={velocity:bowerPath+"/velocity/velocity.min",vibrant:bowerPath+"/vibrant/dist/vibrant",ironCardList:"components/ironcardlist/ironcardlist",scrollThreshold:"components/scrollthreshold",playlisteditor:"components/playlisteditor/playlisteditor",medialibrarycreator:"components/medialibrarycreator/medialibrarycreator",medialibraryeditor:"components/medialibraryeditor/medialibraryeditor",howler:bowerPath+"/howlerjs/howler.min",sortable:bowerPath+"/Sortable/Sortable.min",isMobile:bowerPath+"/isMobile/isMobile.min",headroom:bowerPath+"/headroomjs/dist/headroom",masonry:bowerPath+"/masonry/dist/masonry.pkgd.min",humanedate:"components/humanedate",libraryBrowser:"scripts/librarybrowser",chromecasthelpers:"components/chromecasthelpers",events:apiClientBowerPath+"/events",credentialprovider:apiClientBowerPath+"/credentials",apiclient:apiClientBowerPath+"/apiclient",connectionManagerFactory:bowerPath+"/emby-apiclient/connectionmanager",visibleinviewport:embyWebComponentsBowerPath+"/visibleinviewport",browserdeviceprofile:embyWebComponentsBowerPath+"/browserdeviceprofile",browser:embyWebComponentsBowerPath+"/browser",inputManager:embyWebComponentsBowerPath+"/inputmanager",qualityoptions:embyWebComponentsBowerPath+"/qualityoptions",hammer:bowerPath+"/hammerjs/hammer.min",pageJs:embyWebComponentsBowerPath+"/pagejs/page",focusManager:embyWebComponentsBowerPath+"/focusmanager",datetime:embyWebComponentsBowerPath+"/datetime",globalize:embyWebComponentsBowerPath+"/globalize",itemHelper:embyWebComponentsBowerPath+"/itemhelper",itemShortcuts:embyWebComponentsBowerPath+"/shortcuts",serverNotifications:embyWebComponentsBowerPath+"/servernotifications",playbackManager:embyWebComponentsBowerPath+"/playback/playbackmanager",autoPlayDetect:embyWebComponentsBowerPath+"/playback/autoplaydetect",nowPlayingHelper:embyWebComponentsBowerPath+"/playback/nowplayinghelper",pluginManager:embyWebComponentsBowerPath+"/pluginmanager",packageManager:embyWebComponentsBowerPath+"/packagemanager",webAnimations:bowerPath+"/web-animations-js/web-animations-next-lite.min"};paths.hlsjs=bowerPath+"/hlsjs/dist/hls.min",define("webActionSheet",[embyWebComponentsBowerPath+"/actionsheet/actionsheet"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.sharingMenu="cordova/sharingwidget":define("sharingMenu",[embyWebComponentsBowerPath+"/sharing/sharingmenu"],returnFirstDependency),paths.wakeonlan=apiClientBowerPath+"/wakeonlan",define("libjass",[bowerPath+"/libjass/libjass.min","css!"+bowerPath+"/libjass/libjass"],returnFirstDependency),window.IntersectionObserver?define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-intersectionobserver"],returnFirstDependency):define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-scroll"],returnFirstDependency),define("imageLoader",[embyWebComponentsBowerPath+"/images/imagehelper"],returnFirstDependency),define("appfooter",["components/appfooter/appfooter"],returnFirstDependency),define("dockedtabs",["components/dockedtabs/dockedtabs"],returnFirstDependency),define("directorybrowser",["components/directorybrowser/directorybrowser"],returnFirstDependency),define("metadataEditor",[embyWebComponentsBowerPath+"/metadataeditor/metadataeditor"],returnFirstDependency),define("personEditor",[embyWebComponentsBowerPath+"/metadataeditor/personeditor"],returnFirstDependency),define("playerSelectionMenu",[embyWebComponentsBowerPath+"/playback/playerselection"],returnFirstDependency),define("playerSettingsMenu",[embyWebComponentsBowerPath+"/playback/playersettingsmenu"],returnFirstDependency),define("libraryMenu",["scripts/librarymenu"],returnFirstDependency),define("emby-collapse",[embyWebComponentsBowerPath+"/emby-collapse/emby-collapse"],returnFirstDependency),define("emby-button",[embyWebComponentsBowerPath+"/emby-button/emby-button"],returnFirstDependency),define("emby-itemscontainer",[embyWebComponentsBowerPath+"/emby-itemscontainer/emby-itemscontainer"],returnFirstDependency),define("emby-tabs",[embyWebComponentsBowerPath+"/emby-tabs/emby-tabs"],returnFirstDependency),define("itemHoverMenu",[embyWebComponentsBowerPath+"/itemhovermenu/itemhovermenu"],returnFirstDependency),define("multiSelect",[embyWebComponentsBowerPath+"/multiselect/multiselect"],returnFirstDependency),define("alphaPicker",[embyWebComponentsBowerPath+"/alphapicker/alphapicker"],returnFirstDependency),define("paper-icon-button-light",[embyWebComponentsBowerPath+"/emby-button/paper-icon-button-light"]),define("connectHelper",[embyWebComponentsBowerPath+"/emby-connect/connecthelper"],returnFirstDependency),define("emby-input",[embyWebComponentsBowerPath+"/emby-input/emby-input"],returnFirstDependency),define("emby-select",[embyWebComponentsBowerPath+"/emby-select/emby-select"],returnFirstDependency),define("emby-slider",[embyWebComponentsBowerPath+"/emby-slider/emby-slider"],returnFirstDependency),define("emby-checkbox",[embyWebComponentsBowerPath+"/emby-checkbox/emby-checkbox"],returnFirstDependency),define("emby-toggle",[embyWebComponentsBowerPath+"/emby-toggle/emby-toggle"],returnFirstDependency),define("emby-radio",[embyWebComponentsBowerPath+"/emby-radio/emby-radio"],returnFirstDependency),define("emby-textarea",[embyWebComponentsBowerPath+"/emby-textarea/emby-textarea"],returnFirstDependency),define("collectionEditor",[embyWebComponentsBowerPath+"/collectioneditor/collectioneditor"],returnFirstDependency),define("playlistEditor",[embyWebComponentsBowerPath+"/playlisteditor/playlisteditor"],returnFirstDependency),define("recordingCreator",[embyWebComponentsBowerPath+"/recordingcreator/recordingcreator"],returnFirstDependency),define("recordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/recordingeditor"],returnFirstDependency),define("seriesRecordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/seriesrecordingeditor"],returnFirstDependency),define("recordingFields",[embyWebComponentsBowerPath+"/recordingcreator/recordingfields"],returnFirstDependency),define("recordingHelper",[embyWebComponentsBowerPath+"/recordingcreator/recordinghelper"],returnFirstDependency),define("subtitleEditor",[embyWebComponentsBowerPath+"/subtitleeditor/subtitleeditor"],returnFirstDependency),define("itemIdentifier",[embyWebComponentsBowerPath+"/itemidentifier/itemidentifier"],returnFirstDependency),define("mediaInfo",[embyWebComponentsBowerPath+"/mediainfo/mediainfo"],returnFirstDependency),define("itemContextMenu",[embyWebComponentsBowerPath+"/itemcontextmenu"],returnFirstDependency),define("imageEditor",[embyWebComponentsBowerPath+"/imageeditor/imageeditor"],returnFirstDependency),define("dom",[embyWebComponentsBowerPath+"/dom"],returnFirstDependency),define("fullscreen-doubleclick",[embyWebComponentsBowerPath+"/fullscreen/fullscreen-doubleclick"],returnFirstDependency),define("fullscreenManager",[embyWebComponentsBowerPath+"/fullscreen/fullscreenmanager","events"],returnFirstDependency),define("layoutManager",[embyWebComponentsBowerPath+"/layoutmanager"],getLayoutManager),define("playMenu",[embyWebComponentsBowerPath+"/playmenu"],returnFirstDependency),define("refreshDialog",[embyWebComponentsBowerPath+"/refreshdialog/refreshdialog"],returnFirstDependency),define("backdrop",[embyWebComponentsBowerPath+"/backdrop/backdrop"],returnFirstDependency),define("fetchHelper",[embyWebComponentsBowerPath+"/fetchhelper"],returnFirstDependency),define("roundCardStyle",["cardStyle","css!"+embyWebComponentsBowerPath+"/cardbuilder/roundcard"],returnFirstDependency),define("cardStyle",["css!"+embyWebComponentsBowerPath+"/cardbuilder/card"],returnFirstDependency),define("cardBuilder",[embyWebComponentsBowerPath+"/cardbuilder/cardbuilder"],returnFirstDependency),define("peoplecardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/peoplecardbuilder"],returnFirstDependency),define("chaptercardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/chaptercardbuilder"],returnFirstDependency),define("mouseManager",[embyWebComponentsBowerPath+"/input/mouse"],returnFirstDependency),define("deleteHelper",[embyWebComponentsBowerPath+"/deletehelper"],returnFirstDependency),define("tvguide",[embyWebComponentsBowerPath+"/guide/guide"],returnFirstDependency),define("programStyles",["css!"+embyWebComponentsBowerPath+"/guide/programs"],returnFirstDependency),define("guide-settings-dialog",[embyWebComponentsBowerPath+"/guide/guide-settings"],returnFirstDependency),define("syncDialog",[embyWebComponentsBowerPath+"/sync/sync"],returnFirstDependency),define("syncToggle",[embyWebComponentsBowerPath+"/sync/synctoggle"],returnFirstDependency),define("syncJobEditor",[embyWebComponentsBowerPath+"/sync/syncjobeditor"],returnFirstDependency),define("syncJobList",[embyWebComponentsBowerPath+"/sync/syncjoblist"],returnFirstDependency),define("voiceDialog",[embyWebComponentsBowerPath+"/voice/voicedialog"],returnFirstDependency),define("voiceReceiver",[embyWebComponentsBowerPath+"/voice/voicereceiver"],returnFirstDependency),define("voiceProcessor",[embyWebComponentsBowerPath+"/voice/voiceprocessor"],returnFirstDependency),define("viewManager",[embyWebComponentsBowerPath+"/viewmanager/viewmanager"],function(viewManager){return window.ViewManager=viewManager,viewManager.dispatchPageEvents(!0),viewManager}),Dashboard.isRunningInCordova()&&window.MainActivity?define("shell",["cordova/shell"],returnFirstDependency):define("shell",[embyWebComponentsBowerPath+"/shell"],returnFirstDependency),define("sharingmanager",[embyWebComponentsBowerPath+"/sharing/sharingmanager"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.apphost="cordova/apphost":paths.apphost="components/apphost",Dashboard.isRunningInCordova()&&window.MainActivity?(paths.appStorage="cordova/appstorage",paths.filesystem="cordova/filesystem"):(paths.appStorage=getAppStorage(apiClientBowerPath),paths.filesystem=embyWebComponentsBowerPath+"/filesystem");var sha1Path=bowerPath+"/cryptojslib/components/sha1-min",md5Path=bowerPath+"/cryptojslib/components/md5-min",shim={};shim[sha1Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},shim[md5Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},requirejs.config({waitSeconds:0,map:{"*":{css:bowerPath+"/emby-webcomponents/require/requirecss",html:bowerPath+"/emby-webcomponents/require/requirehtml",text:bowerPath+"/emby-webcomponents/require/requiretext"}},urlArgs:urlArgs,paths:paths,shim:shim}),define("cryptojs-sha1",[sha1Path]),define("cryptojs-md5",[md5Path]),define("jstree",[bowerPath+"/jstree/dist/jstree","css!thirdparty/jstree/themes/default/style.min.css"]),define("dashboardcss",["css!css/dashboard"]),define("jqmtable",["thirdparty/jquerymobile-1.4.5/jqm.table","css!thirdparty/jquerymobile-1.4.5/jqm.table.css"]),define("jqmwidget",["thirdparty/jquerymobile-1.4.5/jqm.widget"]),define("jqmslider",["thirdparty/jquerymobile-1.4.5/jqm.slider","css!thirdparty/jquerymobile-1.4.5/jqm.slider.css"]),define("jqmpopup",["thirdparty/jquerymobile-1.4.5/jqm.popup","css!thirdparty/jquerymobile-1.4.5/jqm.popup.css"]),define("jqmlistview",["css!thirdparty/jquerymobile-1.4.5/jqm.listview.css"]),define("jqmpanel",["thirdparty/jquerymobile-1.4.5/jqm.panel","css!thirdparty/jquerymobile-1.4.5/jqm.panel.css"]),define("slideshow",[embyWebComponentsBowerPath+"/slideshow/slideshow"],returnFirstDependency),define("fetch",[bowerPath+"/fetch/fetch"]),define("raf",[embyWebComponentsBowerPath+"/polyfills/raf"]),define("functionbind",[embyWebComponentsBowerPath+"/polyfills/bind"]),define("arraypolyfills",[embyWebComponentsBowerPath+"/polyfills/array"]),define("objectassign",[embyWebComponentsBowerPath+"/polyfills/objectassign"]),define("clearButtonStyle",["css!"+embyWebComponentsBowerPath+"/clearbutton"]),define("userdataButtons",[embyWebComponentsBowerPath+"/userdatabuttons/userdatabuttons"],returnFirstDependency),define("listView",[embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("listViewStyle",["css!"+embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("formDialogStyle",["css!"+embyWebComponentsBowerPath+"/formdialog"],returnFirstDependency),define("indicators",[embyWebComponentsBowerPath+"/indicators/indicators"],returnFirstDependency),define("registrationServices",[embyWebComponentsBowerPath+"/registrationservices/registrationservices"],returnFirstDependency),Dashboard.isRunningInCordova()?(define("iapManager",["cordova/iap"],returnFirstDependency),define("fileupload",["cordova/fileupload"],returnFirstDependency)):(define("iapManager",["components/iap"],returnFirstDependency),define("fileupload",[apiClientBowerPath+"/fileupload"],returnFirstDependency)),define("connectionmanager",[apiClientBowerPath+"/connectionmanager"]),define("cameraRoll",[apiClientBowerPath+"/cameraroll"],returnFirstDependency),define("contentuploader",[apiClientBowerPath+"/sync/contentuploader"]),define("serversync",[apiClientBowerPath+"/sync/serversync"]),define("multiserversync",[apiClientBowerPath+"/sync/multiserversync"]),define("offlineusersync",[apiClientBowerPath+"/sync/offlineusersync"]),define("mediasync",[apiClientBowerPath+"/sync/mediasync"]),define("swiper",[bowerPath+"/Swiper/dist/js/swiper.min","css!"+bowerPath+"/Swiper/dist/css/swiper.min"],returnFirstDependency),define("scroller",[embyWebComponentsBowerPath+"/scroller/smoothscroller"],returnFirstDependency),define("toast",[embyWebComponentsBowerPath+"/toast/toast"],returnFirstDependency),define("scrollHelper",[embyWebComponentsBowerPath+"/scrollhelper"],returnFirstDependency),define("appSettings",[embyWebComponentsBowerPath+"/appsettings"],updateAppSettings),define("userSettings",[embyWebComponentsBowerPath+"/usersettings/usersettings"],returnFirstDependency),define("userSettingsBuilder",[embyWebComponentsBowerPath+"/usersettings/usersettingsbuilder"],returnFirstDependency),define("material-icons",["css!"+embyWebComponentsBowerPath+"/fonts/material-icons/style"]),define("robotoFont",["css!"+embyWebComponentsBowerPath+"/fonts/roboto/style"]),define("scrollStyles",["css!"+embyWebComponentsBowerPath+"/scrollstyles"]),define("navdrawer",["components/navdrawer/navdrawer"],returnFirstDependency),define("viewcontainer",["components/viewcontainer-lite","css!"+embyWebComponentsBowerPath+"/viewmanager/viewcontainer-lite"],returnFirstDependency),define("queryString",[bowerPath+"/query-string/index"],function(){return queryString}),define("jQuery",[bowerPath+"/jquery/dist/jquery.slim.min"],function(){return window.ApiClient&&(jQuery.ajax=ApiClient.ajax),jQuery}),define("fnchecked",["legacy/fnchecked"]),define("dialogHelper",[embyWebComponentsBowerPath+"/dialoghelper/dialoghelper"],function(dialoghelper){return dialoghelper.setOnOpen(onDialogOpen),dialoghelper}),define("inputmanager",["inputManager"],returnFirstDependency),define("historyManager",["embyRouter"],returnFirstDependency),define("headroom-window",["headroom"],createWindowHeadroom),define("hammer-main",["hammer"],createMainContentHammer),define("appfooter-shared",["appfooter"],createSharedAppFooter),define("skinManager",[],function(){return{loadUserSkin:function(){Emby.Page.show("/home.html")}}}),define("connectionManager",[],function(){return ConnectionManager}),define("apiClientResolver",[],function(){return function(){return window.ApiClient}}),define("embyRouter",[embyWebComponentsBowerPath+"/router"],function(embyRouter){function showItem(item,serverId,options){if("string"==typeof item)require(["connectionManager"],function(connectionManager){var apiClient=connectionManager.currentApiClient();apiClient.getItem(apiClient.getCurrentUserId(),item).then(function(item){embyRouter.showItem(item,options)})});else{2==arguments.length&&(options=arguments[1]);var context=options?options.context:null;Emby.Page.show("/"+LibraryBrowser.getHref(item,context),{item:item})}}return embyRouter.showLocalLogin=function(apiClient,serverId,manualLogin){Dashboard.navigate("login.html?serverid="+serverId)},embyRouter.showVideoOsd=function(){return Dashboard.navigate("videoosd.html")},embyRouter.showSelectServer=function(){Dashboard.navigate("selectserver.html")},embyRouter.showWelcome=function(){Dashboard.isConnectMode()?Dashboard.navigate("connectlogin.html?mode=welcome"):Dashboard.navigate("login.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.showGuide=function(){Dashboard.navigate("livetv.html?tab=1"); +function getWindowLocationSearch(win){"use strict";var search=(win||window).location.search;if(!search){var index=window.location.href.indexOf("?");index!=-1&&(search=window.location.href.substring(index))}return search||""}function getParameterByName(name,url){"use strict";name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regexS="[\\?&]"+name+"=([^&#]*)",regex=new RegExp(regexS,"i"),results=regex.exec(url||getWindowLocationSearch());return null==results?"":decodeURIComponent(results[1].replace(/\+/g," "))}function pageClassOn(eventName,className,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.classList.contains(className)&&fn.call(target,e)})}function pageIdOn(eventName,id,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.id==id&&fn.call(target,e)})}var Dashboard={isConnectMode:function(){if(AppInfo.isNativeApp)return!0;var url=window.location.href.toLowerCase();return url.indexOf("mediabrowser.tv")!=-1||url.indexOf("emby.media")!=-1},isRunningInCordova:function(){return"cordova"==window.appMode},onRequestFail:function(e,data){if(401==data.status&&"ParentalControl"==data.errorCode){var currentView=ViewManager.currentView();currentView&&!currentView.classList.contains(".standalonePage")&&Dashboard.alert({message:Globalize.translate("MessageLoggedOutParentalControl"),callback:function(){Dashboard.logout(!1)}})}},getCurrentUser:function(){return window.ApiClient.getCurrentUser()},serverAddress:function(){if(Dashboard.isConnectMode()){var apiClient=window.ApiClient;return apiClient?apiClient.serverAddress():null}var urlLower=window.location.href.toLowerCase(),index=urlLower.lastIndexOf("/web");if(index!=-1)return urlLower.substring(0,index);var loc=window.location,address=loc.protocol+"//"+loc.hostname;return loc.port&&(address+=":"+loc.port),address},getCurrentUserId:function(){var apiClient=window.ApiClient;return apiClient?apiClient.getCurrentUserId():null},onServerChanged:function(userId,accessToken,apiClient){apiClient=apiClient||window.ApiClient,window.ApiClient=apiClient},logout:function(logoutWithServer){function onLogoutDone(){var loginPage;Dashboard.isConnectMode()?(loginPage="connectlogin.html",window.ApiClient=null):loginPage="login.html",Dashboard.navigate(loginPage)}logoutWithServer===!1?onLogoutDone():ConnectionManager.logout().then(onLogoutDone)},getConfigurationPageUrl:function(name){return"configurationpage?name="+encodeURIComponent(name)},navigate:function(url,preserveQueryString){if(!url)throw new Error("url cannot be null or empty");var queryString=getWindowLocationSearch();return preserveQueryString&&queryString&&(url+=queryString),Emby.Page.show(url)},showLoadingMsg:function(){Dashboard.loadingVisible=!0,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},hideLoadingMsg:function(){Dashboard.loadingVisible=!1,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},processPluginConfigurationUpdateResult:function(){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processServerConfigurationUpdateResult:function(result){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processErrorResponse:function(response){Dashboard.hideLoadingMsg();var status=""+response.status;response.statusText&&(status=response.statusText),Dashboard.alert({title:status,message:response.headers?response.headers.get("X-Application-Error-Code"):null})},alert:function(options){return"string"==typeof options?void require(["toast"],function(toast){toast({text:options})}):void require(["alert"],function(alert){alert({title:options.title||Globalize.translate("HeaderAlert"),text:options.message}).then(options.callback||function(){})})},restartServer:function(){var apiClient=window.ApiClient;apiClient&&(Dashboard.suppressAjaxErrors=!0,Dashboard.showLoadingMsg(),apiClient.restartServer().then(function(){setTimeout(function(){Dashboard.reloadPageWhenServerAvailable()},250)},function(){Dashboard.suppressAjaxErrors=!1}))},reloadPageWhenServerAvailable:function(retryCount){var apiClient=window.ApiClient;apiClient&&apiClient.getJSON(apiClient.getUrl("System/Info")).then(function(info){info.HasPendingRestart?Dashboard.retryReload(retryCount):window.location.reload(!0)},function(){Dashboard.retryReload(retryCount)})},retryReload:function(retryCount){setTimeout(function(){retryCount=retryCount||0,retryCount++,retryCount<10?Dashboard.reloadPageWhenServerAvailable(retryCount):Dashboard.suppressAjaxErrors=!1},500)},showUserFlyout:function(){Dashboard.navigate("mypreferencesmenu.html")},getPluginSecurityInfo:function(){var apiClient=window.ApiClient;if(!apiClient)return Promise.reject();var cachedInfo=Dashboard.pluginSecurityInfo;return cachedInfo?Promise.resolve(cachedInfo):apiClient.ajax({type:"GET",url:apiClient.getUrl("Plugins/SecurityInfo"),dataType:"json",error:function(){}}).then(function(result){return Dashboard.pluginSecurityInfo=result,result})},resetPluginSecurityInfo:function(){Dashboard.pluginSecurityInfo=null},ensureHeader:function(page){page.classList.contains("standalonePage")&&!page.classList.contains("noHeaderPage")&&Dashboard.renderHeader(page)},renderHeader:function(page){var header=page.querySelector(".header");if(!header){var headerHtml="";headerHtml+='",page.insertAdjacentHTML("afterbegin",headerHtml)}},getToolsLinkHtml:function(item){var menuHtml="",pageIds=item.pageIds?item.pageIds.join(","):"";return pageIds=pageIds?' data-pageids="'+pageIds+'"':"",menuHtml+='",menuHtml+='',menuHtml+=item.name,menuHtml+="",menuHtml+=""},getToolsMenuHtml:function(page){var i,length,item,items=Dashboard.getToolsMenuLinks(page),menuHtml="";for(menuHtml+='
',i=0,length=items.length;i
"),item.href?menuHtml+=Dashboard.getToolsLinkHtml(item):(menuHtml+='
',menuHtml+=item.name,menuHtml+="
");return menuHtml+="
"},getToolsMenuLinks:function(){return[{name:Globalize.translate("TabServer")},{name:Globalize.translate("TabDashboard"),href:"dashboard.html",pageIds:["dashboardPage"],icon:"dashboard"},{name:Globalize.translate("TabSettings"),href:"dashboardgeneral.html",pageIds:["dashboardGeneralPage"],icon:"settings"},{name:Globalize.translate("TabDevices"),href:"devices.html",pageIds:["devicesPage","devicePage"],icon:"tablet"},{name:Globalize.translate("TabUsers"),href:"userprofiles.html",pageIds:["userProfilesPage","newUserPage","editUserPage","userLibraryAccessPage","userParentalControlPage","userPasswordPage"],icon:"people"},{name:"Emby Premiere",href:"supporterkey.html",pageIds:["supporterKeyPage"],icon:"star"},{divider:!0,name:Globalize.translate("TabLibrary"),href:"library.html",pageIds:["mediaLibraryPage","librarySettingsPage","libraryDisplayPage","metadataImagesConfigurationPage","metadataNfoPage"],icon:"folder",color:"#38c"},{name:Globalize.translate("TabSubtitles"),href:"metadatasubtitles.html",pageIds:["metadataSubtitlesPage"],icon:"closed_caption"},{name:Globalize.translate("TabPlayback"),icon:"play_circle_filled",color:"#E5342E",href:"cinemamodeconfiguration.html",pageIds:["cinemaModeConfigurationPage","playbackConfigurationPage","streamingSettingsPage"]},{name:Globalize.translate("TabSync"),icon:"sync",href:"syncactivity.html",pageIds:["syncActivityPage","syncJobPage","devicesUploadPage","syncSettingsPage"],color:"#009688"},{name:Globalize.translate("TabTranscoding"),icon:"transform",href:"encodingsettings.html",pageIds:["encodingSettingsPage"]},{divider:!0,name:Globalize.translate("TabExtras")},{name:Globalize.translate("TabAutoOrganize"),color:"#01C0DD",href:"autoorganizelog.html",pageIds:["libraryFileOrganizerPage","libraryFileOrganizerSmartMatchPage","libraryFileOrganizerLogPage"],icon:"folder"},{name:Globalize.translate("DLNA"),href:"dlnasettings.html",pageIds:["dlnaSettingsPage","dlnaProfilesPage","dlnaProfilePage"],icon:"settings"},{name:Globalize.translate("TabLiveTV"),href:"livetvstatus.html",pageIds:["liveTvStatusPage","liveTvSettingsPage","liveTvTunerProviderHdHomerunPage","liveTvTunerProviderM3UPage","liveTvTunerProviderSatPage"],icon:"dvr"},{name:Globalize.translate("TabNotifications"),icon:"notifications",color:"brown",href:"notificationsettings.html",pageIds:["notificationSettingsPage","notificationSettingPage"]},{name:Globalize.translate("TabPlugins"),icon:"add_shopping_cart",color:"#9D22B1",href:"plugins.html",pageIds:["pluginsPage","pluginCatalogPage"]},{divider:!0,name:Globalize.translate("TabExpert")},{name:Globalize.translate("TabAdvanced"),icon:"settings",href:"dashboardhosting.html",color:"#F16834",pageIds:["dashboardHostingPage","serverSecurityPage"]},{name:Globalize.translate("TabLogs"),href:"log.html",pageIds:["logPage"],icon:"folder_open"},{name:Globalize.translate("TabScheduledTasks"),href:"scheduledtasks.html",pageIds:["scheduledTasksPage","scheduledTaskPage"],icon:"schedule"},{name:Globalize.translate("MetadataManager"),href:"edititemmetadata.html",pageIds:[],icon:"mode_edit"},{name:Globalize.translate("ButtonReports"),href:"reports.html",pageIds:[],icon:"insert_chart"}]},getSupportedRemoteCommands:function(){return["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"]},capabilities:function(){var caps={PlayableMediaTypes:["Audio","Video"],SupportedCommands:Dashboard.getSupportedRemoteCommands(),SupportsPersistentIdentifier:Dashboard.isRunningInCordova(),SupportsMediaControl:!0,SupportedLiveMediaTypes:["Audio","Video"]};return Dashboard.isRunningInCordova()&&!browserInfo.safari&&(caps.SupportsSync=!0,caps.SupportsContentUploading=!0),caps},normalizeImageOptions:function(options){AppInfo.hasLowImageBandwidth&&(options.enableImageEnhancers=!1);var setQuality;if(options.maxWidth&&(setQuality=!0),options.width&&(setQuality=!0),options.maxHeight&&(setQuality=!0),options.height&&(setQuality=!0),setQuality){var quality=90,isBackdrop="backdrop"==(options.type||"").toLowerCase();isBackdrop&&(quality-=10),browserInfo.slow&&(quality-=40),AppInfo.hasLowImageBandwidth&&!isBackdrop&&(quality-=10),options.quality=quality}}},AppInfo={};!function(){"use strict";function setAppInfo(){var isCordova=Dashboard.isRunningInCordova();AppInfo.enableHomeTabs=!0,AppInfo.enableAutoSave=browserInfo.touch,AppInfo.enableAppStorePolicy=isCordova;var isIOS=browserInfo.ipad||browserInfo.iphone,isAndroid=browserInfo.android;isIOS&&(AppInfo.hasLowImageBandwidth=!0),isCordova?(AppInfo.isNativeApp=!0,AppInfo.enableHomeTabs=!1,isAndroid&&(AppInfo.supportsExternalPlayers=!0)):AppInfo.enableSupporterMembership=!0,AppInfo.supportsFileInput=!(AppInfo.isNativeApp&&isAndroid),isCordova&&isIOS?AppInfo.moreIcon="more-horiz":AppInfo.moreIcon="more-vert",AppInfo.supportsUserDisplayLanguageSetting=Dashboard.isConnectMode()}function initializeApiClient(apiClient){AppInfo.enableAppStorePolicy&&(apiClient.getAvailablePlugins=function(){return Promise.resolve([])},apiClient.getInstalledPlugins=function(){return Promise.resolve([])}),apiClient.normalizeImageOptions=Dashboard.normalizeImageOptions,Events.off(apiClient,"requestfail",Dashboard.onRequestFail),Events.on(apiClient,"requestfail",Dashboard.onRequestFail)}function onApiClientCreated(e,newApiClient){initializeApiClient(newApiClient),window.$&&($.ajax=newApiClient.ajax)}function defineConnectionManager(connectionManager){window.ConnectionManager=connectionManager,define("connectionManager",[],function(){return connectionManager})}function bindConnectionManagerEvents(connectionManager,events,userSettings){window.Events=events,events.on(ConnectionManager,"apiclientcreated",onApiClientCreated),connectionManager.currentApiClient=function(){if(!localApiClient){var server=connectionManager.getLastUsedServer();server&&(localApiClient=connectionManager.getApiClient(server.Id))}return localApiClient},connectionManager.onLocalUserSignedIn=function(user){return localApiClient=connectionManager.getApiClient(user.ServerId),window.ApiClient=localApiClient,userSettings.setUserInfo(user.Id,localApiClient)},events.on(connectionManager,"localusersignedout",function(){userSettings.setUserInfo(null,null)})}function createConnectionManager(){return new Promise(function(resolve,reject){require(["connectionManagerFactory","apphost","credentialprovider","events","userSettings"],function(connectionManagerExports,apphost,credentialProvider,events,userSettings){window.MediaBrowser=Object.assign(window.MediaBrowser||{},connectionManagerExports);var credentialProviderInstance=new credentialProvider,promises=[apphost.getSyncProfile(),apphost.appInfo()];Promise.all(promises).then(function(responses){var deviceProfile=responses[0],appInfo=responses[1],capabilities=Dashboard.capabilities();capabilities.DeviceProfile=deviceProfile;var connectionManager=new MediaBrowser.ConnectionManager(credentialProviderInstance,appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,capabilities,window.devicePixelRatio);return defineConnectionManager(connectionManager),bindConnectionManagerEvents(connectionManager,events,userSettings),Dashboard.isConnectMode()?void resolve():(console.log("loading ApiClient singleton"),getRequirePromise(["apiclient"]).then(function(apiClientFactory){console.log("creating ApiClient singleton");var apiClient=new apiClientFactory(Dashboard.serverAddress(),appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,window.devicePixelRatio);apiClient.enableAutomaticNetworking=!1,connectionManager.addApiClient(apiClient),require(["css!"+apiClient.getUrl("Branding/Css")]),window.ApiClient=apiClient,localApiClient=apiClient,console.log("loaded ApiClient singleton"),resolve()}))})})})}function setDocumentClasses(browser){var elem=document.documentElement;AppInfo.enableSupporterMembership||elem.classList.add("supporterMembershipDisabled")}function loadTheme(){var name=getParameterByName("theme");if(name)return void require(["themes/"+name+"/theme"]);if(!AppInfo.isNativeApp){var date=new Date,month=date.getMonth(),day=date.getDate();return 9==month&&day>=30?void require(["themes/halloween/theme"]):void 0}}function returnFirstDependency(obj){return obj}function getBowerPath(){return"bower_components"}function getLayoutManager(layoutManager){return layoutManager.init(),layoutManager}function getAppStorage(basePath){try{return localStorage.setItem("_test","0"),localStorage.removeItem("_test"),basePath+"/appstorage-localstorage"}catch(e){return basePath+"/appstorage-memory"}}function createWindowHeadroom(){var headroom=new Headroom([],{tolerance:{down:0,up:0},classes:{}});return headroom.init(),headroom}function createMainContentHammer(Hammer){var hammer=new Hammer(document.querySelector(".skinBody"),null);return hammer}function createSharedAppFooter(appFooter){var footer=new appFooter({});return footer}function initRequire(){var urlArgs="v="+(window.dashboardVersion||(new Date).getDate()),bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents",paths={velocity:bowerPath+"/velocity/velocity.min",vibrant:bowerPath+"/vibrant/dist/vibrant",ironCardList:"components/ironcardlist/ironcardlist",scrollThreshold:"components/scrollthreshold",playlisteditor:"components/playlisteditor/playlisteditor",medialibrarycreator:"components/medialibrarycreator/medialibrarycreator",medialibraryeditor:"components/medialibraryeditor/medialibraryeditor",howler:bowerPath+"/howlerjs/howler.min",sortable:bowerPath+"/Sortable/Sortable.min",isMobile:bowerPath+"/isMobile/isMobile.min",headroom:bowerPath+"/headroomjs/dist/headroom",masonry:bowerPath+"/masonry/dist/masonry.pkgd.min",humanedate:"components/humanedate",libraryBrowser:"scripts/librarybrowser",chromecasthelpers:"components/chromecasthelpers",events:apiClientBowerPath+"/events",credentialprovider:apiClientBowerPath+"/credentials",apiclient:apiClientBowerPath+"/apiclient",connectionManagerFactory:bowerPath+"/emby-apiclient/connectionmanager",visibleinviewport:embyWebComponentsBowerPath+"/visibleinviewport",browserdeviceprofile:embyWebComponentsBowerPath+"/browserdeviceprofile",browser:embyWebComponentsBowerPath+"/browser",inputManager:embyWebComponentsBowerPath+"/inputmanager",qualityoptions:embyWebComponentsBowerPath+"/qualityoptions",hammer:bowerPath+"/hammerjs/hammer.min",pageJs:embyWebComponentsBowerPath+"/pagejs/page",focusManager:embyWebComponentsBowerPath+"/focusmanager",datetime:embyWebComponentsBowerPath+"/datetime",globalize:embyWebComponentsBowerPath+"/globalize",itemHelper:embyWebComponentsBowerPath+"/itemhelper",itemShortcuts:embyWebComponentsBowerPath+"/shortcuts",serverNotifications:embyWebComponentsBowerPath+"/servernotifications",playbackManager:embyWebComponentsBowerPath+"/playback/playbackmanager",autoPlayDetect:embyWebComponentsBowerPath+"/playback/autoplaydetect",nowPlayingHelper:embyWebComponentsBowerPath+"/playback/nowplayinghelper",pluginManager:embyWebComponentsBowerPath+"/pluginmanager",packageManager:embyWebComponentsBowerPath+"/packagemanager",webAnimations:bowerPath+"/web-animations-js/web-animations-next-lite.min"};paths.hlsjs=bowerPath+"/hlsjs/dist/hls.min",define("webActionSheet",[embyWebComponentsBowerPath+"/actionsheet/actionsheet"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.sharingMenu="cordova/sharingwidget":define("sharingMenu",[embyWebComponentsBowerPath+"/sharing/sharingmenu"],returnFirstDependency),paths.wakeonlan=apiClientBowerPath+"/wakeonlan",define("libjass",[bowerPath+"/libjass/libjass.min","css!"+bowerPath+"/libjass/libjass"],returnFirstDependency),window.IntersectionObserver?define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-intersectionobserver"],returnFirstDependency):define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-scroll"],returnFirstDependency),define("imageLoader",[embyWebComponentsBowerPath+"/images/imagehelper"],returnFirstDependency),define("appfooter",["components/appfooter/appfooter"],returnFirstDependency),define("dockedtabs",["components/dockedtabs/dockedtabs"],returnFirstDependency),define("directorybrowser",["components/directorybrowser/directorybrowser"],returnFirstDependency),define("metadataEditor",[embyWebComponentsBowerPath+"/metadataeditor/metadataeditor"],returnFirstDependency),define("personEditor",[embyWebComponentsBowerPath+"/metadataeditor/personeditor"],returnFirstDependency),define("playerSelectionMenu",[embyWebComponentsBowerPath+"/playback/playerselection"],returnFirstDependency),define("playerSettingsMenu",[embyWebComponentsBowerPath+"/playback/playersettingsmenu"],returnFirstDependency),define("libraryMenu",["scripts/librarymenu"],returnFirstDependency),define("emby-collapse",[embyWebComponentsBowerPath+"/emby-collapse/emby-collapse"],returnFirstDependency),define("emby-button",[embyWebComponentsBowerPath+"/emby-button/emby-button"],returnFirstDependency),define("emby-itemscontainer",[embyWebComponentsBowerPath+"/emby-itemscontainer/emby-itemscontainer"],returnFirstDependency),define("emby-tabs",[embyWebComponentsBowerPath+"/emby-tabs/emby-tabs"],returnFirstDependency),define("itemHoverMenu",[embyWebComponentsBowerPath+"/itemhovermenu/itemhovermenu"],returnFirstDependency),define("multiSelect",[embyWebComponentsBowerPath+"/multiselect/multiselect"],returnFirstDependency),define("alphaPicker",[embyWebComponentsBowerPath+"/alphapicker/alphapicker"],returnFirstDependency),define("paper-icon-button-light",[embyWebComponentsBowerPath+"/emby-button/paper-icon-button-light"]),define("connectHelper",[embyWebComponentsBowerPath+"/emby-connect/connecthelper"],returnFirstDependency),define("emby-input",[embyWebComponentsBowerPath+"/emby-input/emby-input"],returnFirstDependency),define("emby-select",[embyWebComponentsBowerPath+"/emby-select/emby-select"],returnFirstDependency),define("emby-slider",[embyWebComponentsBowerPath+"/emby-slider/emby-slider"],returnFirstDependency),define("emby-checkbox",[embyWebComponentsBowerPath+"/emby-checkbox/emby-checkbox"],returnFirstDependency),define("emby-toggle",[embyWebComponentsBowerPath+"/emby-toggle/emby-toggle"],returnFirstDependency),define("emby-radio",[embyWebComponentsBowerPath+"/emby-radio/emby-radio"],returnFirstDependency),define("emby-textarea",[embyWebComponentsBowerPath+"/emby-textarea/emby-textarea"],returnFirstDependency),define("collectionEditor",[embyWebComponentsBowerPath+"/collectioneditor/collectioneditor"],returnFirstDependency),define("playlistEditor",[embyWebComponentsBowerPath+"/playlisteditor/playlisteditor"],returnFirstDependency),define("recordingCreator",[embyWebComponentsBowerPath+"/recordingcreator/recordingcreator"],returnFirstDependency),define("recordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/recordingeditor"],returnFirstDependency),define("seriesRecordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/seriesrecordingeditor"],returnFirstDependency),define("recordingFields",[embyWebComponentsBowerPath+"/recordingcreator/recordingfields"],returnFirstDependency),define("recordingHelper",[embyWebComponentsBowerPath+"/recordingcreator/recordinghelper"],returnFirstDependency),define("subtitleEditor",[embyWebComponentsBowerPath+"/subtitleeditor/subtitleeditor"],returnFirstDependency),define("itemIdentifier",[embyWebComponentsBowerPath+"/itemidentifier/itemidentifier"],returnFirstDependency),define("mediaInfo",[embyWebComponentsBowerPath+"/mediainfo/mediainfo"],returnFirstDependency),define("itemContextMenu",[embyWebComponentsBowerPath+"/itemcontextmenu"],returnFirstDependency),define("imageEditor",[embyWebComponentsBowerPath+"/imageeditor/imageeditor"],returnFirstDependency),define("dom",[embyWebComponentsBowerPath+"/dom"],returnFirstDependency),define("fullscreen-doubleclick",[embyWebComponentsBowerPath+"/fullscreen/fullscreen-doubleclick"],returnFirstDependency),define("fullscreenManager",[embyWebComponentsBowerPath+"/fullscreen/fullscreenmanager","events"],returnFirstDependency),define("layoutManager",[embyWebComponentsBowerPath+"/layoutmanager"],getLayoutManager),define("playMenu",[embyWebComponentsBowerPath+"/playmenu"],returnFirstDependency),define("refreshDialog",[embyWebComponentsBowerPath+"/refreshdialog/refreshdialog"],returnFirstDependency),define("backdrop",[embyWebComponentsBowerPath+"/backdrop/backdrop"],returnFirstDependency),define("fetchHelper",[embyWebComponentsBowerPath+"/fetchhelper"],returnFirstDependency),define("roundCardStyle",["cardStyle","css!"+embyWebComponentsBowerPath+"/cardbuilder/roundcard"],returnFirstDependency),define("cardStyle",["css!"+embyWebComponentsBowerPath+"/cardbuilder/card"],returnFirstDependency),define("cardBuilder",[embyWebComponentsBowerPath+"/cardbuilder/cardbuilder"],returnFirstDependency),define("peoplecardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/peoplecardbuilder"],returnFirstDependency),define("chaptercardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/chaptercardbuilder"],returnFirstDependency),define("mouseManager",[embyWebComponentsBowerPath+"/input/mouse"],returnFirstDependency),define("deleteHelper",[embyWebComponentsBowerPath+"/deletehelper"],returnFirstDependency),define("tvguide",[embyWebComponentsBowerPath+"/guide/guide"],returnFirstDependency),define("programStyles",["css!"+embyWebComponentsBowerPath+"/guide/programs"],returnFirstDependency),define("guide-settings-dialog",[embyWebComponentsBowerPath+"/guide/guide-settings"],returnFirstDependency),define("syncDialog",[embyWebComponentsBowerPath+"/sync/sync"],returnFirstDependency),define("syncToggle",[embyWebComponentsBowerPath+"/sync/synctoggle"],returnFirstDependency),define("syncJobEditor",[embyWebComponentsBowerPath+"/sync/syncjobeditor"],returnFirstDependency),define("syncJobList",[embyWebComponentsBowerPath+"/sync/syncjoblist"],returnFirstDependency),define("voiceDialog",[embyWebComponentsBowerPath+"/voice/voicedialog"],returnFirstDependency),define("voiceReceiver",[embyWebComponentsBowerPath+"/voice/voicereceiver"],returnFirstDependency),define("voiceProcessor",[embyWebComponentsBowerPath+"/voice/voiceprocessor"],returnFirstDependency),define("viewManager",[embyWebComponentsBowerPath+"/viewmanager/viewmanager"],function(viewManager){return window.ViewManager=viewManager,viewManager.dispatchPageEvents(!0),viewManager}),Dashboard.isRunningInCordova()&&window.MainActivity?define("shell",["cordova/shell"],returnFirstDependency):define("shell",[embyWebComponentsBowerPath+"/shell"],returnFirstDependency),define("sharingmanager",[embyWebComponentsBowerPath+"/sharing/sharingmanager"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.apphost="cordova/apphost":paths.apphost="components/apphost",Dashboard.isRunningInCordova()&&window.MainActivity?(paths.appStorage="cordova/appstorage",paths.filesystem="cordova/filesystem"):(paths.appStorage=getAppStorage(apiClientBowerPath),paths.filesystem=embyWebComponentsBowerPath+"/filesystem");var sha1Path=bowerPath+"/cryptojslib/components/sha1-min",md5Path=bowerPath+"/cryptojslib/components/md5-min",shim={};shim[sha1Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},shim[md5Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},requirejs.config({waitSeconds:0,map:{"*":{css:bowerPath+"/emby-webcomponents/require/requirecss",html:bowerPath+"/emby-webcomponents/require/requirehtml",text:bowerPath+"/emby-webcomponents/require/requiretext"}},urlArgs:urlArgs,paths:paths,shim:shim}),define("cryptojs-sha1",[sha1Path]),define("cryptojs-md5",[md5Path]),define("jstree",[bowerPath+"/jstree/dist/jstree","css!thirdparty/jstree/themes/default/style.min.css"]),define("dashboardcss",["css!css/dashboard"]),define("jqmtable",["thirdparty/jquerymobile-1.4.5/jqm.table","css!thirdparty/jquerymobile-1.4.5/jqm.table.css"]),define("jqmwidget",["thirdparty/jquerymobile-1.4.5/jqm.widget"]),define("jqmslider",["thirdparty/jquerymobile-1.4.5/jqm.slider","css!thirdparty/jquerymobile-1.4.5/jqm.slider.css"]),define("jqmpopup",["thirdparty/jquerymobile-1.4.5/jqm.popup","css!thirdparty/jquerymobile-1.4.5/jqm.popup.css"]),define("jqmlistview",["css!thirdparty/jquerymobile-1.4.5/jqm.listview.css"]),define("jqmpanel",["thirdparty/jquerymobile-1.4.5/jqm.panel","css!thirdparty/jquerymobile-1.4.5/jqm.panel.css"]),define("slideshow",[embyWebComponentsBowerPath+"/slideshow/slideshow"],returnFirstDependency),define("fetch",[bowerPath+"/fetch/fetch"]),define("raf",[embyWebComponentsBowerPath+"/polyfills/raf"]),define("functionbind",[embyWebComponentsBowerPath+"/polyfills/bind"]),define("arraypolyfills",[embyWebComponentsBowerPath+"/polyfills/array"]),define("objectassign",[embyWebComponentsBowerPath+"/polyfills/objectassign"]),define("clearButtonStyle",["css!"+embyWebComponentsBowerPath+"/clearbutton"]),define("userdataButtons",[embyWebComponentsBowerPath+"/userdatabuttons/userdatabuttons"],returnFirstDependency),define("listView",[embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("listViewStyle",["css!"+embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("formDialogStyle",["css!"+embyWebComponentsBowerPath+"/formdialog"],returnFirstDependency),define("indicators",[embyWebComponentsBowerPath+"/indicators/indicators"],returnFirstDependency),define("registrationServices",[embyWebComponentsBowerPath+"/registrationservices/registrationservices"],returnFirstDependency),Dashboard.isRunningInCordova()?(define("iapManager",["cordova/iap"],returnFirstDependency),define("fileupload",["cordova/fileupload"],returnFirstDependency)):(define("iapManager",["components/iap"],returnFirstDependency),define("fileupload",[apiClientBowerPath+"/fileupload"],returnFirstDependency)),define("connectionmanager",[apiClientBowerPath+"/connectionmanager"]),define("cameraRoll",[apiClientBowerPath+"/cameraroll"],returnFirstDependency),define("contentuploader",[apiClientBowerPath+"/sync/contentuploader"]),define("serversync",[apiClientBowerPath+"/sync/serversync"]),define("multiserversync",[apiClientBowerPath+"/sync/multiserversync"]),define("offlineusersync",[apiClientBowerPath+"/sync/offlineusersync"]),define("mediasync",[apiClientBowerPath+"/sync/mediasync"]),define("swiper",[bowerPath+"/Swiper/dist/js/swiper.min","css!"+bowerPath+"/Swiper/dist/css/swiper.min"],returnFirstDependency),define("scroller",[embyWebComponentsBowerPath+"/scroller/smoothscroller"],returnFirstDependency),define("toast",[embyWebComponentsBowerPath+"/toast/toast"],returnFirstDependency),define("scrollHelper",[embyWebComponentsBowerPath+"/scrollhelper"],returnFirstDependency),define("appSettings",[embyWebComponentsBowerPath+"/appsettings"],updateAppSettings),define("userSettings",[embyWebComponentsBowerPath+"/usersettings/usersettings"],returnFirstDependency),define("userSettingsBuilder",[embyWebComponentsBowerPath+"/usersettings/usersettingsbuilder"],returnFirstDependency),define("material-icons",["css!"+embyWebComponentsBowerPath+"/fonts/material-icons/style"]),define("robotoFont",["css!"+embyWebComponentsBowerPath+"/fonts/roboto/style"]),define("scrollStyles",["css!"+embyWebComponentsBowerPath+"/scrollstyles"]),define("navdrawer",["components/navdrawer/navdrawer"],returnFirstDependency),define("viewcontainer",["components/viewcontainer-lite","css!"+embyWebComponentsBowerPath+"/viewmanager/viewcontainer-lite"],returnFirstDependency),define("queryString",[bowerPath+"/query-string/index"],function(){return queryString}),define("jQuery",[bowerPath+"/jquery/dist/jquery.slim.min"],function(){return window.ApiClient&&(jQuery.ajax=ApiClient.ajax),jQuery}),define("fnchecked",["legacy/fnchecked"]),define("dialogHelper",[embyWebComponentsBowerPath+"/dialoghelper/dialoghelper"],function(dialoghelper){return dialoghelper.setOnOpen(onDialogOpen),dialoghelper}),define("inputmanager",["inputManager"],returnFirstDependency),define("historyManager",["embyRouter"],returnFirstDependency),define("headroom-window",["headroom"],createWindowHeadroom),define("hammer-main",["hammer"],createMainContentHammer),define("appfooter-shared",["appfooter"],createSharedAppFooter),define("skinManager",[],function(){return{loadUserSkin:function(){Emby.Page.show("/home.html")}}}),define("connectionManager",[],function(){return ConnectionManager}),define("apiClientResolver",[],function(){return function(){return window.ApiClient}}),define("embyRouter",[embyWebComponentsBowerPath+"/router"],function(embyRouter){function showItem(item,serverId,options){if("string"==typeof item)require(["connectionManager"],function(connectionManager){var apiClient=connectionManager.currentApiClient();apiClient.getItem(apiClient.getCurrentUserId(),item).then(function(item){embyRouter.showItem(item,options)})});else{2==arguments.length&&(options=arguments[1]);var context=options?options.context:null;Emby.Page.show("/"+LibraryBrowser.getHref(item,context),{item:item})}}return embyRouter.showLocalLogin=function(apiClient,serverId,manualLogin){Dashboard.navigate("login.html?serverid="+serverId)},embyRouter.showVideoOsd=function(){return Dashboard.navigate("videoosd.html")},embyRouter.showSelectServer=function(){Dashboard.navigate("selectserver.html")},embyRouter.showWelcome=function(){Dashboard.isConnectMode()?Dashboard.navigate("connectlogin.html?mode=welcome"):Dashboard.navigate("login.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.showGuide=function(){Dashboard.navigate("livetv.html?tab=1"); },embyRouter.goHome=function(){Dashboard.navigate("home.html")},embyRouter.showSearch=function(){Dashboard.navigate("search.html")},embyRouter.showLiveTV=function(){Dashboard.navigate("livetv.html")},embyRouter.showRecordedTV=function(){Dashboard.navigate("livetv.html?tab=3")},embyRouter.showFavorites=function(){Dashboard.navigate("favorites.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.setTitle=function(){},embyRouter.showItem=showItem,embyRouter})}function updateAppSettings(appSettings){return appSettings.enableExternalPlayers=function(val){return null!=val&&appSettings.set("externalplayers",val.toString()),"true"===appSettings.get("externalplayers")},appSettings}function onDialogOpen(dlg){dlg.classList.contains("background-theme-a")||dlg.classList.contains("actionSheet")||(dlg.classList.add("background-theme-b"),dlg.classList.add("ui-body-b"))}function initRequireWithBrowser(browser){var bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents";Dashboard.isRunningInCordova()&&browser.safari?define("actionsheet",["cordova/actionsheet"],returnFirstDependency):define("actionsheet",["webActionSheet"],returnFirstDependency),"registerElement"in document?define("registerElement",[]):browser.msie?define("registerElement",[bowerPath+"/webcomponentsjs/webcomponents-lite.min.js"]):define("registerElement",[bowerPath+"/document-register-element/build/document-register-element"]),window.chrome&&window.chrome.sockets?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.android?define("serverdiscovery",["cordova/serverdiscovery"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.safari?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.safari?define("imageFetcher",["cordova/imagestore"],returnFirstDependency):define("imageFetcher",[embyWebComponentsBowerPath+"/images/basicimagefetcher"],returnFirstDependency);var preferNativeAlerts=browser.tv;preferNativeAlerts&&window.alert?define("alert",[embyWebComponentsBowerPath+"/alert/nativealert"],returnFirstDependency):define("alert",[embyWebComponentsBowerPath+"/alert/alert"],returnFirstDependency),define("dialog",[embyWebComponentsBowerPath+"/dialog/dialog"],returnFirstDependency),preferNativeAlerts&&window.confirm?define("confirm",[embyWebComponentsBowerPath+"/confirm/nativeconfirm"],returnFirstDependency):define("confirm",[embyWebComponentsBowerPath+"/confirm/confirm"],returnFirstDependency);var preferNativePrompt=preferNativeAlerts||browser.xboxOne;preferNativePrompt&&window.confirm?define("prompt",[embyWebComponentsBowerPath+"/prompt/nativeprompt"],returnFirstDependency):define("prompt",[embyWebComponentsBowerPath+"/prompt/prompt"],returnFirstDependency),browser.tizen||browser.operaTv?define("loading",[embyWebComponentsBowerPath+"/loading/loading-legacy"],returnFirstDependency):define("loading",[embyWebComponentsBowerPath+"/loading/loading-lite"],returnFirstDependency),define("multi-download",[embyWebComponentsBowerPath+"/multidownload"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("fileDownloader",["cordova/filedownloader"],returnFirstDependency),define("localassetmanager",["cordova/localassetmanager"],returnFirstDependency)):(define("fileDownloader",[embyWebComponentsBowerPath+"/filedownloader"],returnFirstDependency),define("localassetmanager",[apiClientBowerPath+"/localassetmanager"],returnFirstDependency)),define("screenLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",["cordova/wakelock"],returnFirstDependency),define("networkLock",["cordova/networklock"],returnFirstDependency)):(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),define("networkLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency))}function init(){Dashboard.isRunningInCordova()&&browserInfo.android&&define("nativedirectorychooser",["cordova/nativedirectorychooser"]),Dashboard.isRunningInCordova()&&browserInfo.android?define("localsync",["cordova/localsync"],returnFirstDependency):define("localsync",["scripts/localsync"],returnFirstDependency),define("livetvcss",["css!css/livetv.css"]),define("detailtablecss",["css!css/detailtable.css"]),define("autoorganizetablecss",["css!css/autoorganizetable.css"]),define("buttonenabled",["legacy/buttonenabled"]),initAfterDependencies()}function getRequirePromise(deps){return new Promise(function(resolve,reject){require(deps,resolve)})}function initAfterDependencies(){var list=[];window.fetch||list.push("fetch"),"function"!=typeof Object.assign&&list.push("objectassign"),Array.prototype.filter||list.push("arraypolyfills"),Function.prototype.bind||list.push("functionbind"),window.requestAnimationFrame||list.push("raf"),require(list,function(){createConnectionManager().then(function(){console.log("initAfterDependencies promises resolved"),require(["globalize"],function(globalize){window.Globalize=globalize,Promise.all([loadCoreDictionary(globalize),loadSharedComponentsDictionary(globalize)]).then(onGlobalizeInit)})})})}function loadSharedComponentsDictionary(globalize){var baseUrl="bower_components/emby-webcomponents/strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sk","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});globalize.loadStrings({name:"sharedcomponents",translations:translations})}function loadCoreDictionary(globalize){var baseUrl="strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});return globalize.defaultModule("core"),globalize.loadStrings({name:"core",translations:translations})}function onGlobalizeInit(){document.title=Globalize.translateDocument(document.title,"core"),require(["apphost"],function(appHost){loadPlugins([],appHost,browserInfo).then(onAppReady)})}function defineRoute(newRoute,dictionary){var baseRoute=Emby.Page.baseUrl(),path=newRoute.path;path=path.replace(baseRoute,""),console.log("Defining route: "+path),newRoute.dictionary=newRoute.dictionary||dictionary||"core",Emby.Page.addRoute(path,newRoute)}function defineCoreRoutes(){console.log("Defining core routes"),defineRoute({path:"/addplugin.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"scripts/addpluginpage"}),defineRoute({path:"/appservices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizelog.html",dependencies:["scripts/taskbutton","autoorganizetablecss"],controller:"dashboard/autoorganizelog",roles:"admin"}),defineRoute({path:"/autoorganizesmart.html",dependencies:["emby-button"],controller:"dashboard/autoorganizesmart",autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizetv.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-select","emby-collapse"],controller:"dashboard/autoorganizetv",autoFocus:!1,roles:"admin"}),defineRoute({path:"/channelitems.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/channels.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/channels"}),defineRoute({path:"/channelsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/cinemamodeconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/connectlogin.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/connectlogin"}),defineRoute({path:"/dashboard.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardgeneral.html",controller:"dashboard/dashboardgeneral",autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardhosting.html",dependencies:["emby-input","emby-button"],autoFocus:!1,roles:"admin",controller:"dashboard/dashboardhosting"}),defineRoute({path:"/device.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devicesupload.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofile.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaserversettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnasettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/edititemmetadata.html",dependencies:[],controller:"scripts/edititemmetadata",autoFocus:!1}),defineRoute({path:"/encodingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/favorites.html",dependencies:[],autoFocus:!1,controller:"scripts/favorites"}),defineRoute({path:"/forgotpassword.html",dependencies:["emby-input","emby-button"],anonymous:!0,startup:!0,controller:"scripts/forgotpassword"}),defineRoute({path:"/forgotpasswordpin.html",dependencies:["emby-input","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/forgotpasswordpin"}),defineRoute({path:"/gamegenres.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/games.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesrecommended.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamestudios.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesystems.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/home.html",dependencies:[],autoFocus:!1,controller:"scripts/indexpage",transition:"fade",type:"home"}),defineRoute({path:"/index.html",dependencies:[],autoFocus:!1,isDefaultRoute:!0}),defineRoute({path:"/itemdetails.html",dependencies:["emby-button","scripts/livetvcomponents","paper-icon-button-light","emby-itemscontainer"],controller:"scripts/itemdetailpage",autoFocus:!1,transition:"fade"}),defineRoute({path:"/itemlist.html",dependencies:[],autoFocus:!1,controller:"scripts/itemlistpage",transition:"fade"}),defineRoute({path:"/kids.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/library.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/librarydisplay.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"dashboard/librarydisplay"}),defineRoute({path:"/librarysettings.html",dependencies:["emby-collapse","emby-input","emby-button","emby-select"],autoFocus:!1,roles:"admin",controller:"dashboard/librarysettings"}),defineRoute({path:"/livetv.html",dependencies:["emby-button","livetvcss"],controller:"scripts/livetvsuggested",autoFocus:!1,transition:"fade"}),defineRoute({path:"/livetvguideprovider.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvitems.html",dependencies:[],autoFocus:!1,controller:"scripts/livetvitems"}),defineRoute({path:"/livetvseriestimer.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-collapse","scripts/livetvcomponents","scripts/livetvseriestimer","livetvcss"],autoFocus:!1,controller:"scripts/livetvseriestimer"}),defineRoute({path:"/livetvsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/livetvstatus.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-hdhomerun.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-m3u.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-satip.html",dependencies:["emby-input"],autoFocus:!1,roles:"admin",controller:"dashboard/livetvtunerprovider-satip"}),defineRoute({path:"/log.html",dependencies:["emby-checkbox"],roles:"admin",controller:"dashboard/logpage"}),defineRoute({path:"/login.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/loginpage"}),defineRoute({path:"/metadataadvanced.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadataimages.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatanfo.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatasubtitles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/movies.html",dependencies:["emby-button"],autoFocus:!1,controller:"scripts/moviesrecommended",transition:"fade"}),defineRoute({path:"/music.html",dependencies:[],controller:"scripts/musicrecommended",autoFocus:!1,transition:"fade"}),defineRoute({path:"/mypreferencesdisplay.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencesdisplay"}),defineRoute({path:"/mypreferenceshome.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceshome"}),defineRoute({path:"/mypreferenceslanguages.html",dependencies:["emby-button","emby-checkbox","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceslanguages"}),defineRoute({path:"/mypreferencesmenu.html",dependencies:["emby-button"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencescommon"}),defineRoute({path:"/myprofile.html",dependencies:["emby-button","emby-collapse","emby-checkbox","emby-input"],autoFocus:!1,transition:"fade",controller:"scripts/myprofile"}),defineRoute({path:"/mysync.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/mysync"}),defineRoute({path:"/camerauploadsettings.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/camerauploadsettings"}),defineRoute({path:"/mysyncjob.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/syncjob"}),defineRoute({path:"/mysyncsettings.html",dependencies:["emby-checkbox","emby-input","emby-button","paper-icon-button-light"],autoFocus:!1,transition:"fade",controller:"scripts/mysyncsettings"}),defineRoute({path:"/notificationlist.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/notificationsetting.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/notificationsettings.html",controller:"scripts/notificationsettings",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/nowplaying.html",dependencies:["paper-icon-button-light","emby-slider","emby-button","emby-input","emby-itemscontainer"],controller:"scripts/nowplayingpage",autoFocus:!1,transition:"fade",fullscreen:!0,supportsThemeMedia:!0}),defineRoute({path:"/photos.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/playbackconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/playlists.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/playlists"}),defineRoute({path:"/plugincatalog.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/plugins.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/reports.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/scheduledtask.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/scheduledtasks.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/search.html",dependencies:[],controller:"scripts/searchpage"}),defineRoute({path:"/secondaryitems.html",dependencies:[],autoFocus:!1,controller:"scripts/secondaryitems"}),defineRoute({path:"/selectserver.html",dependencies:["listViewStyle","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/selectserver"}),defineRoute({path:"/serversecurity.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/shared.html",dependencies:[],autoFocus:!1,anonymous:!0}),defineRoute({path:"/streamingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/support.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/supporterkey.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/syncactivity.html",dependencies:[],autoFocus:!1,controller:"scripts/syncactivity"}),defineRoute({path:"/syncsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/tv.html",dependencies:["paper-icon-button-light","emby-button"],autoFocus:!1,controller:"scripts/tvrecommended",transition:"fade"}),defineRoute({path:"/useredit.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userlibraryaccess.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/usernew.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userparentalcontrol.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userpassword.html",dependencies:["emby-input","emby-button","emby-checkbox"],autoFocus:!1,controller:"scripts/userpasswordpage"}),defineRoute({path:"/userprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/wizardagreement.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardcomponents.html",dependencies:["dashboardcss","emby-button","emby-input","emby-select"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardcomponents"}),defineRoute({path:"/wizardfinish.html",dependencies:["emby-button","dashboardcss"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardfinishpage"}),defineRoute({path:"/wizardlibrary.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvguide.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvtuner.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardsettings.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardstart.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizarduser.html",dependencies:["dashboardcss","emby-input"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/videoosd.html",dependencies:[],transition:"fade",controller:"scripts/videoosd",autoFocus:!1,type:"video-osd",supportsThemeMedia:!0,fullscreen:!0}),defineRoute({path:"/configurationpage",dependencies:["jQuery"],autoFocus:!1,enableCache:!1,enableContentQueryString:!0,roles:"admin"}),defineRoute({path:"/",isDefaultRoute:!0,autoFocus:!1,dependencies:[]})}function loadPlugins(externalPlugins,appHost,browser,shell){console.log("Loading installed plugins");var list=["bower_components/emby-webcomponents/playback/playbackvalidation"];Dashboard.isRunningInCordova()&&browser.android?(document.createElement("audio").canPlayType("audio/flac").replace(/no/,"")&&document.createElement("audio").canPlayType('audio/ogg; codecs="opus"').replace(/no/,"")||(window.VlcAudio=!0),list.push("cordova/vlcplayer")):Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/audioplayer"),list.push("bower_components/emby-webcomponents/htmlaudioplayer/plugin"),Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/chromecast"),Dashboard.isRunningInCordova()&&browser.android&&list.push("cordova/externalplayer"),list.push("bower_components/emby-webcomponents/htmlvideoplayer/plugin"),appHost.supports("remotecontrol")&&(list.push("bower_components/emby-webcomponents/sessionplayer"),browser.chrome&&list.push("bower_components/emby-webcomponents/chromecastplayer")),list.push("bower_components/emby-webcomponents/youtubeplayer/plugin");for(var i=0,length=externalPlugins.length;i1?view.querySelector(".btnAudio").classList.remove("hide"):view.querySelector(".btnAudio").classList.add("hide"))):(Emby.Page.setTitle(""),nowPlayingVolumeSlider.disabled=!0,nowPlayingPositionSlider.disabled=!0,btnFastForward.disabled=!0,btnRewind.disabled=!0,view.querySelector(".btnSubtitles").classList.add("hide"),view.querySelector(".btnAudio").classList.add("hide"),view.querySelector(".osdTitle").innerHTML="",void(view.querySelector(".osdMediaInfo").innerHTML=""))}function setTitle(item){var url=logoImageUrl(item,connectionManager.getApiClient(item.ServerId),{});url||Emby.Page.setTitle("")}function setPoster(item){var osdPoster=view.querySelector(".osdPoster");if(item){var imgUrl=seriesImageUrl(item,{type:"Primary"})||seriesImageUrl(item,{type:"Thumb"})||imageUrl(item,{type:"Primary"});if(imgUrl)return void(osdPoster.innerHTML='')}osdPoster.innerHTML=""}function isOsdOpen(){return _osdOpen}function showOsd(){slideDownToShow(headerElement),slideUpToShow(osdBottomElement),startHideTimer()}function hideOsd(){slideUpToHide(headerElement),slideDownToHide(osdBottomElement)}function startHideTimer(){stopHideTimer(),hideTimeout=setTimeout(hideOsd,5e3)}function stopHideTimer(){hideTimeout&&(clearTimeout(hideTimeout),hideTimeout=null)}function slideDownToShow(elem){elem.classList.remove("osdHeader-hidden")}function slideUpToHide(elem){elem.classList.add("osdHeader-hidden")}function clearBottomPanelAnimationEventListeners(elem){dom.removeEventListener(elem,transitionEndEventName,onSlideDownComplete,{once:!0})}function slideUpToShow(elem){_osdOpen||(_osdOpen=!0,clearBottomPanelAnimationEventListeners(elem),elem.classList.remove("hide"),void elem.offsetWidth,elem.classList.remove("videoOsdBottom-hidden"),setTimeout(function(){focusManager.focus(elem.querySelector(".btnPause"))},50),view.dispatchEvent(new CustomEvent("video-osd-show",{bubbles:!0,cancelable:!1})))}function onSlideDownComplete(e){var elem=e.target;elem.classList.add("hide"),dom.removeEventListener(elem,transitionEndEventName,onSlideDownComplete,{once:!0}),view.dispatchEvent(new CustomEvent("video-osd-hide",{bubbles:!0,cancelable:!1}))}function slideDownToHide(elem){_osdOpen&&(clearBottomPanelAnimationEventListeners(elem),void elem.offsetWidth,elem.classList.add("videoOsdBottom-hidden"),dom.addEventListener(elem,transitionEndEventName,onSlideDownComplete,{once:!0}),_osdOpen=!1)}function onMouseMove(e){var eventX=e.screenX||0,eventY=e.screenY||0,obj=lastMouseMoveData;return obj?void(Math.abs(eventX-obj.x)<10&&Math.abs(eventY-obj.y)<10||(obj.x=eventX,obj.y=eventY,showOsd())):void(lastMouseMoveData={x:eventX,y:eventY})}function onInputCommand(e){switch(e.detail.command){case"left":isOsdOpen()?showOsd():(e.preventDefault(),playbackManager.rewind());break;case"right":isOsdOpen()?showOsd():(e.preventDefault(),playbackManager.fastForward());break;case"up":case"down":case"select":case"menu":case"info":case"play":case"playpause":case"pause":case"fastforward":case"rewind":case"next":case"previous":showOsd()}}function updateFullscreenIcon(){playbackManager.isFullscreen(currentPlayer)?(view.querySelector(".btnFullscreen").setAttribute("title",globalize.translate("ExitFullscreen")),view.querySelector(".btnFullscreen i").innerHTML=""):(view.querySelector(".btnFullscreen").setAttribute("title",globalize.translate("Fullscreen")),view.querySelector(".btnFullscreen i").innerHTML="")}function onPlayerChange(){var player=playbackManager.getCurrentPlayer();player&&!player.isLocalPlayer?view.querySelector(".btnCast i").innerHTML="":view.querySelector(".btnCast i").innerHTML="",bindToPlayer(player)}function onStateChanged(event,state){var player=this;state.NowPlayingItem&&(isEnabled=!0,updatePlayerStateInternal(event,state),updatePlaylist(player),enableStopOnBack(!0))}function onPlayPauseStateChanged(e){if(isEnabled){var player=this;updatePlayPauseState(player.paused())}}function onVolumeChanged(e){if(isEnabled){var player=this;updatePlayerVolumeState(player.isMuted(),player.getVolume())}}function onPlaybackStart(e,state){console.log("nowplaying event: "+e.type);var player=this;onStateChanged.call(player,e,state)}function onPlaybackStopped(e,state){currentRuntimeTicks=null,console.log("nowplaying event: "+e.type),"Video"!==state.nextMediaType&&(view.removeEventListener("viewbeforehide",onViewHideStopPlayback),Emby.Page.back())}function bindToPlayer(player){player!==currentPlayer&&(releaseCurrentPlayer(),currentPlayer=player,player&&(playbackManager.getPlayerState(player).then(function(state){onStateChanged.call(player,{type:"init"},state)}),events.on(player,"playbackstart",onPlaybackStart),events.on(player,"playbackstop",onPlaybackStopped),events.on(player,"volumechange",onVolumeChanged),events.on(player,"pause",onPlayPauseStateChanged),events.on(player,"playing",onPlayPauseStateChanged),events.on(player,"timeupdate",onTimeUpdate),events.on(player,"fullscreenchange",updateFullscreenIcon)))}function releaseCurrentPlayer(){var player=currentPlayer;player&&(events.off(player,"playbackstart",onPlaybackStart),events.off(player,"playbackstop",onPlaybackStopped),events.off(player,"volumechange",onVolumeChanged),events.off(player,"pause",onPlayPauseStateChanged),events.off(player,"playing",onPlayPauseStateChanged),events.off(player,"timeupdate",onTimeUpdate),events.off(player,"fullscreenchange",updateFullscreenIcon),currentPlayer=null)}function onTimeUpdate(e){if(isEnabled){var now=(new Date).getTime();if(!(now-lastUpdateTime<700)){lastUpdateTime=now;var player=this;currentRuntimeTicks=playbackManager.duration(player),updateTimeDisplay(playbackManager.currentTime(player),currentRuntimeTicks)}}}function updatePlayPauseState(isPaused){isPaused?view.querySelector(".btnPause i").innerHTML="":view.querySelector(".btnPause i").innerHTML=""}function updatePlayerStateInternal(event,state){var playerInfo=playbackManager.getPlayerInfo(),playState=state.PlayState||{};updatePlayPauseState(playState.IsPaused);var supportedCommands=playerInfo.supportedCommands;currentPlayerSupportedCommands=supportedCommands,updatePlayerVolumeState(playState.IsMuted,playState.VolumeLevel),nowPlayingPositionSlider&&!nowPlayingPositionSlider.dragging&&(nowPlayingPositionSlider.disabled=!playState.CanSeek),btnFastForward.disabled=!playState.CanSeek,btnRewind.disabled=!playState.CanSeek;var nowPlayingItem=state.NowPlayingItem||{};updateTimeDisplay(playState.PositionTicks,nowPlayingItem.RunTimeTicks),updateNowPlayingInfo(state),state.MediaSource&&state.MediaSource.SupportsTranscoding&&supportedCommands.indexOf("SetMaxStreamingBitrate")!==-1?view.querySelector(".btnSettings").classList.remove("hide"):view.querySelector(".btnSettings").classList.add("hide"),supportedCommands.indexOf("ToggleFullscreen")===-1?view.querySelector(".btnFullscreen").classList.add("hide"):view.querySelector(".btnFullscreen").classList.remove("hide"),supportedCommands.indexOf("PictureInPicture")===-1?view.querySelector(".btnPip").classList.add("hide"):view.querySelector(".btnPip").classList.remove("hide"),updateFullscreenIcon()}function updateTimeDisplay(positionTicks,runtimeTicks){if(nowPlayingPositionSlider&&!nowPlayingPositionSlider.dragging){if(runtimeTicks){var pct=positionTicks/runtimeTicks;pct*=100,nowPlayingPositionSlider.value=pct}else nowPlayingPositionSlider.value=0;runtimeTicks&&null!=positionTicks?endsAtText.innerHTML="  -  "+mediaInfo.getEndsAtFromPosition(runtimeTicks,positionTicks,!0):endsAtText.innerHTML=""}updateTimeText(nowPlayingPositionText,positionTicks),updateTimeText(nowPlayingDurationText,runtimeTicks,!0)}function updatePlayerVolumeState(isMuted,volumeLevel){var supportedCommands=currentPlayerSupportedCommands,showMuteButton=!0,showVolumeSlider=!0;supportedCommands.indexOf("Mute")===-1&&(showMuteButton=!1),supportedCommands.indexOf("SetVolume")===-1&&(showVolumeSlider=!1),currentPlayer.isLocalPlayer&&appHost.supports("physicalvolumecontrol")&&(showMuteButton=!1,showVolumeSlider=!1),isMuted?(view.querySelector(".buttonMute").setAttribute("title",globalize.translate("Unmute")),view.querySelector(".buttonMute i").innerHTML=""):(view.querySelector(".buttonMute").setAttribute("title",globalize.translate("Mute")),view.querySelector(".buttonMute i").innerHTML=""),showMuteButton?view.querySelector(".buttonMute").classList.remove("hide"):view.querySelector(".buttonMute").classList.add("hide"),nowPlayingVolumeSlider&&(showVolumeSlider?nowPlayingVolumeSliderContainer.classList.remove("hide"):nowPlayingVolumeSliderContainer.classList.add("hide"),nowPlayingVolumeSlider.dragging||(nowPlayingVolumeSlider.value=volumeLevel||0))}function updatePlaylist(player){var btnPreviousTrack=view.querySelector(".btnPreviousTrack"),btnNextTrack=view.querySelector(".btnNextTrack");btnPreviousTrack.classList.remove("hide"),btnNextTrack.classList.remove("hide"),btnNextTrack.disabled=!1,btnPreviousTrack.disabled=!1}function updateTimeText(elem,ticks,divider){if(null==ticks)return void(elem.innerHTML="");var html=datetime.getDisplayRunningTime(ticks);divider&&(html=" / "+html),elem.innerHTML=html}function onSettingsButtonClick(e){var btn=this;require(["playerSettingsMenu"],function(playerSettingsMenu){playerSettingsMenu.show({mediaType:"Video",player:currentPlayer,positionTo:btn})})}function showAudioTrackSelection(){var player=currentPlayer,audioTracks=playbackManager.audioTracks(player),currentIndex=playbackManager.getAudioStreamIndex(player),menuItems=audioTracks.map(function(stream){var opt={name:stream.DisplayTitle,id:stream.Index};return stream.Index===currentIndex&&(opt.selected=!0),opt}),positionTo=this;require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,title:globalize.translate("Audio"),positionTo:positionTo}).then(function(id){var index=parseInt(id);index!==currentIndex&&playbackManager.setAudioStreamIndex(index,currentPlayer)})})}function showSubtitleTrackSelection(){var player=currentPlayer,streams=playbackManager.subtitleTracks(player),currentIndex=playbackManager.getSubtitleStreamIndex(player);null==currentIndex&&(currentIndex=-1),streams.unshift({Index:-1,DisplayTitle:globalize.translate("Off")});var menuItems=streams.map(function(stream){var opt={name:stream.DisplayTitle,id:stream.Index};return stream.Index===currentIndex&&(opt.selected=!0),opt}),positionTo=this;require(["actionsheet"],function(actionsheet){actionsheet.show({title:globalize.translate("Subtitles"),items:menuItems,positionTo:positionTo}).then(function(id){var index=parseInt(id);index!==currentIndex&&playbackManager.setSubtitleStreamIndex(index,currentPlayer)})})}function onWindowKeyDown(e){32!==e.keyCode||isOsdOpen()||(playbackManager.playPause(currentPlayer),showOsd())}function getImgUrl(item,chapter,index,maxWidth,apiClient){return chapter.ImageTag?apiClient.getScaledImageUrl(item.Id,{maxWidth:maxWidth,tag:chapter.ImageTag,type:"Chapter",index:index}):null}function getChapterBubbleHtml(apiClient,item,chapters,positionTicks){for(var chapter,index=-1,i=0,length=chapters.length;i=currentChapter.StartPositionTicks&&(chapter=currentChapter,index=i)}if(!chapter)return null;var src=getImgUrl(item,chapter,index,400,apiClient);if(src){var html='
';return html+='',html+='
',html+='
',html+=chapter.Name,html+="
",html+='

',html+=datetime.getDisplayRunningTime(positionTicks),html+="

",html+="
",html+="
"}return null}function onViewHideStopPlayback(){if(playbackManager.isPlayingVideo()){var player=currentPlayer;view.removeEventListener("viewbeforehide",onViewHideStopPlayback),releaseCurrentPlayer(),playbackManager.stop(player)}}function enableStopOnBack(enabled){view.removeEventListener("viewbeforehide",onViewHideStopPlayback),enabled&&playbackManager.isPlayingVideo(currentPlayer)&&view.addEventListener("viewbeforehide",onViewHideStopPlayback)}var currentPlayer,isEnabled,currentItem,hideTimeout,lastMouseMoveData,currentPlayerSupportedCommands=[],currentRuntimeTicks=0,lastUpdateTime=0,nowPlayingVolumeSlider=view.querySelector(".osdVolumeSlider"),nowPlayingVolumeSliderContainer=view.querySelector(".osdVolumeSliderContainer"),nowPlayingPositionSlider=view.querySelector(".osdPositionSlider"),nowPlayingPositionText=view.querySelector(".osdPositionText"),nowPlayingDurationText=view.querySelector(".osdDurationText"),endsAtText=view.querySelector(".endsAtText"),btnRewind=view.querySelector(".btnRewind"),btnFastForward=view.querySelector(".btnFastForward"),transitionEndEventName=dom.whichTransitionEvent(),headerElement=document.querySelector(".skinHeader"),osdBottomElement=document.querySelector(".videoOsdBottom"),_osdOpen=!0;view.addEventListener("viewbeforeshow",function(e){headerElement.classList.add("osdHeader"),Emby.Page.setTransparency("full")}),view.addEventListener("viewshow",function(e){events.on(playbackManager,"playerchange",onPlayerChange),bindToPlayer(playbackManager.getCurrentPlayer()),dom.addEventListener(document,"mousemove",onMouseMove,{passive:!0}),document.body.classList.add("autoScrollY"),showOsd(),inputManager.on(window,onInputCommand),dom.addEventListener(window,"keydown",onWindowKeyDown,{passive:!0})}),view.addEventListener("viewbeforehide",function(){dom.removeEventListener(window,"keydown",onWindowKeyDown,{passive:!0}),stopHideTimer(),headerElement.classList.remove("osdHeader"),headerElement.classList.remove("osdHeader-hidden"),dom.removeEventListener(document,"mousemove",onMouseMove,{passive:!0}),document.body.classList.remove("autoScrollY"),inputManager.off(window,onInputCommand),events.off(playbackManager,"playerchange",onPlayerChange),releaseCurrentPlayer()}),appHost.supports("remotecontrol")&&!layoutManager.tv&&view.querySelector(".btnCast").classList.remove("hide"),view.querySelector(".btnCast").addEventListener("click",function(){var btn=this;require(["playerSelectionMenu"],function(playerSelectionMenu){playerSelectionMenu.show(btn)})}),view.querySelector(".btnFullscreen").addEventListener("click",function(){playbackManager.toggleFullscreen(currentPlayer)}),view.querySelector(".btnPip").addEventListener("click",function(){playbackManager.togglePictureInPicture(currentPlayer)}),view.querySelector(".btnSettings").addEventListener("click",onSettingsButtonClick),view.addEventListener("viewhide",function(){headerElement.classList.remove("hide")}),view.querySelector(".pageContainer").addEventListener("click",function(){browser.touch||playbackManager.playPause(currentPlayer),showOsd()}),view.querySelector(".buttonMute").addEventListener("click",function(){playbackManager.toggleMute(currentPlayer)}),nowPlayingVolumeSlider.addEventListener("change",function(){playbackManager.setVolume(this.value,currentPlayer)}),nowPlayingPositionSlider.addEventListener("change",function(){if(currentPlayer){var newPercent=parseFloat(this.value);playbackManager.seekPercent(newPercent,currentPlayer)}}),nowPlayingPositionSlider.getBubbleHtml=function(value){if(showOsd(),!currentRuntimeTicks)return"--:--";var ticks=currentRuntimeTicks;ticks/=100,ticks*=value;var item=currentItem;if(item&&item.Chapters&&item.Chapters.length&&item.Chapters[0].ImageTag){var html=getChapterBubbleHtml(connectionManager.getApiClient(item.ServerId),item,item.Chapters,ticks);if(html)return html}return'

'+datetime.getDisplayRunningTime(ticks)+"

"},view.querySelector(".btnPreviousTrack").addEventListener("click",function(){playbackManager.previousChapter(currentPlayer)}),view.querySelector(".btnPause").addEventListener("click",function(){playbackManager.playPause(currentPlayer)}),view.querySelector(".btnNextTrack").addEventListener("click",function(){playbackManager.nextChapter(currentPlayer)}),btnRewind.addEventListener("click",function(){playbackManager.rewind(currentPlayer)}),btnFastForward.addEventListener("click",function(){playbackManager.fastForward(currentPlayer)}),view.querySelector(".btnAudio").addEventListener("click",showAudioTrackSelection),view.querySelector(".btnSubtitles").addEventListener("click",showSubtitleTrackSelection)}}); \ No newline at end of file +define(["playbackManager","dom","inputmanager","datetime","itemHelper","mediaInfo","focusManager","imageLoader","scrollHelper","events","connectionManager","browser","globalize","apphost","layoutManager","scrollStyles","emby-slider","paper-icon-button-light"],function(playbackManager,dom,inputManager,datetime,itemHelper,mediaInfo,focusManager,imageLoader,scrollHelper,events,connectionManager,browser,globalize,appHost,layoutManager){"use strict";function seriesImageUrl(item,options){if("Episode"!==item.Type)return null;if(options=options||{},options.type=options.type||"Primary","Primary"===options.type&&item.SeriesPrimaryImageTag)return options.tag=item.SeriesPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if("Thumb"===options.type){if(item.SeriesThumbImageTag)return options.tag=item.SeriesThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if(item.ParentThumbImageTag)return options.tag=item.ParentThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId,options)}return null}function imageUrl(item,options){return options=options||{},options.type=options.type||"Primary",item.ImageTags&&item.ImageTags[options.type]?(options.tag=item.ImageTags[options.type],connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId||item.Id,options)):"Primary"===options.type&&item.AlbumId&&item.AlbumPrimaryImageTag?(options.tag=item.AlbumPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId,options)):null}function logoImageUrl(item,apiClient,options){return options=options||{},options.type="Logo",item.ImageTags&&item.ImageTags.Logo?(options.tag=item.ImageTags.Logo,apiClient.getScaledImageUrl(item.Id,options)):item.ParentLogoImageTag?(options.tag=item.ParentLogoImageTag,apiClient.getScaledImageUrl(item.ParentLogoItemId,options)):null}return function(view,params){function updateNowPlayingInfo(state){var item=state.NowPlayingItem;return currentItem=item,setPoster(item),item?(setTitle(item),view.querySelector(".osdTitle").innerHTML=itemHelper.getDisplayName(item),view.querySelector(".osdMediaInfo").innerHTML=mediaInfo.getPrimaryMediaInfoHtml(item,{runtime:!1,subtitles:!1,tomatoes:!1,endsAt:!1}),nowPlayingVolumeSlider.disabled=!1,nowPlayingPositionSlider.disabled=!1,btnFastForward.disabled=!1,btnRewind.disabled=!1,playbackManager.subtitleTracks(currentPlayer).length?view.querySelector(".btnSubtitles").classList.remove("hide"):view.querySelector(".btnSubtitles").classList.add("hide"),void(playbackManager.audioTracks(currentPlayer).length>1?view.querySelector(".btnAudio").classList.remove("hide"):view.querySelector(".btnAudio").classList.add("hide"))):(Emby.Page.setTitle(""),nowPlayingVolumeSlider.disabled=!0,nowPlayingPositionSlider.disabled=!0,btnFastForward.disabled=!0,btnRewind.disabled=!0,view.querySelector(".btnSubtitles").classList.add("hide"),view.querySelector(".btnAudio").classList.add("hide"),view.querySelector(".osdTitle").innerHTML="",void(view.querySelector(".osdMediaInfo").innerHTML=""))}function setTitle(item){var url=logoImageUrl(item,connectionManager.getApiClient(item.ServerId),{});url||Emby.Page.setTitle("")}function setPoster(item){var osdPoster=view.querySelector(".osdPoster");if(item){var imgUrl=seriesImageUrl(item,{type:"Primary"})||seriesImageUrl(item,{type:"Thumb"})||imageUrl(item,{type:"Primary"});if(imgUrl)return void(osdPoster.innerHTML='')}osdPoster.innerHTML=""}function isOsdOpen(){return _osdOpen}function showOsd(){slideDownToShow(headerElement),slideUpToShow(osdBottomElement),startHideTimer()}function hideOsd(){slideUpToHide(headerElement),slideDownToHide(osdBottomElement)}function startHideTimer(){stopHideTimer(),hideTimeout=setTimeout(hideOsd,5e3)}function stopHideTimer(){hideTimeout&&(clearTimeout(hideTimeout),hideTimeout=null)}function slideDownToShow(elem){elem.classList.remove("osdHeader-hidden")}function slideUpToHide(elem){elem.classList.add("osdHeader-hidden")}function clearBottomPanelAnimationEventListeners(elem){dom.removeEventListener(elem,transitionEndEventName,onSlideDownComplete,{once:!0})}function slideUpToShow(elem){_osdOpen||(_osdOpen=!0,clearBottomPanelAnimationEventListeners(elem),elem.classList.remove("hide"),void elem.offsetWidth,elem.classList.remove("videoOsdBottom-hidden"),setTimeout(function(){focusManager.focus(elem.querySelector(".btnPause"))},50),view.dispatchEvent(new CustomEvent("video-osd-show",{bubbles:!0,cancelable:!1})))}function onSlideDownComplete(e){var elem=e.target;elem.classList.add("hide"),dom.removeEventListener(elem,transitionEndEventName,onSlideDownComplete,{once:!0}),view.dispatchEvent(new CustomEvent("video-osd-hide",{bubbles:!0,cancelable:!1}))}function slideDownToHide(elem){_osdOpen&&(clearBottomPanelAnimationEventListeners(elem),void elem.offsetWidth,elem.classList.add("videoOsdBottom-hidden"),dom.addEventListener(elem,transitionEndEventName,onSlideDownComplete,{once:!0}),_osdOpen=!1)}function onMouseMove(e){var eventX=e.screenX||0,eventY=e.screenY||0,obj=lastMouseMoveData;return obj?void(Math.abs(eventX-obj.x)<10&&Math.abs(eventY-obj.y)<10||(obj.x=eventX,obj.y=eventY,showOsd())):void(lastMouseMoveData={x:eventX,y:eventY})}function onInputCommand(e){switch(e.detail.command){case"left":isOsdOpen()?showOsd():(e.preventDefault(),playbackManager.rewind());break;case"right":isOsdOpen()?showOsd():(e.preventDefault(),playbackManager.fastForward());break;case"up":case"down":case"select":case"menu":case"info":case"play":case"playpause":case"pause":case"fastforward":case"rewind":case"next":case"previous":showOsd()}}function updateFullscreenIcon(){playbackManager.isFullscreen(currentPlayer)?(view.querySelector(".btnFullscreen").setAttribute("title",globalize.translate("ExitFullscreen")),view.querySelector(".btnFullscreen i").innerHTML=""):(view.querySelector(".btnFullscreen").setAttribute("title",globalize.translate("Fullscreen")),view.querySelector(".btnFullscreen i").innerHTML="")}function onPlayerChange(){var player=playbackManager.getCurrentPlayer();player&&!player.isLocalPlayer?view.querySelector(".btnCast i").innerHTML="":view.querySelector(".btnCast i").innerHTML="",bindToPlayer(player)}function onStateChanged(event,state){var player=this;state.NowPlayingItem&&(isEnabled=!0,updatePlayerStateInternal(event,state),updatePlaylist(player),enableStopOnBack(!0))}function onPlayPauseStateChanged(e){if(isEnabled){var player=this;updatePlayPauseState(player.paused())}}function onVolumeChanged(e){if(isEnabled){var player=this;updatePlayerVolumeState(player.isMuted(),player.getVolume())}}function onPlaybackStart(e,state){console.log("nowplaying event: "+e.type);var player=this;onStateChanged.call(player,e,state)}function onPlaybackStopped(e,state){currentRuntimeTicks=null,console.log("nowplaying event: "+e.type),"Video"!==state.NextMediaType&&(view.removeEventListener("viewbeforehide",onViewHideStopPlayback),Emby.Page.back())}function bindToPlayer(player){player!==currentPlayer&&(releaseCurrentPlayer(),currentPlayer=player,player&&(playbackManager.getPlayerState(player).then(function(state){onStateChanged.call(player,{type:"init"},state)}),events.on(player,"playbackstart",onPlaybackStart),events.on(player,"playbackstop",onPlaybackStopped),events.on(player,"volumechange",onVolumeChanged),events.on(player,"pause",onPlayPauseStateChanged),events.on(player,"playing",onPlayPauseStateChanged),events.on(player,"timeupdate",onTimeUpdate),events.on(player,"fullscreenchange",updateFullscreenIcon)))}function releaseCurrentPlayer(){var player=currentPlayer;player&&(events.off(player,"playbackstart",onPlaybackStart),events.off(player,"playbackstop",onPlaybackStopped),events.off(player,"volumechange",onVolumeChanged),events.off(player,"pause",onPlayPauseStateChanged),events.off(player,"playing",onPlayPauseStateChanged),events.off(player,"timeupdate",onTimeUpdate),events.off(player,"fullscreenchange",updateFullscreenIcon),currentPlayer=null)}function onTimeUpdate(e){if(isEnabled){var now=(new Date).getTime();if(!(now-lastUpdateTime<700)){lastUpdateTime=now;var player=this;currentRuntimeTicks=playbackManager.duration(player),updateTimeDisplay(playbackManager.currentTime(player),currentRuntimeTicks)}}}function updatePlayPauseState(isPaused){isPaused?view.querySelector(".btnPause i").innerHTML="":view.querySelector(".btnPause i").innerHTML=""}function updatePlayerStateInternal(event,state){var playerInfo=playbackManager.getPlayerInfo(),playState=state.PlayState||{};updatePlayPauseState(playState.IsPaused);var supportedCommands=playerInfo.supportedCommands;currentPlayerSupportedCommands=supportedCommands,updatePlayerVolumeState(playState.IsMuted,playState.VolumeLevel),nowPlayingPositionSlider&&!nowPlayingPositionSlider.dragging&&(nowPlayingPositionSlider.disabled=!playState.CanSeek),btnFastForward.disabled=!playState.CanSeek,btnRewind.disabled=!playState.CanSeek;var nowPlayingItem=state.NowPlayingItem||{};updateTimeDisplay(playState.PositionTicks,nowPlayingItem.RunTimeTicks),updateNowPlayingInfo(state),state.MediaSource&&state.MediaSource.SupportsTranscoding&&supportedCommands.indexOf("SetMaxStreamingBitrate")!==-1?view.querySelector(".btnVideoOsdSettings").classList.remove("hide"):view.querySelector(".btnVideoOsdSettings").classList.add("hide"),supportedCommands.indexOf("ToggleFullscreen")===-1?view.querySelector(".btnFullscreen").classList.add("hide"):view.querySelector(".btnFullscreen").classList.remove("hide"),supportedCommands.indexOf("PictureInPicture")===-1?view.querySelector(".btnPip").classList.add("hide"):view.querySelector(".btnPip").classList.remove("hide"),updateFullscreenIcon()}function updateTimeDisplay(positionTicks,runtimeTicks){if(nowPlayingPositionSlider&&!nowPlayingPositionSlider.dragging){if(runtimeTicks){var pct=positionTicks/runtimeTicks;pct*=100,nowPlayingPositionSlider.value=pct}else nowPlayingPositionSlider.value=0;runtimeTicks&&null!=positionTicks?endsAtText.innerHTML="  -  "+mediaInfo.getEndsAtFromPosition(runtimeTicks,positionTicks,!0):endsAtText.innerHTML=""}updateTimeText(nowPlayingPositionText,positionTicks),updateTimeText(nowPlayingDurationText,runtimeTicks,!0)}function updatePlayerVolumeState(isMuted,volumeLevel){var supportedCommands=currentPlayerSupportedCommands,showMuteButton=!0,showVolumeSlider=!0;supportedCommands.indexOf("Mute")===-1&&(showMuteButton=!1),supportedCommands.indexOf("SetVolume")===-1&&(showVolumeSlider=!1),currentPlayer.isLocalPlayer&&appHost.supports("physicalvolumecontrol")&&(showMuteButton=!1,showVolumeSlider=!1),isMuted?(view.querySelector(".buttonMute").setAttribute("title",globalize.translate("Unmute")),view.querySelector(".buttonMute i").innerHTML=""):(view.querySelector(".buttonMute").setAttribute("title",globalize.translate("Mute")),view.querySelector(".buttonMute i").innerHTML=""),showMuteButton?view.querySelector(".buttonMute").classList.remove("hide"):view.querySelector(".buttonMute").classList.add("hide"),nowPlayingVolumeSlider&&(showVolumeSlider?nowPlayingVolumeSliderContainer.classList.remove("hide"):nowPlayingVolumeSliderContainer.classList.add("hide"),nowPlayingVolumeSlider.dragging||(nowPlayingVolumeSlider.value=volumeLevel||0))}function updatePlaylist(player){var btnPreviousTrack=view.querySelector(".btnPreviousTrack"),btnNextTrack=view.querySelector(".btnNextTrack");btnPreviousTrack.classList.remove("hide"),btnNextTrack.classList.remove("hide"),btnNextTrack.disabled=!1,btnPreviousTrack.disabled=!1}function updateTimeText(elem,ticks,divider){if(null==ticks)return void(elem.innerHTML="");var html=datetime.getDisplayRunningTime(ticks);divider&&(html=" / "+html),elem.innerHTML=html}function onSettingsButtonClick(e){var btn=this;require(["playerSettingsMenu"],function(playerSettingsMenu){playerSettingsMenu.show({mediaType:"Video",player:currentPlayer,positionTo:btn})})}function showAudioTrackSelection(){var player=currentPlayer,audioTracks=playbackManager.audioTracks(player),currentIndex=playbackManager.getAudioStreamIndex(player),menuItems=audioTracks.map(function(stream){var opt={name:stream.DisplayTitle,id:stream.Index};return stream.Index===currentIndex&&(opt.selected=!0),opt}),positionTo=this;require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,title:globalize.translate("Audio"),positionTo:positionTo}).then(function(id){var index=parseInt(id);index!==currentIndex&&playbackManager.setAudioStreamIndex(index,currentPlayer)})})}function showSubtitleTrackSelection(){var player=currentPlayer,streams=playbackManager.subtitleTracks(player),currentIndex=playbackManager.getSubtitleStreamIndex(player);null==currentIndex&&(currentIndex=-1),streams.unshift({Index:-1,DisplayTitle:globalize.translate("Off")});var menuItems=streams.map(function(stream){var opt={name:stream.DisplayTitle,id:stream.Index};return stream.Index===currentIndex&&(opt.selected=!0),opt}),positionTo=this;require(["actionsheet"],function(actionsheet){actionsheet.show({title:globalize.translate("Subtitles"),items:menuItems,positionTo:positionTo}).then(function(id){var index=parseInt(id);index!==currentIndex&&playbackManager.setSubtitleStreamIndex(index,currentPlayer)})})}function onWindowKeyDown(e){32!==e.keyCode||isOsdOpen()||(playbackManager.playPause(currentPlayer),showOsd())}function getImgUrl(item,chapter,index,maxWidth,apiClient){return chapter.ImageTag?apiClient.getScaledImageUrl(item.Id,{maxWidth:maxWidth,tag:chapter.ImageTag,type:"Chapter",index:index}):null}function getChapterBubbleHtml(apiClient,item,chapters,positionTicks){for(var chapter,index=-1,i=0,length=chapters.length;i=currentChapter.StartPositionTicks&&(chapter=currentChapter,index=i)}if(!chapter)return null;var src=getImgUrl(item,chapter,index,400,apiClient);if(src){var html='
';return html+='',html+='
',html+='
',html+=chapter.Name,html+="
",html+='

',html+=datetime.getDisplayRunningTime(positionTicks),html+="

",html+="
",html+="
"}return null}function onViewHideStopPlayback(){if(playbackManager.isPlayingVideo()){var player=currentPlayer;view.removeEventListener("viewbeforehide",onViewHideStopPlayback),releaseCurrentPlayer(),playbackManager.stop(player)}}function enableStopOnBack(enabled){view.removeEventListener("viewbeforehide",onViewHideStopPlayback),enabled&&playbackManager.isPlayingVideo(currentPlayer)&&view.addEventListener("viewbeforehide",onViewHideStopPlayback)}var currentPlayer,isEnabled,currentItem,hideTimeout,lastMouseMoveData,currentPlayerSupportedCommands=[],currentRuntimeTicks=0,lastUpdateTime=0,nowPlayingVolumeSlider=view.querySelector(".osdVolumeSlider"),nowPlayingVolumeSliderContainer=view.querySelector(".osdVolumeSliderContainer"),nowPlayingPositionSlider=view.querySelector(".osdPositionSlider"),nowPlayingPositionText=view.querySelector(".osdPositionText"),nowPlayingDurationText=view.querySelector(".osdDurationText"),endsAtText=view.querySelector(".endsAtText"),btnRewind=view.querySelector(".btnRewind"),btnFastForward=view.querySelector(".btnFastForward"),transitionEndEventName=dom.whichTransitionEvent(),headerElement=document.querySelector(".skinHeader"),osdBottomElement=document.querySelector(".videoOsdBottom"),_osdOpen=!0;view.addEventListener("viewbeforeshow",function(e){headerElement.classList.add("osdHeader"),Emby.Page.setTransparency("full")}),view.addEventListener("viewshow",function(e){events.on(playbackManager,"playerchange",onPlayerChange),bindToPlayer(playbackManager.getCurrentPlayer()),dom.addEventListener(document,"mousemove",onMouseMove,{passive:!0}),document.body.classList.add("autoScrollY"),showOsd(),inputManager.on(window,onInputCommand),dom.addEventListener(window,"keydown",onWindowKeyDown,{passive:!0})}),view.addEventListener("viewbeforehide",function(){dom.removeEventListener(window,"keydown",onWindowKeyDown,{passive:!0}),stopHideTimer(),headerElement.classList.remove("osdHeader"),headerElement.classList.remove("osdHeader-hidden"),dom.removeEventListener(document,"mousemove",onMouseMove,{passive:!0}),document.body.classList.remove("autoScrollY"),inputManager.off(window,onInputCommand),events.off(playbackManager,"playerchange",onPlayerChange),releaseCurrentPlayer()}),appHost.supports("remotecontrol")&&!layoutManager.tv&&view.querySelector(".btnCast").classList.remove("hide"),view.querySelector(".btnCast").addEventListener("click",function(){var btn=this;require(["playerSelectionMenu"],function(playerSelectionMenu){playerSelectionMenu.show(btn)})}),view.querySelector(".btnFullscreen").addEventListener("click",function(){playbackManager.toggleFullscreen(currentPlayer)}),view.querySelector(".btnPip").addEventListener("click",function(){playbackManager.togglePictureInPicture(currentPlayer)}),view.querySelector(".btnVideoOsdSettings").addEventListener("click",onSettingsButtonClick),view.addEventListener("viewhide",function(){headerElement.classList.remove("hide")}),view.querySelector(".pageContainer").addEventListener("click",function(){browser.touch||playbackManager.playPause(currentPlayer),showOsd()}),view.querySelector(".buttonMute").addEventListener("click",function(){playbackManager.toggleMute(currentPlayer)}),nowPlayingVolumeSlider.addEventListener("change",function(){playbackManager.setVolume(this.value,currentPlayer)}),nowPlayingPositionSlider.addEventListener("change",function(){if(currentPlayer){var newPercent=parseFloat(this.value);playbackManager.seekPercent(newPercent,currentPlayer)}}),nowPlayingPositionSlider.getBubbleHtml=function(value){if(showOsd(),!currentRuntimeTicks)return"--:--";var ticks=currentRuntimeTicks;ticks/=100,ticks*=value;var item=currentItem;if(item&&item.Chapters&&item.Chapters.length&&item.Chapters[0].ImageTag){var html=getChapterBubbleHtml(connectionManager.getApiClient(item.ServerId),item,item.Chapters,ticks);if(html)return html}return'

'+datetime.getDisplayRunningTime(ticks)+"

"},view.querySelector(".btnPreviousTrack").addEventListener("click",function(){playbackManager.previousChapter(currentPlayer)}),view.querySelector(".btnPause").addEventListener("click",function(){playbackManager.playPause(currentPlayer)}),view.querySelector(".btnNextTrack").addEventListener("click",function(){playbackManager.nextChapter(currentPlayer)}),btnRewind.addEventListener("click",function(){playbackManager.rewind(currentPlayer)}),btnFastForward.addEventListener("click",function(){playbackManager.fastForward(currentPlayer)}),view.querySelector(".btnAudio").addEventListener("click",showAudioTrackSelection),view.querySelector(".btnSubtitles").addEventListener("click",showSubtitleTrackSelection)}}); \ No newline at end of file diff --git a/dashboard-ui/thirdparty/paper-button-style.css b/dashboard-ui/thirdparty/paper-button-style.css index a111cc7f26..8435bbcbab 100644 --- a/dashboard-ui/thirdparty/paper-button-style.css +++ b/dashboard-ui/thirdparty/paper-button-style.css @@ -1 +1 @@ -.clearButton,.clearLink,.emby-button>span{vertical-align:middle}.ui-body-b .raised{background:rgba(170,170,190,.4);color:#fff}.ui-body-a .raised{background:#38c;color:#fff}.ui-body-a .button-submit{background:#52B54B;color:#fff}.ui-body-a .button-cancel{background:#fff;color:inherit;-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.ui-body-a .button-accent,.ui-body-b .button-accent,.ui-body-b .button-submit{background:#52B54B;color:#fff}.button-accent-flat{color:#52B54B!important}button.emby-button.raised.more{background:#38c;color:#fff}.clearButton{background:0 0;border:0;padding:0;cursor:pointer;outline:0;color:inherit;width:100%;font-family:inherit;font-weight:inherit}.clearLink{text-decoration:none;font-weight:inherit!important;color:inherit!important}button.emby-button.mini:not(.fab){padding:.5em .7em}.ui-body-b .fieldDescription,.ui-body-b .inputLabelUnfocused,.ui-body-b .paperListLabel,.ui-body-b .selectLabelUnfocused,.ui-body-b .textareaLabelUnfocused{color:#ccc}.ui-body-b .paperList{background-color:#2b2b2b}.ui-body-a div.formDialogHeader{background-color:#52B54B;color:#fff}.ui-body-a div.formDialogFooter{background-color:#f0f0f0;border-top:1px solid #ddd;color:inherit}.ui-body-a .formDialogHeader a{color:#fff!important;text-transform:uppercase} \ No newline at end of file +.clearLink,.emby-button>span{vertical-align:middle}.ui-body-b .raised{background:rgba(170,170,190,.4);color:#fff}.ui-body-a .raised{background:#38c;color:#fff}.ui-body-a .button-submit{background:#52B54B;color:#fff}.ui-body-a .button-cancel{background:#fff;color:inherit;-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.ui-body-a .button-accent,.ui-body-b .button-accent,.ui-body-b .button-submit{background:#52B54B;color:#fff}.button-accent-flat{color:#52B54B!important}button.emby-button.raised.more{background:#38c;color:#fff}.clearLink{text-decoration:none;font-weight:inherit!important;color:inherit!important}button.emby-button.mini:not(.fab){padding:.5em .7em}.ui-body-b .fieldDescription,.ui-body-b .inputLabelUnfocused,.ui-body-b .paperListLabel,.ui-body-b .selectLabelUnfocused,.ui-body-b .textareaLabelUnfocused{color:#ccc}.ui-body-b .paperList{background-color:#2b2b2b}.ui-body-a div.formDialogHeader{background-color:#52B54B;color:#fff}.ui-body-a div.formDialogFooter{background-color:#f0f0f0;border-top:1px solid #ddd;color:inherit}.ui-body-a .formDialogHeader a{color:#fff!important;text-transform:uppercase} \ No newline at end of file diff --git a/dashboard-ui/videoosd.html b/dashboard-ui/videoosd.html index 39c1a4ca2b..1b850707b7 100644 --- a/dashboard-ui/videoosd.html +++ b/dashboard-ui/videoosd.html @@ -246,7 +246,7 @@ -
":'
'+text+"
"}).join("");return view.querySelector(".mediaInfoIcons").innerHTML=html,html}function renderPhotoInfo(page,item){var html="",attributes=[];if(item.CameraMake&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraMake"),item.CameraMake)),item.CameraModel&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraModel"),item.CameraModel)),item.Altitude&&attributes.push(createAttribute(globalize.translate("MediaInfoAltitude"),item.Altitude.toFixed(1))),item.Aperture&&attributes.push(createAttribute(globalize.translate("MediaInfoAperture"),"F"+item.Aperture.toFixed(1))),item.ExposureTime){var val=1/item.ExposureTime;attributes.push(createAttribute(globalize.translate("MediaInfoExposureTime"),"1/"+val+" s"))}item.FocalLength&&attributes.push(createAttribute(globalize.translate("MediaInfoFocalLength"),item.FocalLength.toFixed(1)+" mm")),item.ImageOrientation,item.IsoSpeedRating&&attributes.push(createAttribute(globalize.translate("MediaInfoIsoSpeedRating"),item.IsoSpeedRating)),item.Latitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLatitude"),item.Latitude.toFixed(1))),item.Longitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLongitude"),item.Longitude.toFixed(1))),item.ShutterSpeed&&attributes.push(createAttribute(globalize.translate("MediaInfoShutterSpeed"),item.ShutterSpeed)),item.Software&&attributes.push(createAttribute(globalize.translate("MediaInfoSoftware"),item.Software)),html+=attributes.join("
"),page.querySelector(".photoInfoContent").innerHTML=html}function getArtistLinksHtml(artists,context){for(var html=[],i=0,length=artists.length;i'+artist.Name+"")}return html=html.join(" / "),1==artists.length?globalize.translate("ValueArtist",html):artists.length>1?globalize.translate("ValueArtists",html):html}function enableScrollX(){return browserInfo.mobile&&screen.availWidth<=1e3}function getPortraitShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowPortrait":"portrait"}function getSquareShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowSquare":"square"}function getThumbShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowBackdrop":"backdrop"}function renderMoreFromItems(page,item){var moreFromSection=page.querySelector("#moreFromSection");if(moreFromSection)return"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length?void ApiClient.getItems(Dashboard.getCurrentUserId(),{IncludeItemTypes:"MusicAlbum",ArtistIds:item.AlbumArtists[0].Id,Recursive:!0,ExcludeItemIds:item.Id}).then(function(result){if(!result.Items.length)return void moreFromSection.classList.add("hide");moreFromSection.classList.remove("hide"),moreFromSection.querySelector(".moreFromHeader").innerHTML=globalize.translate("MoreFromValue",item.AlbumArtists[0].Name);var html="";html+=enableScrollX()?'
':'
';var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!supportsImageAnalysis,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
";var similarContent=page.querySelector("#moreFromItems");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)}):void moreFromSection.classList.add("hide")}function renderSimilarItems(page,item,context){var similarCollapsible=page.querySelector("#similarCollapsible");if(similarCollapsible){if("Movie"!=item.Type&&"Trailer"!=item.Type&&"Series"!=item.Type&&"Program"!=item.Type&&"Recording"!=item.Type&&"Game"!=item.Type&&"MusicAlbum"!=item.Type&&"MusicArtist"!=item.Type&&"ChannelVideoItem"!=item.Type)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),options={userId:Dashboard.getCurrentUserId(),limit:"MusicAlbum"==item.Type||"MusicArtist"==item.Type?8:10,fields:"PrimaryImageAspectRatio,UserData,CanDelete"};"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length&&(options.ExcludeArtistIds=item.AlbumArtists[0].Id),enableScrollX()&&(options.limit=12),ApiClient.getSimilarItems(item.Id,options).then(function(result){if(!result.Items.length)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var html="";html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis&&("MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type);html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!cardLayout,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,context:context,lazy:!0,showDetailsMenu:!0,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:cardLayout,vibrant:cardLayout&&supportsImageAnalysis}),html+="
";var similarContent=similarCollapsible.querySelector(".similarContent");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)})}}function renderSeriesAirTime(page,item,isStatic){var seriesAirTime=page.querySelector("#seriesAirTime");if("Series"!=item.Type)return void seriesAirTime.classList.add("hide");var html="";if(item.AirDays&&item.AirDays.length&&(html+=7==item.AirDays.length?"daily":item.AirDays.map(function(a){return a+"s"}).join(",")),item.AirTime&&(html+=" at "+item.AirTime),item.Studios.length)if(isStatic)html+=" on "+item.Studios[0].Name;else{var context=inferContext(item),href=LibraryBrowser.getHref(item.Studios[0],context);html+=' on '+item.Studios[0].Name+""}html?(html=("Ended"==item.Status?"Aired ":"Airs ")+html,seriesAirTime.innerHTML=html,seriesAirTime.classList.remove("hide")):seriesAirTime.classList.add("hide")}function renderTags(page,item){var itemTags=page.querySelector(".itemTags");if(item.Tags&&item.Tags.length){for(var html="",i=0,length=item.Tags.length;i'+item.Tags[i]+"
";itemTags.innerHTML=html,itemTags.classList.remove("hide")}else itemTags.classList.add("hide")}function getEpisodesFunction(seriesId,query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getEpisodes(seriesId,query)}}function getAlbumSongsFunction(query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getItems(Dashboard.getCurrentUserId(),query)}}function renderChildren(page,item){_childrenItemsFunction=null;var fields="ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete",query={ParentId:item.Id,Fields:fields};"BoxSet"!==item.Type&&(query.SortBy="SortName");var promise,userId=Dashboard.getCurrentUserId();"Series"==item.Type?promise=ApiClient.getSeasons(item.Id,{userId:userId,Fields:fields}):"Season"==item.Type?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields})):"Episode"==item.Type&&item.SeriesId&&item.SeasonId?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields})):"MusicAlbum"==item.Type&&(_childrenItemsFunction=getAlbumSongsFunction(query)),promise=promise||ApiClient.getItems(Dashboard.getCurrentUserId(),query),promise.then(function(result){var html="",scrollX=!1,isList=!1,scrollClass="hiddenScrollX",childrenItemsContainer=page.querySelector(".childrenItemsContainer");if("MusicAlbum"==item.Type)html=listView.getListViewHtml({items:result.Items,smallIcon:!0,showIndex:!0,index:"disc",showIndexNumber:!0,playFromHere:!0,action:"playallfromhere",image:!1,artist:"auto",containerAlbumArtist:item.AlbumArtist,addToListButton:!0}),isList=!0;else if("Series"==item.Type)scrollX=enableScrollX(),html=cardBuilder.getCardsHtml({items:result.Items,shape:getPortraitShape(),showTitle:!0,centerText:!0,lazy:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX});else if("Season"==item.Type||"Episode"==item.Type){if("Episode"===item.Type&&childrenItemsContainer.classList.add("darkScroller"),scrollX="Episode"==item.Type,browser.touch||(scrollClass="smoothScrollX"),1==result.Items.length&&"Episode"===item.Type)return;html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(scrollX),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,playFromHere:!0,overlayText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX,includeParentInfoInTitle:!1})}else"GameSystem"==item.Type&&(html=cardBuilder.getCardsHtml({items:result.Items,shape:"auto",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0}));if(page.querySelector("#childrenCollapsible").classList.remove("hide"),scrollX?(childrenItemsContainer.classList.add(scrollClass),childrenItemsContainer.classList.remove("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list")):(childrenItemsContainer.classList.remove("hiddenScrollX"),childrenItemsContainer.classList.remove("smoothScrollX"),isList?(childrenItemsContainer.classList.add("vertical-list"),childrenItemsContainer.classList.remove("vertical-wrap")):(childrenItemsContainer.classList.add("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list"))),childrenItemsContainer.innerHTML=html,imageLoader.lazyChildren(childrenItemsContainer),"BoxSet"==item.Type){var collectionItemTypes=[{name:globalize.translate("HeaderMovies"),type:"Movie"},{name:globalize.translate("HeaderSeries"),type:"Series"},{name:globalize.translate("HeaderAlbums"),type:"MusicAlbum"},{name:globalize.translate("HeaderGames"),type:"Game"},{name:globalize.translate("HeaderBooks"),type:"Book"}];renderCollectionItems(page,item,collectionItemTypes,result.Items)}else if("Episode"===item.Type){var card=childrenItemsContainer.querySelector('.card[data-id="'+item.Id+'"]');card&&scrollHelper.toStart(childrenItemsContainer,card.previousSibling||card,!0)}}),"Season"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderEpisodes"):"Episode"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("MoreFromValue",item.SeasonName):"Series"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderSeasons"):"MusicAlbum"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderTracks"):"GameSystem"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderGames"):page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderItems"),"MusicAlbum"==item.Type?page.querySelector(".childrenSectionHeader",page).classList.add("hide"):page.querySelector(".childrenSectionHeader",page).classList.remove("hide")}function renderItemsByName(page,item,user){require("scripts/itembynamedetailpage".split(","),function(){window.ItemsByName.renderItems(page,item)})}function renderPlaylistItems(page,item,user){require("scripts/playlistedit".split(","),function(){PlaylistViewer.render(page,item)})}function renderChannelGuide(page,item,user){require("scripts/livetvchannel,scripts/livetvcomponents,livetvcss".split(","),function(liveTvChannelPage){liveTvChannelPage.renderPrograms(page,item.Id)})}function renderSeriesSchedule(page,item,user){}function inferContext(item){return"Movie"==item.Type||"BoxSet"==item.Type?"movies":"Series"==item.Type||"Season"==item.Type||"Episode"==item.Type?"tvshows":"Game"==item.Type||"GameSystem"==item.Type?"games":"Game"==item.Type||"GameSystem"==item.Type?"games":"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"music":null}function renderStudios(elem,item,isStatic){var context=inferContext(item);if(item.Studios&&item.Studios.length&&"Series"!=item.Type,1)elem.classList.add("hide");else{for(var html="",i=0,length=item.Studios.length;i0&&(html+="  /  "),isStatic)html+=item.Studios[i].Name;else{item.Studios[i].Type="Studio";var href=LibraryBrowser.getHref(item.Studios[i],context);html+=''+item.Studios[i].Name+""}var translationKey=item.Studios.length>1?"ValueStudios":"ValueStudio";html=globalize.translate(translationKey,html),elem.innerHTML=html,elem.classList.remove("hide")}}function renderGenres(elem,item,limit,isStatic){for(var context=inferContext(item),html="",genres=item.Genres||[],i=0,length=genres.length;i=limit);i++){i>0&&(html+='');var param="Audio"==item.Type||"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"musicgenre":"genre";if("Game"==item.MediaType&&(param="gamegenre"),isStatic)html+=genres[i];else{var type;switch(context){case"tvshows":type="Series";break;case"games":type="Game";break;case"music":type="MusicAlbum";break;default:type="Movie"}var url="secondaryitems.html?type="+type+"&"+param+"="+ApiClient.encodeName(genres[i]);html+=''+genres[i]+""}}elem.innerHTML=html}function renderAwardSummary(elem,item){item.AwardSummary?(elem.classList.remove("hide"),elem.innerHTML=globalize.translate("ValueAwards",item.AwardSummary)):elem.classList.add("hide")}function renderCollectionItems(page,parentItem,types,items){page.querySelector(".collectionItems").innerHTML="";var i,length;for(i=0,length=types.length;i",html+="",html+='',html+="
",html+='
';var shape="MusicAlbum"==type.type?getSquareShape(!1):getPortraitShape(!1);html+=cardBuilder.getCardsHtml({items:items,shape:shape,showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayMoreButton:!0,showAddToCollection:!1,showRemoveFromCollection:!0,collectionId:parentItem.Id}),html+="
",html+="
";var collectionItems=page.querySelector(".collectionItems");collectionItems.insertAdjacentHTML("beforeend",html),imageLoader.lazyChildren(collectionItems), -collectionItems.querySelector(".btnAddToCollection").addEventListener("click",function(){require(["alert"],function(alert){alert({text:globalize.translate("AddItemToCollectionHelp"),html:globalize.translate("AddItemToCollectionHelp")+'

'+globalize.translate("ButtonLearnMore")+""})})})}function renderUserDataIcons(page,item){for(var userDataIcons=page.querySelectorAll(".userDataIcons"),i=0,length=userDataIcons.length;i',html+='
',null!=review.Score||null!=review.Likes&&(html+=review.Likes?"
":"
"),html+='
',html+='

'+review.Caption+"

";var vals=[];if(review.ReviewerName&&vals.push(review.ReviewerName),review.Publisher&&vals.push(review.Publisher),html+='
'+vals.join(", ")+".",review.Date)try{var date=datetime.toLocaleDateString(datetime.parseISO8601Date(review.Date,!0));html+=''+date+""}catch(error){}html+="
",review.Url&&(html+='"),html+="
",html+="
",html+="
"}limit&&result.TotalRecordCount>limit&&(html+='

");var criticReviewsContent=page.querySelector("#criticReviewsContent");criticReviewsContent.innerHTML=html,enableScrollX()?criticReviewsContent.classList.add("hiddenScrollX"):criticReviewsContent.classList.remove("hiddenScrollX")}function renderThemeMedia(page,item){"SeriesTimer"!==item.Type&&"Timer"!==item.Type&&"Genre"!==item.Type&&"MusicGenre"!==item.Type&&"GameGenre"!==item.Type&&"Studio"!==item.Type&&"Person"!==item.Type&&ApiClient.getThemeMedia(Dashboard.getCurrentUserId(),item.Id,!0).then(function(result){var themeSongs=result.ThemeSongsResult.OwnerId==item.Id?result.ThemeSongsResult.Items:[],themeVideos=result.ThemeVideosResult.OwnerId==item.Id?result.ThemeVideosResult.Items:[];renderThemeSongs(page,themeSongs),renderThemeVideos(page,themeVideos)})}function renderThemeSongs(page,items){if(items.length){page.querySelector("#themeSongsCollapsible").classList.remove("hide");var html=listView.getListViewHtml({items:items});page.querySelector("#themeSongsContent").innerHTML=html}else page.querySelector("#themeSongsCollapsible").classList.add("hide")}function renderThemeVideos(page,items,user){if(items.length){page.querySelector("#themeVideosCollapsible").classList.remove("hide");var themeVideosContent=page.querySelector("#themeVideosContent");themeVideosContent.innerHTML=getVideosHtml(items,user),imageLoader.lazyChildren(themeVideosContent)}else page.querySelector("#themeVideosCollapsible").classList.add("hide")}function renderMusicVideos(page,item,user){ApiClient.getItems(user.Id,{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"MusicVideo",Recursive:!0,Fields:"DateCreated,CanDelete",Albums:item.Name}).then(function(result){if(result.Items.length){page.querySelector("#musicVideosCollapsible").classList.remove("hide");var musicVideosContent=page.querySelector(".musicVideosContent");musicVideosContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(musicVideosContent)}else page.querySelector("#musicVideosCollapsible").classList.add("hide")})}function renderAdditionalParts(page,item,user){ApiClient.getAdditionalVideoParts(user.Id,item.Id).then(function(result){if(result.Items.length){page.querySelector("#additionalPartsCollapsible").classList.remove("hide");var additionalPartsContent=page.querySelector("#additionalPartsContent");additionalPartsContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(additionalPartsContent)}else page.querySelector("#additionalPartsCollapsible").classList.add("hide")})}function renderScenes(page,item){var chapters=item.Chapters||[];if(chapters.length&&!chapters[0].ImageTag&&(chapters=[]),chapters.length){page.querySelector("#scenesCollapsible").classList.remove("hide");var scenesContent=page.querySelector("#scenesContent");enableScrollX()?scenesContent.classList.add("smoothScrollX"):scenesContent.classList.add("vertical-wrap"),require(["chaptercardbuilder"],function(chaptercardbuilder){chaptercardbuilder.buildChapterCards(item,chapters,{itemsContainer:scenesContent,coverImage:!0,width:400,backdropShape:getThumbShape(),squareShape:getSquareShape()})})}else page.querySelector("#scenesCollapsible").classList.add("hide")}function renderMediaSources(page,user,item){var html=item.MediaSources.map(function(v){return getMediaSourceHtml(user,item,v)}).join('
');item.MediaSources.length>1&&(html="
"+html);var mediaInfoContent=page.querySelector("#mediaInfoContent");mediaInfoContent.innerHTML=html}function getMediaSourceHtml(user,item,version){var html="";version.Name&&item.MediaSources.length>1&&(html+='
'+version.Name+"

");for(var i=0,length=version.MediaStreams.length;i';var displayType=globalize.translate("MediaInfoStreamType"+stream.Type);html+='

'+displayType+"

";var attributes=[];stream.Language&&"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoLanguage"),stream.Language)),stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoCodec"),stream.Codec.toUpperCase())),stream.CodecTag&&attributes.push(createAttribute(globalize.translate("MediaInfoCodecTag"),stream.CodecTag)),null!=stream.IsAVC&&attributes.push(createAttribute("AVC",stream.IsAVC?"Yes":"No")),stream.Profile&&attributes.push(createAttribute(globalize.translate("MediaInfoProfile"),stream.Profile)),stream.Level&&attributes.push(createAttribute(globalize.translate("MediaInfoLevel"),stream.Level)),(stream.Width||stream.Height)&&attributes.push(createAttribute(globalize.translate("MediaInfoResolution"),stream.Width+"x"+stream.Height)),stream.AspectRatio&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoAspectRatio"),stream.AspectRatio)),"Video"==stream.Type&&(null!=stream.IsAnamorphic&&attributes.push(createAttribute(globalize.translate("MediaInfoAnamorphic"),stream.IsAnamorphic?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoInterlaced"),stream.IsInterlaced?"Yes":"No"))),(stream.AverageFrameRate||stream.RealFrameRate)&&attributes.push(createAttribute(globalize.translate("MediaInfoFramerate"),stream.AverageFrameRate||stream.RealFrameRate)),stream.ChannelLayout&&attributes.push(createAttribute(globalize.translate("MediaInfoLayout"),stream.ChannelLayout)),stream.Channels&&attributes.push(createAttribute(globalize.translate("MediaInfoChannels"),stream.Channels+" ch")),stream.BitRate&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoBitrate"),parseInt(stream.BitRate/1e3)+" kbps")),stream.SampleRate&&attributes.push(createAttribute(globalize.translate("MediaInfoSampleRate"),stream.SampleRate+" Hz")),stream.BitDepth&&attributes.push(createAttribute(globalize.translate("MediaInfoBitDepth"),stream.BitDepth+" bit")),stream.PixelFormat&&attributes.push(createAttribute(globalize.translate("MediaInfoPixelFormat"),stream.PixelFormat)),stream.RefFrames&&attributes.push(createAttribute(globalize.translate("MediaInfoRefFrames"),stream.RefFrames)),stream.NalLengthSize&&attributes.push(createAttribute("NAL",stream.NalLengthSize)),"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoDefault"),stream.IsDefault?"Yes":"No")),"Subtitle"==stream.Type&&(attributes.push(createAttribute(globalize.translate("MediaInfoForced"),stream.IsForced?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoExternal"),stream.IsExternal?"Yes":"No"))),"Video"==stream.Type&&version.Timestamp&&attributes.push(createAttribute(globalize.translate("MediaInfoTimestamp"),version.Timestamp)),stream.DisplayTitle&&attributes.push(createAttribute("Title",stream.DisplayTitle)),html+=attributes.join("
"),html+="
"}}if(version.Container&&(html+='
'+globalize.translate("MediaInfoContainer")+''+version.Container+"
"),version.Formats&&version.Formats.length,version.Path&&"Http"!=version.Protocol&&user&&user.Policy.IsAdministrator&&(html+='
'+globalize.translate("MediaInfoPath")+''+version.Path+"
"),version.Size){var size=(version.Size/1048576).toFixed(0);html+='
'+globalize.translate("MediaInfoSize")+''+size+" MB
"}return html}function createAttribute(label,value){return''+label+''+value+""}function getVideosHtml(items,user,limit,moreButtonClass){var html=cardBuilder.getCardsHtml({items:items,shape:"auto",showTitle:!0,action:"play",overlayText:!0,showRuntime:!0});return limit&&items.length>limit&&(html+='

"),html}function renderSpecials(page,item,user,limit){ApiClient.getSpecialFeatures(user.Id,item.Id).then(function(specials){var specialsContent=page.querySelector("#specialsContent");specialsContent.innerHTML=getVideosHtml(specials,user,limit,"moreSpecials"),imageLoader.lazyChildren(specialsContent)})}function renderCast(page,item,context,limit,isStatic){var people=item.People||[],castContent=page.querySelector("#castContent");enableScrollX()?(castContent.classList.add("smoothScrollX"),limit=32):castContent.classList.add("vertical-wrap");var limitExceeded=limit&&people.length>limit;limitExceeded&&(people=people.slice(0),people.length=Math.min(limit,people.length)),require(["peoplecardbuilder"],function(peoplecardbuilder){peoplecardbuilder.buildPeopleCards(people,{itemsContainer:castContent,coverImage:!0,serverId:item.ServerId,width:160,shape:getPortraitShape()})});var morePeopleButton=page.querySelector(".morePeople");morePeopleButton&&(limitExceeded&&!enableScrollX()?morePeopleButton.classList.remove("hide"):morePeopleButton.classList.add("hide"))}function play(startPosition){playbackManager.play({items:[currentItem],startPositionTicks:startPosition})}function splitVersions(page,params){require(["confirm"],function(confirm){confirm("Are you sure you wish to split the media sources into separate items?","Split Media Apart").then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Videos/"+params.id+"/AlternateSources")}).then(function(){Dashboard.hideLoadingMsg(),reload(page,params)})})})}function playTrailer(page){playbackManager.playTrailers(currentItem)}function showPlayMenu(item,target){require(["playMenu"],function(playMenu){playMenu.show({item:item,positionTo:target})})}function playCurrentItem(button,mode){var item=currentItem;return"Program"===item.Type?void ApiClient.getLiveTvChannel(item.ChannelId,Dashboard.getCurrentUserId()).then(function(channel){playbackManager.play({items:[channel]})}):void("playmenu"===mode?showPlayMenu(item,button):playbackManager.play({items:[item],startPositionTicks:item.UserData&&"resume"===mode?item.UserData.PlaybackPositionTicks:0}))}function itemDetailPage(){var self=this;self.play=play,self.setInitialCollapsibleState=setInitialCollapsibleState,self.renderDetails=renderDetails,self.renderCriticReviews=renderCriticReviews,self.renderCast=renderCast,self.renderScenes=renderScenes,self.renderMediaSources=renderMediaSources}function onPlayClick(){var mode=this.getAttribute("data-mode");playCurrentItem(this,mode)}function onInstantMixClick(){playbackManager.instantMix(currentItem)}function onShuffleClick(){playbackManager.shuffle(currentItem)}function onDeleteClick(){require(["deleteHelper"],function(deleteHelper){deleteHelper.deleteItem({item:currentItem,navigate:!0})})}function onCancelSeriesTimerClick(){require(["recordingHelper"],function(recordingHelper){recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id,currentItem.ServerId).then(function(){Dashboard.navigate("livetv.html")})})}var currentItem,currentRecordingFields,_childrenItemsFunction=null;return window.ItemDetailPage=new itemDetailPage,function(view,params){function onPlayTrailerClick(){playTrailer(view)}function onMoreCommandsClick(){var button=this;itemContextMenu.show(getContextMenuOptions(currentItem,button)).then(function(result){result.deleted?Emby.Page.goHome():result.updated&&reload(view,params)})}function editImages(){return new Promise(function(resolve,reject){require(["imageEditor"],function(imageEditor){imageEditor.show({itemId:currentItem.Id,serverId:currentItem.ServerId}).then(resolve,reject)})})}function onWebSocketMessage(e,data){var msg=data;if("UserDataChanged"===msg.MessageType&¤tItem&&msg.Data.UserId==Dashboard.getCurrentUserId()){var key=currentItem.UserData.Key,userData=msg.Data.UserDataList.filter(function(u){return u.Key==key})[0];userData&&(currentItem.UserData=userData,Dashboard.getCurrentUser().then(function(user){refreshImage(view,currentItem,user)}))}}var i,length,elems=view.querySelectorAll(".btnPlay");for(i=0,length=elems.length;i"}function renderSeriesTimerSchedule(page,seriesTimerId){ApiClient.getLiveTvTimers({UserId:ApiClient.getCurrentUserId(),ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb",SortBy:"StartDate",EnableTotalRecordCount:!1,EnableUserData:!1,SeriesTimerId:seriesTimerId,Fields:"ChannelInfo"}).then(function(result){result.Items.length&&result.Items[0].SeriesTimerId!=seriesTimerId&&(result.Items=[]);var html=getProgramScheduleHtml(result.Items),scheduleTab=page.querySelector(".seriesTimerSchedule");scheduleTab.innerHTML=html,imageLoader.lazyChildren(scheduleTab)})}function renderSeriesTimerEditor(page,item,user){if("SeriesTimer"===item.Type){if(!user.Policy.EnableLiveTvManagement)return page.querySelector(".seriesTimerScheduleSection").classList.add("hide"),void page.querySelector(".btnCancelSeriesTimer").classList.add("hide");require(["seriesRecordingEditor"],function(seriesRecordingEditor){seriesRecordingEditor.embed(item,ApiClient.serverId(),{context:page.querySelector(".seriesRecordingEditor")})}),page.querySelector(".seriesTimerScheduleSection").classList.remove("hide"),page.querySelector(".btnCancelSeriesTimer").classList.remove("hide"),renderSeriesTimerSchedule(page,item.Id)}}function reloadPlayButtons(page,item){var canPlay=!1;if("Program"==item.Type){var now=new Date;now>=datetime.parseISO8601Date(item.StartDate,!0)&&now0)}else hideAll(page,"btnPlay"),hideAll(page,"btnResume"),hideAll(page,"btnInstantMix"),hideAll(page,"btnShuffle");return canPlay}function reloadFromItem(page,params,item){currentItem=item;var context=params.context;LibraryBrowser.renderName(item,page.querySelector(".itemName"),!1,context),LibraryBrowser.renderParentName(item,page.querySelector(".parentName"),context),libraryMenu.setTitle(""),Dashboard.getCurrentUser().then(function(user){window.scrollTo(0,0),renderSeriesTimerEditor(page,item,user),renderImage(page,item,user),renderLogo(page,item,ApiClient),setInitialCollapsibleState(page,item,context,user),renderDetails(page,item,context),dom.getWindowSize().innerWidth>=800?backdrop.setBackdrops([item]):backdrop.clear(),LibraryBrowser.renderDetailPageBackdrop(page,item,imageLoader),libraryMenu.setTransparentMenu(!0);var canPlay=reloadPlayButtons(page,item),hasAnyButton=canPlay;(item.LocalTrailerCount||item.RemoteTrailers&&item.RemoteTrailers.length)&&"Full"==item.PlayAccess?(hideAll(page,"btnPlayTrailer",!0),hasAnyButton=!0):hideAll(page,"btnPlayTrailer"),item.CanDelete&&!item.IsFolder?(hideAll(page,"btnDeleteItem",!0),hasAnyButton=!0):hideAll(page,"btnDeleteItem"),renderSyncLocalContainer(page,params,user,item),hasAnyButton||"Program"!==item.Type?hideAll(page,"mainDetailButtons",!0):hideAll(page,"mainDetailButtons"),showRecordingFields(page,item,user);var groupedVersions=(item.MediaSources||[]).filter(function(g){return"Grouping"==g.Type});user.Policy.IsAdministrator&&groupedVersions.length?page.querySelector(".splitVersionContainer").classList.remove("hide"):page.querySelector(".splitVersionContainer").classList.add("hide"),itemContextMenu.getCommands(getContextMenuOptions(item)).then(function(commands){commands.length?hideAll(page,"btnMoreCommands",!0):hideAll(page,"btnMoreCommands")});var itemBirthday=page.querySelector("#itemBirthday");if("Person"==item.Type&&item.PremiereDate)try{var birthday=datetime.parseISO8601Date(item.PremiereDate,!0).toDateString();itemBirthday.classList.remove("hide"),itemBirthday.innerHTML=globalize.translate("BirthDateValue").replace("{0}",birthday)}catch(err){itemBirthday.classList.add("hide")}else itemBirthday.classList.add("hide");var itemDeathDate=page.querySelector("#itemDeathDate");if("Person"==item.Type&&item.EndDate)try{var deathday=datetime.parseISO8601Date(item.EndDate,!0).toDateString();itemDeathDate.classList.remove("hide"),itemDeathDate.innerHTML=globalize.translate("DeathDateValue").replace("{0}",deathday)}catch(err){itemDeathDate.classList.add("hide")}var itemBirthLocation=page.querySelector("#itemBirthLocation");if("Person"==item.Type&&item.ProductionLocations&&item.ProductionLocations.length){var gmap=''+item.ProductionLocations[0]+"";itemBirthLocation.classList.remove("hide"),itemBirthLocation.innerHTML=globalize.translate("BirthPlaceValue").replace("{0}",gmap)}else itemBirthLocation.classList.add("hide")}),setPeopleHeader(page,item),page.dispatchEvent(new CustomEvent("displayingitem",{detail:{item:item,context:context},bubbles:!0})),Dashboard.hideLoadingMsg()}function logoImageUrl(item,apiClient,options){return options=options||{},options.type="Logo",item.ImageTags&&item.ImageTags.Logo?(options.tag=item.ImageTags.Logo,apiClient.getScaledImageUrl(item.Id,options)):item.ParentLogoImageTag?(options.tag=item.ParentLogoImageTag,apiClient.getScaledImageUrl(item.ParentLogoItemId,options)):null}function renderLogo(page,item,apiClient){var url=logoImageUrl(item,apiClient,{maxWidth:300}),detailLogo=page.querySelector(".detailLogo");url?(detailLogo.classList.remove("hide"),detailLogo.classList.add("lazy"),detailLogo.setAttribute("data-src",url),imageLoader.lazyImage(detailLogo)):detailLogo.classList.add("hide")}function showRecordingFields(page,item,user){if(!currentRecordingFields){var recordingFieldsElement=page.querySelector(".recordingFields");"Program"==item.Type&&user.Policy.EnableLiveTvManagement?require(["recordingFields"],function(recordingFields){currentRecordingFields=new recordingFields({parent:recordingFieldsElement,programId:item.Id,serverId:item.ServerId}),recordingFieldsElement.classList.remove("hide")}):(recordingFieldsElement.classList.add("hide"),recordingFieldsElement.innerHTML="")}}function renderLinks(linksElem,item){var links=[];if(item.HomePageUrl&&links.push(''+globalize.translate("ButtonWebsite")+""),item.ExternalUrls)for(var i=0,length=item.ExternalUrls.length;i'+url.Name+"")}if(links.length){var html=links.join('');linksElem.innerHTML=html,linksElem.classList.remove("hide")}else linksElem.classList.add("hide")}function renderImage(page,item,user){var container=page.querySelector(".detailImageContainer");LibraryBrowser.renderDetailImage(container,item,user.Policy.IsAdministrator&&"Photo"!=item.MediaType,null,imageLoader,indicators)}function refreshDetailImageUserData(elem,item){var detailImageProgressContainer=elem.querySelector(".detailImageProgressContainer");detailImageProgressContainer.innerHTML=indicators.getProgressBarHtml(item)}function refreshImage(page,item,user){refreshDetailImageUserData(page.querySelector(".detailImageContainer"),item)}function setPeopleHeader(page,item){"Audio"==item.MediaType||"MusicAlbum"==item.Type||"Book"==item.MediaType||"Photo"==item.MediaType?page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderPeople"):page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderCastAndCrew")}function renderNextUp(page,item,user){var section=page.querySelector(".nextUpSection");return"Series"!=item.Type?void section.classList.add("hide"):void ApiClient.getNextUpEpisodes({SeriesId:item.Id,UserId:user.Id}).then(function(result){result.Items.length?section.classList.remove("hide"):section.classList.add("hide");var html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(!1),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,overlayText:!0,lazy:!0,overlayPlayButton:!0}),itemsContainer=section.querySelector(".nextUpItems");itemsContainer.innerHTML=html,imageLoader.lazyChildren(itemsContainer)})}function setInitialCollapsibleState(page,item,context,user){page.querySelector(".collectionItems").innerHTML="","TvChannel"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderChannelGuide(page,item,user)):"Playlist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderPlaylistItems(page,item,user)):"Studio"==item.Type||"Person"==item.Type||"Genre"==item.Type||"MusicGenre"==item.Type||"GameGenre"==item.Type||"MusicArtist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderItemsByName(page,item,user)):item.IsFolder||"Episode"==item.Type?("BoxSet"==item.Type&&page.querySelector("#childrenCollapsible").classList.add("hide"),renderChildren(page,item)):page.querySelector("#childrenCollapsible").classList.add("hide"),"Series"==item.Type&&renderSeriesSchedule(page,item,user),"Series"==item.Type?renderNextUp(page,item,user):page.querySelector(".nextUpSection").classList.add("hide"),item.MediaSources&&item.MediaSources.length&&renderMediaSources(page,user,item),renderScenes(page,item),item.SpecialFeatureCount&&0!=item.SpecialFeatureCount&&"Series"!=item.Type?(page.querySelector("#specialsCollapsible").classList.remove("hide"),renderSpecials(page,item,user,6)):page.querySelector("#specialsCollapsible").classList.add("hide"),item.People&&item.People.length?(page.querySelector("#castCollapsible").classList.remove("hide"),renderCast(page,item,context,enableScrollX()?null:12)):page.querySelector("#castCollapsible").classList.add("hide"),item.PartCount&&item.PartCount>1?(page.querySelector("#additionalPartsCollapsible").classList.remove("hide"),renderAdditionalParts(page,item,user)):page.querySelector("#additionalPartsCollapsible").classList.add("hide"),page.querySelector("#themeSongsCollapsible").classList.add("hide"),page.querySelector("#themeVideosCollapsible").classList.add("hide"),"MusicAlbum"==item.Type?renderMusicVideos(page,item,user):page.querySelector("#musicVideosCollapsible").classList.add("hide"),renderThemeMedia(page,item,user),enableScrollX()?renderCriticReviews(page,item):renderCriticReviews(page,item,1)}function renderOverview(elems,item){for(var i=0,length=elems.length;i'+text+"
":'
'+text+"
"}).join("");return view.querySelector(".mediaInfoIcons").innerHTML=html,html}function renderPhotoInfo(page,item){var html="",attributes=[];if(item.CameraMake&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraMake"),item.CameraMake)),item.CameraModel&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraModel"),item.CameraModel)),item.Altitude&&attributes.push(createAttribute(globalize.translate("MediaInfoAltitude"),item.Altitude.toFixed(1))),item.Aperture&&attributes.push(createAttribute(globalize.translate("MediaInfoAperture"),"F"+item.Aperture.toFixed(1))),item.ExposureTime){var val=1/item.ExposureTime;attributes.push(createAttribute(globalize.translate("MediaInfoExposureTime"),"1/"+val+" s"))}item.FocalLength&&attributes.push(createAttribute(globalize.translate("MediaInfoFocalLength"),item.FocalLength.toFixed(1)+" mm")),item.ImageOrientation,item.IsoSpeedRating&&attributes.push(createAttribute(globalize.translate("MediaInfoIsoSpeedRating"),item.IsoSpeedRating)),item.Latitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLatitude"),item.Latitude.toFixed(1))),item.Longitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLongitude"),item.Longitude.toFixed(1))),item.ShutterSpeed&&attributes.push(createAttribute(globalize.translate("MediaInfoShutterSpeed"),item.ShutterSpeed)),item.Software&&attributes.push(createAttribute(globalize.translate("MediaInfoSoftware"),item.Software)),html+=attributes.join("
"),page.querySelector(".photoInfoContent").innerHTML=html}function getArtistLinksHtml(artists,context){for(var html=[],i=0,length=artists.length;i'+artist.Name+"")}return html=html.join(" / "),1==artists.length?globalize.translate("ValueArtist",html):artists.length>1?globalize.translate("ValueArtists",html):html}function enableScrollX(){return browserInfo.mobile&&screen.availWidth<=1e3}function getPortraitShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowPortrait":"portrait"}function getSquareShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowSquare":"square"}function getThumbShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowBackdrop":"backdrop"}function renderMoreFromItems(page,item){var moreFromSection=page.querySelector("#moreFromSection");if(moreFromSection)return"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length?void ApiClient.getItems(Dashboard.getCurrentUserId(),{IncludeItemTypes:"MusicAlbum",ArtistIds:item.AlbumArtists[0].Id,Recursive:!0,ExcludeItemIds:item.Id}).then(function(result){if(!result.Items.length)return void moreFromSection.classList.add("hide");moreFromSection.classList.remove("hide"),moreFromSection.querySelector(".moreFromHeader").innerHTML=globalize.translate("MoreFromValue",item.AlbumArtists[0].Name);var html="";html+=enableScrollX()?'
':'
';var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!supportsImageAnalysis,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
";var similarContent=page.querySelector("#moreFromItems");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)}):void moreFromSection.classList.add("hide")}function renderSimilarItems(page,item,context){var similarCollapsible=page.querySelector("#similarCollapsible");if(similarCollapsible){if("Movie"!=item.Type&&"Trailer"!=item.Type&&"Series"!=item.Type&&"Program"!=item.Type&&"Recording"!=item.Type&&"Game"!=item.Type&&"MusicAlbum"!=item.Type&&"MusicArtist"!=item.Type&&"ChannelVideoItem"!=item.Type)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),options={userId:Dashboard.getCurrentUserId(),limit:"MusicAlbum"==item.Type||"MusicArtist"==item.Type?8:10,fields:"PrimaryImageAspectRatio,UserData,CanDelete"};"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length&&(options.ExcludeArtistIds=item.AlbumArtists[0].Id),enableScrollX()&&(options.limit=12),ApiClient.getSimilarItems(item.Id,options).then(function(result){if(!result.Items.length)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var html="";html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis&&("MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type);html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!cardLayout,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,context:context,lazy:!0,showDetailsMenu:!0,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:cardLayout,vibrant:cardLayout&&supportsImageAnalysis}),html+="
";var similarContent=similarCollapsible.querySelector(".similarContent");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)})}}function renderSeriesAirTime(page,item,isStatic){var seriesAirTime=page.querySelector("#seriesAirTime");if("Series"!=item.Type)return void seriesAirTime.classList.add("hide");var html="";if(item.AirDays&&item.AirDays.length&&(html+=7==item.AirDays.length?"daily":item.AirDays.map(function(a){return a+"s"}).join(",")),item.AirTime&&(html+=" at "+item.AirTime),item.Studios.length)if(isStatic)html+=" on "+item.Studios[0].Name;else{var context=inferContext(item),href=LibraryBrowser.getHref(item.Studios[0],context);html+=' on '+item.Studios[0].Name+""}html?(html=("Ended"==item.Status?"Aired ":"Airs ")+html,seriesAirTime.innerHTML=html,seriesAirTime.classList.remove("hide")):seriesAirTime.classList.add("hide")}function renderTags(page,item){var itemTags=page.querySelector(".itemTags");if(item.Tags&&item.Tags.length){for(var html="",i=0,length=item.Tags.length;i'+item.Tags[i]+"
";itemTags.innerHTML=html,itemTags.classList.remove("hide")}else itemTags.classList.add("hide")}function getEpisodesFunction(seriesId,query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getEpisodes(seriesId,query)}}function getAlbumSongsFunction(query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getItems(Dashboard.getCurrentUserId(),query)}}function renderChildren(page,item){_childrenItemsFunction=null;var fields="ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete",query={ParentId:item.Id,Fields:fields};"BoxSet"!==item.Type&&(query.SortBy="SortName");var promise,userId=Dashboard.getCurrentUserId();"Series"==item.Type?promise=ApiClient.getSeasons(item.Id,{userId:userId,Fields:fields}):"Season"==item.Type?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields})):"Episode"==item.Type&&item.SeriesId&&item.SeasonId?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields})):"MusicAlbum"==item.Type&&(_childrenItemsFunction=getAlbumSongsFunction(query)),promise=promise||ApiClient.getItems(Dashboard.getCurrentUserId(),query),promise.then(function(result){var html="",scrollX=!1,isList=!1,scrollClass="hiddenScrollX",childrenItemsContainer=page.querySelector(".childrenItemsContainer");if("MusicAlbum"==item.Type)html=listView.getListViewHtml({items:result.Items,smallIcon:!0,showIndex:!0,index:"disc",showIndexNumber:!0,playFromHere:!0,action:"playallfromhere",image:!1,artist:"auto",containerAlbumArtist:item.AlbumArtist,addToListButton:!0}),isList=!0;else if("Series"==item.Type)scrollX=enableScrollX(),html=cardBuilder.getCardsHtml({items:result.Items,shape:getPortraitShape(),showTitle:!0,centerText:!0,lazy:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX});else if("Season"==item.Type||"Episode"==item.Type){if("Episode"===item.Type&&childrenItemsContainer.classList.add("darkScroller"),scrollX="Episode"==item.Type,browser.touch||(scrollClass="smoothScrollX"),1==result.Items.length&&"Episode"===item.Type)return;html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(scrollX),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,playFromHere:!0,overlayText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX,includeParentInfoInTitle:!1})}else"GameSystem"==item.Type&&(html=cardBuilder.getCardsHtml({items:result.Items,shape:"auto",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0}));if(page.querySelector("#childrenCollapsible").classList.remove("hide"),scrollX?(childrenItemsContainer.classList.add(scrollClass),childrenItemsContainer.classList.remove("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list")):(childrenItemsContainer.classList.remove("hiddenScrollX"),childrenItemsContainer.classList.remove("smoothScrollX"),isList?(childrenItemsContainer.classList.add("vertical-list"),childrenItemsContainer.classList.remove("vertical-wrap")):(childrenItemsContainer.classList.add("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list"))),childrenItemsContainer.innerHTML=html,imageLoader.lazyChildren(childrenItemsContainer),"BoxSet"==item.Type){var collectionItemTypes=[{name:globalize.translate("HeaderMovies"),type:"Movie"},{name:globalize.translate("HeaderSeries"),type:"Series"},{name:globalize.translate("HeaderAlbums"),type:"MusicAlbum"},{name:globalize.translate("HeaderGames"),type:"Game"},{name:globalize.translate("HeaderBooks"),type:"Book"}];renderCollectionItems(page,item,collectionItemTypes,result.Items)}else if("Episode"===item.Type){var card=childrenItemsContainer.querySelector('.card[data-id="'+item.Id+'"]');card&&scrollHelper.toStart(childrenItemsContainer,card.previousSibling||card,!0)}}),"Season"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderEpisodes"):"Episode"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("MoreFromValue",item.SeasonName):"Series"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderSeasons"):"MusicAlbum"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderTracks"):"GameSystem"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderGames"):page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderItems"),"MusicAlbum"==item.Type?page.querySelector(".childrenSectionHeader",page).classList.add("hide"):page.querySelector(".childrenSectionHeader",page).classList.remove("hide")}function renderItemsByName(page,item,user){require("scripts/itembynamedetailpage".split(","),function(){window.ItemsByName.renderItems(page,item)})}function renderPlaylistItems(page,item,user){require("scripts/playlistedit".split(","),function(){PlaylistViewer.render(page,item)})}function renderChannelGuide(page,item,user){require("scripts/livetvchannel,scripts/livetvcomponents,livetvcss".split(","),function(liveTvChannelPage){liveTvChannelPage.renderPrograms(page,item.Id)})}function renderSeriesSchedule(page,item,user){}function inferContext(item){return"Movie"==item.Type||"BoxSet"==item.Type?"movies":"Series"==item.Type||"Season"==item.Type||"Episode"==item.Type?"tvshows":"Game"==item.Type||"GameSystem"==item.Type?"games":"Game"==item.Type||"GameSystem"==item.Type?"games":"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"music":null}function renderStudios(elem,item,isStatic){var context=inferContext(item);if(item.Studios&&item.Studios.length&&"Series"!=item.Type,1)elem.classList.add("hide");else{for(var html="",i=0,length=item.Studios.length;i0&&(html+="  /  "),isStatic)html+=item.Studios[i].Name;else{item.Studios[i].Type="Studio";var href=LibraryBrowser.getHref(item.Studios[i],context);html+=''+item.Studios[i].Name+""}var translationKey=item.Studios.length>1?"ValueStudios":"ValueStudio";html=globalize.translate(translationKey,html),elem.innerHTML=html,elem.classList.remove("hide")}}function renderGenres(elem,item,limit,isStatic){for(var context=inferContext(item),html="",genres=item.Genres||[],i=0,length=genres.length;i=limit);i++){i>0&&(html+='');var param="Audio"==item.Type||"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"musicgenre":"genre";if("Game"==item.MediaType&&(param="gamegenre"),isStatic)html+=genres[i];else{var type;switch(context){case"tvshows":type="Series";break;case"games":type="Game";break;case"music":type="MusicAlbum";break;default:type="Movie"}var url="secondaryitems.html?type="+type+"&"+param+"="+ApiClient.encodeName(genres[i]);html+=''+genres[i]+""}}elem.innerHTML=html}function renderAwardSummary(elem,item){item.AwardSummary?(elem.classList.remove("hide"),elem.innerHTML=globalize.translate("ValueAwards",item.AwardSummary)):elem.classList.add("hide")}function renderCollectionItems(page,parentItem,types,items){page.querySelector(".collectionItems").innerHTML="";var i,length;for(i=0,length=types.length;i",html+="",html+='',html+="
",html+='
';var shape="MusicAlbum"==type.type?getSquareShape(!1):getPortraitShape(!1);html+=cardBuilder.getCardsHtml({items:items,shape:shape,showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayMoreButton:!0,showAddToCollection:!1,showRemoveFromCollection:!0,collectionId:parentItem.Id}),html+="
",html+="
";var collectionItems=page.querySelector(".collectionItems"); +collectionItems.insertAdjacentHTML("beforeend",html),imageLoader.lazyChildren(collectionItems),collectionItems.querySelector(".btnAddToCollection").addEventListener("click",function(){require(["alert"],function(alert){alert({text:globalize.translate("AddItemToCollectionHelp"),html:globalize.translate("AddItemToCollectionHelp")+'

'+globalize.translate("ButtonLearnMore")+""})})})}function renderUserDataIcons(page,item){for(var userDataIcons=page.querySelectorAll(".userDataIcons"),i=0,length=userDataIcons.length;i',html+='
',null!=review.Score||null!=review.Likes&&(html+=review.Likes?"
":"
"),html+='
',html+='

'+review.Caption+"

";var vals=[];if(review.ReviewerName&&vals.push(review.ReviewerName),review.Publisher&&vals.push(review.Publisher),html+='
'+vals.join(", ")+".",review.Date)try{var date=datetime.toLocaleDateString(datetime.parseISO8601Date(review.Date,!0));html+=''+date+""}catch(error){}html+="
",review.Url&&(html+='"),html+="
",html+="
",html+="
"}limit&&result.TotalRecordCount>limit&&(html+='

");var criticReviewsContent=page.querySelector("#criticReviewsContent");criticReviewsContent.innerHTML=html,enableScrollX()?criticReviewsContent.classList.add("hiddenScrollX"):criticReviewsContent.classList.remove("hiddenScrollX")}function renderThemeMedia(page,item){"SeriesTimer"!==item.Type&&"Timer"!==item.Type&&"Genre"!==item.Type&&"MusicGenre"!==item.Type&&"GameGenre"!==item.Type&&"Studio"!==item.Type&&"Person"!==item.Type&&ApiClient.getThemeMedia(Dashboard.getCurrentUserId(),item.Id,!0).then(function(result){var themeSongs=result.ThemeSongsResult.OwnerId==item.Id?result.ThemeSongsResult.Items:[],themeVideos=result.ThemeVideosResult.OwnerId==item.Id?result.ThemeVideosResult.Items:[];renderThemeSongs(page,themeSongs),renderThemeVideos(page,themeVideos)})}function renderThemeSongs(page,items){if(items.length){page.querySelector("#themeSongsCollapsible").classList.remove("hide");var html=listView.getListViewHtml({items:items});page.querySelector("#themeSongsContent").innerHTML=html}else page.querySelector("#themeSongsCollapsible").classList.add("hide")}function renderThemeVideos(page,items,user){if(items.length){page.querySelector("#themeVideosCollapsible").classList.remove("hide");var themeVideosContent=page.querySelector("#themeVideosContent");themeVideosContent.innerHTML=getVideosHtml(items,user),imageLoader.lazyChildren(themeVideosContent)}else page.querySelector("#themeVideosCollapsible").classList.add("hide")}function renderMusicVideos(page,item,user){ApiClient.getItems(user.Id,{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"MusicVideo",Recursive:!0,Fields:"DateCreated,CanDelete",Albums:item.Name}).then(function(result){if(result.Items.length){page.querySelector("#musicVideosCollapsible").classList.remove("hide");var musicVideosContent=page.querySelector(".musicVideosContent");musicVideosContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(musicVideosContent)}else page.querySelector("#musicVideosCollapsible").classList.add("hide")})}function renderAdditionalParts(page,item,user){ApiClient.getAdditionalVideoParts(user.Id,item.Id).then(function(result){if(result.Items.length){page.querySelector("#additionalPartsCollapsible").classList.remove("hide");var additionalPartsContent=page.querySelector("#additionalPartsContent");additionalPartsContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(additionalPartsContent)}else page.querySelector("#additionalPartsCollapsible").classList.add("hide")})}function renderScenes(page,item){var chapters=item.Chapters||[];if(chapters.length&&!chapters[0].ImageTag&&(chapters=[]),chapters.length){page.querySelector("#scenesCollapsible").classList.remove("hide");var scenesContent=page.querySelector("#scenesContent");enableScrollX()?scenesContent.classList.add("smoothScrollX"):scenesContent.classList.add("vertical-wrap"),require(["chaptercardbuilder"],function(chaptercardbuilder){chaptercardbuilder.buildChapterCards(item,chapters,{itemsContainer:scenesContent,coverImage:!0,width:400,backdropShape:getThumbShape(),squareShape:getSquareShape()})})}else page.querySelector("#scenesCollapsible").classList.add("hide")}function renderMediaSources(page,user,item){var html=item.MediaSources.map(function(v){return getMediaSourceHtml(user,item,v)}).join('
');item.MediaSources.length>1&&(html="
"+html);var mediaInfoContent=page.querySelector("#mediaInfoContent");mediaInfoContent.innerHTML=html}function getMediaSourceHtml(user,item,version){var html="";version.Name&&item.MediaSources.length>1&&(html+='
'+version.Name+"

");for(var i=0,length=version.MediaStreams.length;i';var displayType=globalize.translate("MediaInfoStreamType"+stream.Type);html+='

'+displayType+"

";var attributes=[];stream.Language&&"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoLanguage"),stream.Language)),stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoCodec"),stream.Codec.toUpperCase())),stream.CodecTag&&attributes.push(createAttribute(globalize.translate("MediaInfoCodecTag"),stream.CodecTag)),null!=stream.IsAVC&&attributes.push(createAttribute("AVC",stream.IsAVC?"Yes":"No")),stream.Profile&&attributes.push(createAttribute(globalize.translate("MediaInfoProfile"),stream.Profile)),stream.Level&&attributes.push(createAttribute(globalize.translate("MediaInfoLevel"),stream.Level)),(stream.Width||stream.Height)&&attributes.push(createAttribute(globalize.translate("MediaInfoResolution"),stream.Width+"x"+stream.Height)),stream.AspectRatio&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoAspectRatio"),stream.AspectRatio)),"Video"==stream.Type&&(null!=stream.IsAnamorphic&&attributes.push(createAttribute(globalize.translate("MediaInfoAnamorphic"),stream.IsAnamorphic?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoInterlaced"),stream.IsInterlaced?"Yes":"No"))),(stream.AverageFrameRate||stream.RealFrameRate)&&attributes.push(createAttribute(globalize.translate("MediaInfoFramerate"),stream.AverageFrameRate||stream.RealFrameRate)),stream.ChannelLayout&&attributes.push(createAttribute(globalize.translate("MediaInfoLayout"),stream.ChannelLayout)),stream.Channels&&attributes.push(createAttribute(globalize.translate("MediaInfoChannels"),stream.Channels+" ch")),stream.BitRate&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoBitrate"),parseInt(stream.BitRate/1e3)+" kbps")),stream.SampleRate&&attributes.push(createAttribute(globalize.translate("MediaInfoSampleRate"),stream.SampleRate+" Hz")),stream.BitDepth&&attributes.push(createAttribute(globalize.translate("MediaInfoBitDepth"),stream.BitDepth+" bit")),stream.PixelFormat&&attributes.push(createAttribute(globalize.translate("MediaInfoPixelFormat"),stream.PixelFormat)),stream.RefFrames&&attributes.push(createAttribute(globalize.translate("MediaInfoRefFrames"),stream.RefFrames)),stream.NalLengthSize&&attributes.push(createAttribute("NAL",stream.NalLengthSize)),"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoDefault"),stream.IsDefault?"Yes":"No")),"Subtitle"==stream.Type&&(attributes.push(createAttribute(globalize.translate("MediaInfoForced"),stream.IsForced?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoExternal"),stream.IsExternal?"Yes":"No"))),"Video"==stream.Type&&version.Timestamp&&attributes.push(createAttribute(globalize.translate("MediaInfoTimestamp"),version.Timestamp)),stream.DisplayTitle&&attributes.push(createAttribute("Title",stream.DisplayTitle)),html+=attributes.join("
"),html+="
"}}if(version.Container&&(html+='
'+globalize.translate("MediaInfoContainer")+''+version.Container+"
"),version.Formats&&version.Formats.length,version.Path&&"Http"!=version.Protocol&&user&&user.Policy.IsAdministrator&&(html+='
'+globalize.translate("MediaInfoPath")+''+version.Path+"
"),version.Size){var size=(version.Size/1048576).toFixed(0);html+='
'+globalize.translate("MediaInfoSize")+''+size+" MB
"}return html}function createAttribute(label,value){return''+label+''+value+""}function getVideosHtml(items,user,limit,moreButtonClass){var html=cardBuilder.getCardsHtml({items:items,shape:"auto",showTitle:!0,action:"play",overlayText:!0,showRuntime:!0});return limit&&items.length>limit&&(html+='

"),html}function renderSpecials(page,item,user,limit){ApiClient.getSpecialFeatures(user.Id,item.Id).then(function(specials){var specialsContent=page.querySelector("#specialsContent");specialsContent.innerHTML=getVideosHtml(specials,user,limit,"moreSpecials"),imageLoader.lazyChildren(specialsContent)})}function renderCast(page,item,context,limit,isStatic){var people=item.People||[],castContent=page.querySelector("#castContent");enableScrollX()?(castContent.classList.add("smoothScrollX"),limit=32):castContent.classList.add("vertical-wrap");var limitExceeded=limit&&people.length>limit;limitExceeded&&(people=people.slice(0),people.length=Math.min(limit,people.length)),require(["peoplecardbuilder"],function(peoplecardbuilder){peoplecardbuilder.buildPeopleCards(people,{itemsContainer:castContent,coverImage:!0,serverId:item.ServerId,width:160,shape:getPortraitShape()})});var morePeopleButton=page.querySelector(".morePeople");morePeopleButton&&(limitExceeded&&!enableScrollX()?morePeopleButton.classList.remove("hide"):morePeopleButton.classList.add("hide"))}function play(startPosition){playbackManager.play({items:[currentItem],startPositionTicks:startPosition})}function splitVersions(page,params){require(["confirm"],function(confirm){confirm("Are you sure you wish to split the media sources into separate items?","Split Media Apart").then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Videos/"+params.id+"/AlternateSources")}).then(function(){Dashboard.hideLoadingMsg(),reload(page,params)})})})}function playTrailer(page){playbackManager.playTrailers(currentItem)}function showPlayMenu(item,target){require(["playMenu"],function(playMenu){playMenu.show({item:item,positionTo:target})})}function playCurrentItem(button,mode){var item=currentItem;return"Program"===item.Type?void ApiClient.getLiveTvChannel(item.ChannelId,Dashboard.getCurrentUserId()).then(function(channel){playbackManager.play({items:[channel]})}):void("playmenu"===mode?showPlayMenu(item,button):playbackManager.play({items:[item],startPositionTicks:item.UserData&&"resume"===mode?item.UserData.PlaybackPositionTicks:0}))}function itemDetailPage(){var self=this;self.play=play,self.setInitialCollapsibleState=setInitialCollapsibleState,self.renderDetails=renderDetails,self.renderCriticReviews=renderCriticReviews,self.renderCast=renderCast,self.renderScenes=renderScenes,self.renderMediaSources=renderMediaSources}function onPlayClick(){var mode=this.getAttribute("data-mode");playCurrentItem(this,mode)}function onInstantMixClick(){playbackManager.instantMix(currentItem)}function onShuffleClick(){playbackManager.shuffle(currentItem)}function onDeleteClick(){require(["deleteHelper"],function(deleteHelper){deleteHelper.deleteItem({item:currentItem,navigate:!0})})}function onCancelSeriesTimerClick(){require(["recordingHelper"],function(recordingHelper){recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id,currentItem.ServerId).then(function(){Dashboard.navigate("livetv.html")})})}var currentItem,currentRecordingFields,_childrenItemsFunction=null;return window.ItemDetailPage=new itemDetailPage,function(view,params){function onPlayTrailerClick(){playTrailer(view)}function onMoreCommandsClick(){var button=this;itemContextMenu.show(getContextMenuOptions(currentItem,button)).then(function(result){result.deleted?Emby.Page.goHome():result.updated&&reload(view,params)})}function editImages(){return new Promise(function(resolve,reject){require(["imageEditor"],function(imageEditor){imageEditor.show({itemId:currentItem.Id,serverId:currentItem.ServerId}).then(resolve,reject)})})}function onWebSocketMessage(e,data){var msg=data;if("UserDataChanged"===msg.MessageType&¤tItem&&msg.Data.UserId==Dashboard.getCurrentUserId()){var key=currentItem.UserData.Key,userData=msg.Data.UserDataList.filter(function(u){return u.Key==key})[0];userData&&(currentItem.UserData=userData,reloadPlayButtons(view,currentItem),Dashboard.getCurrentUser().then(function(user){refreshImage(view,currentItem,user)}))}}var i,length,elems=view.querySelectorAll(".btnPlay");for(i=0,length=elems.length;i Date: Wed, 1 Feb 2017 15:55:11 -0500 Subject: [PATCH 13/19] update translations --- .../alphapicker/alphapicker.js | 2 +- .../emby-webcomponents/strings/ar.json | 266 +++++++++--------- .../emby-webcomponents/strings/bg-bg.json | 266 +++++++++--------- .../emby-webcomponents/strings/ca.json | 266 +++++++++--------- .../emby-webcomponents/strings/cs.json | 266 +++++++++--------- .../emby-webcomponents/strings/da.json | 266 +++++++++--------- .../emby-webcomponents/strings/de.json | 266 +++++++++--------- .../emby-webcomponents/strings/el.json | 266 +++++++++--------- .../emby-webcomponents/strings/en-gb.json | 266 +++++++++--------- .../emby-webcomponents/strings/es-ar.json | 266 +++++++++--------- .../emby-webcomponents/strings/es-mx.json | 266 +++++++++--------- .../emby-webcomponents/strings/es.json | 266 +++++++++--------- .../emby-webcomponents/strings/fi.json | 266 +++++++++--------- .../emby-webcomponents/strings/fr-ca.json | 266 +++++++++--------- .../emby-webcomponents/strings/fr.json | 266 +++++++++--------- .../emby-webcomponents/strings/gsw.json | 266 +++++++++--------- .../emby-webcomponents/strings/he.json | 266 +++++++++--------- .../emby-webcomponents/strings/hr.json | 266 +++++++++--------- .../emby-webcomponents/strings/hu.json | 266 +++++++++--------- .../emby-webcomponents/strings/id.json | 266 +++++++++--------- .../emby-webcomponents/strings/it.json | 266 +++++++++--------- .../emby-webcomponents/strings/kk.json | 266 +++++++++--------- .../emby-webcomponents/strings/ko.json | 266 +++++++++--------- .../emby-webcomponents/strings/ms.json | 266 +++++++++--------- .../emby-webcomponents/strings/nb.json | 266 +++++++++--------- .../emby-webcomponents/strings/nl.json | 266 +++++++++--------- .../emby-webcomponents/strings/pl.json | 266 +++++++++--------- .../emby-webcomponents/strings/pt-br.json | 266 +++++++++--------- .../emby-webcomponents/strings/pt-pt.json | 266 +++++++++--------- .../emby-webcomponents/strings/ro.json | 266 +++++++++--------- .../emby-webcomponents/strings/ru.json | 266 +++++++++--------- .../emby-webcomponents/strings/sk.json | 266 +++++++++--------- .../emby-webcomponents/strings/sl-si.json | 266 +++++++++--------- .../emby-webcomponents/strings/sv.json | 266 +++++++++--------- .../emby-webcomponents/strings/tr.json | 266 +++++++++--------- .../emby-webcomponents/strings/uk.json | 266 +++++++++--------- .../emby-webcomponents/strings/vi.json | 266 +++++++++--------- .../emby-webcomponents/strings/zh-cn.json | 266 +++++++++--------- .../emby-webcomponents/strings/zh-hk.json | 266 +++++++++--------- .../emby-webcomponents/strings/zh-tw.json | 266 +++++++++--------- 40 files changed, 5227 insertions(+), 5149 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/alphapicker/alphapicker.js b/dashboard-ui/bower_components/emby-webcomponents/alphapicker/alphapicker.js index 6d0286d168..cbd03d1624 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/alphapicker/alphapicker.js +++ b/dashboard-ui/bower_components/emby-webcomponents/alphapicker/alphapicker.js @@ -1 +1 @@ -define(["focusManager","css!./style.css","paper-icon-button-light","material-icons"],function(focusManager){"use strict";function focus(){var scope=this,selected=scope.querySelector("."+selectedButtonClass);selected?focusManager.focus(selected):focusManager.autoFocus(scope,!0)}function getLetterButton(l){return'"}function render(element,options){element.classList.add("alphaPicker"),element.classList.add("focuscontainer-x");var letters,html="";html+='
',"keyboard"===options.mode?html+='':(letters=["#"],html+=letters.map(getLetterButton).join("")),letters=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],html+=letters.map(getLetterButton).join(""),"keyboard"===options.mode?(html+='',html+="
",letters=["0","1","2","3","4","5","6","7","8","9"],html+='
',html+="
",html+=letters.map(getLetterButton).join(""),html+="
"):html+="
",element.innerHTML=html,element.classList.add("focusable"),element.focus=focus}function AlphaPicker(options){function onItemFocusTimeout(){itemFocusTimeout=null,self.value(itemFocusValue)}function onAlphaFocusTimeout(){if(alphaFocusTimeout=null,document.activeElement===alphaFocusedElement){var value=alphaFocusedElement.getAttribute("data-value");self.value(value,!0)}}function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}function onAlphaPickerInKeyboardModeClick(e){var alphaPickerButton=parentWithClass(e.target,"alphaPickerButton");if(alphaPickerButton){var value=alphaPickerButton.getAttribute("data-value");element.dispatchEvent(new CustomEvent("alphavalueclicked",{cancelable:!1,detail:{value:value}}))}}function onAlphaPickerClick(e){var alphaPickerButton=parentWithClass(e.target,"alphaPickerButton");if(alphaPickerButton){var value=alphaPickerButton.getAttribute("data-value");currentValue===value.toUpperCase()?self.value(null,!0):self.value(value,!0)}}function onAlphaPickerFocusIn(e){alphaFocusTimeout&&(clearTimeout(alphaFocusTimeout),alphaFocusTimeout=null);var alphaPickerButton=parentWithClass(e.target,"alphaPickerButton");alphaPickerButton&&(alphaFocusedElement=alphaPickerButton,alphaFocusTimeout=setTimeout(onAlphaFocusTimeout,100))}function onItemsFocusIn(e){var item=parentWithClass(e.target,itemClass);if(item){var prefix=item.getAttribute("data-prefix");prefix&&prefix.length&&(itemFocusValue=prefix[0],itemFocusTimeout&&clearTimeout(itemFocusTimeout),itemFocusTimeout=setTimeout(onItemFocusTimeout,100))}}var itemFocusValue,itemFocusTimeout,alphaFocusedElement,alphaFocusTimeout,self=this,element=options.element,itemsContainer=options.itemsContainer,itemClass=options.itemClass;self.enabled=function(enabled){enabled?(itemsContainer&&itemsContainer.addEventListener("focus",onItemsFocusIn,!0),"keyboard"===options.mode&&element.addEventListener("click",onAlphaPickerInKeyboardModeClick),"click"!==options.valueChangeEvent?element.addEventListener("focus",onAlphaPickerFocusIn,!0):element.addEventListener("click",onAlphaPickerClick)):(itemsContainer&&itemsContainer.removeEventListener("focus",onItemsFocusIn,!0),element.removeEventListener("click",onAlphaPickerInKeyboardModeClick),element.removeEventListener("focus",onAlphaPickerFocusIn,!0),element.removeEventListener("click",onAlphaPickerClick))},self.on=function(name,fn){element.addEventListener(name,fn)},self.off=function(name,fn){element.removeEventListener(name,fn)},self.destroy=function(){self.enabled(!1),element.classList.remove("focuscontainer-x")},self.visible=function(visible){element.style.visibility=visible?"visible":"hidden"};var currentValue;self.value=function(value,applyValue){var btn,selected;return void 0!==value&&(null!=value?(value=value.toUpperCase(),currentValue=value,"keyboard"!==options.mode&&(selected=element.querySelector("."+selectedButtonClass),btn=element.querySelector(".alphaPickerButton[data-value='"+value+"']"),btn&&btn!==selected&&btn.classList.add(selectedButtonClass),selected&&selected!==btn&&selected.classList.remove(selectedButtonClass))):(currentValue=value,selected=element.querySelector("."+selectedButtonClass),selected&&selected.classList.remove(selectedButtonClass))),applyValue&&element.dispatchEvent(new CustomEvent("alphavaluechanged",{cancelable:!1,detail:{value:value}})),currentValue},self.values=function(){for(var elems=element.querySelectorAll(".alphaPickerButton"),values=[],i=0,length=elems.length;i'+l+""}function render(element,options){element.classList.add("alphaPicker"),element.classList.contains("alphaPicker-vertical")||element.classList.add("focuscontainer-x");var letters,html="";html+='
',"keyboard"===options.mode?html+='':(letters=["#"],html+=letters.map(getLetterButton).join("")),letters=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],html+=letters.map(getLetterButton).join(""),"keyboard"===options.mode?(html+='',html+="
",letters=["0","1","2","3","4","5","6","7","8","9"],html+='
',html+="
",html+=letters.map(getLetterButton).join(""),html+="
"):html+="
",element.innerHTML=html,element.classList.add("focusable"),element.focus=focus}function AlphaPicker(options){function onItemFocusTimeout(){itemFocusTimeout=null,self.value(itemFocusValue)}function onAlphaFocusTimeout(){if(alphaFocusTimeout=null,document.activeElement===alphaFocusedElement){var value=alphaFocusedElement.getAttribute("data-value");self.value(value,!0)}}function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}function onAlphaPickerInKeyboardModeClick(e){var alphaPickerButton=parentWithClass(e.target,"alphaPickerButton");if(alphaPickerButton){var value=alphaPickerButton.getAttribute("data-value");element.dispatchEvent(new CustomEvent("alphavalueclicked",{cancelable:!1,detail:{value:value}}))}}function onAlphaPickerClick(e){var alphaPickerButton=parentWithClass(e.target,"alphaPickerButton");if(alphaPickerButton){var value=alphaPickerButton.getAttribute("data-value");currentValue===value.toUpperCase()?self.value(null,!0):self.value(value,!0)}}function onAlphaPickerFocusIn(e){alphaFocusTimeout&&(clearTimeout(alphaFocusTimeout),alphaFocusTimeout=null);var alphaPickerButton=parentWithClass(e.target,"alphaPickerButton");alphaPickerButton&&(alphaFocusedElement=alphaPickerButton,alphaFocusTimeout=setTimeout(onAlphaFocusTimeout,100))}function onItemsFocusIn(e){var item=parentWithClass(e.target,itemClass);if(item){var prefix=item.getAttribute("data-prefix");prefix&&prefix.length&&(itemFocusValue=prefix[0],itemFocusTimeout&&clearTimeout(itemFocusTimeout),itemFocusTimeout=setTimeout(onItemFocusTimeout,100))}}var itemFocusValue,itemFocusTimeout,alphaFocusedElement,alphaFocusTimeout,self=this,element=options.element,itemsContainer=options.itemsContainer,itemClass=options.itemClass;self.enabled=function(enabled){enabled?(itemsContainer&&itemsContainer.addEventListener("focus",onItemsFocusIn,!0),"keyboard"===options.mode&&element.addEventListener("click",onAlphaPickerInKeyboardModeClick),"click"!==options.valueChangeEvent?element.addEventListener("focus",onAlphaPickerFocusIn,!0):element.addEventListener("click",onAlphaPickerClick)):(itemsContainer&&itemsContainer.removeEventListener("focus",onItemsFocusIn,!0),element.removeEventListener("click",onAlphaPickerInKeyboardModeClick),element.removeEventListener("focus",onAlphaPickerFocusIn,!0),element.removeEventListener("click",onAlphaPickerClick))},self.on=function(name,fn){element.addEventListener(name,fn)},self.off=function(name,fn){element.removeEventListener(name,fn)},self.destroy=function(){self.enabled(!1),element.classList.remove("focuscontainer-x")},self.visible=function(visible){element.style.visibility=visible?"visible":"hidden"};var currentValue;self.value=function(value,applyValue){var btn,selected;return void 0!==value&&(null!=value?(value=value.toUpperCase(),currentValue=value,"keyboard"!==options.mode&&(selected=element.querySelector("."+selectedButtonClass),btn=element.querySelector(".alphaPickerButton[data-value='"+value+"']"),btn&&btn!==selected&&btn.classList.add(selectedButtonClass),selected&&selected!==btn&&selected.classList.remove(selectedButtonClass))):(currentValue=value,selected=element.querySelector("."+selectedButtonClass),selected&&selected.classList.remove(selectedButtonClass))),applyValue&&element.dispatchEvent(new CustomEvent("alphavaluechanged",{cancelable:!1,detail:{value:value}})),currentValue},self.values=function(){for(var elems=element.querySelectorAll(".alphaPickerButton"),values=[],i=0,length=elems.length;i Emby Premiere.", "ValueSpecialEpisodeName": "Speci\u00e1l - {0}", - "Share": "Sd\u00edlet", - "Add": "P\u0159idat", - "ServerUpdateNeeded": "Tento Emby Server je t\u0159eba aktualizovat. Chcete-li st\u00e1hnout nejnov\u011bj\u0161\u00ed verzi, nav\u0161tivte pros\u00edm {0}", - "LiveTvGuideRequiresUnlock": "Live TV programov\u00fd pr\u016fvodce je v sou\u010dasn\u00e9 dob\u011b omezen na {0} kan\u00e1l\u016f. Odemknut\u00edm se m\u016f\u017eete nau\u010dit jak si u\u017e\u00edt tuto funkci.", + "OptionTuesdayShort": "\u00date", + "OptionMondayShort": "Pon", "AttributeNew": "Nov\u00e9", - "Premiere": "Premi\u00e9ra", - "Live": "\u017div\u011b", - "Repeat": "Opakovat", + "ServerUpdateNeeded": "Tento Emby Server je t\u0159eba aktualizovat. Chcete-li st\u00e1hnout nejnov\u011bj\u0161\u00ed verzi, nav\u0161tivte pros\u00edm {0}", + "Share": "Sd\u00edlet", + "OptionSundayShort": "Ned", + "OptionThursdayShort": "\u010ctv", + "OptionSaturdayShort": "Sob", + "OptionWednesdayShort": "St\u0159", + "OptionFridayShort": "P\u00e1t", + "HeaderSelectDate": "Vyber datum", "TrackCount": "{0} stop", "ItemCount": "{0} polo\u017eek", - "ReleaseYearValue": "Rok vyd\u00e1n\u00ed: {0}", "OriginalAirDateValue": "Datum vys\u00edl\u00e1n\u00ed origin\u00e1lu: {0}", + "ReleaseYearValue": "Rok vyd\u00e1n\u00ed: {0}", "EndsAtValue": "Kon\u010d\u00ed v {0}", - "OptionSundayShort": "Ned", - "OptionMondayShort": "Pon", - "OptionTuesdayShort": "\u00date", - "OptionWednesdayShort": "St\u0159", - "OptionThursdayShort": "\u010ctv", - "OptionFridayShort": "P\u00e1t", - "OptionSaturdayShort": "Sob", - "HeaderSelectDate": "Vyber datum", - "ButtonOk": "Ok", "ButtonCancel": "Zru\u0161it", + "ButtonOk": "Ok", "ButtonGotIt": "M\u00e1m to", - "ButtonRestart": "Restart", - "RecordingCancelled": "Nahr\u00e1v\u00e1n\u00ed zru\u0161eno.", - "SeriesCancelled": "S\u00e9rie zru\u0161ena.", + "LiveTvGuideRequiresUnlock": "Live TV programov\u00fd pr\u016fvodce je v sou\u010dasn\u00e9 dob\u011b omezen na {0} kan\u00e1l\u016f. Odemknut\u00edm se m\u016f\u017eete nau\u010dit jak si u\u017e\u00edt tuto funkci.", "RecordingScheduled": "Pl\u00e1n nahr\u00e1v\u00e1n\u00ed.", - "SeriesRecordingScheduled": "Pl\u00e1n nahr\u00e1v\u00e1n\u00ed seri\u00e1lu.", "HeaderNewRecording": "Nov\u00fd z\u00e1znam", "Sunday": "Ned\u011ble", "Monday": "Pond\u011bl\u00ed", "Tuesday": "\u00dater\u00fd", "Wednesday": "St\u0159eda", "Thursday": "\u010ctvrtek", - "Friday": "P\u00e1tek", "Saturday": "Sobota", "Days": "Dny", + "Friday": "P\u00e1tek", "RecordSeries": "Nahr\u00e1t s\u00e9rie", - "HeaderCinemaMode": "Cinema M\u00f3d", - "HeaderCloudSync": "Synchronizace s Cloudem", - "HeaderOfflineDownloads": "Offline m\u00e9dia", - "HeaderOfflineDownloadsDescription": "St\u00e1hnout m\u00e9dia do va\u0161eho za\u0159\u00edzen\u00ed pro snadn\u00e9 pou\u017eit\u00ed offline.", - "CloudSyncFeatureDescription": "Synchronizujte va\u0161e m\u00e9dia na cloud pro jednodu\u0161\u0161\u00ed z\u00e1lohov\u00e1n\u00ed, archivaci a konverzi.", - "CoverArtFeatureDescription": "Cover Art vytv\u00e1\u0159\u00ed z\u00e1bavn\u00e9 obaly a dal\u0161\u00ed mo\u017enosti \u00faprav, kter\u00e9 v\u00e1m pomohou p\u0159izp\u016fsobit va\u0161e medi\u00e1ln\u00ed obr\u00e1zky.", - "CoverArt": "Obal", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "S re\u017eimem Kino z\u00edskate funkci, kter\u00e1 p\u0159ed hlavn\u00edm programem p\u0159ehraje trailery a u\u017eivatelsk\u00e1 intra.", - "HeaderFreeApps": "Emby Apps zdarma", - "FreeAppsFeatureDescription": "U\u017eijte si v\u00fdb\u011br Emby aplikac\u00ed zdarma pro va\u0161e za\u0159\u00edzen\u00ed.", "HeaderBecomeProjectSupporter": "Z\u00edskat Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Aktivn\u00ed p\u0159edplatn\u00e9 Emby Premiere je zapot\u0159eb\u00ed pro vytvo\u0159en\u00ed automatick\u00e9ho nahr\u00e1v\u00e1n\u00ed \u0159ad.", - "LabelEmailAddress": "E-mailov\u00e1 adresa:", - "PromoConvertRecordingsToStreamingFormat": "Automaticky konvertovat nahr\u00e1vky do dopore\u010den\u00e9ho streamovac\u00edho form\u00e1tu s Emby Premiere. Nahr\u00e1vky budou p\u0159ehr\u00e1v\u00e1n\u00ed konvertov\u00e1ny do MP4 nebo MKV - dle nastaven\u00ed Emby server.", "FeatureRequiresEmbyPremiere": "Tato funkce vy\u017eaduje aktivn\u00ed p\u0159edplatn\u00e9 Emby Premiere.", - "HeaderConvertYourRecordings": "Konverze va\u0161ich nahr\u00e1vek", "Record": "Nahr\u00e1vat", + "Advanced": "Pokro\u010dil\u00e9", + "Download": "St\u00e1hnout", + "Refresh": "Obnovit", + "RefreshQueued": "Obnoven\u00ed za\u0159azeno.", "Save": "Ulo\u017eit", "Edit": "Upravit", - "Download": "St\u00e1hnout", - "Advanced": "Pokro\u010dil\u00e9", "Delete": "Odstranit", "HeaderDeleteItem": "Smazat polo\u017eku", "ConfirmDeleteItem": "Smaz\u00e1n\u00edm polo\u017eky odstran\u00edte soubor jak z knihovny m\u00e9di\u00ed tak ze souborov\u00e9ho syst\u00e9mu. Jste si jisti, \u017ee chcete pokra\u010dovat?", - "Refresh": "Obnovit", - "RefreshQueued": "Obnoven\u00ed za\u0159azeno.", - "AddToCollection": "P\u0159idat do kolekce", - "HeaderAddToCollection": "P\u0159idat do Kolekce", "NewCollection": "Nov\u00e1 kolekce", + "AddToCollection": "P\u0159idat do kolekce", "LabelCollection": "Kolekce:", "Help": "N\u00e1pov\u011bda", + "LabelName": "Jm\u00e9no:", "NewCollectionHelp": "Kolekce dovol\u00ed vytvo\u0159it personalizovan\u00e9 seskupen\u00ed film\u016f a dal\u0161\u00edho obsahu knihoven.", "SearchForCollectionInternetMetadata": "Vyhledat metadata a obr\u00e1zky na Internetu.", - "LabelName": "Jm\u00e9no:", "NewCollectionNameExample": "P\u0159\u00edklad: Kolekce Star Wars", - "MessageItemsAdded": "Polo\u017eka p\u0159id\u00e1na.", "OptionNew": "Nov\u00fd...", + "MessageItemsAdded": "Polo\u017eka p\u0159id\u00e1na.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "P\u0159idat do playlistu", - "HeaderAddToPlaylist": "P\u0159idat do playlistu", + "RecordingCancelled": "Nahr\u00e1v\u00e1n\u00ed zru\u0161eno.", + "SeriesRecordingScheduled": "Pl\u00e1n nahr\u00e1v\u00e1n\u00ed seri\u00e1lu.", "Subtitles": "Titulky", - "SearchForSubtitles": "Vyhledat titulky", "LabelLanguage": "Jazyk:", "Search": "Vyhled\u00e1v\u00e1n\u00ed", "NoSubtitleSearchResultsFound": "\u017d\u00e1dn\u00e9 v\u00fdsledky.", @@ -99,54 +68,57 @@ "MySubtitles": "M\u00e9 titulky", "MessageDownloadQueued": "Sta\u017een\u00ed za\u0159azeno.", "EditSubtitles": "Editovat titulky", + "SearchForSubtitles": "Vyhledat titulky", "UnlockGuide": "Pr\u016fvodce pro odem\u010den\u00ed", "RefreshMetadata": "Obnovit Metadata", "ReplaceExistingImages": "Nahradit existuj\u00edc\u00ed obr\u00e1zky", "ReplaceAllMetadata": "P\u0159epsat v\u0161echna metadata", "SearchForMissingMetadata": "Hled\u00e1n\u00ed chyb\u011bj\u00edc\u00edch metadat", "LabelRefreshMode": "M\u00f3d obnovy:", + "RefreshDialogHelp": "Metadata se aktualizuj\u00ed na z\u00e1klad\u011b nastaven\u00ed a internetov\u00fdch slu\u017eeb, kter\u00e9 jsou povoleny v nastaven\u00ed Emby Server.", "NoItemsFound": "Nenalezeny \u017e\u00e1dn\u00e9 polo\u017eky.", "HeaderSaySomethingLike": "Vyslovte n\u011bco jako...", - "ButtonTryAgain": "Zkusit znovu", "HeaderYouSaid": "Zm\u00ednil ses...", - "MessageWeDidntRecognizeCommand": "Je n\u00e1m l\u00edto, p\u0159\u00edkaz nebyl rozpozn\u00e1n.", "MessageIfYouBlockedVoice": "Pokud byl V\u00e1\u0161 p\u0159\u00edstup odep\u0159en pomoc\u00ed hlasov\u00e9 aplikace, budete ji muset p\u0159ekonfigurovat p\u0159ed dal\u0161\u00edm pokusem.", + "ButtonTryAgain": "Zkusit znovu", + "MessageWeDidntRecognizeCommand": "Je n\u00e1m l\u00edto, p\u0159\u00edkaz nebyl rozpozn\u00e1n.", "ValueDiscNumber": "Disk {0}", - "Unrated": "Nehodnoceno", "Favorite": "Obl\u00edben\u00e9", + "Unrated": "Nehodnoceno", "Like": "M\u00e1m r\u00e1d", "Dislike": "Nem\u00e1m r\u00e1d", - "RefreshDialogHelp": "Metadata se aktualizuj\u00ed na z\u00e1klad\u011b nastaven\u00ed a internetov\u00fdch slu\u017eeb, kter\u00e9 jsou povoleny v nastaven\u00ed Emby Server.", "Open": "Otev\u0159\u00edt", - "Play": "P\u0159ehr\u00e1t", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "N\u00e1hodn\u011b", - "Identify": "Identifikuj", - "EditImages": "Editace obr\u00e1zk\u016f", - "EditInfo": "Editace info", - "Sync": "Synchronizace", - "InstantMix": "Okam\u017eit\u00e9 m\u00edch\u00e1n\u00ed", "ViewAlbum": "Zobrazit album", "ViewArtist": "Zobrazit \u00fam\u011blce", + "Play": "P\u0159ehr\u00e1t", + "Shuffle": "N\u00e1hodn\u011b", + "InstantMix": "Okam\u017eit\u00e9 m\u00edch\u00e1n\u00ed", "QueueAllFromHere": "Za\u0159adit v\u0161e do fronty", "PlayAllFromHere": "P\u0159ehr\u00e1t v\u0161e odsud", + "Identify": "Identifikuj", + "EditImages": "Editace obr\u00e1zk\u016f", + "Sync": "Synchronizace", + "EditInfo": "Editace info", + "RemoveFromPlaylist": "Odebrat z playlistu", "PlayFromBeginning": "P\u0159ehr\u00e1t od za\u010d\u00e1tku", "ResumeAt": "Obnovit p\u0159ehr\u00e1v\u00e1n\u00ed od {0}", - "RemoveFromPlaylist": "Odebrat z playlistu", - "RemoveFromCollection": "Odebrat z kolekce", "Trailer": "Uk\u00e1zka\/trailer", "MarkPlayed": "Ozna\u010dit p\u0159ehran\u00e9", "MarkUnplayed": "Ozna\u010dit nep\u0159ehran\u00e9", "GroupVersions": "Skupinov\u00e9 verze", "PleaseSelectTwoItems": "Vyberte nejm\u00e9n\u011b dv\u011b polo\u017eky pros\u00edm.", + "Error": "Chyba", "TryMultiSelect": "Vyzkou\u0161ej multi-v\u00fdb\u011br", "TryMultiSelectMessage": "Chcete-li upravit v\u00edce medi\u00e1ln\u00edch polo\u017eek, sta\u010d\u00ed kliknout a podr\u017eet na kter\u00e9mkoliv plak\u00e1tu. Pot\u00e9 m\u016f\u017eete vybrat v\u00edce polo\u017eek, kter\u00e9 chcete spravovat. Zkus to!", "HeaderConfirmRecordingCancellation": "Potvrzen\u00ed zru\u0161en\u00ed nahr\u00e1v\u00e1n\u00ed", "MessageConfirmRecordingCancellation": "Jste si jisti, \u017ee chcete zru\u0161it tuto nahr\u00e1vku?", - "Error": "Chyba", + "HeaderAddToCollection": "P\u0159idat do Kolekce", + "HeaderAddToPlaylist": "P\u0159idat do playlistu", + "RemoveFromCollection": "Odebrat z kolekce", "VoiceInput": "Hlasov\u00fd vstup", - "LabelContentType": "Typ obsahu:", + "Add": "P\u0159idat", "LabelPath": "Cesta k souboru:", + "LabelContentType": "Typ obsahu:", "LabelTitle": "N\u00e1zev:", "LabelOriginalTitle": "Origin\u00e1ln\u00ed n\u00e1zev:", "LabelSortTitle": "T\u0159\u00eddit dle n\u00e1zvu:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Konfigurace p\u0159id\u00e1n\u00ed datumu je definov\u00e1na v nastaven\u00ed knihovny v ovl\u00e1dac\u00edm panelu", "LabelStatus": "Stav:", "LabelArtists": "\u00dam\u011blci", - "LabelArtistsHelp": "Odd\u011bl pomoc\u00ed ;", "LabelAlbumArtists": "Alba \u00fam\u011blce:", + "LabelArtistsHelp": "Odd\u011bl pomoc\u00ed ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Hodnocen\u00ed komunity:", "LabelVoteCount": "Po\u010det hlas\u016f:", + "LabelCommunityRating": "Hodnocen\u00ed komunity:", "LabelMetascore": "Metask\u00f3re:", "LabelCriticRating": "Hodnocen\u00ed kritik\u016f:", "LabelCriticRatingSummary": "Shrnut\u00ed hodnocen\u00ed kritik\u016f:", "LabelAwardSummary": "P\u0159ehled ocen\u011bn\u00ed:", "LabelWebsite": "Webov\u00e9 str\u00e1nky:", "LabelTagline": "Slogan:", - "LabelOverview": "P\u0159ehled:", "LabelShortOverview": "Hlavn\u00ed linie:", + "LabelOverview": "P\u0159ehled:", "LabelReleaseDate": "Datum vyd\u00e1n\u00ed:", "LabelYear": "Rok:", "LabelPlaceOfBirth": "M\u00edsto narozen\u00ed:", "LabelAirDays": "Vys\u00edl\u00e1no:", "LabelAirTime": "\u010cas vys\u00edl\u00e1n\u00ed:", - "LabelRuntimeMinutes": "D\u00e9lka (v minut\u00e1ch):", "LabelParentalRating": "Rodi\u010dovsk\u00e9 hodnocen\u00ed:", - "LabelCustomRating": "Vlastn\u00ed hodnocen\u00ed:", - "LabelBudget": "Rozpo\u010det", + "LabelRuntimeMinutes": "D\u00e9lka (v minut\u00e1ch):", "LabelRevenue": "V\u00fdnos ($):", - "LabelOriginalAspectRatio": "P\u016fvodn\u00ed pom\u011br stran:", + "LabelBudget": "Rozpo\u010det", + "LabelCustomRating": "Vlastn\u00ed hodnocen\u00ed:", "LabelPlayers": "Hr\u00e1\u010di:", + "LabelOriginalAspectRatio": "P\u016fvodn\u00ed pom\u011br stran:", + "LabelAbsoluteEpisodeNumber": "Absolutn\u00ed \u010d\u00edslo epizody:", "Label3DFormat": "3D form\u00e1t:", "HeaderAlternateEpisodeNumbers": "Alternativn\u00ed \u010d\u00edslov\u00e1n\u00ed epizod", "LabelDvdSeasonNumber": "\u010c\u00edslo DVD sez\u00f3ny:", "LabelDvdEpisodeNumber": "\u010c\u00edslo DVD epizody:", - "LabelAbsoluteEpisodeNumber": "Absolutn\u00ed \u010d\u00edslo epizody:", "HeaderSpecialEpisodeInfo": "Infromace o speci\u00e1ln\u00ed epizod\u011b", "LabelAirsBeforeSeason": "Vys\u00edl\u00e1no p\u0159ed sez\u00f3nou:", "LabelAirsAfterSeason": "Vys\u00edl\u00e1no po sez\u00f3n\u011b:", @@ -201,172 +173,195 @@ "People": "Lid\u00e9", "LabelMetadataDownloadLanguage": "Preferovan\u00fd jazyk:", "LabelLockItemToPreventChanges": "Uzamknout polo\u017eku pro z\u00e1branu budouc\u00edch zm\u011bn", - "MessageLeaveEmptyToInherit": "P\u0159i ponech\u00e1n\u00ed pr\u00e1zdn\u00e9 polo\u017eky bude zd\u011bd\u011bno nastaven\u00ed z polo\u017eky p\u0159edka nebo z glob\u00e1ln\u00ed defaultn\u00ed hodnoty.", "LabelCountry": "Zem\u011b:", + "MessageLeaveEmptyToInherit": "P\u0159i ponech\u00e1n\u00ed pr\u00e1zdn\u00e9 polo\u017eky bude zd\u011bd\u011bno nastaven\u00ed z polo\u017eky p\u0159edka nebo z glob\u00e1ln\u00ed defaultn\u00ed hodnoty.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Rok narozen\u00ed:", "LabelBirthDate": "Datum narozen\u00ed:", - "LabelDeathDate": "Datum \u00famrt\u00ed:", "LabelEndDate": "Datum ukon\u010den\u00ed:", + "LabelDeathDate": "Datum \u00famrt\u00ed:", "LabelSeasonNumber": "\u010c\u00edslo sez\u00f3ny:", "LabelEpisodeNumber": "\u010c\u00edslo epizody:", "LabelTrackNumber": "\u010c\u00edslo stopy:", "LabelNumber": "\u010c\u00edslo:", "LabelDiscNumber": "\u010c\u00edslo disku", - "LabelParentNumber": "\u010c\u00edslo p\u0159edch\u016fdce", "SortName": "Set\u0159\u00eddit dle n\u00e1zvu", + "LabelParentNumber": "\u010c\u00edslo p\u0159edch\u016fdce", "ReleaseDate": "Datum vyd\u00e1n\u00ed", "Continuing": "Pokra\u010dov\u00e1n\u00ed", - "Ended": "Ukon\u010deno", "HeaderEnabledFields": "Povolen\u00e9 pole", + "Ended": "Ukon\u010deno", + "Keywords": "Kl\u00ed\u010dov\u00e1 slova", "HeaderEnabledFieldsHelp": "Zru\u0161te za\u0161krtnut\u00ed, abyste zabr\u00e1nily zm\u011bn\u00e1m dat.", + "Name": "N\u00e1zev", "Backdrops": "Pozad\u00ed", "Images": "Obr\u00e1zky", - "Keywords": "Kl\u00ed\u010dov\u00e1 slova", "Runtime": "D\u00e9lka", - "ProductionLocations": "M\u00edsto v\u00fdroby", + "Actor": "Herec", "BirthLocation": "M\u00edsto narozen\u00ed", + "ProductionLocations": "M\u00edsto v\u00fdroby", "ParentalRating": "Rodi\u010dovsk\u00e9 hodnocen\u00ed", - "Name": "N\u00e1zev", "Overview": "P\u0159ehled\/Obsah", "LabelType": "Typ:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "P\u0159\u00edklad: \u0158idi\u010d kami\u00f3nu se zmrzlinou", - "Actor": "Herec", "Composer": "Skladatel", - "Director": "Re\u017eis\u00e9r", "GuestStar": "Hostuj\u00edc\u00ed hv\u011bzda", + "Director": "Re\u017eis\u00e9r", "Producer": "Producent", "Writer": "Napsal", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Instalace {0}", + "MessageItemSaved": "Polo\u017eka ulo\u017eena.", "PackageInstallCompleted": "Instalace {0} dokon\u010dena.", + "InstallingPackage": "Instalace {0}", "PackageInstallFailed": "Instalace {0} selhala!!!", "PackageInstallCancelled": "Instalace {0} zru\u0161ena.", "SeriesYearToPresent": "{0} - Sou\u010dasnost", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} song\u016f", "ValueOneMovie": "1 film", "ValueMovieCount": "{0} film\u016f", "ValueOneSeries": "1 seri\u00e1l", - "ValueSeriesCount": "{0} seri\u00e1l\u016f", "ValueOneEpisode": "1 epizoda", + "ValueSeriesCount": "{0} seri\u00e1l\u016f", "ValueEpisodeCount": "{0} epizod", "ValueOneGame": "1 hra", - "ValueGameCount": "{0} her", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} alb", + "ValueGameCount": "{0} her", "ValueOneMusicVideo": "1 hudebn\u00ed klip", + "ValueAlbumCount": "{0} alb", "ValueMusicVideoCount": "{0} hudebn\u00edch klip\u016f", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Zadejte jedno nebo v\u00edce vyhled\u00e1vac\u00edch krit\u00e9ri\u00ed. Odstra\u0148te krit\u00e9ria pro vyhled\u00e1n\u00ed v\u00edce v\u00fdsledk\u016f.", "PleaseEnterNameOrId": "Pros\u00edm, zadejte n\u00e1zev nebo extern\u00ed Id.", - "MessageItemSaved": "Polo\u017eka ulo\u017eena.", "SearchResults": "V\u00fdsledky vyhled\u00e1v\u00e1n\u00ed", "SyncToOtherDevice": "Synchronizovat na dal\u0161\u00ed za\u0159\u00edzen\u00ed", "MakeAvailableOffline": "Zp\u0159\u00edstupnit offline", - "ServerNameIsRestarting": "Emby Server - {0} je restartov\u00e1n.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} je vyp\u00edn\u00e1n.", + "PleaseRestartServerName": "Pros\u00edm, restartujte Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} je restartov\u00e1n.", "HeaderDeleteItems": "Odstranit polo\u017eky", "ConfirmDeleteItems": "Odstran\u011bn\u00edm t\u011bchto polo\u017eek odstran\u00edte va\u0161e m\u00e9dia jak z knihovny m\u00e9di\u00ed, tak i ze souborov\u00e9ho syst\u00e9mu. Jste si jisti, \u017ee chcete pokra\u010dovat?", - "PleaseRestartServerName": "Pros\u00edm, restartujte Emby Server - {0}.", "SyncJobCreated": "\u00daloha Sync vytvo\u0159ena", "LabelSyncTo": "Sync do:", "LabelSyncJobName": "N\u00e1zev Sync \u00falohy:", - "LabelQuality": "Kvalita:", "LabelSyncNoTargetsHelp": "Vypad\u00e1 to, \u017ee v sou\u010dasn\u00e9 dob\u011b nem\u00e1te \u017e\u00e1dn\u00e9 aplikace, kter\u00e9 podporuj\u00ed synchronizaci.", - "DownloadScheduled": "Sta\u017een\u00ed napl\u00e1nov\u00e1no", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Kvalita:", "LearnMore": "Zjistit v\u00edce", - "LabelProfile": "Profil:", + "DownloadScheduled": "Sta\u017een\u00ed napl\u00e1nov\u00e1no", "LabelBitrateMbps": "Datov\u00fd tok (Mbps):", + "LabelProfile": "Profil:", "SyncUnwatchedVideosOnly": "Synchronizovat pouze neshl\u00e9dnut\u00e1 videa", - "SyncUnwatchedVideosOnlyHelp": "Pouze neshl\u00e9dnut\u00e1 videa budou synchronizov\u00e1ny. Videa budou odstran\u011bny ze za\u0159\u00edzen\u00ed, jakmile je zhl\u00e9dnete.", "AutomaticallySyncNewContent": "Automaticky synchronizovat nov\u00fd obsah", - "AutomaticallySyncNewContentHelp": "Nov\u00fd p\u0159idan\u00fd obsah bude automaticky synchronizov\u00e1n s va\u0161\u00edm za\u0159\u00edzen\u00edm.", - "LabelItemLimit": "Limit polo\u017eek:", - "LabelItemLimitHelp": "Voliteln\u00e9. Nastaven\u00ed limitu k po\u010dtu polo\u017eek, kter\u00e9 budou synchronizovan\u00e9.", "PleaseSelectDeviceToSyncTo": "Vyberte za\u0159\u00edzen\u00ed k synchronizaci.", + "LabelItemLimit": "Limit polo\u017eek:", + "SyncUnwatchedVideosOnlyHelp": "Pouze neshl\u00e9dnut\u00e1 videa budou synchronizov\u00e1ny. Videa budou odstran\u011bny ze za\u0159\u00edzen\u00ed, jakmile je zhl\u00e9dnete.", + "LabelItemLimitHelp": "Voliteln\u00e9. Nastaven\u00ed limitu k po\u010dtu polo\u017eek, kter\u00e9 budou synchronizovan\u00e9.", + "AutomaticallySyncNewContentHelp": "Nov\u00fd p\u0159idan\u00fd obsah bude automaticky synchronizov\u00e1n s va\u0161\u00edm za\u0159\u00edzen\u00edm.", + "Premiere": "Premi\u00e9ra", + "Live": "\u017div\u011b", + "Repeat": "Opakovat", + "Settings": "Nastaven\u00ed", + "DefaultErrorMessage": "Do\u0161lo k chyb\u011b p\u0159i zpracov\u00e1n\u00ed po\u017eadavku. Pros\u00edm zkuste to znovu pozd\u011bji.", "Screenshots": "Sn\u00edmky obrazovky", "MoveRight": "Posunout vpravo", "MoveLeft": "Posunout vlevo", "ConfirmDeleteImage": "Odstranit obr\u00e1zek?", "HeaderEditImages": "Editace obr\u00e1zk\u016f", - "Settings": "Nastaven\u00ed", "ShowIndicatorsFor": "Zobrazit indik\u00e1tor pro:", "NewEpisodes": "Nov\u00e9 episody", + "Premieres": "Premi\u00e9ry", "HDPrograms": "HD programy", "LiveBroadcasts": "P\u0159\u00edm\u00e9 p\u0159enosy", - "Premieres": "Premi\u00e9ry", "RepeatEpisodes": "Opakovan\u00ed epizod", "DvrSubscriptionRequired": "Emby DVR vy\u017eaduje aktivn\u00ed p\u0159edplatn\u00e9 Emby Premiere.", "HeaderCancelRecording": "Zru\u0161it nahr\u00e1v\u00e1n\u00ed", - "CancelRecording": "Zru\u0161it nahr\u00e1v\u00e1n\u00ed", - "HeaderKeepRecording": "Udr\u017eet nahr\u00e1v\u00e1n\u00ed", - "HeaderCancelSeries": "Ukon\u010dit Seri\u00e1l", - "HeaderKeepSeries": "Udr\u017eet seri\u00e1l", + "PromoConvertRecordingsToStreamingFormat": "Automaticky konvertovat nahr\u00e1vky do dopore\u010den\u00e9ho streamovac\u00edho form\u00e1tu s Emby Premiere. Nahr\u00e1vky budou p\u0159ehr\u00e1v\u00e1n\u00ed konvertov\u00e1ny do MP4 nebo MKV - dle nastaven\u00ed Emby server.", + "HeaderConvertYourRecordings": "Konverze va\u0161ich nahr\u00e1vek", "HeaderLearnMore": "Zjistit v\u00edce", + "HeaderKeepRecording": "Udr\u017eet nahr\u00e1v\u00e1n\u00ed", "DeleteMedia": "Odstranit m\u00e9dia", "SeriesSettings": "Nastaven\u00ed seri\u00e1lu", "HeaderRecordingOptions": "Nastaven\u00ed nahr\u00e1v\u00e1n\u00ed", - "CancelSeries": "Ukon\u010dit Seri\u00e1l", "DoNotRecord": "Nenahr\u00e1vat", - "HeaderSeriesOptions": "Nastaven\u00ed seri\u00e1lu", + "CancelSeries": "Ukon\u010dit Seri\u00e1l", "LabelChannels": "Kan\u00e1ly:", + "HeaderSeriesOptions": "Nastaven\u00ed seri\u00e1lu", "ChannelNameOnly": "Kan\u00e1l {0} jen", "Anytime": "Kdykoliv", "AroundTime": "Okolo {0}", "LabelAirtime": "\u010cas vys\u00edl\u00e1n\u00ed:", - "AllChannels": "V\u0161echny kan\u00e1ly", "LabelRecord": "Z\u00e1znam:", + "AllChannels": "V\u0161echny kan\u00e1ly", "NewEpisodesOnly": "Jen nov\u00e9 epizody", "AllEpisodes": "V\u0161echny epizody", "LabelStartWhenPossible": "Za\u010d\u00edt jakmile je to mo\u017en\u00e9:", "LabelStopWhenPossible": "Zastavit jakmile je to mo\u017en\u00e9:", "MinutesBefore": "minut p\u0159edem", - "MinutesAfter": "minut po", - "SkipEpisodesAlreadyInMyLibrary": "P\u0159esko\u010dit epizody, kter\u00e9 jsou u\u017e v m\u00e9 knihovn\u011b", "SkipEpisodesAlreadyInMyLibraryHelp": "Epizody budou porovn\u00e1v\u00e1ny s pou\u017eit\u00edm obdob\u00ed a \u010d\u00edsla epizody, pokud jsou k dispozici.", + "SkipEpisodesAlreadyInMyLibrary": "P\u0159esko\u010dit epizody, kter\u00e9 jsou u\u017e v m\u00e9 knihovn\u011b", + "MinutesAfter": "minut po", "LabelKeepUpTo": "Aktualizovat k:", "AsManyAsPossible": "Tolikr\u00e1t jak je mo\u017en\u00e9", - "DefaultErrorMessage": "Do\u0161lo k chyb\u011b p\u0159i zpracov\u00e1n\u00ed po\u017eadavku. Pros\u00edm zkuste to znovu pozd\u011bji.", - "LabelKeep:": "Udr\u017eet:", "UntilIDelete": "Dokud nesma\u017eu", + "LabelKeep:": "Udr\u017eet:", "UntilSpaceNeeded": "Do pot\u0159ebn\u00e9ho prostoru", - "Categories": "Kategorie", "Sports": "Sport", + "Categories": "Kategorie", "News": "Zpravodajstv\u00ed", "Movies": "Filmy", "Kids": "D\u011btsk\u00e9", "EnableColorCodedBackgrounds": "Aktivovat barevn\u011b ozna\u010den\u00e9 pozad\u00ed", "SortChannelsBy": "T\u0159\u00eddit kan\u00e1ly dle:", - "RecentlyWatched": "Ned\u00e1vno shl\u00e9dnut\u00e9", "ChannelNumber": "\u010c\u00edslo kan\u00e1lu", + "RecentlyWatched": "Ned\u00e1vno shl\u00e9dnut\u00e9", + "PlaceFavoriteChannelsAtBeginning": "Um\u00edstit obl\u00edben\u00e9 kan\u00e1ly na za\u010d\u00e1tek", + "SeriesCancelled": "S\u00e9rie zru\u0161ena.", + "HeaderKeepSeries": "Udr\u017eet seri\u00e1l", + "HeaderCancelSeries": "Ukon\u010dit Seri\u00e1l", + "CancelRecording": "Zru\u0161it nahr\u00e1v\u00e1n\u00ed", + "MessageUnlockAppWithSupporter": "Odemknout tuto funkci pomoc\u00ed aktivn\u00edho p\u0159edplatn\u00e9ho Emby Premiere.", + "MessageUnlockAppWithPurchaseOrSupporter": "Odemknout tuto funkci pomoc\u00ed jednor\u00e1zov\u00e9 platby, nebo pomoc\u00ed aktivace p\u0159edplatn\u00e9ho Emby Premiere.", + "MessageToValidateSupporter": "Pokud m\u00e1te aktivn\u00ed p\u0159edplatn\u00e9 Emby Premiere, ujist\u011bte se, \u017ee m\u00e1te nastaven Emby Premiere v panelu Nastaven\u00ed pod N\u00e1pov\u011bda -> Emby Premiere.", + "HeaderCinemaMode": "Cinema M\u00f3d", + "HeaderCloudSync": "Synchronizace s Cloudem", + "HeaderOfflineDownloads": "Offline m\u00e9dia", + "HeaderOfflineDownloadsDescription": "St\u00e1hnout m\u00e9dia do va\u0161eho za\u0159\u00edzen\u00ed pro snadn\u00e9 pou\u017eit\u00ed offline.", + "CloudSyncFeatureDescription": "Synchronizujte va\u0161e m\u00e9dia na cloud pro jednodu\u0161\u0161\u00ed z\u00e1lohov\u00e1n\u00ed, archivaci a konverzi.", + "CoverArtFeatureDescription": "Cover Art vytv\u00e1\u0159\u00ed z\u00e1bavn\u00e9 obaly a dal\u0161\u00ed mo\u017enosti \u00faprav, kter\u00e9 v\u00e1m pomohou p\u0159izp\u016fsobit va\u0161e medi\u00e1ln\u00ed obr\u00e1zky.", + "CoverArt": "Obal", + "CinemaModeFeatureDescription": "S re\u017eimem Kino z\u00edskate funkci, kter\u00e1 p\u0159ed hlavn\u00edm programem p\u0159ehraje trailery a u\u017eivatelsk\u00e1 intra.", + "HeaderFreeApps": "Emby Apps zdarma", + "FreeAppsFeatureDescription": "U\u017eijte si v\u00fdb\u011br Emby aplikac\u00ed zdarma pro va\u0161e za\u0159\u00edzen\u00ed.", + "LabelEmailAddress": "E-mailov\u00e1 adresa:", "HeaderBenefitsEmbyPremiere": "V\u00fdhody Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Pros\u00edm u\u017eijte si jednu minutu p\u0159ehr\u00e1v\u00e1n\u00ed. D\u011bkujeme v\u00e1m za vyzkou\u0161en\u00ed Emby.", "HeaderTryPlayback": "Zkusit playback", + "IPurchasedThisApp": "Tuto aplikaci m\u00e1m ji\u017e zaplacenu", "HowDidYouPay": "Jak chcete platit?", "IHaveEmbyPremiere": "Ji\u017e m\u00e1m Emby Premiere", - "IPurchasedThisApp": "Tuto aplikaci m\u00e1m ji\u017e zaplacenu", "ButtonRestorePreviousPurchase": "Obnovit n\u00e1kup", "ButtonUnlockWithPurchase": "Odemkn\u011bte pomoc\u00ed koup\u011b", "ButtonUnlockPrice": "Odemknout {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "P\u0159ehr\u00e1t jednu minutu", - "PlaceFavoriteChannelsAtBeginning": "Um\u00edstit obl\u00edben\u00e9 kan\u00e1ly na za\u010d\u00e1tek", "HeaderUnlockFeature": "Odemknout funkci", "MessageDidYouKnowCinemaMode": "V\u00edte, \u017ee s Emby Premiere m\u016f\u017eete zlep\u0161it sv\u00e9 z\u00e1\u017eitky ze sledov\u00e1n\u00ed pomoc\u00ed funkce jako Cinema M\u00f3d?", "MessageDidYouKnowCinemaMode2": "S re\u017eimem Kino budou p\u0159ed hlavn\u00edm programem p\u0159ehr\u00e1ny upout\u00e1vky a u\u017eivatelsk\u00e1 intra.", - "HeaderPlayMyMedia": "P\u0159ehr\u00e1t moje M\u00e9dia", "HeaderDiscoverEmbyPremiere": "Objevte v\u00fdhody Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "P\u0159ehr\u00e1t moje M\u00e9dia", "OneChannel": "Jeden kan\u00e1l", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json index 5fc7c9ddd8..e8a7740761 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "L\u00e5s op for dette feature med en lille enkeltst\u00e5ende betaling, eller med et aktivt Emby Premiere abonnement.", - "MessageUnlockAppWithSupporter": "L\u00e5s op for dette feature med et aktivt Emby Premiere abonnement.", - "MessageToValidateSupporter": "Hvis du har et aktivt Emby Premiere abonnement, skal du v\u00e6re sikker p\u00e5 at Emby Premiere er konfigureret i dit Emby Server-kontrolpanel, som kan tilg\u00e5es ved at klikke p\u00e5 Emby Premiere i hovedmenuen.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Del", - "Add": "Tilf\u00f8j", - "ServerUpdateNeeded": "Denne Emby server b\u00f8r opdateres. For at downloade den nyeste version bes\u00f8g venligst {0}", - "LiveTvGuideRequiresUnlock": "Live TV Guiden er p\u00e5 nuv\u00e6rende tidspunkt begr\u00e6nset til {0} kanaler. Klik p\u00e5 \"L\u00e5s op\" knappen for at f\u00e5 mere at vide omkring hvordan du kan f\u00e5 den fulde oplevelse.", + "OptionTuesdayShort": "Tirs.", + "OptionMondayShort": "Man.", "AttributeNew": "Ny", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Gentag", + "ServerUpdateNeeded": "Denne Emby server b\u00f8r opdateres. For at downloade den nyeste version bes\u00f8g venligst {0}", + "Share": "Del", + "OptionSundayShort": "S\u00f8n.", + "OptionThursdayShort": "Tors.", + "OptionSaturdayShort": "L\u00f8r.", + "OptionWednesdayShort": "Ons.", + "OptionFridayShort": "Fre.", + "HeaderSelectDate": "V\u00e6lg dato", "TrackCount": "{0} numre", "ItemCount": "{0} elementer", - "ReleaseYearValue": "Udgivelses\u00e5r: {0}", "OriginalAirDateValue": "Originalt sendt: {0}", + "ReleaseYearValue": "Udgivelses\u00e5r: {0}", "EndsAtValue": "Slutter {0}", - "OptionSundayShort": "S\u00f8n.", - "OptionMondayShort": "Man.", - "OptionTuesdayShort": "Tirs.", - "OptionWednesdayShort": "Ons.", - "OptionThursdayShort": "Tors.", - "OptionFridayShort": "Fre.", - "OptionSaturdayShort": "L\u00f8r.", - "HeaderSelectDate": "V\u00e6lg dato", - "ButtonOk": "Ok", "ButtonCancel": "Annuller", + "ButtonOk": "Ok", "ButtonGotIt": "Forst\u00e5et", - "ButtonRestart": "Genstart", - "RecordingCancelled": "Optagelse annulleret.", - "SeriesCancelled": "Serie annulleret.", + "LiveTvGuideRequiresUnlock": "Live TV Guiden er p\u00e5 nuv\u00e6rende tidspunkt begr\u00e6nset til {0} kanaler. Klik p\u00e5 \"L\u00e5s op\" knappen for at f\u00e5 mere at vide omkring hvordan du kan f\u00e5 den fulde oplevelse.", "RecordingScheduled": "Optagelse planlagt.", - "SeriesRecordingScheduled": "Optagning af serie planlagt.", "HeaderNewRecording": "Ny optagelse", "Sunday": "S\u00f8ndag", "Monday": "Mandag", "Tuesday": "Tirsdag", "Wednesday": "Onsdag", "Thursday": "Torsdag", - "Friday": "Fredag", "Saturday": "L\u00f8rdag", "Days": "Dage", + "Friday": "Fredag", "RecordSeries": "Optag serie", - "HeaderCinemaMode": "Biograftilstand", - "HeaderCloudSync": "Sky-Synk", - "HeaderOfflineDownloads": "Offline Medie", - "HeaderOfflineDownloadsDescription": "Download medier til dine enheder for nem offline-brug.", - "CloudSyncFeatureDescription": "Synk dine medier til skyen for nem backup, arkivering og konvertering.", - "CoverArtFeatureDescription": "Cover Art opretter sjove covers og andre \u00e6ndringer for at personalisere dine mediebilleder.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Annull\u00e9r synk", - "CancelSyncJobConfirmation": "Annullering af synk-jobbet fjerner synkroniserede medier fra enheden under n\u00e6ste synk. Er du sikker p\u00e5 at du vil forts\u00e6tte?", - "CinemaModeFeatureDescription": "Biograftilstand giver dig den \u00e6gte biografoplevelse med trailers og brugertilpassede introer, f\u00f8r selve filmen.", - "HeaderFreeApps": "Gratis Emby Apps", - "FreeAppsFeatureDescription": "God forn\u00f8jelse med gratis adgang til Emby apps til dine enheder.", "HeaderBecomeProjectSupporter": "F\u00e5 Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Et aktivt Emby Premiere abonnement er n\u00f8dvendigt for at oprette automatiserede optagelser af serier.", - "LabelEmailAddress": "Email-adresse:", - "PromoConvertRecordingsToStreamingFormat": "Konverter automatisk optagelser til streaming-venlige formater med Emby Premiere. Optagelser bliver konverteret on-the-fly til MP4 eller MKV, afh\u00e6ngigt af dine Emby serverindstillinger.", "FeatureRequiresEmbyPremiere": "Denne funktion kr\u00e6ver et aktivt Emby Premiere abonnement.", - "HeaderConvertYourRecordings": "Konverter Dine Optagelser", "Record": "Optag", + "Advanced": "Avanceret", + "Download": "Hent", + "Refresh": "Opdater", + "RefreshQueued": "Opdatering sat i k\u00f8", "Save": "Gem", "Edit": "Rediger", - "Download": "Hent", - "Advanced": "Avanceret", "Delete": "Slet", "HeaderDeleteItem": "Slet element", "ConfirmDeleteItem": "Hvis dette element slettes, fjernes det b\u00e5de fra dit filsystem samt din mediebibliotek. Er du sikker p\u00e5 du \u00f8nsker at forts\u00e6tte?", - "Refresh": "Opdater", - "RefreshQueued": "Opdatering sat i k\u00f8", - "AddToCollection": "Tilf\u00f8j til samling", - "HeaderAddToCollection": "Tilf\u00f8j til samling", "NewCollection": "Ny samling", + "AddToCollection": "Tilf\u00f8j til samling", "LabelCollection": "Samling:", "Help": "Hj\u00e6lp", + "LabelName": "Navn:", "NewCollectionHelp": "Samlinger lader dig oprette personaliserede grupper af film og andet biblioteksindhold.", "SearchForCollectionInternetMetadata": "S\u00f8g p\u00e5 internettet efter billeder og metadata", - "LabelName": "Navn:", "NewCollectionNameExample": "Eksempel: Star Wars samling", - "MessageItemsAdded": "Emne tilf\u00f8jet.", "OptionNew": "Ny...", + "MessageItemsAdded": "Emne tilf\u00f8jet.", "LabelPlaylist": "Afspilningsliste:", "AddToPlaylist": "Tilf\u00f8j til afspilningsliste", - "HeaderAddToPlaylist": "Tilf\u00f8j til afspilningsliste", + "RecordingCancelled": "Optagelse annulleret.", + "SeriesRecordingScheduled": "Optagning af serie planlagt.", "Subtitles": "Undertekster", - "SearchForSubtitles": "S\u00f8g efter undertekster", "LabelLanguage": "Sprog:", "Search": "S\u00f8g", "NoSubtitleSearchResultsFound": "Ingen resultater fundet.", @@ -99,54 +68,57 @@ "MySubtitles": "Mine Undertekster", "MessageDownloadQueued": "Download sat i k\u00f8.", "EditSubtitles": "Rediger undertekster", + "SearchForSubtitles": "S\u00f8g efter undertekster", "UnlockGuide": "Opl\u00e5s guide", "RefreshMetadata": "Opdater metadata", "ReplaceExistingImages": "Erstat eksisterende billeder", "ReplaceAllMetadata": "Erstat alle metadata", "SearchForMissingMetadata": "S\u00f8g efter manglende metadata", "LabelRefreshMode": "Genopfrisk tilstand:", + "RefreshDialogHelp": "Metadata opdateres alt efter hvilke indstillinger og internet-servicer der er aktiveret i Emby Server-kontrolpanelet.", "NoItemsFound": "Ingen emner fundet.", "HeaderSaySomethingLike": "Sig noget i stil med...", - "ButtonTryAgain": "Pr\u00f8v Igen", "HeaderYouSaid": "Du sagde...", - "MessageWeDidntRecognizeCommand": "Beklager, men vi genkendte ikke denne kommando.", "MessageIfYouBlockedVoice": "Hvis du afslog adgang til tale for appen, skal du re-konfigurere f\u00f8r du pr\u00f8ver igen.", + "ButtonTryAgain": "Pr\u00f8v Igen", + "MessageWeDidntRecognizeCommand": "Beklager, men vi genkendte ikke denne kommando.", "ValueDiscNumber": "Disk {0}", - "Unrated": "Ingen bed\u00f8mmelse", "Favorite": "Favorit", + "Unrated": "Ingen bed\u00f8mmelse", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata opdateres alt efter hvilke indstillinger og internet-servicer der er aktiveret i Emby Server-kontrolpanelet.", "Open": "\u00c5ben", - "Play": "Afspil", - "AddToPlayQueue": "Tilf\u00f8j til afspilningsk\u00f8", - "Shuffle": "Bland", - "Identify": "Identificer", - "EditImages": "Rediger billeder", - "EditInfo": "Rediger info", - "Sync": "Synk", - "InstantMix": "Instant Mix", "ViewAlbum": "Vis album", "ViewArtist": "Vis kunstner", + "Play": "Afspil", + "Shuffle": "Bland", + "InstantMix": "Instant Mix", "QueueAllFromHere": "Set alt her i k\u00f8", "PlayAllFromHere": "Afspil alt fra her", + "Identify": "Identificer", + "EditImages": "Rediger billeder", + "Sync": "Synk", + "EditInfo": "Rediger info", + "RemoveFromPlaylist": "Fjer fra afspilningsliste", "PlayFromBeginning": "Afspil fra begyndelsen", "ResumeAt": "Genoptag fra {0}", - "RemoveFromPlaylist": "Fjer fra afspilningsliste", - "RemoveFromCollection": "Fjern fra samling", "Trailer": "Trailer", "MarkPlayed": "Mark\u00e9r som afspillet", "MarkUnplayed": "Mark\u00e9r som ikke afspillet", "GroupVersions": "Grup\u00e9r versioner", "PleaseSelectTwoItems": "V\u00e6lg venligst mindst to elementer.", + "Error": "Fejl", "TryMultiSelect": "Pr\u00f8v Multi-Valg", "TryMultiSelectMessage": "For at redigere adskillige emner, skal du blot klikke og holde p\u00e5 hvilken som helst plakat og v\u00e6lge de emner du vil administrere. Pr\u00f8v det!", "HeaderConfirmRecordingCancellation": "Bekr\u00e6ft annullering af optagelse", "MessageConfirmRecordingCancellation": "Er du sikker p\u00e5 du \u00f8nsker at annullere denne optagelse?", - "Error": "Fejl", + "HeaderAddToCollection": "Tilf\u00f8j til samling", + "HeaderAddToPlaylist": "Tilf\u00f8j til afspilningsliste", + "RemoveFromCollection": "Fjern fra samling", "VoiceInput": "Taleinput", - "LabelContentType": "Indholdstype:", + "Add": "Tilf\u00f8j", "LabelPath": "Sti:", + "LabelContentType": "Indholdstype:", "LabelTitle": "Titel:", "LabelOriginalTitle": "Original titel:", "LabelSortTitle": "Sort\u00e9r titel:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Konfigurer hvordan tilf\u00f8jet-dato bestemmes, under Emby Server-kontrolpanelet under Biblioteksindstillinger", "LabelStatus": "Status:", "LabelArtists": "Artister:", - "LabelArtistsHelp": "Angiv flere ved at s\u00e6tte ; mellem dem.", "LabelAlbumArtists": "Albumartister:", + "LabelArtistsHelp": "Angiv flere ved at s\u00e6tte ; mellem dem.", "LabelAlbum": "Album:", - "LabelCommunityRating": "F\u00e6llesskabsvurdering:", "LabelVoteCount": "Antal stemmer:", + "LabelCommunityRating": "F\u00e6llesskabsvurdering:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Kritikervurdering:", "LabelCriticRatingSummary": "Resum\u00e9 af kritikervurderinger:", "LabelAwardSummary": "Resum\u00e9 af priser:", "LabelWebsite": "Hjemmeside:", "LabelTagline": "Tagline:", - "LabelOverview": "Oversigt:", "LabelShortOverview": "Kort oversigt:", + "LabelOverview": "Oversigt:", "LabelReleaseDate": "Udgivelsesdato:", "LabelYear": "Year:", "LabelPlaceOfBirth": "F\u00f8dselssted:", "LabelAirDays": "Sendedage:", "LabelAirTime": "Sendetid:", - "LabelRuntimeMinutes": "Spilletid (minutter):", "LabelParentalRating": "Aldersgr\u00e6nse:", - "LabelCustomRating": "Brugerdefineret bed\u00f8mmelse:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Spilletid (minutter):", "LabelRevenue": "Indt\u00e6gter ($):", - "LabelOriginalAspectRatio": "Originalt formatforhold:", + "LabelBudget": "Budget", + "LabelCustomRating": "Brugerdefineret bed\u00f8mmelse:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Originalt formatforhold:", + "LabelAbsoluteEpisodeNumber": "Absolut episodenummer:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternative episodenumre", "LabelDvdSeasonNumber": "DVD s\u00e6sonnummer", "LabelDvdEpisodeNumber": "DVD episodenummer:", - "LabelAbsoluteEpisodeNumber": "Absolut episodenummer:", "HeaderSpecialEpisodeInfo": "Information om specialepisoder", "LabelAirsBeforeSeason": "Sendes f\u00f8r s\u00e6son:", "LabelAirsAfterSeason": "Sendes efter s\u00e6son:", @@ -201,172 +173,195 @@ "People": "Personer", "LabelMetadataDownloadLanguage": "Foretrukket sprog for nedhentning:", "LabelLockItemToPreventChanges": "L\u00e5s for at undg\u00e5 fremtidige \u00e6ndringer", - "MessageLeaveEmptyToInherit": "Efterlad tom for at arve indstillinger fra en overliggende post eller den globale standardv\u00e6rdi.", "LabelCountry": "Land:", + "MessageLeaveEmptyToInherit": "Efterlad tom for at arve indstillinger fra en overliggende post eller den globale standardv\u00e6rdi.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "F\u00f8dsels\u00e5r:", "LabelBirthDate": "F\u00f8dselsdato:", - "LabelDeathDate": "D\u00f8dsdato:", "LabelEndDate": "Slutdato:", + "LabelDeathDate": "D\u00f8dsdato:", "LabelSeasonNumber": "S\u00e6sonnummer:", "LabelEpisodeNumber": "Episodenummer:", "LabelTrackNumber": "Spor nummer:", "LabelNumber": "Nummer:", "LabelDiscNumber": "Disk-nummer", - "LabelParentNumber": "For\u00e6ldre-nummer:", "SortName": "Sorteringsnavn", + "LabelParentNumber": "For\u00e6ldre-nummer:", "ReleaseDate": "Udgivelsesdato", "Continuing": "Fors\u00e6ttes", - "Ended": "F\u00e6rdig", "HeaderEnabledFields": "Aktiv\u00e9r Felter", + "Ended": "F\u00e6rdig", + "Keywords": "N\u00f8gleord", "HeaderEnabledFieldsHelp": "Fjern fluebenet fra et felt for at l\u00e5se det og forhindre dets data fra at blive \u00e6ndret.", + "Name": "Navn", "Backdrops": "Backdrops", "Images": "Billeder", - "Keywords": "N\u00f8gleord", "Runtime": "Afspilningstid", - "ProductionLocations": "Produktionslokationer", + "Actor": "Skuespiller", "BirthLocation": "F\u00f8dselslokation", + "ProductionLocations": "Produktionslokationer", "ParentalRating": "Parental Rating", - "Name": "Navn", "Overview": "Overblik", "LabelType": "Type:", "LabelPersonRole": "Rolle:", "LabelPersonRoleHelp": "Eksempel: Isbilschauff\u00f8r", - "Actor": "Skuespiller", "Composer": "Komponist", - "Director": "Instrukt\u00f8r", "GuestStar": "G\u00e6steskuespiller", + "Director": "Instrukt\u00f8r", "Producer": "Producent", "Writer": "Forfatter", - "MessageNoSyncJobsFound": "Ingen synk-jobs fundet. Opret synk-jobs ved hj\u00e6lp af Synk-knapperne der findes i appen.", - "MessageNoDownloadsFound": "Ingen offline downloads. G\u00f8r dit medie tilg\u00e6ngeligt offline ved at klikke p\u00e5 G\u00f8r Tilg\u00e6ngelig Offline i appen.", - "InstallingPackage": "Installerer {0}", + "MessageItemSaved": "Element gemt.", "PackageInstallCompleted": "{0} installation udf\u00f8rt.", + "InstallingPackage": "Installerer {0}", "PackageInstallFailed": "{0} installationen mislykkedes.", "PackageInstallCancelled": "{0} installation afbrudt.", "SeriesYearToPresent": "{0} - Nuv\u00e6rende", - "ValueOneItem": "1 emne", "ValueOneSong": "1 sang", "ValueSongCount": "{0} sange", "ValueOneMovie": "1 film", "ValueMovieCount": "{0} film", "ValueOneSeries": "1 serie", - "ValueSeriesCount": "{0} serier", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} serier", "ValueEpisodeCount": "{0} episoder", "ValueOneGame": "1 spil", - "ValueGameCount": "{0} spil", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} album", + "ValueGameCount": "{0} spil", "ValueOneMusicVideo": "1 musikvideo", + "ValueAlbumCount": "{0} album", "ValueMusicVideoCount": "{0} musikvideoer", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Indtast et eller flere s\u00f8gekriterier.Fjern kriterier for at f\u00e5 flere s\u00f8geresultater.", "PleaseEnterNameOrId": "Indtast venligst et navn eller eksternt Id.", - "MessageItemSaved": "Element gemt.", "SearchResults": "S\u00f8geresultater", "SyncToOtherDevice": "Synk til anden enhed", "MakeAvailableOffline": "G\u00f8r tilg\u00e6ngelig offline", - "ServerNameIsRestarting": "Emby Server - {0} genstarter.", + "ButtonRestart": "Genstart", "ServerNameIsShuttingDown": "Emby Server - {0} lukker ned.", + "PleaseRestartServerName": "Genstart venligst Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} genstarter.", "HeaderDeleteItems": "Slet emner", "ConfirmDeleteItems": "Sletning af disse emner vil b\u00e5de fjerne dem fra filsystemet og dit mediebibliotek. Er du sikker p\u00e5 at du vil forts\u00e6tte?", - "PleaseRestartServerName": "Genstart venligst Emby Server - {0}.", "SyncJobCreated": "Synkroniserings job oprettet", "LabelSyncTo": "Synkroniser til:", "LabelSyncJobName": "Navn til synkroniserings job:", - "LabelQuality": "Kvalitet:", "LabelSyncNoTargetsHelp": "Det ser ud til at du for \u00f8jeblikket ikke har nogle enheder ser underst\u00f8tter sync.", - "DownloadScheduled": "Download planlagt", - "HeaderSyncRequiresSub": "Synk p\u00e5kr\u00e6ver et aktivt Emby Premiere abonnement.", + "LabelQuality": "Kvalitet:", "LearnMore": "L\u00e6r mere", - "LabelProfile": "Profil:", + "DownloadScheduled": "Download planlagt", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profil:", "SyncUnwatchedVideosOnly": "Synkroniser kun usete videoer", - "SyncUnwatchedVideosOnlyHelp": "Kun usete videoer vil blive synkroniseret, og videoer vil blive fjernet fra enheden n\u00e5r de er blevet set.", "AutomaticallySyncNewContent": "Synkroniser automatisk nyt indhold", - "AutomaticallySyncNewContentHelp": "Nyt indhold tilf\u00f8jet til denne mappe bliver automatisk synkroniseret til enheden.", - "LabelItemLimit": "Maks. filer:", - "LabelItemLimitHelp": "Valgfri. S\u00e6t en gr\u00e6nse for antallet af filer der synkroniseres.", "PleaseSelectDeviceToSyncTo": "V\u00e6lg en enhed at synkroniserer til.", + "LabelItemLimit": "Maks. filer:", + "SyncUnwatchedVideosOnlyHelp": "Kun usete videoer vil blive synkroniseret, og videoer vil blive fjernet fra enheden n\u00e5r de er blevet set.", + "LabelItemLimitHelp": "Valgfri. S\u00e6t en gr\u00e6nse for antallet af filer der synkroniseres.", + "AutomaticallySyncNewContentHelp": "Nyt indhold tilf\u00f8jet til denne mappe bliver automatisk synkroniseret til enheden.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Gentag", + "Settings": "Indstillinger", + "DefaultErrorMessage": "Det opstod en fejl ved behandlingen af foresp\u00f8rgslen. Pr\u00f8v igen senere.", "Screenshots": "Sk\u00e6rmbilleder", "MoveRight": "Flyt mod h\u00f8jre", "MoveLeft": "Flyt mod venstre", "ConfirmDeleteImage": "Slet billede?", "HeaderEditImages": "Rediger billeder", - "Settings": "Indstillinger", "ShowIndicatorsFor": "Vis indikatorer for:", "NewEpisodes": "Nye episoder", + "Premieres": "Premiere", "HDPrograms": "HD-programmer", "LiveBroadcasts": "Live-udsending", - "Premieres": "Premiere", "RepeatEpisodes": "Gentag episoder", "DvrSubscriptionRequired": "Emby DVR p\u00e5kr\u00e6ver et aktivt Emby Premiere abonnement.", "HeaderCancelRecording": "Annuller Optagelse", - "CancelRecording": "Annuller optagelse", - "HeaderKeepRecording": "Bevar Optagelse", - "HeaderCancelSeries": "Annuller Serie", - "HeaderKeepSeries": "Bevar Serie", + "PromoConvertRecordingsToStreamingFormat": "Konverter automatisk optagelser til streaming-venlige formater med Emby Premiere. Optagelser bliver konverteret on-the-fly til MP4 eller MKV, afh\u00e6ngigt af dine Emby serverindstillinger.", + "HeaderConvertYourRecordings": "Konverter Dine Optagelser", "HeaderLearnMore": "L\u00e6r Mere", + "HeaderKeepRecording": "Bevar Optagelse", "DeleteMedia": "Slet medie", "SeriesSettings": "Serieindstillinger", "HeaderRecordingOptions": "Optagelsesindstillinger", - "CancelSeries": "Annuller serie", "DoNotRecord": "Optag ikke", - "HeaderSeriesOptions": "Serieindstillinger", + "CancelSeries": "Annuller serie", "LabelChannels": "Kanaler:", + "HeaderSeriesOptions": "Serieindstillinger", "ChannelNameOnly": "Udelukkende kanal {0}", "Anytime": "Altid", "AroundTime": "Omkring {0}", "LabelAirtime": "Sendetid:", - "AllChannels": "Alle kanaler", "LabelRecord": "Optag:", + "AllChannels": "Alle kanaler", "NewEpisodesOnly": "Kun nye episoder", "AllEpisodes": "Alle episoder", "LabelStartWhenPossible": "Start n\u00e5r muligt:", "LabelStopWhenPossible": "Stop n\u00e5r muligt:", "MinutesBefore": "minutter f\u00f8r", - "MinutesAfter": "minutter efter", - "SkipEpisodesAlreadyInMyLibrary": "Optag ikke episoder som allerede findes i mit bibliotek", "SkipEpisodesAlreadyInMyLibraryHelp": "Episoder bliver sammenlignet p\u00e5 s\u00e6son og episodenummer, n\u00e5r muligt.", + "SkipEpisodesAlreadyInMyLibrary": "Optag ikke episoder som allerede findes i mit bibliotek", + "MinutesAfter": "minutter efter", "LabelKeepUpTo": "Bevar op til:", "AsManyAsPossible": "S\u00e5 mange som muligt", - "DefaultErrorMessage": "Det opstod en fejl ved behandlingen af foresp\u00f8rgslen. Pr\u00f8v igen senere.", - "LabelKeep:": "Bevar:", "UntilIDelete": "Til jeg sletter", + "LabelKeep:": "Bevar:", "UntilSpaceNeeded": "Til pladsen er n\u00f8dvendig", - "Categories": "Kategorier", "Sports": "Sport", + "Categories": "Kategorier", "News": "Nyheder", "Movies": "Film", "Kids": "B\u00f8rn", "EnableColorCodedBackgrounds": "Aktiver farvekodet baggrunde", "SortChannelsBy": "Sort\u00e9r kanaler efter:", - "RecentlyWatched": "Nyligt sete", "ChannelNumber": "Kanalnummer", + "RecentlyWatched": "Nyligt sete", + "PlaceFavoriteChannelsAtBeginning": "Placer favoritkanaler i begyndelsen", + "SeriesCancelled": "Serie annulleret.", + "HeaderKeepSeries": "Bevar Serie", + "HeaderCancelSeries": "Annuller Serie", + "CancelRecording": "Annuller optagelse", + "MessageUnlockAppWithSupporter": "L\u00e5s op for dette feature med et aktivt Emby Premiere abonnement.", + "MessageUnlockAppWithPurchaseOrSupporter": "L\u00e5s op for dette feature med en lille enkeltst\u00e5ende betaling, eller med et aktivt Emby Premiere abonnement.", + "MessageToValidateSupporter": "Hvis du har et aktivt Emby Premiere abonnement, skal du v\u00e6re sikker p\u00e5 at Emby Premiere er konfigureret i dit Emby Server-kontrolpanel, som kan tilg\u00e5es ved at klikke p\u00e5 Emby Premiere i hovedmenuen.", + "HeaderCinemaMode": "Biograftilstand", + "HeaderCloudSync": "Sky-Synk", + "HeaderOfflineDownloads": "Offline Medie", + "HeaderOfflineDownloadsDescription": "Download medier til dine enheder for nem offline-brug.", + "CloudSyncFeatureDescription": "Synk dine medier til skyen for nem backup, arkivering og konvertering.", + "CoverArtFeatureDescription": "Cover Art opretter sjove covers og andre \u00e6ndringer for at personalisere dine mediebilleder.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Biograftilstand giver dig den \u00e6gte biografoplevelse med trailers og brugertilpassede introer, f\u00f8r selve filmen.", + "HeaderFreeApps": "Gratis Emby Apps", + "FreeAppsFeatureDescription": "God forn\u00f8jelse med gratis adgang til Emby apps til dine enheder.", + "LabelEmailAddress": "Email-adresse:", "HeaderBenefitsEmbyPremiere": "Fordele ved Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Nyd venligst et minuts afspilning. Tak fordi du pr\u00f8ver Emby.", "HeaderTryPlayback": "Pr\u00f8v Afspilning", + "IPurchasedThisApp": "Jeg k\u00f8bte denne app", "HowDidYouPay": "Hvordan betalte du?", "IHaveEmbyPremiere": "Jeg har Emby Premiere", - "IPurchasedThisApp": "Jeg k\u00f8bte denne app", "ButtonRestorePreviousPurchase": "Genskab Indk\u00f8b", "ButtonUnlockWithPurchase": "L\u00e5s op for med K\u00f8b", "ButtonUnlockPrice": "L\u00e5s op for {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere M\u00e5nedlig {0}", - "HeaderAlreadyPaid": "Allerede Betalt?", "ButtonPlayOneMinute": "Afspil \u00c9t Minut", - "PlaceFavoriteChannelsAtBeginning": "Placer favoritkanaler i begyndelsen", "HeaderUnlockFeature": "L\u00e5s op for Feature", "MessageDidYouKnowCinemaMode": "Vidste du, at med Emby Premiere kan du opleve features s\u00e5 som Biograftilstand?", "MessageDidYouKnowCinemaMode2": "Biograftilstand giver dig den \u00e6gte biografoplevelse med trailere og brugertilpassede introer f\u00f8r selve filmen.", - "HeaderPlayMyMedia": "Afspil mit Medie", "HeaderDiscoverEmbyPremiere": "Oplev Emby Premiere", - "Items": "emner", + "HeaderPlayMyMedia": "Afspil mit Medie", "OneChannel": "En kanal", - "ConfirmRemoveDownload": "Fjern download?", - "RemoveDownload": "Fjern download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere M\u00e5nedlig {0}", + "HeaderAlreadyPaid": "Allerede Betalt?", "AddedOnValue": "Tilf\u00f8jet {0}", + "ConfirmRemoveDownload": "Fjern download?", + "CancelSyncJobConfirmation": "Annullering af synk-jobbet fjerner synkroniserede medier fra enheden under n\u00e6ste synk. Er du sikker p\u00e5 at du vil forts\u00e6tte?", + "ButtonCancelSyncJob": "Annull\u00e9r synk", + "MessageNoSyncJobsFound": "Ingen synk-jobs fundet. Opret synk-jobs ved hj\u00e6lp af Synk-knapperne der findes i appen.", + "MessageNoDownloadsFound": "Ingen offline downloads. G\u00f8r dit medie tilg\u00e6ngeligt offline ved at klikke p\u00e5 G\u00f8r Tilg\u00e6ngelig Offline i appen.", + "ValueOneItem": "1 emne", + "HeaderSyncRequiresSub": "Synk p\u00e5kr\u00e6ver et aktivt Emby Premiere abonnement.", + "Items": "emner", + "RemoveDownload": "Fjern download", "RemovingFromDevice": "Fjerner fra enhed", "RemoveFromDevice": "Fjern fra enhed", "KeepOnDevice": "Bevar p\u00e5 enhed", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Klar til at Overf\u00f8re", "SyncJobItemStatusSyncedMarkForRemoval": "Fjerner fra enhed", "SyncJobItemStatusQueued": "Sat i k\u00f8", - "SyncJobItemStatusConverting": "Konverterer", "SyncJobItemStatusTransferring": "Overf\u00f8rer", - "SyncJobItemStatusSynced": "Downloadet", - "SyncJobItemStatusFailed": "Fejlet", + "SyncJobItemStatusConverting": "Konverterer", "SyncJobItemStatusRemovedFromDevice": "Fjern fra enhed", "SyncJobItemStatusCancelled": "Annulleret", + "SyncJobItemStatusSynced": "Downloadet", + "SyncJobItemStatusFailed": "Fejlet", "Retry": "Pr\u00f8v igen", "HeaderMyDevice": "Min Enhed", + "ContinueInSecondsValue": "Forts\u00e6t om {0} sekunder.", "Continue": "Forts\u00e6t", - "ContinueInSecondsValue": "Forts\u00e6t om {0} sekunder." + "AddToPlayQueue": "Tilf\u00f8j til afspilningsk\u00f8", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json index a5b2959750..fe4493936f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Schalte diese Funktion mit einer kleinen einmaligen Geb\u00fchr oder einem aktiven Emby Premium Abo frei.", - "MessageUnlockAppWithSupporter": "Schalte diese Funktion mit einem aktiven Emby Premium Abo frei.", - "MessageToValidateSupporter": "Wenn du eine aktive Emby Premiere Mitgliedschaft hast, stelle bitte sicher, dass du diese \u00fcber das Emby Server Dashboard eingerichtet hast (Hauptmenu -> Emby Premiere).", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Teilen", - "Add": "Hinzuf\u00fcgen", - "ServerUpdateNeeded": "Dieser Emby Server muss aktualisiert werden. Um die neueste Version herunterzuladen, besuche bitte {0}", - "LiveTvGuideRequiresUnlock": "Dein TV-Guide ist begrenzt auf {0} Kan\u00e4le. Klicke auf die Freischalten Schaltfl\u00e4che um weitere Informationen zu erhalten.", + "OptionTuesdayShort": "Di", + "OptionMondayShort": "Mo", "AttributeNew": "Neu", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Wiederholen", + "ServerUpdateNeeded": "Dieser Emby Server muss aktualisiert werden. Um die neueste Version herunterzuladen, besuche bitte {0}", + "Share": "Teilen", + "OptionSundayShort": "So", + "OptionThursdayShort": "Do", + "OptionSaturdayShort": "Sa", + "OptionWednesdayShort": "Mi", + "OptionFridayShort": "Fr", + "HeaderSelectDate": "Datum w\u00e4hlen", "TrackCount": "{0} Titel", "ItemCount": "{0} Eintr\u00e4ge", - "ReleaseYearValue": "Erscheinungsjahr: {0}", "OriginalAirDateValue": "Erstausstrahlung: {0}", + "ReleaseYearValue": "Erscheinungsjahr: {0}", "EndsAtValue": "Endet um {0}", - "OptionSundayShort": "So", - "OptionMondayShort": "Mo", - "OptionTuesdayShort": "Di", - "OptionWednesdayShort": "Mi", - "OptionThursdayShort": "Do", - "OptionFridayShort": "Fr", - "OptionSaturdayShort": "Sa", - "HeaderSelectDate": "Datum w\u00e4hlen", - "ButtonOk": "Ok", "ButtonCancel": "Abbrechen", + "ButtonOk": "Ok", "ButtonGotIt": "Verstanden", - "ButtonRestart": "Neustart", - "RecordingCancelled": "Aufzeichnung abgebrochen.", - "SeriesCancelled": "Serie abgebrochen.", + "LiveTvGuideRequiresUnlock": "Dein TV-Guide ist begrenzt auf {0} Kan\u00e4le. Klicke auf die Freischalten Schaltfl\u00e4che um weitere Informationen zu erhalten.", "RecordingScheduled": "Aufnahme geplant.", - "SeriesRecordingScheduled": "Serien-Aufnahme geplant.", "HeaderNewRecording": "Neue Aufnahme", "Sunday": "Sonntag", "Monday": "Montag", "Tuesday": "Dienstag", "Wednesday": "Mittwoch", "Thursday": "Donnerstag", - "Friday": "Freitag", "Saturday": "Samstag", "Days": "Tage", + "Friday": "Freitag", "RecordSeries": "Serie aufnehmen", - "HeaderCinemaMode": "Kinomodus", - "HeaderCloudSync": "Cloud Synchronisation", - "HeaderOfflineDownloads": "Offline Medien", - "HeaderOfflineDownloadsDescription": "Lade Medien auf deine Ger\u00e4te herunter um sie einfach offline zu nutzen.", - "CloudSyncFeatureDescription": "Synchronisiere deine Medien in die Cloud f\u00fcr ein Backup, eine Archivierung und Konvertierung.", - "CoverArtFeatureDescription": "Cover Art erstellt z.B. lustige Cover und erlaubt dir eine weitergehende pers\u00f6nliche Gestaltung deiner Medienbilder.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Synchronisierung abbrechen", - "CancelSyncJobConfirmation": "Der Abbruch der Synchronisation wird bereits synchronisierte Medien bei der n\u00e4chsten Synchronisation vom Ger\u00e4t l\u00f6schen. M\u00f6chten Sie wirklich fortfahren?", - "CinemaModeFeatureDescription": "Der Cinema Mode bringt das richtige Kinogef\u00fchl mit Trailern und eigenen Intros vor dem Hauptfilm.", - "HeaderFreeApps": "Kostenlose Emby Apps", - "FreeAppsFeatureDescription": "Genie\u00dfe Zugriff auf kostenlose Emby Apps f\u00fcr deine Ger\u00e4te.", "HeaderBecomeProjectSupporter": "Hol dir Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Ein aktives Emby Premium Abo wird benn\u00f6tigt um automatische Serienaufnahmen zu erstellen.", - "LabelEmailAddress": "E-Mail Adresse:", - "PromoConvertRecordingsToStreamingFormat": "Konvertiere Aufnahmen automatisch in ein Streaming-freundliches Format mit Emby Premiere. Aufnahmen werden, basierend auf den Emby Server-Einstellungen, dynamisch zu MP4 oder MKV konvertiert.", "FeatureRequiresEmbyPremiere": "Dieses Feature ben\u00f6tigt eine aktive Emby Premiere Mitgliedschaft.", - "HeaderConvertYourRecordings": "Konvertiere deine Aufnahmen", "Record": "Aufnehmen", + "Advanced": "Erweitert", + "Download": "Download", + "Refresh": "Aktualisieren", + "RefreshQueued": "Warteschlange aktualisieren.", "Save": "Speichern", "Edit": "Bearbeiten", - "Download": "Download", - "Advanced": "Erweitert", "Delete": "L\u00f6schen", "HeaderDeleteItem": "L\u00f6sche Element", "ConfirmDeleteItem": "L\u00f6schen dieses Eintrages bedeutet das L\u00f6schen der Datei und das Entfernen aus der Medien-Bibliothek. M\u00f6chtest du wirklich fortfahren?", - "Refresh": "Aktualisieren", - "RefreshQueued": "Warteschlange aktualisieren.", - "AddToCollection": "Zur Sammlung hinzuf\u00fcgen", - "HeaderAddToCollection": "Zu Sammlung hinzuf\u00fcgen", "NewCollection": "Neue Collection", + "AddToCollection": "Zur Sammlung hinzuf\u00fcgen", "LabelCollection": "Sammlung:", "Help": "Hilfe", + "LabelName": "Name:", "NewCollectionHelp": "Sammlungen erm\u00f6glichen personallisierte Gruppen von Filmen oder anderen Medien.", "SearchForCollectionInternetMetadata": "Suche im Internet nach Bildmaterial und Metadaten", - "LabelName": "Name:", "NewCollectionNameExample": "Beispiel: Star Wars Collection", - "MessageItemsAdded": "Eintr\u00e4ge hinzugef\u00fcgt", "OptionNew": "Neu...", + "MessageItemsAdded": "Eintr\u00e4ge hinzugef\u00fcgt", "LabelPlaylist": "Wiedergabeliste", "AddToPlaylist": "Hinzuf\u00fcgen zur Wiedergabeliste", - "HeaderAddToPlaylist": "Zur Wiedergabeliste hinzuf\u00fcgen", + "RecordingCancelled": "Aufzeichnung abgebrochen.", + "SeriesRecordingScheduled": "Serien-Aufnahme geplant.", "Subtitles": "Untertitel", - "SearchForSubtitles": "Suche nach Untertiteln", "LabelLanguage": "Sprache:", "Search": "Suche", "NoSubtitleSearchResultsFound": "Keine Ergebnisse gefunden.", @@ -99,54 +68,57 @@ "MySubtitles": "Meine Untertitel", "MessageDownloadQueued": "Download eingereiht.", "EditSubtitles": "Untertitel bearbeiten", + "SearchForSubtitles": "Suche nach Untertiteln", "UnlockGuide": "Guide freischalten", "RefreshMetadata": "Aktualisiere Metadaten", "ReplaceExistingImages": "Ersetze vorhandene Bilder", "ReplaceAllMetadata": "Ersetze alle Metadaten", "SearchForMissingMetadata": "Suche nach fehlenden Metadaten", "LabelRefreshMode": "Aktualisierungsmodus:", + "RefreshDialogHelp": "Metadaten werden auf Basis der Einstellungen und Internet Services in den Emby Server Einstellungen aktualisiert.", "NoItemsFound": "Keine Eintr\u00e4ge gefunden.", "HeaderSaySomethingLike": "Sage etwas wie...", - "ButtonTryAgain": "Erneut versuchen", "HeaderYouSaid": "Du sagtest...", - "MessageWeDidntRecognizeCommand": "Entschuldigung, dieses Kommando konnten wir nicht erkennen.", "MessageIfYouBlockedVoice": "Wenn du die Sprachsteuerung f\u00fcr die App nicht erlaubt hast, musst du dies vor einem erneuten Versuch \u00e4ndern.", + "ButtonTryAgain": "Erneut versuchen", + "MessageWeDidntRecognizeCommand": "Entschuldigung, dieses Kommando konnten wir nicht erkennen.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Nicht bewertet", "Favorite": "Favorit", + "Unrated": "Nicht bewertet", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadaten werden auf Basis der Einstellungen und Internet Services in den Emby Server Einstellungen aktualisiert.", "Open": "\u00d6ffnen", - "Play": "Abspielen", - "AddToPlayQueue": "Zur Abspielwarteschlange hinzuf\u00fcgen", - "Shuffle": "Zufallswiedergabe", - "Identify": "Identifizieren", - "EditImages": "Bearbeite Bilder", - "EditInfo": "Info bearbeiten", - "Sync": "Synchronisation", - "InstantMix": "Schnellmix", "ViewAlbum": "Zeige Album", "ViewArtist": "Zeige Darsteller", + "Play": "Abspielen", + "Shuffle": "Zufallswiedergabe", + "InstantMix": "Schnellmix", "QueueAllFromHere": "Setze alles von hier auf Warteschlange", "PlayAllFromHere": "Spiele alles von hier", + "Identify": "Identifizieren", + "EditImages": "Bearbeite Bilder", + "Sync": "Synchronisation", + "EditInfo": "Info bearbeiten", + "RemoveFromPlaylist": "Von Wiedergabeliste entfernen", "PlayFromBeginning": "Von Beginn abspielen", "ResumeAt": "Fortsetzen bei {0}", - "RemoveFromPlaylist": "Von Wiedergabeliste entfernen", - "RemoveFromCollection": "Aus Sammlung entfernen", "Trailer": "Trailer", "MarkPlayed": "Markiere \"als gesehen\"", "MarkUnplayed": "Markiere \"als ungesehen\"", "GroupVersions": "Gruppiere Versionen", "PleaseSelectTwoItems": "Bitte w\u00e4hle mindestens zwei Optionen aus.", + "Error": "Fehler", "TryMultiSelect": "Versuche Mehrfachauswahl", "TryMultiSelectMessage": "F\u00fcr eine Mehrfachauswahl klicke und halte ein Poster. W\u00e4hle die Eintr\u00e4ge die du bearbeiten m\u00f6chten. Versuch es!", "HeaderConfirmRecordingCancellation": "Best\u00e4tige Aufzeichnungsabbruch", "MessageConfirmRecordingCancellation": "Bis du dir sicher, diese Aufzeichnung abzubrechen?", - "Error": "Fehler", + "HeaderAddToCollection": "Zu Sammlung hinzuf\u00fcgen", + "HeaderAddToPlaylist": "Zur Wiedergabeliste hinzuf\u00fcgen", + "RemoveFromCollection": "Aus Sammlung entfernen", "VoiceInput": "Spracheingabe", - "LabelContentType": "Typ des Inhalts:", + "Add": "Hinzuf\u00fcgen", "LabelPath": "Pfad:", + "LabelContentType": "Typ des Inhalts:", "LabelTitle": "Titel:", "LabelOriginalTitle": "Original Titel:", "LabelSortTitle": "Sortierungs Titel:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Bestimme in den Bibliotheks-Einstellungen des Emby Server Dashboards, wie das Feld \"Hinzugef\u00fcgt am\" interpretiert werden soll.", "LabelStatus": "Status:", "LabelArtists": "Interpreten:", - "LabelArtistsHelp": "Trenne mehrere Eintr\u00e4ge durch ;", "LabelAlbumArtists": "Alben Interpreten:", + "LabelArtistsHelp": "Trenne mehrere Eintr\u00e4ge durch ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community Bewertung:", "LabelVoteCount": "Stimmen:", + "LabelCommunityRating": "Community Bewertung:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Kritiker Bewertung:", "LabelCriticRatingSummary": "Kritikerbewertungen:", "LabelAwardSummary": "Auszeichnungen:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "\u00dcbersicht:", "LabelShortOverview": "Kurz\u00fcbersicht:", + "LabelOverview": "\u00dcbersicht:", "LabelReleaseDate": "Ver\u00f6ffentlichungsdatum:", "LabelYear": "Jahr:", "LabelPlaceOfBirth": "Geburtsort:", "LabelAirDays": "Ausstrahlungstage:", "LabelAirTime": "Ausstrahlungszeit:", - "LabelRuntimeMinutes": "Laufzeit (Minuten):", "LabelParentalRating": "Altersfreigabe:", - "LabelCustomRating": "Eigene Bewertung:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Laufzeit (Minuten):", "LabelRevenue": "Einnahmen ($):", - "LabelOriginalAspectRatio": "Original Seitenverh\u00e4ltnis:", + "LabelBudget": "Budget", + "LabelCustomRating": "Eigene Bewertung:", "LabelPlayers": "Spieler:", + "LabelOriginalAspectRatio": "Original Seitenverh\u00e4ltnis:", + "LabelAbsoluteEpisodeNumber": "Absolute Episodennummer:", "Label3DFormat": "3D Format:", "HeaderAlternateEpisodeNumbers": "Alternative Episodennummern", "LabelDvdSeasonNumber": "DVD Staffelnummer:", "LabelDvdEpisodeNumber": "DVD Episodennummer:", - "LabelAbsoluteEpisodeNumber": "Absolute Episodennummer:", "HeaderSpecialEpisodeInfo": "Spezialepisoden Information", "LabelAirsBeforeSeason": "Ausstrahlungen vor Staffel:", "LabelAirsAfterSeason": "Ausstrahlungen nach Staffel:", @@ -201,172 +173,195 @@ "People": "Personen", "LabelMetadataDownloadLanguage": "Bevorzugte Sprache f\u00fcr Downloads:", "LabelLockItemToPreventChanges": "Sperre diesen Eintrag um zuk\u00fcnftige \u00c4nderungen zu verhindern", - "MessageLeaveEmptyToInherit": "Freilassen f\u00fcr die Vererbung von Berechtigungen oder dem systemweiten Standardwert.", "LabelCountry": "Land:", + "MessageLeaveEmptyToInherit": "Freilassen f\u00fcr die Vererbung von Berechtigungen oder dem systemweiten Standardwert.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Geburtsjahr:", "LabelBirthDate": "Geburtsdatum:", - "LabelDeathDate": "Todesdatum:", "LabelEndDate": "Endzeit:", + "LabelDeathDate": "Todesdatum:", "LabelSeasonNumber": "Staffelnummer:", "LabelEpisodeNumber": "Episodennummer:", "LabelTrackNumber": "St\u00fcck Nummer:", "LabelNumber": "Nummer:", "LabelDiscNumber": "Discnummer:", - "LabelParentNumber": "Ursprungsnummer:", "SortName": "Sortiername", + "LabelParentNumber": "Ursprungsnummer:", "ReleaseDate": "Ver\u00f6ffentlichungsdatum", "Continuing": "Fortdauernd", - "Ended": "Beendent", "HeaderEnabledFields": "Aktiviere Felder", + "Ended": "Beendent", + "Keywords": "Stichworte", "HeaderEnabledFieldsHelp": "W\u00e4hle Felder ab um das \u00c4ndern von Daten zu verhindern.", + "Name": "Name", "Backdrops": "Hintergr\u00fcnde", "Images": "Bilder", - "Keywords": "Stichworte", "Runtime": "Laufzeit", - "ProductionLocations": "Drehorte", + "Actor": "Schauspieler", "BirthLocation": "Geburtsort", + "ProductionLocations": "Drehorte", "ParentalRating": "Altersfreigabe", - "Name": "Name", "Overview": "\u00dcbersicht", "LabelType": "Typ:", "LabelPersonRole": "Rolle:", "LabelPersonRoleHelp": "Beispiel: Eiswagenfahrer", - "Actor": "Schauspieler", "Composer": "Komponist", - "Director": "Regisseur", "GuestStar": "Gaststar", + "Director": "Regisseur", "Producer": "Produzent", "Writer": "Drehbuchautor", - "MessageNoSyncJobsFound": "Keine Synchronisationsaufgaben gefunden. Um Synchronisationsaufgaben zu erstellen verwende die Synchronisationsbuttons in der App.", - "MessageNoDownloadsFound": "Keine Offline-Downloads. Mache deine Medien offline verf\u00fcgbar indem du \"Offline verf\u00fcgbar machen\" in der App bei bei den Medien anklickst.", - "InstallingPackage": "Installiere {0}", + "MessageItemSaved": "Element gespeichert", "PackageInstallCompleted": "{0} Installation abgeschlossen", + "InstallingPackage": "Installiere {0}", "PackageInstallFailed": "{0} Installation fehlgeschlagen", "PackageInstallCancelled": "{0} Installation abgebrochen", "SeriesYearToPresent": "{0}-Heute", - "ValueOneItem": "1 Eintrag", "ValueOneSong": "1 Lied", "ValueSongCount": "{0} Lieder", "ValueOneMovie": "1 Film", "ValueMovieCount": "{0} Filme", "ValueOneSeries": "1 Serie", - "ValueSeriesCount": "{0} Serien", "ValueOneEpisode": "1 Episode", + "ValueSeriesCount": "{0} Serien", "ValueEpisodeCount": "{0} Episoden", "ValueOneGame": "1 Spiel", - "ValueGameCount": "{0} Spiele", "ValueOneAlbum": "1 Album", - "ValueAlbumCount": "{0} Alben", + "ValueGameCount": "{0} Spiele", "ValueOneMusicVideo": "1 Musikvideo", + "ValueAlbumCount": "{0} Alben", "ValueMusicVideoCount": "{0} Musikvideos", "ValueMinutes": "{0} Minuten", "HeaderIdentifyItemHelp": "Gib ein oder mehrere Suchkriterien ein. Entferne Kriterien um die Suchergebnisse zu erweitern.", "PleaseEnterNameOrId": "Bitte gib einen Namen oder eine externe Id an.", - "MessageItemSaved": "Element gespeichert", "SearchResults": "Suchergebnisse", "SyncToOtherDevice": "Mit einem anderen Ger\u00e4t synchronisieren", "MakeAvailableOffline": "Offline verf\u00fcgbar machen", - "ServerNameIsRestarting": "Emby Server - {0} startet neu.", + "ButtonRestart": "Neustart", "ServerNameIsShuttingDown": "Emby Server - {0} f\u00e4hrt herunter.", + "PleaseRestartServerName": "Bitte starte Emby Server - {0} neu.", + "ServerNameIsRestarting": "Emby Server - {0} startet neu.", "HeaderDeleteItems": "L\u00f6sche Objekte", "ConfirmDeleteItems": "Das L\u00f6schen dieser Objekte l\u00f6scht die Dateien vom Laufwerk und in deiner Medienbibliothek. Bist du wirklich sicher?", - "PleaseRestartServerName": "Bitte starte Emby Server - {0} neu.", "SyncJobCreated": "Synchronisations-Aufgabe erstellt.", "LabelSyncTo": "Synchronisiere mit:", "LabelSyncJobName": "Synchronisations-Aufgabe:", - "LabelQuality": "Qualit\u00e4t:", "LabelSyncNoTargetsHelp": "Es sieht so aus als w\u00fcrdest du aktuell keine Apps verwenden, die Synchronisation unterst\u00fctzen.", - "DownloadScheduled": "Download geplant", - "HeaderSyncRequiresSub": "Synchronisation ben\u00f6tigt ein aktives Emby Premiere Abonnement.", + "LabelQuality": "Qualit\u00e4t:", "LearnMore": "Erfahre mehr", - "LabelProfile": "Profil:", + "DownloadScheduled": "Download geplant", "LabelBitrateMbps": "Datenrate (Mbps):", + "LabelProfile": "Profil:", "SyncUnwatchedVideosOnly": "Synchronisiere nur ungesehene Videos.", - "SyncUnwatchedVideosOnlyHelp": "Nur ungesehene Video werden synchronisiert. Videos werden entfernt sobald diese auf dem Ger\u00e4t angeschaut wurden.", "AutomaticallySyncNewContent": "Synchronisiere neue Inhalte automatisch", - "AutomaticallySyncNewContentHelp": "Neu zu diesem Ordner hinzugef\u00fcgte Inhalte werden automatisch mit dem Ger\u00e4t synchronisiert.", - "LabelItemLimit": "Maximale Anzahl:", - "LabelItemLimitHelp": "Optional. Lege die maximale Anzahl der zu synchronisierenden Eintr\u00e4ge fest.", "PleaseSelectDeviceToSyncTo": "Bitte w\u00e4hle ein zu synchronisierendes Ger\u00e4t.", + "LabelItemLimit": "Maximale Anzahl:", + "SyncUnwatchedVideosOnlyHelp": "Nur ungesehene Video werden synchronisiert. Videos werden entfernt sobald diese auf dem Ger\u00e4t angeschaut wurden.", + "LabelItemLimitHelp": "Optional. Lege die maximale Anzahl der zu synchronisierenden Eintr\u00e4ge fest.", + "AutomaticallySyncNewContentHelp": "Neu zu diesem Ordner hinzugef\u00fcgte Inhalte werden automatisch mit dem Ger\u00e4t synchronisiert.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Wiederholen", + "Settings": "Einstellungen", + "DefaultErrorMessage": "Es gab einen Fehler beim verarbeiten der Anfrage. Bitte versuche es sp\u00e4ter erneut.", "Screenshots": "Screenshots", "MoveRight": "Nach rechts bewegen", "MoveLeft": "Nach links bewegen", "ConfirmDeleteImage": "Bild l\u00f6schen?", "HeaderEditImages": "Bilder bearbeiten", - "Settings": "Einstellungen", "ShowIndicatorsFor": "Zeige Indikatoren f\u00fcr:", "NewEpisodes": "Neue Episoden", + "Premieres": "Premieren", "HDPrograms": "HD Programme", "LiveBroadcasts": "Live\u00fcbertragungen", - "Premieres": "Premieren", "RepeatEpisodes": "Wiederholung Episoden", "DvrSubscriptionRequired": "Emby DVR ben\u00f6tigt eine aktive Emby Premiere Mitgliedschaft.", "HeaderCancelRecording": "Aufnahme abbrechen", - "CancelRecording": "Aufnahme abbrechen", - "HeaderKeepRecording": "Aufnahme behalten", - "HeaderCancelSeries": "Serie abbrechen", - "HeaderKeepSeries": "Serie behalten", + "PromoConvertRecordingsToStreamingFormat": "Konvertiere Aufnahmen automatisch in ein Streaming-freundliches Format mit Emby Premiere. Aufnahmen werden, basierend auf den Emby Server-Einstellungen, dynamisch zu MP4 oder MKV konvertiert.", + "HeaderConvertYourRecordings": "Konvertiere deine Aufnahmen", "HeaderLearnMore": "Erfahre mehr", + "HeaderKeepRecording": "Aufnahme behalten", "DeleteMedia": "Medien l\u00f6schen", "SeriesSettings": "Serieneinstellungen", "HeaderRecordingOptions": "Aufnahmeeinstellungen", - "CancelSeries": "Serien abbrechen", "DoNotRecord": "Nicht aufnehmen", - "HeaderSeriesOptions": "Serienoptionen", + "CancelSeries": "Serien abbrechen", "LabelChannels": "Kan\u00e4le:", + "HeaderSeriesOptions": "Serienoptionen", "ChannelNameOnly": "Nur Kanal {0}", "Anytime": "Jederzeit", "AroundTime": "Um {0}", "LabelAirtime": "Sendezeit", - "AllChannels": "Alle Kan\u00e4le:", "LabelRecord": "Aufnahme:", + "AllChannels": "Alle Kan\u00e4le:", "NewEpisodesOnly": "Nur neue Episoden", "AllEpisodes": "Alle Episoden", "LabelStartWhenPossible": "Starte wenn m\u00f6glich:", "LabelStopWhenPossible": "Stoppe wenn m\u00f6glich", "MinutesBefore": "Minuten vor", - "MinutesAfter": "Minuten nach", - "SkipEpisodesAlreadyInMyLibrary": "Nehme keine Episoden auf, die schon in meiner Bibliothek verf\u00fcgbar sind.", "SkipEpisodesAlreadyInMyLibraryHelp": "Episoden werden mittels Staffel- und Episodennummer verglichen, wenn verf\u00fcgbar.", + "SkipEpisodesAlreadyInMyLibrary": "Nehme keine Episoden auf, die schon in meiner Bibliothek verf\u00fcgbar sind.", + "MinutesAfter": "Minuten nach", "LabelKeepUpTo": "Fortf\u00fchren:", "AsManyAsPossible": "So viele wie m\u00f6glich", - "DefaultErrorMessage": "Es gab einen Fehler beim verarbeiten der Anfrage. Bitte versuche es sp\u00e4ter erneut.", - "LabelKeep:": "Behalten:", "UntilIDelete": "Bis ich l\u00f6sche", + "LabelKeep:": "Behalten:", "UntilSpaceNeeded": "Bis Speicherplatz ben\u00f6tigt wird", - "Categories": "Kategorien", "Sports": "Sport", + "Categories": "Kategorien", "News": "Nachrichten", "Movies": "Filme", "Kids": "Kinder", "EnableColorCodedBackgrounds": "Aktiviere farbige Hintergr\u00fcnde", "SortChannelsBy": "Sortiere Kan\u00e4le nach:", - "RecentlyWatched": "K\u00fcrzlich gesehen", "ChannelNumber": "Kanalnummer", + "RecentlyWatched": "K\u00fcrzlich gesehen", + "PlaceFavoriteChannelsAtBeginning": "Platziere favorisierte Kan\u00e4le am Anfang", + "SeriesCancelled": "Serie abgebrochen.", + "HeaderKeepSeries": "Serie behalten", + "HeaderCancelSeries": "Serie abbrechen", + "CancelRecording": "Aufnahme abbrechen", + "MessageUnlockAppWithSupporter": "Schalte diese Funktion mit einem aktiven Emby Premium Abo frei.", + "MessageUnlockAppWithPurchaseOrSupporter": "Schalte diese Funktion mit einer kleinen einmaligen Geb\u00fchr oder einem aktiven Emby Premium Abo frei.", + "MessageToValidateSupporter": "Wenn du eine aktive Emby Premiere Mitgliedschaft hast, stelle bitte sicher, dass du diese \u00fcber das Emby Server Dashboard eingerichtet hast (Hauptmenu -> Emby Premiere).", + "HeaderCinemaMode": "Kinomodus", + "HeaderCloudSync": "Cloud Synchronisation", + "HeaderOfflineDownloads": "Offline Medien", + "HeaderOfflineDownloadsDescription": "Lade Medien auf deine Ger\u00e4te herunter um sie einfach offline zu nutzen.", + "CloudSyncFeatureDescription": "Synchronisiere deine Medien in die Cloud f\u00fcr ein Backup, eine Archivierung und Konvertierung.", + "CoverArtFeatureDescription": "Cover Art erstellt z.B. lustige Cover und erlaubt dir eine weitergehende pers\u00f6nliche Gestaltung deiner Medienbilder.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Der Cinema Mode bringt das richtige Kinogef\u00fchl mit Trailern und eigenen Intros vor dem Hauptfilm.", + "HeaderFreeApps": "Kostenlose Emby Apps", + "FreeAppsFeatureDescription": "Genie\u00dfe Zugriff auf kostenlose Emby Apps f\u00fcr deine Ger\u00e4te.", + "LabelEmailAddress": "E-Mail Adresse:", "HeaderBenefitsEmbyPremiere": "Vorteile von Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Genie\u00dfe eine Minute Wiedergabe. Danke, dass du Emby ausprobierst.", "HeaderTryPlayback": "Wiedergabe ausprobieren", + "IPurchasedThisApp": "Ich habe diese App gekauft", "HowDidYouPay": "Wie hast Du bezahlt?", "IHaveEmbyPremiere": "Ich besitze Emby Premiere", - "IPurchasedThisApp": "Ich habe diese App gekauft", "ButtonRestorePreviousPurchase": "Kauf wiederherstellen", "ButtonUnlockWithPurchase": "Freischalten durch Kauf", "ButtonUnlockPrice": "{0} freischalten", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monatlich {0}", - "HeaderAlreadyPaid": "Schon bezahlt?", "ButtonPlayOneMinute": "Eine Minute wiedergeben", - "PlaceFavoriteChannelsAtBeginning": "Platziere favorisierte Kan\u00e4le am Anfang", "HeaderUnlockFeature": "Feature freischalten", "MessageDidYouKnowCinemaMode": "Wusstest du schon, das du mit Emby Premiere dein Erlebnis mit Funktionen wie dem Kino-Modus noch verbessern kannst?", "MessageDidYouKnowCinemaMode2": "Der Kino-Modus bringt das richtige Kino-Erlebnis nach Hause, mit Trailern und eigenen Intros vor deinem Hauptfilm.", - "HeaderPlayMyMedia": "Spiele meine Medien ab", "HeaderDiscoverEmbyPremiere": "Entdecke Emby Premiere", - "Items": "Eintr\u00e4ge", + "HeaderPlayMyMedia": "Spiele meine Medien ab", "OneChannel": "Ein Kanal", - "ConfirmRemoveDownload": "Download entfernen?", - "RemoveDownload": "Download entfernen", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monatlich {0}", + "HeaderAlreadyPaid": "Schon bezahlt?", "AddedOnValue": "Hinzugef\u00fcgt {0}", + "ConfirmRemoveDownload": "Download entfernen?", + "CancelSyncJobConfirmation": "Der Abbruch der Synchronisation wird bereits synchronisierte Medien bei der n\u00e4chsten Synchronisation vom Ger\u00e4t l\u00f6schen. M\u00f6chten Sie wirklich fortfahren?", + "ButtonCancelSyncJob": "Synchronisierung abbrechen", + "MessageNoSyncJobsFound": "Keine Synchronisationsaufgaben gefunden. Um Synchronisationsaufgaben zu erstellen verwende die Synchronisationsbuttons in der App.", + "MessageNoDownloadsFound": "Keine Offline-Downloads. Mache deine Medien offline verf\u00fcgbar indem du \"Offline verf\u00fcgbar machen\" in der App bei bei den Medien anklickst.", + "ValueOneItem": "1 Eintrag", + "HeaderSyncRequiresSub": "Synchronisation ben\u00f6tigt ein aktives Emby Premiere Abonnement.", + "Items": "Eintr\u00e4ge", + "RemoveDownload": "Download entfernen", "RemovingFromDevice": "Vom Ger\u00e4t entfernen", "RemoveFromDevice": "Vom Ger\u00e4t entfernen", "KeepOnDevice": "Auf Ger\u00e4t behalten", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Fertig zum Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Vom Ger\u00e4t entfernen", "SyncJobItemStatusQueued": "In Warteschlange", - "SyncJobItemStatusConverting": "Konvertiere", "SyncJobItemStatusTransferring": "\u00dcbertrage", - "SyncJobItemStatusSynced": "Heruntergeladen", - "SyncJobItemStatusFailed": "Fehlgeschlagen", + "SyncJobItemStatusConverting": "Konvertiere", "SyncJobItemStatusRemovedFromDevice": "Vom Ger\u00e4t entfernt", "SyncJobItemStatusCancelled": "Abgebrochen", + "SyncJobItemStatusSynced": "Heruntergeladen", + "SyncJobItemStatusFailed": "Fehlgeschlagen", "Retry": "Wiederholen", "HeaderMyDevice": "Mein Ger\u00e4t", + "ContinueInSecondsValue": "Fortfahren in {0} Sekunden.", "Continue": "Fortfahren", - "ContinueInSecondsValue": "Fortfahren in {0} Sekunden." + "AddToPlayQueue": "Zur Abspielwarteschlange hinzuf\u00fcgen", + "HeaderRemoteControl": "Fernsteuerung", + "Disconnect": "Verbindung trennen", + "EnableDisplayMirroring": "Aktiviere Display-Weiterleitung", + "HeaderSelectPlayer": "W\u00e4hle Videoplayer", + "Quality": "Qualit\u00e4t", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/el.json b/dashboard-ui/bower_components/emby-webcomponents/strings/el.json index e3e76de414..c157137a64 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/el.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/el.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "\u039e\u03b5\u03ba\u03bb\u03b5\u03b9\u03b4\u03ce\u03c3\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03b7\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u03ba\u03b1\u03c4\u03b1\u03b2\u03ac\u03bb\u03bf\u03bd\u03c4\u03b1\u03c2 \u03ad\u03bd\u03b1 \u03c0\u03bf\u03bb\u03cd \u03bc\u03b9\u03ba\u03c1\u03cc \u03ba\u03cc\u03c3\u03c4\u03bf\u03c2 \u03ae \u03bc\u03b5 \u03bc\u03af\u03b1 \u03b5\u03bd\u03b5\u03c1\u03b3\u03ae \u03c3\u03c5\u03bd\u03b4\u03c1\u03bf\u03bc\u03ae \u03c3\u03c4\u03bf Emby Premiere.", - "MessageUnlockAppWithSupporter": "\u039e\u03b5\u03ba\u03bb\u03b5\u03b9\u03b4\u03ce\u03c3\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03b7\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u03bc\u03b5 \u03bc\u03af\u03b1 \u03b5\u03bd\u03b5\u03c1\u03b3\u03ae \u03c3\u03c5\u03bd\u03b4\u03c1\u03bf\u03bc\u03ae \u03c3\u03c4\u03bf Emby Premiere.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "\u03a4\u03c1\u03b9", + "OptionMondayShort": "\u0394\u03b5\u03c5", "AttributeNew": "\u039d\u03ad\u03bf", - "Premiere": "Premiere", - "Live": "\u0396\u03c9\u03bd\u03c4\u03b1\u03bd\u03ac", - "Repeat": "\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "\u039a\u03c5\u03c1", + "OptionThursdayShort": "\u03a0\u03b5\u03bc", + "OptionSaturdayShort": "\u03a3\u03b1\u03b2", + "OptionWednesdayShort": "\u03a4\u03b5\u03c4", + "OptionFridayShort": "\u03a0\u03b1\u03c1", + "HeaderSelectDate": "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u0397\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1\u03c2", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "\u0388\u03c4\u03bf\u03c2 \u03ba\u03c5\u03ba\u03bb\u03bf\u03c6\u03bf\u03c1\u03af\u03b1\u03c2: {0} \n", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "\u0388\u03c4\u03bf\u03c2 \u03ba\u03c5\u03ba\u03bb\u03bf\u03c6\u03bf\u03c1\u03af\u03b1\u03c2: {0} \n", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "\u039a\u03c5\u03c1", - "OptionMondayShort": "\u0394\u03b5\u03c5", - "OptionTuesdayShort": "\u03a4\u03c1\u03b9", - "OptionWednesdayShort": "\u03a4\u03b5\u03c4", - "OptionThursdayShort": "\u03a0\u03b5\u03bc", - "OptionFridayShort": "\u03a0\u03b1\u03c1", - "OptionSaturdayShort": "\u03a3\u03b1\u03b2", - "HeaderSelectDate": "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u0397\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1\u03c2", - "ButtonOk": "Ok", "ButtonCancel": "\u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7 ", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "\u0395\u03c0\u03b1\u03bd\u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "\u039d\u03ad\u03b1 \u0395\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae", "Sunday": "\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae", "Monday": "\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1", "Tuesday": "\u03a4\u03c1\u03af\u03c4\u03b7", "Wednesday": "\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7", "Thursday": "\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7", - "Friday": "\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae", "Saturday": "\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf", "Days": "\u0397\u03bc\u03ad\u03c1\u03b5\u03c2", + "Friday": "\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "\u0394\u03c9\u03c1\u03b5\u03ac\u03bd \u0395\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ad\u03c2 Emby", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "\u0391\u03c0\u03cc\u03ba\u03c4\u03b7\u03c3\u03b5 \u03a3\u03c5\u03bd\u03b4\u03c1\u03bf\u03bc\u03ae Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 E-mail", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "\u0395\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "\u0391\u03bd\u03b1\u03bd\u03ad\u03c9\u03c3\u03b7", + "RefreshQueued": "Refresh queued.", "Save": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7", "Edit": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1", - "Download": "Download", - "Advanced": "Advanced", "Delete": "\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae", "HeaderDeleteItem": "\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u0391\u03bd\u03c4\u03b9\u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "\u0391\u03bd\u03b1\u03bd\u03ad\u03c9\u03c3\u03b7", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5 \u03c3\u03c4\u03b7 \u03c3\u03c5\u03bb\u03bb\u03bf\u03b3\u03ae", - "HeaderAddToCollection": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5 \u03c3\u03c4\u03b7 \u03a3\u03c5\u03bb\u03bb\u03bf\u03b3\u03ae", "NewCollection": "\u039d\u03ad\u03b1 \u03a3\u03c5\u03bb\u03bb\u03bf\u03b3\u03ae", + "AddToCollection": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5 \u03c3\u03c4\u03b7 \u03c3\u03c5\u03bb\u03bb\u03bf\u03b3\u03ae", "LabelCollection": "\u03a3\u03c5\u03bb\u03bb\u03bf\u03b3\u03ae:", "Help": "\u0392\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1", + "LabelName": "\u038c\u03bd\u03bf\u03bc\u03b1:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03c3\u03c4\u03bf \u03b4\u03b9\u03b1\u03b4\u03af\u03ba\u03c4\u03c5\u03bf \u03b3\u03b9\u03b1 \u03b5\u03be\u03ce\u03c6\u03c5\u03bb\u03bb\u03bf \u03ba\u03b1\u03b9 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2", - "LabelName": "\u038c\u03bd\u03bf\u03bc\u03b1:", "NewCollectionNameExample": "\u03a0\u03b1\u03c1\u03ac\u03b4\u03b5\u03b9\u03b3\u03bc\u03b1: \u03a3\u03c5\u03bb\u03bb\u03bf\u03b3\u03ae \"\u03a0\u03cc\u03bb\u03b5\u03bc\u03bf\u03c2 \u03c4\u03c9\u03bd \u0386\u03c3\u03c4\u03c1\u03c9\u03bd\"", - "MessageItemsAdded": "Items added.", "OptionNew": "\u039d\u03ad\u03bf...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "\u039b\u03af\u03c3\u03c4\u03b1:", "AddToPlaylist": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5 \u03c3\u03b5 \u03bb\u03af\u03c3\u03c4\u03b1", - "HeaderAddToPlaylist": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5 \u03c3\u03b5 \u039b\u03af\u03c3\u03c4\u03b1", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "\u03a5\u03c0\u03cc\u03c4\u03b9\u03c4\u03bb\u03bf\u03b9", - "SearchForSubtitles": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03a5\u03c0\u03bf\u03c4\u03af\u03c4\u03bb\u03c9\u03bd", "LabelLanguage": "\u0393\u03bb\u03ce\u03c3\u03c3\u03b1", "Search": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "\u039f\u03b9 \u03a5\u03c0\u03cc\u03c4\u03b9\u03c4\u03bb\u03bf\u03b9 \u03bc\u03bf\u03c5", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c5\u03c0\u03bf\u03c4\u03af\u03c4\u03bb\u03c9\u03bd", + "SearchForSubtitles": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03a5\u03c0\u03bf\u03c4\u03af\u03c4\u03bb\u03c9\u03bd", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "\u0391\u03bd\u03b1\u03bd\u03ad\u03c9\u03c3\u03b7 \u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03b9\u03ce\u03bd", "ReplaceExistingImages": "\u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03c3\u03c9\u03bd \u03b5\u03b9\u03ba\u03cc\u03bd\u03c9\u03bd", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5 \u03c3\u03c4\u03b7 \u03a3\u03c5\u03bb\u03bb\u03bf\u03b3\u03ae", + "HeaderAddToPlaylist": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5 \u03c3\u03b5 \u039b\u03af\u03c3\u03c4\u03b1", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "\u03a4\u03cd\u03c0\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5:", + "Add": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5", "LabelPath": "Path:", + "LabelContentType": "\u03a4\u03cd\u03c0\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7:", "LabelArtists": "\u039a\u03b1\u03bb\u03bb\u03b9\u03c4\u03ad\u03c7\u03bd\u03b5\u03c2:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "\u0388\u03c4\u03bf\u03c2:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "\u03a7\u03ce\u03c1\u03b1:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "\u039a\u03b1\u03c4\u03b1\u03bb\u03bb\u03b7\u03bb\u03cc\u03c4\u03b7\u03c4\u03b1", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "\u0395\u03c0\u03b1\u03bd\u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "\u0396\u03c9\u03bd\u03c4\u03b1\u03bd\u03ac", + "Repeat": "\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "\u039e\u03b5\u03ba\u03bb\u03b5\u03b9\u03b4\u03ce\u03c3\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03b7\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u03bc\u03b5 \u03bc\u03af\u03b1 \u03b5\u03bd\u03b5\u03c1\u03b3\u03ae \u03c3\u03c5\u03bd\u03b4\u03c1\u03bf\u03bc\u03ae \u03c3\u03c4\u03bf Emby Premiere.", + "MessageUnlockAppWithPurchaseOrSupporter": "\u039e\u03b5\u03ba\u03bb\u03b5\u03b9\u03b4\u03ce\u03c3\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03b7\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u03ba\u03b1\u03c4\u03b1\u03b2\u03ac\u03bb\u03bf\u03bd\u03c4\u03b1\u03c2 \u03ad\u03bd\u03b1 \u03c0\u03bf\u03bb\u03cd \u03bc\u03b9\u03ba\u03c1\u03cc \u03ba\u03cc\u03c3\u03c4\u03bf\u03c2 \u03ae \u03bc\u03b5 \u03bc\u03af\u03b1 \u03b5\u03bd\u03b5\u03c1\u03b3\u03ae \u03c3\u03c5\u03bd\u03b4\u03c1\u03bf\u03bc\u03ae \u03c3\u03c4\u03bf Emby Premiere.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "\u0394\u03c9\u03c1\u03b5\u03ac\u03bd \u0395\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ad\u03c2 Emby", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 E-mail", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-gb.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-gb.json index 694fa65509..5228cb3149 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-gb.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-gb.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Add", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "Cancel", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", "Wednesday": "Wednesday", "Thursday": "Thursday", - "Friday": "Friday", "Saturday": "Saturday", "Days": "Days", + "Friday": "Friday", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalise your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "Save", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "Name:", "NewCollectionHelp": "Collections allow you to create personalised groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "Name:", "NewCollectionNameExample": "Example: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Language:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognise that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognise that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favourite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Content type:", + "Add": "Add", "LabelPath": "Path:", + "LabelContentType": "Content type:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Country:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent its data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external ID.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programmes", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable colour-coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favourite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalise your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favourite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es-ar.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es-ar.json index 0c9a3b0889..91179ebd92 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es-ar.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es-ar.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Add", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "Cancel", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", "Wednesday": "Wednesday", "Thursday": "Thursday", - "Friday": "Friday", "Saturday": "Saturday", "Days": "Days", + "Friday": "Friday", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "Save", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "Name:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "Name:", "NewCollectionNameExample": "Ejemplo: Colecci\u00f3n de Star Wars", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Language:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Content type:", + "Add": "Add", "LabelPath": "Path:", + "LabelContentType": "Content type:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Country:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Palabras clave", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Palabras clave", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es-mx.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es-mx.json index 6d72bd7551..61545318ed 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es-mx.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es-mx.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Desbloquee esta caracter\u00edstica con una peque\u00f1a compra \u00fanica, o con una suscripci\u00f3n activa de Emby Premier.", - "MessageUnlockAppWithSupporter": "Desbloquee esta caracter\u00edstica con una suscripci\u00f3n activa de Emby Premier.", - "MessageToValidateSupporter": "Si tiene una subscripci\u00f3n de Emby Premiere activa, aseg\u00farese de que ha configurado Emby Premiere en el Panel de Control del Servidor Emby, al cual puede acceder dando click en Emby Premiere dentro del men\u00fa principal.", "ValueSpecialEpisodeName": "Especial - {0}", - "Share": "Compartir", - "Add": "Agregar", - "ServerUpdateNeeded": "Este Servidor Emby necesita ser actualizado. Para descargar la ultima versi\u00f3n, por favor visite {0}", - "LiveTvGuideRequiresUnlock": "La Guia de TV en Vivo actualmente esta limitada a {0} canales. De clic en el bot\u00f3n Desbloquear para saber como desbloquear la experiencia completa.", + "OptionTuesdayShort": "Mar", + "OptionMondayShort": "Lun", "AttributeNew": "Nuevo", - "Premiere": "Premier", - "Live": "En Vivo", - "Repeat": "Repetir", + "ServerUpdateNeeded": "Este Servidor Emby necesita ser actualizado. Para descargar la ultima versi\u00f3n, por favor visite {0}", + "Share": "Compartir", + "OptionSundayShort": "Dom", + "OptionThursdayShort": "Jue", + "OptionSaturdayShort": "Sab", + "OptionWednesdayShort": "Mie", + "OptionFridayShort": "Vie", + "HeaderSelectDate": "Seleccionar fecha", "TrackCount": "{0} Pistas", "ItemCount": "{0} \u00edtems", - "ReleaseYearValue": "A\u00f1o de estreno: {0}", "OriginalAirDateValue": "Fecha de transmisi\u00f3n original: {0}", + "ReleaseYearValue": "A\u00f1o de estreno: {0}", "EndsAtValue": "Termina a las {0}", - "OptionSundayShort": "Dom", - "OptionMondayShort": "Lun", - "OptionTuesdayShort": "Mar", - "OptionWednesdayShort": "Mie", - "OptionThursdayShort": "Jue", - "OptionFridayShort": "Vie", - "OptionSaturdayShort": "Sab", - "HeaderSelectDate": "Seleccionar fecha", - "ButtonOk": "Ok", "ButtonCancel": "Cancelar", + "ButtonOk": "Ok", "ButtonGotIt": "Hecho", - "ButtonRestart": "Reiniciar", - "RecordingCancelled": "Grabaci\u00f3n cancelada.", - "SeriesCancelled": "Serie cancelada.", + "LiveTvGuideRequiresUnlock": "La Guia de TV en Vivo actualmente esta limitada a {0} canales. De clic en el bot\u00f3n Desbloquear para saber como desbloquear la experiencia completa.", "RecordingScheduled": "Grabaci\u00f3n programada.", - "SeriesRecordingScheduled": "Grabaci\u00f3n de series programadas.", "HeaderNewRecording": "Nueva Grabaci\u00f3n", "Sunday": "Domingo", "Monday": "Lunes", "Tuesday": "Martes", "Wednesday": "Mi\u00e9rcoles", "Thursday": "Jueves", - "Friday": "Viernes", "Saturday": "S\u00e1bado", "Days": "D\u00edas", + "Friday": "Viernes", "RecordSeries": "Grabar Series", - "HeaderCinemaMode": "Modo Cine", - "HeaderCloudSync": "Sinc. en la Nube", - "HeaderOfflineDownloads": "Medios sin conexion", - "HeaderOfflineDownloadsDescription": "Descargue sus medios en su dispositivo para f\u00e1cil uso mientras esta desconectado.", - "CloudSyncFeatureDescription": "Sincronice sus medios a la nube para un f\u00e1cil respaldo, archivo y conversi\u00f3n.", - "CoverArtFeatureDescription": "Cover Art crea divertidas caratulas y da otros tratamientos para ayudar a personalizar las im\u00e1genes de sus medios.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancelar sinc.", - "CancelSyncJobConfirmation": "Cancelando el trabajo de sincronizaci\u00f3n eliminara los medios sincronizados del dispositivo durante el pr\u00f3ximo proceso de sincronizaci\u00f3n. \u00bfEsta seguro de que desea continuar?", - "CinemaModeFeatureDescription": "El Modo Cine le da una verdadera experiencia de cine con trailers e intros personalizados antes de la funci\u00f3n.", - "HeaderFreeApps": "Aplicaciones Emby Gratuitas", - "FreeAppsFeatureDescription": "Disfrute acceso gratuito para elegir aplicaciones Emby para sus dispositivos.", "HeaderBecomeProjectSupporter": "Obtener Emby Premier", "MessageActiveSubscriptionRequiredSeriesRecordings": "Se requiere de una suscripci\u00f3n de Emby Premier para crear grabaciones automatizadas de series.", - "LabelEmailAddress": "Direcci\u00f3n de correo:", - "PromoConvertRecordingsToStreamingFormat": "Convertir autom\u00e1ticamente grabaciones a un formato amigable para transmitir con Emby Premiere. Las grabaciones ser\u00e1n convertidos en tiempo real a MP4 o MKV, basado en las configuraciones del servidor Emby.", "FeatureRequiresEmbyPremiere": "Esta caracter\u00edstica requiere de una suscripci\u00f3n activa de Emby Premiere.", - "HeaderConvertYourRecordings": "Convertir Sus Grabaciones", "Record": "Grabar", + "Advanced": "Avanzado", + "Download": "Descargar", + "Refresh": "Actualizar", + "RefreshQueued": "Actualizaci\u00f3n programada", "Save": "Guardar", "Edit": "Editar", - "Download": "Descargar", - "Advanced": "Avanzado", "Delete": "Eliminar", "HeaderDeleteItem": "Eliminar \u00cdtem", "ConfirmDeleteItem": "Al eliminar este \u00edtem se eliminar\u00e1 tanto del sistema de archivos como de su biblioteca de medios. \u00bfEsta seguro de querer continuar?", - "Refresh": "Actualizar", - "RefreshQueued": "Actualizaci\u00f3n programada", - "AddToCollection": "Agregar a Colecci\u00f3n.", - "HeaderAddToCollection": "Agregar a Colecci\u00f3n", "NewCollection": "Nueva Colecci\u00f3n", + "AddToCollection": "Agregar a Colecci\u00f3n.", "LabelCollection": "Colecci\u00f3n:", "Help": "Ayuda", + "LabelName": "Nombre:", "NewCollectionHelp": "Las colecciones le permiten disfrutar de agrupaciones personalizadas de pel\u00edculas y otros contenidos de la biblioteca.", "SearchForCollectionInternetMetadata": "Buscar en internet ilustraciones y metadatos", - "LabelName": "Nombre:", "NewCollectionNameExample": "Ejemplo: Colecci\u00f3n Guerra de las Galaxias", - "MessageItemsAdded": "\u00cdtems agregados.", "OptionNew": "Nuevo...", + "MessageItemsAdded": "\u00cdtems agregados.", "LabelPlaylist": "Lista de Reproducci\u00f3n:", "AddToPlaylist": "Agregar a lista de reproducci\u00f3n", - "HeaderAddToPlaylist": "Agregar a Lista de Reproducci\u00f3n", + "RecordingCancelled": "Grabaci\u00f3n cancelada.", + "SeriesRecordingScheduled": "Grabaci\u00f3n de series programadas.", "Subtitles": "Subt\u00edtulos", - "SearchForSubtitles": "Buscar Subtitulos", "LabelLanguage": "Idioma:", "Search": "Buscar", "NoSubtitleSearchResultsFound": "No se encontraron resultados.", @@ -99,54 +68,57 @@ "MySubtitles": "Mis Subtitulos", "MessageDownloadQueued": "Descargar cola.", "EditSubtitles": "Editar subt\u00edtulos", + "SearchForSubtitles": "Buscar Subtitulos", "UnlockGuide": "Desbloquear Gu\u00eda", "RefreshMetadata": "Actualizar Metadatos", "ReplaceExistingImages": "Reemplazar im\u00e1genes existentes", "ReplaceAllMetadata": "Remplazar todos los metadatos", "SearchForMissingMetadata": "Buscar metadatos faltantes", "LabelRefreshMode": "Modo de actualizaci\u00f3n:", + "RefreshDialogHelp": "Los metadatos son actualizados bas\u00e1ndose en las configuraciones y servicios de internet que que est\u00e9n activados en el panel de control de su Servidor de Emby.", "NoItemsFound": "No se encontraron \u00edtems.", "HeaderSaySomethingLike": "Decir Algo Como...", - "ButtonTryAgain": "Intentar de Nuevo", "HeaderYouSaid": "Ha Dicho...", - "MessageWeDidntRecognizeCommand": "Lo sentimos, no reconocimos ese comando.", "MessageIfYouBlockedVoice": "Si ha negado el acceso a la voz a la aplicaci\u00f3n necesitara reconfigurar antes de intentarlo de nuevo.", + "ButtonTryAgain": "Intentar de Nuevo", + "MessageWeDidntRecognizeCommand": "Lo sentimos, no reconocimos ese comando.", "ValueDiscNumber": "Disco {0}", - "Unrated": "Sin clasificar", "Favorite": "Favorito", + "Unrated": "Sin clasificar", "Like": "Me gusta", "Dislike": "No me gusta", - "RefreshDialogHelp": "Los metadatos son actualizados bas\u00e1ndose en las configuraciones y servicios de internet que que est\u00e9n activados en el panel de control de su Servidor de Emby.", "Open": "Abrir", - "Play": "Reproducir", - "AddToPlayQueue": "Agregar a la cola de reproduccion", - "Shuffle": "Aleatorio", - "Identify": "Identificar", - "EditImages": "Editar im\u00e1genes", - "EditInfo": "Editar informaci\u00f3n", - "Sync": "Sinc.", - "InstantMix": "Mix instant\u00e1neo", "ViewAlbum": "Ver album", "ViewArtist": "Ver artista", + "Play": "Reproducir", + "Shuffle": "Aleatorio", + "InstantMix": "Mix instant\u00e1neo", "QueueAllFromHere": "Encolar todos desde aqu\u00ed", "PlayAllFromHere": "Reproducir todos desde aqu\u00ed", + "Identify": "Identificar", + "EditImages": "Editar im\u00e1genes", + "Sync": "Sinc.", + "EditInfo": "Editar informaci\u00f3n", + "RemoveFromPlaylist": "Eliminar de la lista de reproducci\u00f3n", "PlayFromBeginning": "Reproducir desde el inicio", "ResumeAt": "Reanudar desde {0}", - "RemoveFromPlaylist": "Eliminar de la lista de reproducci\u00f3n", - "RemoveFromCollection": "Remover de la colecci\u00f3n", "Trailer": "Trailer", "MarkPlayed": "Marcar como Reproducido", "MarkUnplayed": "Marcar como No Reproducido", "GroupVersions": "Agrupar versiones", "PleaseSelectTwoItems": "Por favor selecciona al menos dos \u00edtems.", + "Error": "Error", "TryMultiSelect": "Intente Multi-Selecci\u00f3n", "TryMultiSelectMessage": "Para editar m\u00faltiples medios, solo de clic sostenido sobre cualquier p\u00f3ster y elija los items que desea administrar. \u00a1int\u00e9ntelo!", "HeaderConfirmRecordingCancellation": "Confirmar Cancelaci\u00f3n de la Grabaci\u00f3n", "MessageConfirmRecordingCancellation": "\u00bfEst\u00e1 seguro de querer cancelar esta grabaci\u00f3n?", - "Error": "Error", + "HeaderAddToCollection": "Agregar a Colecci\u00f3n", + "HeaderAddToPlaylist": "Agregar a Lista de Reproducci\u00f3n", + "RemoveFromCollection": "Remover de la colecci\u00f3n", "VoiceInput": "Entrada de Voz", - "LabelContentType": "Tipo de Contenido:", + "Add": "Agregar", "LabelPath": "Ruta:", + "LabelContentType": "Tipo de Contenido:", "LabelTitle": "Titulo:", "LabelOriginalTitle": "Titulo original:", "LabelSortTitle": "Titulo para ordenar:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure como la fecha de adici\u00f3n es determinada en el Panel de Control del Servidor Emby bajo la configuraci\u00f3n de Librerias", "LabelStatus": "Estado:", "LabelArtists": "Artistas:", - "LabelArtistsHelp": "Separar m\u00faltiples empleando:", "LabelAlbumArtists": "Artistas del \u00e1lbum:", + "LabelArtistsHelp": "Separar m\u00faltiples empleando:", "LabelAlbum": "\u00c1lbum", - "LabelCommunityRating": "Calificaci\u00f3n de la comunidad:", "LabelVoteCount": "Cantidad de votos:", + "LabelCommunityRating": "Calificaci\u00f3n de la comunidad:", "LabelMetascore": "Metaescore:", "LabelCriticRating": "Calificaci\u00f3n de la cr\u00edtica:", "LabelCriticRatingSummary": "Res\u00famen de la calificaci\u00f3n de la cr\u00edtica:", "LabelAwardSummary": "Res\u00famen de premios:", "LabelWebsite": "Sitio web:", "LabelTagline": "Eslogan", - "LabelOverview": "Sinopsis:", "LabelShortOverview": "Sinopsis corta:", + "LabelOverview": "Sinopsis:", "LabelReleaseDate": "Fecha de estreno:", "LabelYear": "A\u00f1o:", "LabelPlaceOfBirth": "Lugar de nacimiento:", "LabelAirDays": "Se emite los d\u00edas:", "LabelAirTime": "Duraci\u00f3n:", - "LabelRuntimeMinutes": "Duraci\u00f3n (minutos):", "LabelParentalRating": "Clasificaci\u00f3n parental:", - "LabelCustomRating": "Calificaci\u00f3n personalizada:", - "LabelBudget": "Presupuesto", + "LabelRuntimeMinutes": "Duraci\u00f3n (minutos):", "LabelRevenue": "Ingresos ($):", - "LabelOriginalAspectRatio": "Relaci\u00f3n de aspecto original:", + "LabelBudget": "Presupuesto", + "LabelCustomRating": "Calificaci\u00f3n personalizada:", "LabelPlayers": "Reproductores:", + "LabelOriginalAspectRatio": "Relaci\u00f3n de aspecto original:", + "LabelAbsoluteEpisodeNumber": "N\u00famero de episodio absoluto:", "Label3DFormat": "Formato 3D:", "HeaderAlternateEpisodeNumbers": "N\u00fameros de Episodio Alternativos:", "LabelDvdSeasonNumber": "N\u00famero de temporada del DVD:", "LabelDvdEpisodeNumber": "N\u00famero de episodio de DVD:", - "LabelAbsoluteEpisodeNumber": "N\u00famero de episodio absoluto:", "HeaderSpecialEpisodeInfo": "Informaci\u00f3n del Episodio Especial", "LabelAirsBeforeSeason": "Transmisi\u00f3n antes de la temporada:", "LabelAirsAfterSeason": "Transmisi\u00f3n despu\u00e9s de la temporada:", @@ -201,172 +173,195 @@ "People": "Personas", "LabelMetadataDownloadLanguage": "Lenguaje preferido para descargas:", "LabelLockItemToPreventChanges": "Bloquear este \u00edtem para evitar cambios futuros", - "MessageLeaveEmptyToInherit": "Dejar vac\u00edo para heredar la configuraci\u00f3n del \u00edtem padre, o el valor global por omisi\u00f3n.", "LabelCountry": "Pa\u00eds:", + "MessageLeaveEmptyToInherit": "Dejar vac\u00edo para heredar la configuraci\u00f3n del \u00edtem padre, o el valor global por omisi\u00f3n.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "A\u00f1o de nacimiento:", "LabelBirthDate": "Fecha de Nacimiento:", - "LabelDeathDate": "Fecha de defunci\u00f3n:", "LabelEndDate": "Fecha de Fin:", + "LabelDeathDate": "Fecha de defunci\u00f3n:", "LabelSeasonNumber": "Temporada numero:", "LabelEpisodeNumber": "Episodio numero:", "LabelTrackNumber": "N\u00famero de Pista:", "LabelNumber": "N\u00famero:", "LabelDiscNumber": "N\u00famero de disco:", - "LabelParentNumber": "N\u00famero antecesor:", "SortName": "Nombre para ordenar", + "LabelParentNumber": "N\u00famero antecesor:", "ReleaseDate": "Fecha de estreno", "Continuing": "Continuando", - "Ended": "Finalizado", "HeaderEnabledFields": "Campos Habilitados", + "Ended": "Finalizado", + "Keywords": "Palabras clave", "HeaderEnabledFieldsHelp": "Desmarcar un campo para bloquearlo y prevenir que sus datos cambien.", + "Name": "Nombre", "Backdrops": "Im\u00e1genes de fondo", "Images": "Im\u00e1genes", - "Keywords": "Palabras clave", "Runtime": "Duraci\u00f3n", - "ProductionLocations": "Lugares de produccion", + "Actor": "Actor", "BirthLocation": "Lugar de nacimiento", + "ProductionLocations": "Lugares de produccion", "ParentalRating": "Clasificaci\u00f3n Parental", - "Name": "Nombre", "Overview": "Sinopsis", "LabelType": "Tipo:", "LabelPersonRole": "Rol:", "LabelPersonRoleHelp": "Ejemplo: Conductor de cami\u00f3n de helados", - "Actor": "Actor", "Composer": "Compositor", - "Director": "Director", "GuestStar": "Estrella invitada", + "Director": "Director", "Producer": "Productor", "Writer": "Escritor", - "MessageNoSyncJobsFound": "No se han encontrado trabajos de sincronizaci\u00f3n. Cree trabajos de sincronizaci\u00f3n empleando los botones de Sinc. en la app.", - "MessageNoDownloadsFound": "No hay elementos sin conexi\u00f3n. Haga sus medios disponibles mientras esta desconectado haciendo clic en Hacer Disponible sin Conexi\u00f3n a trav\u00e9s de la app.", - "InstallingPackage": "Instalando {0}", + "MessageItemSaved": "\u00cdtem guardado.", "PackageInstallCompleted": "{0} instalaci\u00f3n completada.", + "InstallingPackage": "Instalando {0}", "PackageInstallFailed": "{0} instalaci\u00f3n fallida.", "PackageInstallCancelled": "{0} instalaci\u00f3n cancelada.", "SeriesYearToPresent": "{0} - Actualidad", - "ValueOneItem": "1 \u00cdtem", "ValueOneSong": "1 canci\u00f3n", "ValueSongCount": "{0} canciones", "ValueOneMovie": "1 pel\u00edcula", "ValueMovieCount": "{0} pel\u00edculas", "ValueOneSeries": "1 serie", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episodio", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodios", "ValueOneGame": "1 juego", - "ValueGameCount": "{0} juegos", "ValueOneAlbum": "1 \u00e1lbum", - "ValueAlbumCount": "{0} \u00e1lbumes", + "ValueGameCount": "{0} juegos", "ValueOneMusicVideo": "1 video musical", + "ValueAlbumCount": "{0} \u00e1lbumes", "ValueMusicVideoCount": "{0} videos musicales", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Introduzca uno o m\u00e1s criterios de b\u00fasqueda. Elimine criterios para expandir los resultados.", "PleaseEnterNameOrId": "Por favor introduzca un nombre o id externo.", - "MessageItemSaved": "\u00cdtem guardado.", "SearchResults": "Resultados de la b\u00fasqueda", "SyncToOtherDevice": "Sincronizar a otro dispositivo", "MakeAvailableOffline": "Hacer disponible sin conexi\u00f3n", - "ServerNameIsRestarting": "El Servidor Emby - {0} se esta reiniciando.", + "ButtonRestart": "Reiniciar", "ServerNameIsShuttingDown": "El Servidor Emby - {0} se esta apagando.", + "PleaseRestartServerName": "Por favor reinicie el Servidor Emby - {0}.", + "ServerNameIsRestarting": "El Servidor Emby - {0} se esta reiniciando.", "HeaderDeleteItems": "Borrar items", "ConfirmDeleteItems": "Al borrar estos items ser\u00e1n eliminados tanto del sistema de archivos como de la librer\u00eda de medios. \u00bfEsta seguro que desea continuar?", - "PleaseRestartServerName": "Por favor reinicie el Servidor Emby - {0}.", "SyncJobCreated": "Trabajo de sincronizaci\u00f3n creado.", "LabelSyncTo": "Sincronizar con:", "LabelSyncJobName": "Nombre del trabajo de sinc:", - "LabelQuality": "Calidad:", "LabelSyncNoTargetsHelp": "Parece que actualmente no cuentas con ninguna app que soporte sinc.", - "DownloadScheduled": "Descarga programada", - "HeaderSyncRequiresSub": "Sinc requiere de una suscripci\u00f3n activa de Emby Premiere", + "LabelQuality": "Calidad:", "LearnMore": "Aprenda m\u00e1s", - "LabelProfile": "Perf\u00edl:", + "DownloadScheduled": "Descarga programada", "LabelBitrateMbps": "Tasa de bits (Mbps):", + "LabelProfile": "Perf\u00edl:", "SyncUnwatchedVideosOnly": "Sincronizar \u00fanicamente videos no vistos", - "SyncUnwatchedVideosOnlyHelp": "Solamente los videos a\u00fan no vistos ser\u00e1n sincronizados, se eliminar\u00e1n los videos del dispositivo conforme \u00e9stos sean vistos.", "AutomaticallySyncNewContent": "Sincronizar autom\u00e1ticamente nuevos contenidos", - "AutomaticallySyncNewContentHelp": "Los contenidos nuevos agregados a esta carpeta ser\u00e1n sincronizados autom\u00e1ticamente con el dispositivo.", - "LabelItemLimit": "L\u00edmite de \u00cdtems:", - "LabelItemLimitHelp": "Opcional. Establece un l\u00edmite en el n\u00famero de \u00edtems que ser\u00e1n sincronizados.", "PleaseSelectDeviceToSyncTo": "Por favor seleccione un dispositivo con el que desea sincronizar.", + "LabelItemLimit": "L\u00edmite de \u00cdtems:", + "SyncUnwatchedVideosOnlyHelp": "Solamente los videos a\u00fan no vistos ser\u00e1n sincronizados, se eliminar\u00e1n los videos del dispositivo conforme \u00e9stos sean vistos.", + "LabelItemLimitHelp": "Opcional. Establece un l\u00edmite en el n\u00famero de \u00edtems que ser\u00e1n sincronizados.", + "AutomaticallySyncNewContentHelp": "Los contenidos nuevos agregados a esta carpeta ser\u00e1n sincronizados autom\u00e1ticamente con el dispositivo.", + "Premiere": "Premier", + "Live": "En Vivo", + "Repeat": "Repetir", + "Settings": "Configuraci\u00f3n", + "DefaultErrorMessage": "Ha ocurrido un error al procesar la solicitud. Por favor int\u00e9ntelo de nuevo mas tarde.", "Screenshots": "Capturas de pantalla", "MoveRight": "Mover a la derecha", "MoveLeft": "Mover a la izquierda", "ConfirmDeleteImage": "\u00bfEliminar imagen?", "HeaderEditImages": "Editar im\u00e1genes", - "Settings": "Configuraci\u00f3n", "ShowIndicatorsFor": "Mostrar indicadores para:", "NewEpisodes": "Episodios nuevos", + "Premieres": "Estrenos", "HDPrograms": "Programas en HD", "LiveBroadcasts": "Transmisiones en vivo", - "Premieres": "Estrenos", "RepeatEpisodes": "Repetir episodios", "DvrSubscriptionRequired": "Emby DVR necesita una suscripci\u00f3n activa de Emby Premiere.", "HeaderCancelRecording": "Cancelar Grabaci\u00f3n", - "CancelRecording": "Cancelar grabaci\u00f3n", - "HeaderKeepRecording": "Conservar Grabaciones", - "HeaderCancelSeries": "Cancelar Serie", - "HeaderKeepSeries": "Conservar Serie", + "PromoConvertRecordingsToStreamingFormat": "Convertir autom\u00e1ticamente grabaciones a un formato amigable para transmitir con Emby Premiere. Las grabaciones ser\u00e1n convertidos en tiempo real a MP4 o MKV, basado en las configuraciones del servidor Emby.", + "HeaderConvertYourRecordings": "Convertir Sus Grabaciones", "HeaderLearnMore": "Aprenda m\u00e1s", + "HeaderKeepRecording": "Conservar Grabaciones", "DeleteMedia": "Eliminar medios", "SeriesSettings": "Configuraci\u00f3n de la Serie", "HeaderRecordingOptions": "Opciones de Grabaci\u00f3n", - "CancelSeries": "Cancelar serie", "DoNotRecord": "No grabar", - "HeaderSeriesOptions": "Opciones de Serie", + "CancelSeries": "Cancelar serie", "LabelChannels": "Canales:", + "HeaderSeriesOptions": "Opciones de Serie", "ChannelNameOnly": "Canal {0} solamente", "Anytime": "En cualquier momento", "AroundTime": "Alrededor de {0}", "LabelAirtime": "Duraci\u00f3n:", - "AllChannels": "Todos los canales", "LabelRecord": "Grabar:", + "AllChannels": "Todos los canales", "NewEpisodesOnly": "Solo episodios nuevos", "AllEpisodes": "Todos los episodios", "LabelStartWhenPossible": "Iniciar cuando sea posible:", "LabelStopWhenPossible": "Detener cuando sea posible:", "MinutesBefore": "Minutos antes", - "MinutesAfter": "minutos despues", - "SkipEpisodesAlreadyInMyLibrary": "No grabar episodios que ya se encuentran en mi biblioteca", "SkipEpisodesAlreadyInMyLibraryHelp": "Los episodios ser\u00e1n comparados usando el numero de temporada y de episodio, cuando est\u00e9n disponibles.", + "SkipEpisodesAlreadyInMyLibrary": "No grabar episodios que ya se encuentran en mi biblioteca", + "MinutesAfter": "minutos despues", "LabelKeepUpTo": "Mantener hasta:", "AsManyAsPossible": "Tantos como sea posible", - "DefaultErrorMessage": "Ha ocurrido un error al procesar la solicitud. Por favor int\u00e9ntelo de nuevo mas tarde.", - "LabelKeep:": "Mantener:", "UntilIDelete": "Hasta que yo lo borre", + "LabelKeep:": "Mantener:", "UntilSpaceNeeded": "Hasta que se necesite espacio", - "Categories": "Categor\u00edas", "Sports": "Deportes", + "Categories": "Categor\u00edas", "News": "Noticias", "Movies": "Pel\u00edculas", "Kids": "Ni\u00f1os", "EnableColorCodedBackgrounds": "Habilitar fondos con c\u00f3digo de color", "SortChannelsBy": "Ordenar canales por:", - "RecentlyWatched": "Visto recientemente", "ChannelNumber": "Numero de canal", + "RecentlyWatched": "Visto recientemente", + "PlaceFavoriteChannelsAtBeginning": "Colocar canales favoritos al inicio", + "SeriesCancelled": "Serie cancelada.", + "HeaderKeepSeries": "Conservar Serie", + "HeaderCancelSeries": "Cancelar Serie", + "CancelRecording": "Cancelar grabaci\u00f3n", + "MessageUnlockAppWithSupporter": "Desbloquee esta caracter\u00edstica con una suscripci\u00f3n activa de Emby Premier.", + "MessageUnlockAppWithPurchaseOrSupporter": "Desbloquee esta caracter\u00edstica con una peque\u00f1a compra \u00fanica, o con una suscripci\u00f3n activa de Emby Premier.", + "MessageToValidateSupporter": "Si tiene una subscripci\u00f3n de Emby Premiere activa, aseg\u00farese de que ha configurado Emby Premiere en el Panel de Control del Servidor Emby, al cual puede acceder dando click en Emby Premiere dentro del men\u00fa principal.", + "HeaderCinemaMode": "Modo Cine", + "HeaderCloudSync": "Sinc. en la Nube", + "HeaderOfflineDownloads": "Medios sin conexion", + "HeaderOfflineDownloadsDescription": "Descargue sus medios en su dispositivo para f\u00e1cil uso mientras esta desconectado.", + "CloudSyncFeatureDescription": "Sincronice sus medios a la nube para un f\u00e1cil respaldo, archivo y conversi\u00f3n.", + "CoverArtFeatureDescription": "Cover Art crea divertidas caratulas y da otros tratamientos para ayudar a personalizar las im\u00e1genes de sus medios.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "El Modo Cine le da una verdadera experiencia de cine con trailers e intros personalizados antes de la funci\u00f3n.", + "HeaderFreeApps": "Aplicaciones Emby Gratuitas", + "FreeAppsFeatureDescription": "Disfrute acceso gratuito para elegir aplicaciones Emby para sus dispositivos.", + "LabelEmailAddress": "Direcci\u00f3n de correo:", "HeaderBenefitsEmbyPremiere": "Beneficios de Emby Premier", "ThankYouForTryingEnjoyOneMinute": "Por favor disfrute de un minuto de reproducci\u00f3n. Gracias por probar Emby.", "HeaderTryPlayback": "Intente Reproducir", + "IPurchasedThisApp": "Ya he comprado esta app", "HowDidYouPay": "\u00bfCual sera su forma de pago?", "IHaveEmbyPremiere": "Ya cuento con Emby Premiere", - "IPurchasedThisApp": "Ya he comprado esta app", "ButtonRestorePreviousPurchase": "Restaurar Compra", "ButtonUnlockWithPurchase": "Desbloquear con una Compra", "ButtonUnlockPrice": "Desbloquear {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premier Mensual {0}", - "HeaderAlreadyPaid": "\u00bfYa ha pagado?", "ButtonPlayOneMinute": "Reproducir un minuto", - "PlaceFavoriteChannelsAtBeginning": "Colocar canales favoritos al inicio", "HeaderUnlockFeature": "Desbloquear Caracter\u00edstica", "MessageDidYouKnowCinemaMode": "\u00bfSab\u00eda que con Emby Premier, puede mejorar su experiencia con caracter\u00edsticas como Modo Cine?", "MessageDidYouKnowCinemaMode2": "El Modo Cine le da una verdadera experiencia de cine con trailers e intros personalizados antes de la presentaci\u00f3n estelar.", - "HeaderPlayMyMedia": "Reproducir mis Medios", "HeaderDiscoverEmbyPremiere": "Descubra Emby Premier", - "Items": "\u00cdtems", + "HeaderPlayMyMedia": "Reproducir mis Medios", "OneChannel": "Un canal", - "ConfirmRemoveDownload": "\u00bfEliminar descarga?", - "RemoveDownload": "Eliminar descarga", + "EmbyPremiereMonthlyWithPrice": "Emby Premier Mensual {0}", + "HeaderAlreadyPaid": "\u00bfYa ha pagado?", "AddedOnValue": "Agregado {0}", + "ConfirmRemoveDownload": "\u00bfEliminar descarga?", + "CancelSyncJobConfirmation": "Cancelando el trabajo de sincronizaci\u00f3n eliminara los medios sincronizados del dispositivo durante el pr\u00f3ximo proceso de sincronizaci\u00f3n. \u00bfEsta seguro de que desea continuar?", + "ButtonCancelSyncJob": "Cancelar sinc.", + "MessageNoSyncJobsFound": "No se han encontrado trabajos de sincronizaci\u00f3n. Cree trabajos de sincronizaci\u00f3n empleando los botones de Sinc. en la app.", + "MessageNoDownloadsFound": "No hay elementos sin conexi\u00f3n. Haga sus medios disponibles mientras esta desconectado haciendo clic en Hacer Disponible sin Conexi\u00f3n a trav\u00e9s de la app.", + "ValueOneItem": "1 \u00cdtem", + "HeaderSyncRequiresSub": "Sinc requiere de una suscripci\u00f3n activa de Emby Premiere", + "Items": "\u00cdtems", + "RemoveDownload": "Eliminar descarga", "RemovingFromDevice": "Eliminando del dispositivo", "RemoveFromDevice": "Eliminar del dispositivo", "KeepOnDevice": "Conservar en el dispositivo", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Listo para Transferir", "SyncJobItemStatusSyncedMarkForRemoval": "Eliminando del dispositivo", "SyncJobItemStatusQueued": "En cola", - "SyncJobItemStatusConverting": "Convirtiendo", "SyncJobItemStatusTransferring": "Transfiriendo", - "SyncJobItemStatusSynced": "Descargado", - "SyncJobItemStatusFailed": "Fall\u00f3", + "SyncJobItemStatusConverting": "Convirtiendo", "SyncJobItemStatusRemovedFromDevice": "Eliminado del dispositivo", "SyncJobItemStatusCancelled": "Cancelado", + "SyncJobItemStatusSynced": "Descargado", + "SyncJobItemStatusFailed": "Fall\u00f3", "Retry": "Volver a intentar", "HeaderMyDevice": "Mi Dispositivo", + "ContinueInSecondsValue": "Continua en {0} segundos.", "Continue": "Continuar", - "ContinueInSecondsValue": "Continua en {0} segundos." + "AddToPlayQueue": "Agregar a la cola de reproduccion", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es.json index 8544f37ef2..6939839a3f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Compartir", - "Add": "A\u00f1adir", - "ServerUpdateNeeded": "El servidor necesita actualizarse. Para descargar la \u00faltima versi\u00f3n visita {0}", - "LiveTvGuideRequiresUnlock": "La gu\u00eda de la TV en directo est\u00e1 limitada a {0} canales. Haz clic en el bot\u00f3n de desbloquear para ver como disfrutar de la experiencia completa.", + "OptionTuesdayShort": "Mar", + "OptionMondayShort": "Lun", "AttributeNew": "Nuevo", - "Premiere": "Premiere", - "Live": "Directo", - "Repeat": "Repetir", + "ServerUpdateNeeded": "El servidor necesita actualizarse. Para descargar la \u00faltima versi\u00f3n visita {0}", + "Share": "Compartir", + "OptionSundayShort": "Dom", + "OptionThursdayShort": "Jue", + "OptionSaturdayShort": "S\u00e1b", + "OptionWednesdayShort": "Mie", + "OptionFridayShort": "Vie", + "HeaderSelectDate": "Seleccionar Fecha", "TrackCount": "{0} tracks", "ItemCount": "\u00edtems {0}", - "ReleaseYearValue": "A\u00f1o de estreno: {0}", "OriginalAirDateValue": "Fecha de emisi\u00f3n original: {0}", + "ReleaseYearValue": "A\u00f1o de estreno: {0}", "EndsAtValue": "Termina a las {0}", - "OptionSundayShort": "Dom", - "OptionMondayShort": "Lun", - "OptionTuesdayShort": "Mar", - "OptionWednesdayShort": "Mie", - "OptionThursdayShort": "Jue", - "OptionFridayShort": "Vie", - "OptionSaturdayShort": "S\u00e1b", - "HeaderSelectDate": "Seleccionar Fecha", - "ButtonOk": "Ok", "ButtonCancel": "Cancelar", + "ButtonOk": "Ok", "ButtonGotIt": "Lo tengo", - "ButtonRestart": "Reiniciar", - "RecordingCancelled": "Grabaci\u00f3n cancelada.", - "SeriesCancelled": "Series cancelada.", + "LiveTvGuideRequiresUnlock": "La gu\u00eda de la TV en directo est\u00e1 limitada a {0} canales. Haz clic en el bot\u00f3n de desbloquear para ver como disfrutar de la experiencia completa.", "RecordingScheduled": "Grabaci\u00f3n programada.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "Nueva grabaci\u00f3n", "Sunday": "Domingo", "Monday": "Lunes", "Tuesday": "Martes", "Wednesday": "Mi\u00e9rcoles", "Thursday": "Jueves", - "Friday": "Viernes", "Saturday": "S\u00e1bado", "Days": "D\u00edas", + "Friday": "Viernes", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Consigue Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Se necesita una suscripci\u00f3n a Emby Premiere para poder crear grabaciones autom\u00e1ticas.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Esta caracter\u00edstica necesita una suscripci\u00f3n a Emby Premiere.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Grabar", + "Advanced": "Avanzado", + "Download": "Descargar", + "Refresh": "Refrescar", + "RefreshQueued": "Refresh queued.", "Save": "Grabar", "Edit": "Editar", - "Download": "Descargar", - "Advanced": "Avanzado", "Delete": "Borrar", "HeaderDeleteItem": "Borrar elemento", "ConfirmDeleteItem": "Al borrar este \u00edtem se borrar\u00e1 del sistema de archivos y de la biblioteca. \u00bfQuieres continuar?", - "Refresh": "Refrescar", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "A\u00f1adir a la colecci\u00f3n", - "HeaderAddToCollection": "Agregar a la colecci\u00f3n", "NewCollection": "Nueva colecci\u00f3n", + "AddToCollection": "A\u00f1adir a la colecci\u00f3n", "LabelCollection": "Collection:", "Help": "Ayuda", + "LabelName": "Nombre:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Buscar en internet ilustraciones y metadatos", - "LabelName": "Nombre:", "NewCollectionNameExample": "Ejemplo: Colecci\u00f3n de Star Wars", - "MessageItemsAdded": "Items added.", "OptionNew": "Nuevo...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Lista:", "AddToPlaylist": "A\u00f1adir a la lista de reproducci\u00f3n", - "HeaderAddToPlaylist": "A\u00f1adir a la lista", + "RecordingCancelled": "Grabaci\u00f3n cancelada.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "B\u00fasqueda de Subt\u00edtulos", "LabelLanguage": "Idioma:", "Search": "Buscar", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Editar subt\u00edtulos", + "SearchForSubtitles": "B\u00fasqueda de Subt\u00edtulos", "UnlockGuide": "Gu\u00eda de desbloqueo", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Reemplazar im\u00e1genes existentes", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No se han encontrado \u00edtems", "HeaderSaySomethingLike": "Di algo como...", - "ButtonTryAgain": "Int\u00e9ntalo de nuevo", "HeaderYouSaid": "Dijiste...", - "MessageWeDidntRecognizeCommand": "Lo sentimos, no reconocemos ese comando.", "MessageIfYouBlockedVoice": "Si has denegado el acceso a la voz a la aplicaci\u00f3n tendr\u00e1s que reconfigurarlo antes de intentarlo de nuevo.", + "ButtonTryAgain": "Int\u00e9ntalo de nuevo", + "MessageWeDidntRecognizeCommand": "Lo sentimos, no reconocemos ese comando.", "ValueDiscNumber": "Disco {0}", - "Unrated": "Sin clasificar", "Favorite": "Favorito", + "Unrated": "Sin clasificar", "Like": "Me gusta", "Dislike": "No me gusta", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Abrir", - "Play": "Reproducir", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Mezclar", - "Identify": "Identificar", - "EditImages": "Editar im\u00e1genes", - "EditInfo": "Editar info", - "Sync": "Sincronizar", - "InstantMix": "Mix instant\u00e1neo", "ViewAlbum": "Ver album", "ViewArtist": "Ver artista", + "Play": "Reproducir", + "Shuffle": "Mezclar", + "InstantMix": "Mix instant\u00e1neo", "QueueAllFromHere": "En cola todos desde aqu\u00ed", "PlayAllFromHere": "Reproducir todos desde aqu\u00ed", + "Identify": "Identificar", + "EditImages": "Editar im\u00e1genes", + "Sync": "Sincronizar", + "EditInfo": "Editar info", + "RemoveFromPlaylist": "Quitar de la lista", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Quitar de la lista", - "RemoveFromCollection": "Remove from collection", "Trailer": "Tr\u00e1iler", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Seleccione al menos dos elementos.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirmar la cancelaci\u00f3n de la grabaci\u00f3n", "MessageConfirmRecordingCancellation": "\u00bfEst\u00e1 seguro que desea cancelar esta grabaci\u00f3n?", - "Error": "Error", + "HeaderAddToCollection": "Agregar a la colecci\u00f3n", + "HeaderAddToPlaylist": "A\u00f1adir a la lista", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Tipo de contenido:", + "Add": "A\u00f1adir", "LabelPath": "Ruta:", + "LabelContentType": "Tipo de contenido:", "LabelTitle": "T\u00edtulo", "LabelOriginalTitle": "T\u00edtulo original", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configura como la fecha a\u00f1adida se determina en el Panel de Control del servidor Emby en los ajustes de la biblioteca.", "LabelStatus": "Estado:", "LabelArtists": "Artistas:", - "LabelArtistsHelp": "Separar multiples usando ;", "LabelAlbumArtists": "Artistas de los \u00e1lbumes", + "LabelArtistsHelp": "Separar multiples usando ;", "LabelAlbum": "\u00c1lbum", - "LabelCommunityRating": "Puntuaci\u00f3n de la comunidad", "LabelVoteCount": "Contador de votos:", + "LabelCommunityRating": "Puntuaci\u00f3n de la comunidad", "LabelMetascore": "Metapuntuaci\u00f3n:", "LabelCriticRating": "Valoraci\u00f3n de la cr\u00edtica:", "LabelCriticRatingSummary": "Resumen de la valoraci\u00f3n de la cr\u00edtica:", "LabelAwardSummary": "Resumen de premios:", "LabelWebsite": "Sitio web:", "LabelTagline": "Lema:", - "LabelOverview": "Resumen:", "LabelShortOverview": "Resumen corto:", + "LabelOverview": "Resumen:", "LabelReleaseDate": "Fecha de lanzamiento:", "LabelYear": "A\u00f1o:", "LabelPlaceOfBirth": "Lugar de nacimiento:", "LabelAirDays": "D\u00edas de emisi\u00f3n:", "LabelAirTime": "Tiempo de emisi\u00f3n:", - "LabelRuntimeMinutes": "Tiempo e ejecuci\u00f3n (minutos):", "LabelParentalRating": "Clasificaci\u00f3n parental:", - "LabelCustomRating": "Valoraci\u00f3n pesonalizada:", - "LabelBudget": "Prespuesto", + "LabelRuntimeMinutes": "Tiempo e ejecuci\u00f3n (minutos):", "LabelRevenue": "ingresos ($):", - "LabelOriginalAspectRatio": "Relaci\u00f3n de aspecto original:", + "LabelBudget": "Prespuesto", + "LabelCustomRating": "Valoraci\u00f3n pesonalizada:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Relaci\u00f3n de aspecto original:", + "LabelAbsoluteEpisodeNumber": "N\u00famero absoluto de episodio:", "Label3DFormat": "Formato 3D:", "HeaderAlternateEpisodeNumbers": "Alternar el n\u00famero de episodios", "LabelDvdSeasonNumber": "Temporada DVD n\u00famero:", "LabelDvdEpisodeNumber": "Episodio DVD n\u00famero:", - "LabelAbsoluteEpisodeNumber": "N\u00famero absoluto de episodio:", "HeaderSpecialEpisodeInfo": "Informaci\u00f3n del episodio especial", "LabelAirsBeforeSeason": "Se emite antes de la temporada:", "LabelAirsAfterSeason": "Se emite despu\u00e9s de la temporada:", @@ -201,172 +173,195 @@ "People": "Gente", "LabelMetadataDownloadLanguage": "Idioma preferido visualizado", "LabelLockItemToPreventChanges": "Bloquear este \u00edtem para evitar futuros cambios", - "MessageLeaveEmptyToInherit": "Dejar en blanco para heredar la configuraci\u00f3n de un elemento principal, o el valor predeterminado global.", "LabelCountry": "Pa\u00eds:", + "MessageLeaveEmptyToInherit": "Dejar en blanco para heredar la configuraci\u00f3n de un elemento principal, o el valor predeterminado global.", "LabelDynamicExternalId": "{0} id:", "LabelBirthYear": "A\u00f1o de nacimiento:", "LabelBirthDate": "Fecha de nacimiento:", - "LabelDeathDate": "Fecha de muerte:", "LabelEndDate": "Fecha de fin:", + "LabelDeathDate": "Fecha de muerte:", "LabelSeasonNumber": "Temporada n\u00famero:", "LabelEpisodeNumber": "Episodio n\u00famero:", "LabelTrackNumber": "N\u00famero de pista:", "LabelNumber": "N\u00famero:", "LabelDiscNumber": "N\u00famero de disco", - "LabelParentNumber": "N\u00famero de los padres", "SortName": "Ordenar por nombre", + "LabelParentNumber": "N\u00famero de los padres", "ReleaseDate": "Fecha de lanzamiento", "Continuing": "Continuando", - "Ended": "Finalizado", "HeaderEnabledFields": "Campos activados", + "Ended": "Finalizado", + "Keywords": "Palabras clave", "HeaderEnabledFieldsHelp": "Desmarca un campo para bloquearlo y evitar que se cambie su contenido.", + "Name": "Nombre", "Backdrops": "Im\u00e1genes de fondo", "Images": "Im\u00e1genes", - "Keywords": "Palabras clave", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Nombre", "Overview": "Overview", "LabelType": "Tipo:", "LabelPersonRole": "Rol:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Compositor", - "Director": "Director", "GuestStar": "Estrella invitada", + "Director": "Director", "Producer": "Productor", "Writer": "Escritor", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Instalando {0}", + "MessageItemSaved": "Elemento grabado.", "PackageInstallCompleted": "{0} instalaci\u00f3n completada.", + "InstallingPackage": "Instalando {0}", "PackageInstallFailed": "{0} instalaci\u00f3n fallida.", "PackageInstallCancelled": "{0} instalaci\u00f3n cancelada.", "SeriesYearToPresent": "{0}-Presente", - "ValueOneItem": "1 item", "ValueOneSong": "1 canci\u00f3n", "ValueSongCount": "{0} canciones", "ValueOneMovie": "1 pel\u00edcula", "ValueMovieCount": "{0} pel\u00edculas", "ValueOneSeries": "1 serie", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episodio", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodios", "ValueOneGame": "1 juego", - "ValueGameCount": "{0} juegos", "ValueOneAlbum": "1 \u00e1lbum", - "ValueAlbumCount": "{0} \u00e1lbumes", + "ValueGameCount": "{0} juegos", "ValueOneMusicVideo": "1 v\u00eddeo musical", + "ValueAlbumCount": "{0} \u00e1lbumes", "ValueMusicVideoCount": "{0} v\u00eddeos musicales", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Asigna uno o m\u00e1s criterios de b\u00fasqueda. Quita criterios para aumentar el n\u00famero de resultados de b\u00fasqueda", "PleaseEnterNameOrId": "Introduzca un nombre o un identificador externo.", - "MessageItemSaved": "Elemento grabado.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Reiniciar", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Borrar \u00edtems", "ConfirmDeleteItems": "Al borrar este \u00edtem se borrar\u00e1 del sistema de archivos y de la biblioteca. \u00bfQuieres continuar?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Trabajo de sincronizaci\u00f3n creado.", "LabelSyncTo": "Sincronizar en:", "LabelSyncJobName": "Nombre del trabajo de sincronizaci\u00f3n:", - "LabelQuality": "Calidad:", "LabelSyncNoTargetsHelp": "Parece que no tienes aplicaciones que soporten la sincronizaci\u00f3n.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Calidad:", "LearnMore": "Aprende m\u00e1s", - "LabelProfile": "Perfil:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Tasa de bits (Mbps):", + "LabelProfile": "Perfil:", "SyncUnwatchedVideosOnly": "Sincronizar los v\u00eddeos no vistos s\u00f3lo", - "SyncUnwatchedVideosOnlyHelp": "S\u00f3lo se sincronizar\u00e1n los v\u00eddeos no vistos, conforme los vayas viendo se eliminar\u00e1n del dispositivo.", "AutomaticallySyncNewContent": "Sincronizar autom\u00e1ticamente contenido nuevo", - "AutomaticallySyncNewContentHelp": "El contenido nuevo a\u00f1adido se sincronizar\u00e1 autom\u00e1ticamente en el dispositivo.", - "LabelItemLimit": "L\u00edmite de \u00edtems:", - "LabelItemLimitHelp": "Opcional. Pon un l\u00edmite de cantidad de \u00edtems que se sincronizar\u00e1n.", "PleaseSelectDeviceToSyncTo": "Por favor selecciona el dispositivo donde quieres sincronizar.", + "LabelItemLimit": "L\u00edmite de \u00edtems:", + "SyncUnwatchedVideosOnlyHelp": "S\u00f3lo se sincronizar\u00e1n los v\u00eddeos no vistos, conforme los vayas viendo se eliminar\u00e1n del dispositivo.", + "LabelItemLimitHelp": "Opcional. Pon un l\u00edmite de cantidad de \u00edtems que se sincronizar\u00e1n.", + "AutomaticallySyncNewContentHelp": "El contenido nuevo a\u00f1adido se sincronizar\u00e1 autom\u00e1ticamente en el dispositivo.", + "Premiere": "Premiere", + "Live": "Directo", + "Repeat": "Repetir", + "Settings": "Ajustes", + "DefaultErrorMessage": "Ha habido un error procesando la solicitud. Por favor int\u00e9ntalo m\u00e1s tarde.", "Screenshots": "Capturas de pantalla", "MoveRight": "Mover derecha", "MoveLeft": "Mover izquierda", "ConfirmDeleteImage": "Borrar imagen", "HeaderEditImages": "Editar Im\u00e1genes", - "Settings": "Ajustes", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancelar Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "Ha habido un error procesando la solicitud. Por favor int\u00e9ntalo m\u00e1s tarde.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelada.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancelar Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Reproducir un minuto", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json index 673a42d546..80ec5a12b4 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Add", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "Lopeta", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", "Wednesday": "Wednesday", "Thursday": "Thursday", - "Friday": "Friday", "Saturday": "Saturday", "Days": "Days", + "Friday": "Friday", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "Tallenna", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "Name:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "Name:", "NewCollectionNameExample": "Example: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Kieli:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Content type:", + "Add": "Add", "LabelPath": "Path:", + "LabelContentType": "Content type:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Maa:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fr-ca.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fr-ca.json index 471c427e2e..b322fb989f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fr-ca.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fr-ca.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Add", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "Cancel", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", "Wednesday": "Wednesday", "Thursday": "Thursday", - "Friday": "Friday", "Saturday": "Saturday", "Days": "Days", + "Friday": "Friday", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "Save", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "Name:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "Name:", "NewCollectionNameExample": "Example: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Language:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Content type:", + "Add": "Add", "LabelPath": "Path:", + "LabelContentType": "Content type:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Country:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json index a02c870742..2e3c3a1b9f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "D\u00e9verrouillez cette fonctionnalit\u00e9 avec un petit achat en une fois, ou avec une souscription Emby Premiere.", - "MessageUnlockAppWithSupporter": "D\u00e9verrouillez cette fonctionnalit\u00e9 avec une souscription Emby Premiere.", - "MessageToValidateSupporter": "Si vous avez un abonnement Emby Premiere, veuillez-vous assurer que vous avez configur\u00e9 Emby Premiere dans votre menu de gestion Emby Server auquel vous pouvez acc\u00e9der en cliquant sur Emby Premiere dans le menu principal", "ValueSpecialEpisodeName": "Sp\u00e9cial - {0}", - "Share": "Partager", - "Add": "Ajouter", - "ServerUpdateNeeded": "Le serveur Emby doit \u00eatre mis \u00e0 jour. Pour t\u00e9l\u00e9charger la derni\u00e8re version, veuillez visiter {0}", - "LiveTvGuideRequiresUnlock": "Le Guide TV en direct est actuellement limit\u00e9 \u00e0 {0} cha\u00eenes. Cliquez sur le bouton d\u00e9verrouiller pour d\u00e9couvrir comment profiter de l'ensemble.", + "OptionTuesdayShort": "Mar", + "OptionMondayShort": "Lun", "AttributeNew": "Nouveau", - "Premiere": "Premiere", - "Live": "Direct", - "Repeat": "R\u00e9p\u00e9ter", + "ServerUpdateNeeded": "Le serveur Emby doit \u00eatre mis \u00e0 jour. Pour t\u00e9l\u00e9charger la derni\u00e8re version, veuillez visiter {0}", + "Share": "Partager", + "OptionSundayShort": "Dim", + "OptionThursdayShort": "Jeu", + "OptionSaturdayShort": "Sam", + "OptionWednesdayShort": "Mer", + "OptionFridayShort": "Ven", + "HeaderSelectDate": "S\u00e9lectionnez la date", "TrackCount": "{0} pistes", "ItemCount": "{0} \u00e9l\u00e9ments", - "ReleaseYearValue": "Ann\u00e9e de sortie: {0}", "OriginalAirDateValue": "Date de diffusion originale: {0}", + "ReleaseYearValue": "Ann\u00e9e de sortie: {0}", "EndsAtValue": "Se termine \u00e0 {0}", - "OptionSundayShort": "Dim", - "OptionMondayShort": "Lun", - "OptionTuesdayShort": "Mar", - "OptionWednesdayShort": "Mer", - "OptionThursdayShort": "Jeu", - "OptionFridayShort": "Ven", - "OptionSaturdayShort": "Sam", - "HeaderSelectDate": "S\u00e9lectionnez la date", - "ButtonOk": "OK", "ButtonCancel": "Annuler", + "ButtonOk": "OK", "ButtonGotIt": "Vu", - "ButtonRestart": "Red\u00e9marrer", - "RecordingCancelled": "Enregistrement annul\u00e9.", - "SeriesCancelled": "S\u00e9rie annul\u00e9e.", + "LiveTvGuideRequiresUnlock": "Le Guide TV en direct est actuellement limit\u00e9 \u00e0 {0} cha\u00eenes. Cliquez sur le bouton d\u00e9verrouiller pour d\u00e9couvrir comment profiter de l'ensemble.", "RecordingScheduled": "Enregistrement planifi\u00e9.", - "SeriesRecordingScheduled": "Enregistrement de la s\u00e9rie pr\u00e9vue.", "HeaderNewRecording": "Nouvel enregistrement", "Sunday": "Dimanche", "Monday": "Lundi", "Tuesday": "Mardi", "Wednesday": "Mercredi", "Thursday": "Jeudi", - "Friday": "Vendredi", "Saturday": "Samedi", "Days": "Jours", + "Friday": "Vendredi", "RecordSeries": "Enregistrer s\u00e9ries", - "HeaderCinemaMode": "Mode Cin\u00e9ma", - "HeaderCloudSync": "Synchronisation avec le cloud", - "HeaderOfflineDownloads": "Contenu multim\u00e9dia hors-ligne", - "HeaderOfflineDownloadsDescription": "T\u00e9l\u00e9chargez votre contenu multim\u00e9dia vers vos appareils pour une meilleure utilisation hors-ligne.", - "CloudSyncFeatureDescription": "Synchronisez votre contenu multim\u00e9dia vers le cloud pour le sauvegarder, l'archiver et le convertir plus facilement.", - "CoverArtFeatureDescription": "Pochette cr\u00e9\u00e9 des couvertures amusantes et d'autres fonctions pour vous aider \u00e0 personnaliser les pochettes de votre contenu multim\u00e9dia.", - "CoverArt": "Pochette", - "ButtonCancelSyncJob": "Annuler la synchronisation", - "CancelSyncJobConfirmation": "L'annulation d'une t\u00e2che de synchronisation provoquera la suppression des m\u00e9dias synchronis\u00e9s sur l'appareil lors la prochaine ex\u00e9cution de la synchronisation. \u00cates-vous s\u00fbr de vouloir continuer ?", - "CinemaModeFeatureDescription": "Le Mode Cin\u00e9ma vous donne une v\u00e9ritable exp\u00e9rience cin\u00e9matique avec des trailers et des intros personnalis\u00e9es avant la lecture du contenu.", - "HeaderFreeApps": "Apps Emby gratuites", - "FreeAppsFeatureDescription": "Profitez d'un acc\u00e8s gratuit \u00e0 certaines applications Emby pour vos appareils.", "HeaderBecomeProjectSupporter": "Obtenez Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Une souscription Emby Premiere active est n\u00e9cessaire pour cr\u00e9er des enregistrements automatiques de s\u00e9ries.", - "LabelEmailAddress": "Adresse mail:", - "PromoConvertRecordingsToStreamingFormat": "Convertissez automatiquement vos enregistrement en un format compatible streaming avec Emby Premiere. Les enregistrements seront convertis sur demande vers des formats MP4 ou MKV, selon les options du serveur Emby.", "FeatureRequiresEmbyPremiere": "Cette fonctionnalit\u00e9 requiert un compte Emby Premiere.", - "HeaderConvertYourRecordings": "Convertissez Vos Enregistrements", "Record": "Enregistrer", + "Advanced": "Avanc\u00e9", + "Download": "T\u00e9l\u00e9chargement", + "Refresh": "Actualiser", + "RefreshQueued": "Demande d'actualisation en file d'attente.", "Save": "Sauvegarder", "Edit": "Modifier", - "Download": "T\u00e9l\u00e9chargement", - "Advanced": "Avanc\u00e9", "Delete": "Supprimer", "HeaderDeleteItem": "Supprimer l'\u00e9l\u00e9ment", "ConfirmDeleteItem": "Supprimer cet \u00e9l\u00e9ment l'effacera \u00e0 la fois du syst\u00e8me de fichiers et de votre biblioth\u00e8que de medias. Etes-vous s\u00fbr de vouloir continuer ?", - "Refresh": "Actualiser", - "RefreshQueued": "Demande d'actualisation en file d'attente.", - "AddToCollection": "Ajouter \u00e0 la collection", - "HeaderAddToCollection": "Ajouter \u00e0 une collection", "NewCollection": "Nouvelle collection", + "AddToCollection": "Ajouter \u00e0 la collection", "LabelCollection": "Collection:", "Help": "Aide", + "LabelName": "Nom", "NewCollectionHelp": "Les Collections vous permettent de cr\u00e9er des groupes personnalis\u00e9s de films et autres contenus.", "SearchForCollectionInternetMetadata": "Rechercher sur Internet les images et m\u00e9tadonn\u00e9es", - "LabelName": "Nom", "NewCollectionNameExample": "Exemple: Collection Star Wars", - "MessageItemsAdded": " \u00c9l\u00e9ments ajout\u00e9s.", "OptionNew": "Nouveau...", + "MessageItemsAdded": " \u00c9l\u00e9ments ajout\u00e9s.", "LabelPlaylist": "Liste de lecture :", "AddToPlaylist": "Ajouter \u00e0 la liste de lecture", - "HeaderAddToPlaylist": "Ajouter \u00e0 la liste de lecture", + "RecordingCancelled": "Enregistrement annul\u00e9.", + "SeriesRecordingScheduled": "Enregistrement de la s\u00e9rie pr\u00e9vue.", "Subtitles": "Sous-titres", - "SearchForSubtitles": "Rechercher des sous-titres", "LabelLanguage": "Langue:", "Search": "Recherche", "NoSubtitleSearchResultsFound": "Aucun r\u00e9sultat trouv\u00e9.", @@ -99,54 +68,57 @@ "MySubtitles": "Mes Sous-titres", "MessageDownloadQueued": "T\u00e9l\u00e9charger en file d'attente.", "EditSubtitles": "Modifier les sous-titres", + "SearchForSubtitles": "Rechercher des sous-titres", "UnlockGuide": "D\u00e9verrouiller le Guide", "RefreshMetadata": "Actualiser les m\u00e9tadonn\u00e9es", "ReplaceExistingImages": "Remplacer les images existantes", "ReplaceAllMetadata": "Remplacer toutes les m\u00e9tadonn\u00e9es", "SearchForMissingMetadata": "Rechercher les m\u00e9tadonn\u00e9es manquantes", "LabelRefreshMode": "Mode de rafra\u00eechissement:", + "RefreshDialogHelp": "Les m\u00e9tadonn\u00e9es sont actualis\u00e9es en fonction des param\u00e8tres et des services internet qui sont activ\u00e9s dans le tableau de bord Emby Server.", "NoItemsFound": "Aucun \u00e9l\u00e9ment trouv\u00e9", "HeaderSaySomethingLike": "Dites quelque chose...", - "ButtonTryAgain": "Veuillez r\u00e9essayer", "HeaderYouSaid": "Vous avez dit...", - "MessageWeDidntRecognizeCommand": "D\u00e9sol\u00e9, cette commande n'a pas \u00e9t\u00e9 reconnue.", "MessageIfYouBlockedVoice": "Si vous avez supprim\u00e9 l'acc\u00e8s par commande vocale \u00e0 l'application, vous devrez reconfigurer avant de r\u00e9essayer.", + "ButtonTryAgain": "Veuillez r\u00e9essayer", + "MessageWeDidntRecognizeCommand": "D\u00e9sol\u00e9, cette commande n'a pas \u00e9t\u00e9 reconnue.", "ValueDiscNumber": "Disque {0}", - "Unrated": "Non not\u00e9", "Favorite": "Favoris", + "Unrated": "Non not\u00e9", "Like": "Aime bien", "Dislike": "N'aime pas", - "RefreshDialogHelp": "Les m\u00e9tadonn\u00e9es sont actualis\u00e9es en fonction des param\u00e8tres et des services internet qui sont activ\u00e9s dans le tableau de bord Emby Server.", "Open": "Ouvrir", - "Play": "Lire", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "M\u00e9langer", - "Identify": "Identifier", - "EditImages": "Modifier les images", - "EditInfo": "Modifier infos", - "Sync": "Sync", - "InstantMix": "Instantan\u00e9", "ViewAlbum": "Voir l'album", "ViewArtist": "Voir l'artiste", + "Play": "Lire", + "Shuffle": "M\u00e9langer", + "InstantMix": "Instantan\u00e9", "QueueAllFromHere": "Tout mette en file d'attente \u00e0 partir d'ici", "PlayAllFromHere": "Tout lire \u00e0 partir d'ici", + "Identify": "Identifier", + "EditImages": "Modifier les images", + "Sync": "Sync", + "EditInfo": "Modifier infos", + "RemoveFromPlaylist": "Supprimer de la liste de lecture", "PlayFromBeginning": "Lire depuis le d\u00e9but", "ResumeAt": "Reprendre \u00e0 {0}", - "RemoveFromPlaylist": "Supprimer de la liste de lecture", - "RemoveFromCollection": "Supprimer de la collection", "Trailer": "Bande-annonce", "MarkPlayed": "Marquer comme lu", "MarkUnplayed": "Marquer comme non lu", "GroupVersions": "Versions de groupe", "PleaseSelectTwoItems": "Veuillez s\u00e9lectionner au moins deux items.", + "Error": "Erreur", "TryMultiSelect": "Essayer la s\u00e9lection multiple", "TryMultiSelectMessage": "Pour modifier plusieurs \u00e9l\u00e9ments m\u00e9dias, il suffit de cliquer et maintenir le clic sur n'importe quel poster et de s\u00e9lectionner les \u00e9lements que vous voulez g\u00e9rer. Essayer le !", "HeaderConfirmRecordingCancellation": "Confirmer l'annulation de l'enregistrement.", "MessageConfirmRecordingCancellation": "\u00cates-vous s\u00fbr de vouloir annuler cet enregistrement?", - "Error": "Erreur", + "HeaderAddToCollection": "Ajouter \u00e0 une collection", + "HeaderAddToPlaylist": "Ajouter \u00e0 la liste de lecture", + "RemoveFromCollection": "Supprimer de la collection", "VoiceInput": "Entr\u00e9e vocale", - "LabelContentType": "Type de contenu :", + "Add": "Ajouter", "LabelPath": "Chemin", + "LabelContentType": "Type de contenu :", "LabelTitle": "Titre:", "LabelOriginalTitle": "Titre original:", "LabelSortTitle": "Trier par titre:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configurer la fa\u00e7on dont la date ajout\u00e9e est d\u00e9termin\u00e9e dans le tableau de bord Emby serveur dans les param\u00e8tres de la biblioth\u00e8que", "LabelStatus": "Statut:", "LabelArtists": "Artistes", - "LabelArtistsHelp": "S\u00e9parer les \u00e9l\u00e9ments par un point-virgule ;", "LabelAlbumArtists": "Artistes de l'album :", + "LabelArtistsHelp": "S\u00e9parer les \u00e9l\u00e9ments par un point-virgule ;", "LabelAlbum": "Album :", - "LabelCommunityRating": "Note de la communaut\u00e9", "LabelVoteCount": "Nombre de votes", + "LabelCommunityRating": "Note de la communaut\u00e9", "LabelMetascore": "Metascore", "LabelCriticRating": "Note des critiques", "LabelCriticRatingSummary": "R\u00e9sum\u00e9 des critiques", "LabelAwardSummary": "R\u00e9compenses", "LabelWebsite": "Site Web", "LabelTagline": "Slogan", - "LabelOverview": "Synopsis", "LabelShortOverview": "R\u00e9sum\u00e9", + "LabelOverview": "Synopsis", "LabelReleaseDate": "Date de sortie", "LabelYear": "Ann\u00e9e :", "LabelPlaceOfBirth": "Lieu de naissance :", "LabelAirDays": "Jours de diffusion", "LabelAirTime": "Heure de diffusion", - "LabelRuntimeMinutes": "Dur\u00e9e (minutes)", "LabelParentalRating": "Classification parentale", - "LabelCustomRating": "Classification personnalis\u00e9e", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Dur\u00e9e (minutes)", "LabelRevenue": "Box-office ($)", - "LabelOriginalAspectRatio": "Ratio d'aspect original", + "LabelBudget": "Budget", + "LabelCustomRating": "Classification personnalis\u00e9e", "LabelPlayers": "Lecteurs :", + "LabelOriginalAspectRatio": "Ratio d'aspect original", + "LabelAbsoluteEpisodeNumber": "Num\u00e9ro absolu d'\u00e9pisode:", "Label3DFormat": "Format 3D", "HeaderAlternateEpisodeNumbers": "Num\u00e9ros d'\u00e9pisode alternatif", "LabelDvdSeasonNumber": "Num\u00e9ro de saison DVD :", "LabelDvdEpisodeNumber": "Num\u00e9ro d'Episode DVD:", - "LabelAbsoluteEpisodeNumber": "Num\u00e9ro absolu d'\u00e9pisode:", "HeaderSpecialEpisodeInfo": "Information \u00e9pisode sp\u00e9cial", "LabelAirsBeforeSeason": "Diffusion avant la saison :", "LabelAirsAfterSeason": "Diffusion apr\u00e8s la saison :", @@ -201,172 +173,195 @@ "People": "Personnes", "LabelMetadataDownloadLanguage": "Langue de t\u00e9l\u00e9chargement pr\u00e9f\u00e9r\u00e9e:", "LabelLockItemToPreventChanges": "Verrouiller cet \u00e9l\u00e9ment pour \u00e9viter de futures modifications", - "MessageLeaveEmptyToInherit": "Laisser vide pour h\u00e9riter des r\u00e9glages de l'\u00e9l\u00e9ment parent, ou de la valeur globale par d\u00e9faut.", "LabelCountry": "Pays:", + "MessageLeaveEmptyToInherit": "Laisser vide pour h\u00e9riter des r\u00e9glages de l'\u00e9l\u00e9ment parent, ou de la valeur globale par d\u00e9faut.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Ann\u00e9e de naissance :", "LabelBirthDate": "Date de naissance :", - "LabelDeathDate": "Date de d\u00e9c\u00e8s :", "LabelEndDate": "Date de fin:", + "LabelDeathDate": "Date de d\u00e9c\u00e8s :", "LabelSeasonNumber": "Num\u00e9ro de la saison:", "LabelEpisodeNumber": "Num\u00e9ro de l'\u00e9pisode:", "LabelTrackNumber": "Num\u00e9ro de piste:", "LabelNumber": "Num\u00e9ro:", "LabelDiscNumber": "Num\u00e9ro de disque", - "LabelParentNumber": "Num\u00e9ro parent", "SortName": "Clef de tri", + "LabelParentNumber": "Num\u00e9ro parent", "ReleaseDate": "Date de diffusion", "Continuing": "En continuation", - "Ended": "Termin\u00e9", "HeaderEnabledFields": "Activer les champs", + "Ended": "Termin\u00e9", + "Keywords": "Mots-cl\u00e9s", "HeaderEnabledFieldsHelp": "D\u00e9cocher un champ pour le verrouiller et emp\u00eacher ainsi ses donn\u00e9es d'\u00eatre modifi\u00e9es.", + "Name": "Nom", "Backdrops": "Arri\u00e8re-plans", "Images": "Images", - "Keywords": "Mots-cl\u00e9s", "Runtime": "Dur\u00e9e", - "ProductionLocations": "Sites de production", + "Actor": "Acteur(trice)", "BirthLocation": "Lieu de naissance", + "ProductionLocations": "Sites de production", "ParentalRating": "Classification parentale", - "Name": "Nom", "Overview": "R\u00e9sum\u00e9", "LabelType": "Type :", "LabelPersonRole": "R\u00f4le:", "LabelPersonRoleHelp": "Exemple: Chauffeur de camion de cr\u00e8me glac\u00e9e", - "Actor": "Acteur(trice)", "Composer": "Compositeur:", - "Director": "R\u00e9alisateur:", "GuestStar": "Invit\u00e9s d'honneur", + "Director": "R\u00e9alisateur:", "Producer": "Producteur", "Writer": "Sc\u00e9nariste", - "MessageNoSyncJobsFound": "Aucune t\u00e2che de synchronisation trouv\u00e9e. Vous pouvez cr\u00e9er des t\u00e2ches de synchronisation gr\u00e2ce aux boutons Synchroniser pr\u00e9sents dans l'application.", - "MessageNoDownloadsFound": "Aucun t\u00e9l\u00e9chargement hors ligne. Afin que votre contenu multim\u00e9dia soit disponible m\u00eame quand vous \u00eates hors ligne, cliquez sur Activer la disponibilit\u00e9 hors ligne dans l'application.", - "InstallingPackage": "Installation de {0}", + "MessageItemSaved": "Item sauvegard\u00e9.", "PackageInstallCompleted": "L'installation de {0} est termin\u00e9e.", + "InstallingPackage": "Installation de {0}", "PackageInstallFailed": "L'installation de {0} a \u00e9chou\u00e9.", "PackageInstallCancelled": "L'installation de {0} a \u00e9t\u00e9 annul\u00e9e.", "SeriesYearToPresent": "{0} - Pr\u00e9sent", - "ValueOneItem": "1 El\u00e9ment", "ValueOneSong": "1 chanson", "ValueSongCount": "{0} chansons", "ValueOneMovie": "1 Film", "ValueMovieCount": "{0} films", "ValueOneSeries": "1 S\u00e9rie", - "ValueSeriesCount": "{0} s\u00e9ries", "ValueOneEpisode": "1 \u00e9pisode", + "ValueSeriesCount": "{0} s\u00e9ries", "ValueEpisodeCount": "{0} \u00e9pisodes", "ValueOneGame": "1 jeu", - "ValueGameCount": "{0} jeux", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} jeux", "ValueOneMusicVideo": "1 vid\u00e9o musicale", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music Videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Entrez un ou plusieurs crit\u00e8res de recherche. Retirez des crit\u00e8res pour \u00e9largir les r\u00e9sultats de la recherche.", "PleaseEnterNameOrId": "Veuillez saisir un nom ou un identifiant externe.", - "MessageItemSaved": "Item sauvegard\u00e9.", "SearchResults": "R\u00e9sultats de la recherche", "SyncToOtherDevice": "Sync vers un autre appareil", "MakeAvailableOffline": "Rendre disponible hors connexion", - "ServerNameIsRestarting": "Emby Server - {0} est red\u00e9marr\u00e9.", + "ButtonRestart": "Red\u00e9marrer", "ServerNameIsShuttingDown": "Emby Server - {0} est arr\u00eater.", + "PleaseRestartServerName": "S'il vous pla\u00eet red\u00e9marrer Emby server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} est red\u00e9marr\u00e9.", "HeaderDeleteItems": "Supprimer les \u00e9l\u00e9ments", "ConfirmDeleteItems": "Supprimer ces \u00e9l\u00e9ments l'effacera \u00e0 la fois du syst\u00e8me de fichiers et de votre biblioth\u00e8que de m\u00e9dias. \u00cates-vous s\u00fbr de vouloir continuer ?", - "PleaseRestartServerName": "S'il vous pla\u00eet red\u00e9marrer Emby server - {0}.", "SyncJobCreated": "Job de synchronisation cr\u00e9\u00e9.", "LabelSyncTo": "Synchronis\u00e9 avec:", "LabelSyncJobName": "Nom du job de synchronisation:", - "LabelQuality": "Qualit\u00e9:", "LabelSyncNoTargetsHelp": "Il semble que vous n'ayez actuellement aucune application qui supporte la synchronisation.", - "DownloadScheduled": "T\u00e9l\u00e9chargement planifi\u00e9e", - "HeaderSyncRequiresSub": "La synchronisation entre vos appareils n\u00e9cessite un abonnement Emby Premiere.", + "LabelQuality": "Qualit\u00e9:", "LearnMore": "En savoir plus", - "LabelProfile": "Profil :", + "DownloadScheduled": "T\u00e9l\u00e9chargement planifi\u00e9e", "LabelBitrateMbps": "D\u00e9bit (Mbps) :", + "LabelProfile": "Profil :", "SyncUnwatchedVideosOnly": "Synchroniser seulement les vid\u00e9os non lues.", - "SyncUnwatchedVideosOnlyHelp": "Seulement les vid\u00e9os non lus seront synchronis\u00e9es et seront supprim\u00e9es du p\u00e9riph\u00e9rique au fur et \u00e0 mesure qu'elles sont lus.", "AutomaticallySyncNewContent": "Synchroniser automatiquement le nouveau contenu", - "AutomaticallySyncNewContentHelp": "Les nouveaux contenus ajout\u00e9s \u00e0 cette cat\u00e9gorie seront automatiquement synchronis\u00e9s avec l'appareil.", - "LabelItemLimit": "Maximum d'\u00e9l\u00e9ments :", - "LabelItemLimitHelp": "Optionnel : d\u00e9finit le nombre maximum d'\u00e9l\u00e9ments qui seront synchronis\u00e9s.", "PleaseSelectDeviceToSyncTo": "Veuillez s\u00e9lectionner un p\u00e9riph\u00e9rique avec lequel se synchroniser.", + "LabelItemLimit": "Maximum d'\u00e9l\u00e9ments :", + "SyncUnwatchedVideosOnlyHelp": "Seulement les vid\u00e9os non lus seront synchronis\u00e9es et seront supprim\u00e9es du p\u00e9riph\u00e9rique au fur et \u00e0 mesure qu'elles sont lus.", + "LabelItemLimitHelp": "Optionnel : d\u00e9finit le nombre maximum d'\u00e9l\u00e9ments qui seront synchronis\u00e9s.", + "AutomaticallySyncNewContentHelp": "Les nouveaux contenus ajout\u00e9s \u00e0 cette cat\u00e9gorie seront automatiquement synchronis\u00e9s avec l'appareil.", + "Premiere": "Premiere", + "Live": "Direct", + "Repeat": "R\u00e9p\u00e9ter", + "Settings": "Param\u00e8tres", + "DefaultErrorMessage": "Il y a eu une erreur lors de l'ex\u00e9cution de la requ\u00eate. Veuillez r\u00e9essayer plus tard.", "Screenshots": "Captures d'\u00e9cran", "MoveRight": "D\u00e9placer \u00e0 droite", "MoveLeft": "D\u00e9placer \u00e0 gauche", "ConfirmDeleteImage": "Supprimer l'image ?", "HeaderEditImages": "Modifier les images", - "Settings": "Param\u00e8tres", "ShowIndicatorsFor": "Montrer les indicateurs pour:", "NewEpisodes": "Nouveaux \u00e9pisodes", + "Premieres": "Premi\u00e8res", "HDPrograms": "Programmes HD", "LiveBroadcasts": "Diffusions en direct", - "Premieres": "Premi\u00e8res", "RepeatEpisodes": "R\u00e9p\u00e9ter les \u00e9pisodes", "DvrSubscriptionRequired": "Emby DVR n\u00e9cessite un abonnement \u00e0 Emby Premiere.", "HeaderCancelRecording": "Annuler l'enregistrement", - "CancelRecording": "Annuler l'enregistrement", - "HeaderKeepRecording": "Garder l'enregistrement", - "HeaderCancelSeries": "Annuler la s\u00e9rie", - "HeaderKeepSeries": "Garder la s\u00e9rie", + "PromoConvertRecordingsToStreamingFormat": "Convertissez automatiquement vos enregistrement en un format compatible streaming avec Emby Premiere. Les enregistrements seront convertis sur demande vers des formats MP4 ou MKV, selon les options du serveur Emby.", + "HeaderConvertYourRecordings": "Convertissez Vos Enregistrements", "HeaderLearnMore": "En savoir plus", + "HeaderKeepRecording": "Garder l'enregistrement", "DeleteMedia": "Effacer cet objet", "SeriesSettings": "Configuration de la s\u00e9rie", "HeaderRecordingOptions": "Options d'enregistrement", - "CancelSeries": "Annuler la s\u00e9rie", "DoNotRecord": "Ne pas enregistrer", - "HeaderSeriesOptions": "Options de la s\u00e9rie", + "CancelSeries": "Annuler la s\u00e9rie", "LabelChannels": "Cha\u00eenes:", + "HeaderSeriesOptions": "Options de la s\u00e9rie", "ChannelNameOnly": "Cha\u00eene {0} seulement", "Anytime": "N'importe quand", "AroundTime": "Vers {0}", "LabelAirtime": "Temps d'antenne:", - "AllChannels": "Toutes les cha\u00eenes", "LabelRecord": "Enregistrer:", + "AllChannels": "Toutes les cha\u00eenes", "NewEpisodesOnly": "Uniquement les nouveaux \u00e9pisodes", "AllEpisodes": "Tous les \u00e9pisodes", "LabelStartWhenPossible": "Commencer d\u00e8s que possible:", "LabelStopWhenPossible": "Arr\u00eater d\u00e8s que possible:", "MinutesBefore": "minutes avant", - "MinutesAfter": "minutes apr\u00e8s", - "SkipEpisodesAlreadyInMyLibrary": "Ne pas lire les \u00e9pisodes d\u00e9j\u00e0 pr\u00e9sents dans ma m\u00e9diath\u00e8que", "SkipEpisodesAlreadyInMyLibraryHelp": "Les \u00e9pisodes seront compar\u00e9s selon leurs saisons et num\u00e9ros d'\u00e9pisodes, si possible.", + "SkipEpisodesAlreadyInMyLibrary": "Ne pas lire les \u00e9pisodes d\u00e9j\u00e0 pr\u00e9sents dans ma m\u00e9diath\u00e8que", + "MinutesAfter": "minutes apr\u00e8s", "LabelKeepUpTo": "Garder jusqu'\u00e0:", "AsManyAsPossible": "Autant que possible", - "DefaultErrorMessage": "Il y a eu une erreur lors de l'ex\u00e9cution de la requ\u00eate. Veuillez r\u00e9essayer plus tard.", - "LabelKeep:": "Garder:", "UntilIDelete": "Jusqu'\u00e0 ce que je le supprime", + "LabelKeep:": "Garder:", "UntilSpaceNeeded": "Jusqu'\u00e0 ce que l'espace disque est n\u00e9cessaire", - "Categories": "Cat\u00e9gories", "Sports": "Sports", + "Categories": "Cat\u00e9gories", "News": "Actualit\u00e9s", "Movies": "Films", "Kids": "Enfants", "EnableColorCodedBackgrounds": "Activer les arri\u00e8res-plans \u00e0 code-couleur", "SortChannelsBy": "Trier les cha\u00eenes par:", - "RecentlyWatched": "Lus r\u00e9cemment", "ChannelNumber": "Num\u00e9ro de cha\u00eene", + "RecentlyWatched": "Lus r\u00e9cemment", + "PlaceFavoriteChannelsAtBeginning": "Mettre vos cha\u00eenes pr\u00e9f\u00e9r\u00e9es au d\u00e9but", + "SeriesCancelled": "S\u00e9rie annul\u00e9e.", + "HeaderKeepSeries": "Garder la s\u00e9rie", + "HeaderCancelSeries": "Annuler la s\u00e9rie", + "CancelRecording": "Annuler l'enregistrement", + "MessageUnlockAppWithSupporter": "D\u00e9verrouillez cette fonctionnalit\u00e9 avec une souscription Emby Premiere.", + "MessageUnlockAppWithPurchaseOrSupporter": "D\u00e9verrouillez cette fonctionnalit\u00e9 avec un petit achat en une fois, ou avec une souscription Emby Premiere.", + "MessageToValidateSupporter": "Si vous avez un abonnement Emby Premiere, veuillez-vous assurer que vous avez configur\u00e9 Emby Premiere dans votre menu de gestion Emby Server auquel vous pouvez acc\u00e9der en cliquant sur Emby Premiere dans le menu principal", + "HeaderCinemaMode": "Mode Cin\u00e9ma", + "HeaderCloudSync": "Synchronisation avec le cloud", + "HeaderOfflineDownloads": "Contenu multim\u00e9dia hors-ligne", + "HeaderOfflineDownloadsDescription": "T\u00e9l\u00e9chargez votre contenu multim\u00e9dia vers vos appareils pour une meilleure utilisation hors-ligne.", + "CloudSyncFeatureDescription": "Synchronisez votre contenu multim\u00e9dia vers le cloud pour le sauvegarder, l'archiver et le convertir plus facilement.", + "CoverArtFeatureDescription": "Pochette cr\u00e9\u00e9 des couvertures amusantes et d'autres fonctions pour vous aider \u00e0 personnaliser les pochettes de votre contenu multim\u00e9dia.", + "CoverArt": "Pochette", + "CinemaModeFeatureDescription": "Le Mode Cin\u00e9ma vous donne une v\u00e9ritable exp\u00e9rience cin\u00e9matique avec des trailers et des intros personnalis\u00e9es avant la lecture du contenu.", + "HeaderFreeApps": "Apps Emby gratuites", + "FreeAppsFeatureDescription": "Profitez d'un acc\u00e8s gratuit \u00e0 certaines applications Emby pour vos appareils.", + "LabelEmailAddress": "Adresse mail:", "HeaderBenefitsEmbyPremiere": "Avantages de Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Profitez d'une minute de lecture. Merci d'avoir essay\u00e9 Emby.", "HeaderTryPlayback": "Essayer la lecture", + "IPurchasedThisApp": "J'ai achet\u00e9 cette application", "HowDidYouPay": "Comment avez-vous pay\u00e9?", "IHaveEmbyPremiere": "J'ai Emby Premiere", - "IPurchasedThisApp": "J'ai achet\u00e9 cette application", "ButtonRestorePreviousPurchase": "Restaurer l'achat", "ButtonUnlockWithPurchase": "D\u00e9verrouillez par un achat.", "ButtonUnlockPrice": "D\u00e9verrouiller {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere {0} mensuel", - "HeaderAlreadyPaid": "Vous avez d\u00e9j\u00e0 pay\u00e9 ?", "ButtonPlayOneMinute": "Lire une minute", - "PlaceFavoriteChannelsAtBeginning": "Mettre vos cha\u00eenes pr\u00e9f\u00e9r\u00e9es au d\u00e9but", "HeaderUnlockFeature": "D\u00e9verrouiller la fonction", "MessageDidYouKnowCinemaMode": "Saviez-vous qu'avec Emby Premi\u00e8re, vous pouvez am\u00e9liorer votre exp\u00e9rience utilisateur gr\u00e2ce \u00e0 des fonctionnalit\u00e9s comme le Mode Cin\u00e9ma ?", "MessageDidYouKnowCinemaMode2": "Le mode Cin\u00e9ma vous apporte une vraie exp\u00e9rience utilisateur de cin\u00e9ma, avec les bandes-annonces et les intros personnalis\u00e9es avant le film principal.", - "HeaderPlayMyMedia": "Lire mon contenu", "HeaderDiscoverEmbyPremiere": "D\u00e9couvrez Emby Premiere", - "Items": "\u00c9l\u00e9ments", + "HeaderPlayMyMedia": "Lire mon contenu", "OneChannel": "Une cha\u00eene", - "ConfirmRemoveDownload": "Supprimer le t\u00e9l\u00e9chargement ?", - "RemoveDownload": "Supprimer le t\u00e9l\u00e9chargement", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere {0} mensuel", + "HeaderAlreadyPaid": "Vous avez d\u00e9j\u00e0 pay\u00e9 ?", "AddedOnValue": "Ajout\u00e9 {0}", + "ConfirmRemoveDownload": "Supprimer le t\u00e9l\u00e9chargement ?", + "CancelSyncJobConfirmation": "L'annulation d'une t\u00e2che de synchronisation provoquera la suppression des m\u00e9dias synchronis\u00e9s sur l'appareil lors la prochaine ex\u00e9cution de la synchronisation. \u00cates-vous s\u00fbr de vouloir continuer ?", + "ButtonCancelSyncJob": "Annuler la synchronisation", + "MessageNoSyncJobsFound": "Aucune t\u00e2che de synchronisation trouv\u00e9e. Vous pouvez cr\u00e9er des t\u00e2ches de synchronisation gr\u00e2ce aux boutons Synchroniser pr\u00e9sents dans l'application.", + "MessageNoDownloadsFound": "Aucun t\u00e9l\u00e9chargement hors ligne. Afin que votre contenu multim\u00e9dia soit disponible m\u00eame quand vous \u00eates hors ligne, cliquez sur Activer la disponibilit\u00e9 hors ligne dans l'application.", + "ValueOneItem": "1 El\u00e9ment", + "HeaderSyncRequiresSub": "La synchronisation entre vos appareils n\u00e9cessite un abonnement Emby Premiere.", + "Items": "\u00c9l\u00e9ments", + "RemoveDownload": "Supprimer le t\u00e9l\u00e9chargement", "RemovingFromDevice": "Supprim\u00e9 de l'appareil", "RemoveFromDevice": "Supprimer de l'appareil", "KeepOnDevice": "Garder sur l'appareil", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Pr\u00eat pour le transfert", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Mis en file d'attente", - "SyncJobItemStatusConverting": "Conversion en cours", "SyncJobItemStatusTransferring": "Transfert en cours", - "SyncJobItemStatusSynced": "T\u00e9l\u00e9charg\u00e9", - "SyncJobItemStatusFailed": "\u00c9chou\u00e9", + "SyncJobItemStatusConverting": "Conversion en cours", "SyncJobItemStatusRemovedFromDevice": "Supprim\u00e9 de l'appareil", "SyncJobItemStatusCancelled": "Annul\u00e9", + "SyncJobItemStatusSynced": "T\u00e9l\u00e9charg\u00e9", + "SyncJobItemStatusFailed": "\u00c9chou\u00e9", "Retry": "R\u00e9essayer", "HeaderMyDevice": "Mon appareil", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json b/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json index ac499b3c0e..c50f4d10de 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Add", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "Abbreche", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Sonntig", "Monday": "M\u00e4ntig", "Tuesday": "Tsischtig", "Wednesday": "Mittwoch", "Thursday": "Donnstig", - "Friday": "Friitig", "Saturday": "Samstig", "Days": "Days", + "Friday": "Friitig", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "Speichere", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "Name:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Dursuechs Internet nach Bilder und Metadate", - "LabelName": "Name:", "NewCollectionNameExample": "Biispell: Star Wars Sammlig", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Sproch:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Date Art:", + "Add": "Add", "LabelPath": "Path:", + "LabelContentType": "Date Art:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artist:", - "LabelArtistsHelp": "Trenn mehreri iistr\u00e4g dur es ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Trenn mehreri iistr\u00e4g dur es ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Land:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Fortlaufend", - "Ended": "Beendent", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Beendent", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/he.json b/dashboard-ui/bower_components/emby-webcomponents/strings/he.json index 11316047c6..7b27bff532 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/he.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/he.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "\u05d4\u05d5\u05e1\u05e3", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "\u05d1\u05d8\u05dc", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "\u05e8\u05d0\u05e9\u05d5\u05df", "Monday": "\u05e9\u05e0\u05d9", "Tuesday": "\u05e9\u05dc\u05d9\u05e9\u05d9", "Wednesday": "\u05e8\u05d1\u05d9\u05e2\u05d9", "Thursday": "\u05d7\u05de\u05d9\u05e9\u05d9", - "Friday": "\u05e9\u05d9\u05e9\u05d9", "Saturday": "\u05e9\u05d1\u05ea", "Days": "\u05d9\u05de\u05d9\u05dd", + "Friday": "\u05e9\u05d9\u05e9\u05d9", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "\u05d4\u05e7\u05dc\u05d8", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "\u05e9\u05de\u05d5\u05e8", "Edit": "\u05e2\u05e8\u05d5\u05da", - "Download": "Download", - "Advanced": "Advanced", "Delete": "\u05de\u05d7\u05e7", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "\u05d0\u05d5\u05e4\u05e1\u05d9\u05dd \u05d7\u05d3\u05e9\u05d9\u05dd", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "\u05e9\u05dd:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "\u05d7\u05e4\u05e9 \u05d1\u05d0\u05d9\u05e0\u05e8\u05e0\u05d8 \u05d0\u05d7\u05e8\u05d9 \u05de\u05d9\u05d3\u05e2 \u05d5\u05ea\u05de\u05d5\u05e0\u05d5\u05ea", - "LabelName": "\u05e9\u05dd:", "NewCollectionNameExample": "\u05dc\u05d3\u05d5\u05d2\u05de\u05d0 :\u05d0\u05d5\u05e1\u05e3 \u05de\u05dc\u05d7\u05de\u05ea \u05d4\u05db\u05d5\u05db\u05d1\u05d9\u05dd", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "\u05e9\u05e4\u05d4:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "\u05e2\u05e8\u05d5\u05da \u05db\u05ea\u05d5\u05d1\u05d9\u05d5\u05ea", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05e4\u05e8\u05d9\u05d8\u05d9\u05dd", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "\u05e0\u05d2\u05df", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "\u05e6\u05e4\u05d4 \u05d1\u05d0\u05dc\u05d1\u05d5\u05dd", "ViewArtist": "\u05e6\u05e4\u05d4 \u05d1\u05d0\u05de\u05df", + "Play": "\u05e0\u05d2\u05df", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "\u05e1\u05d5\u05d2 \u05d4\u05ea\u05d5\u05db\u05df", + "Add": "\u05d4\u05d5\u05e1\u05e3", "LabelPath": "Path:", + "LabelContentType": "\u05e1\u05d5\u05d2 \u05d4\u05ea\u05d5\u05db\u05df", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "\u05d0\u05de\u05df", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "\u05e9\u05e0\u05d4", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "\u05e9\u05e4\u05ea \u05d4\u05d5\u05e8\u05d3\u05d4 \u05de\u05d5\u05e2\u05d3\u05e4\u05ea:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "\u05de\u05d3\u05d9\u05e0\u05d4:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "\u05de\u05de\u05e9\u05d9\u05da", - "Ended": "\u05d4\u05e1\u05ea\u05d9\u05d9\u05dd", "HeaderEnabledFields": "Enabled Fields", + "Ended": "\u05d4\u05e1\u05ea\u05d9\u05d9\u05dd", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "\u05e1\u05d5\u05d2", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json index c66dd26b2e..19d4fd22ef 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Otklju\u010daj ovu mogu\u0107nost s malom jednokratnom kupnjom ili s aktivnom pretplatom Emby Premijere.", - "MessageUnlockAppWithSupporter": "Otklju\u010daj ovu mogu\u0107nost sa pretplatom Emby Premijere.", - "MessageToValidateSupporter": "Ako imate aktivnu pretplatu Emby Premijere provjerite dali ste postavili Emby Premijeru u svojoj nadzornoj plo\u010di Emby Server-a kojoj mo\u017eete pristupiti klikom Emby Premijera u glavnom izborniku.", "ValueSpecialEpisodeName": "Specijal - {0}", - "Share": "Dijeli", - "Add": "Dodaj", - "ServerUpdateNeeded": "Emby Server treba a\u017eurirati. Da biste preuzeli najnoviju verziju, posjetite {0}", - "LiveTvGuideRequiresUnlock": "Vodi\u010d TV u\u017eivo je trenutno ograni\u010den na {0} kanala. Kliknite na gumb za otklju\u010davanje da biste saznali kako u\u017eivati u potpunom do\u017eivljaju.", + "OptionTuesdayShort": "Uto", + "OptionMondayShort": "Pon", "AttributeNew": "Novo", - "Premiere": "Premijera", - "Live": "U\u017eivo", - "Repeat": "Ponovi", + "ServerUpdateNeeded": "Emby Server treba a\u017eurirati. Da biste preuzeli najnoviju verziju, posjetite {0}", + "Share": "Dijeli", + "OptionSundayShort": "Ned", + "OptionThursdayShort": "\u010cet", + "OptionSaturdayShort": "Sub", + "OptionWednesdayShort": "Sre", + "OptionFridayShort": "Pet", + "HeaderSelectDate": "Odaberi datum", "TrackCount": "{0} pjesme", "ItemCount": "{0} stavaka", - "ReleaseYearValue": "Godina izdanja: {0}", "OriginalAirDateValue": "Originalni datum prikazivanja: {0}", + "ReleaseYearValue": "Godina izdanja: {0}", "EndsAtValue": "Zavr\u0161ava u {0}", - "OptionSundayShort": "Ned", - "OptionMondayShort": "Pon", - "OptionTuesdayShort": "Uto", - "OptionWednesdayShort": "Sre", - "OptionThursdayShort": "\u010cet", - "OptionFridayShort": "Pet", - "OptionSaturdayShort": "Sub", - "HeaderSelectDate": "Odaberi datum", - "ButtonOk": "U redu", "ButtonCancel": "Odustani", + "ButtonOk": "U redu", "ButtonGotIt": "Shva\u0107am", - "ButtonRestart": "Ponovo pokreni", - "RecordingCancelled": "Snimka je otkazana.", - "SeriesCancelled": "Serija je otkazana.", + "LiveTvGuideRequiresUnlock": "Vodi\u010d TV u\u017eivo je trenutno ograni\u010den na {0} kanala. Kliknite na gumb za otklju\u010davanje da biste saznali kako u\u017eivati u potpunom do\u017eivljaju.", "RecordingScheduled": "Snimka je zakazana.", - "SeriesRecordingScheduled": "Snimanje serije je zakazano.", "HeaderNewRecording": "Nova snimka", "Sunday": "Nedjelja", "Monday": "Ponedjeljak", "Tuesday": "Utorak", "Wednesday": "Srijeda", "Thursday": "\u010cetvrtak", - "Friday": "Petak", "Saturday": "Subota", "Days": "Dani", + "Friday": "Petak", "RecordSeries": "Snimi serije", - "HeaderCinemaMode": "Kino na\u010din", - "HeaderCloudSync": "Sink. preko oblaka", - "HeaderOfflineDownloads": "Izvanmre\u017eni mediji", - "HeaderOfflineDownloadsDescription": "Preuzimanje medija na svojim ure\u0111ajima za jednostavnu upotrebu izvan mre\u017ee.", - "CloudSyncFeatureDescription": "Sinkronizirajte svoje medije na oblaku za jednostavni backup, arhiviranje i konvertiranje.", - "CoverArtFeatureDescription": "\"Cover Art\" stvara zabavne naslovnice i druge tretmane koji \u0107e vam pomo\u0107i personalizirati va\u0161e medijske slike.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Kino na\u010din vam daje pravi do\u017eivljaj kina s kratkim filmovima i prilago\u0111enim isje\u010dcima prije odabrane zna\u010dajke.", - "HeaderFreeApps": "Besplatne Emby aplikacije", - "FreeAppsFeatureDescription": "U\u017eivajte u slobodnom pristupu Emby aplikacija za svoje ure\u0111aje.", "HeaderBecomeProjectSupporter": "Nabavite Emby Premijeru", "MessageActiveSubscriptionRequiredSeriesRecordings": "Aktivna pretplata Emby Premijere je potrebna kako bi se napravilo automatsko snimanje serija.", - "LabelEmailAddress": "E-mail adresa:", - "PromoConvertRecordingsToStreamingFormat": "Automatski pretvoriti snimke na prijateljskom formatu strujanja s Emby Premijerom. Snimke \u0107e se pretvoriti u letu u MP4 ili MKV na temelju postavki Emby poslu\u017eitelja.", "FeatureRequiresEmbyPremiere": "Ova zna\u010dajka zahtijeva aktivnu pretplatu Emby Premijere.", - "HeaderConvertYourRecordings": "Konvertiraj snimke", "Record": "Snimi", + "Advanced": "Napredno", + "Download": "Preuzimanje", + "Refresh": "Osvije\u017ei", + "RefreshQueued": "Osvije\u017ei stavke na \u010dekanju", "Save": "Snimi", "Edit": "Izmjeni", - "Download": "Preuzimanje", - "Advanced": "Napredno", "Delete": "Izbri\u0161i", "HeaderDeleteItem": "Izbri\u0161i stavku", "ConfirmDeleteItem": "Brisanjem ove stavke \u0107e je izbrisati iz oba datote\u010dnog sustava i medijskoj biblioteci. Jeste li sigurni da \u017eelite nastaviti?", - "Refresh": "Osvije\u017ei", - "RefreshQueued": "Osvije\u017ei stavke na \u010dekanju", - "AddToCollection": "Dodaj u kolekciju", - "HeaderAddToCollection": "Dodaj u kolekciju", "NewCollection": "Nova kolekcija", + "AddToCollection": "Dodaj u kolekciju", "LabelCollection": "Kolekcija:", "Help": "Pomo\u0107", + "LabelName": "Ime:", "NewCollectionHelp": "Kolekcije vam omogu\u0107iti da napravite personalizirane grupe filmova i ostale biblioteke.", "SearchForCollectionInternetMetadata": "Potra\u017ei na internetu grafike i metadata", - "LabelName": "Ime:", "NewCollectionNameExample": "Naprimjer: Star Wars Kolekcija", - "MessageItemsAdded": "Stavke su dodane", "OptionNew": "Novo...", + "MessageItemsAdded": "Stavke su dodane", "LabelPlaylist": "Popis:", "AddToPlaylist": "Dodaj u popis", - "HeaderAddToPlaylist": "Dodaj u popis", + "RecordingCancelled": "Snimka je otkazana.", + "SeriesRecordingScheduled": "Snimanje serije je zakazano.", "Subtitles": "Titlovi", - "SearchForSubtitles": "Tra\u017ei titlove prijevoda", "LabelLanguage": "Jezik:", "Search": "Tra\u017ei", "NoSubtitleSearchResultsFound": "Nije ni\u0161ta prona\u0111eno.", @@ -99,54 +68,57 @@ "MySubtitles": "Moji titlovi", "MessageDownloadQueued": "Preuzimanje na \u010dekanju", "EditSubtitles": "Uredi titlove", + "SearchForSubtitles": "Tra\u017ei titlove prijevoda", "UnlockGuide": "Otklju\u010daj vodi\u010d", "RefreshMetadata": "Osvje\u017ei meta-podatke", "ReplaceExistingImages": "Zamijeni postoje\u0107e slike", "ReplaceAllMetadata": "Zamijeni sve mate-podatke", "SearchForMissingMetadata": "Potraga za meta-podacima koji nedostaju", "LabelRefreshMode": "Na\u010din osvje\u017eavanja:", + "RefreshDialogHelp": "Meta-podaci se osvje\u017eavaju na temelju postavki i internet usluga koje su omogu\u0107ene u nadzornoj plo\u010di Emby Server-a.", "NoItemsFound": "Nije ni\u0161ta prona\u0111eno.", "HeaderSaySomethingLike": "Reci ne\u0161to poput...", - "ButtonTryAgain": "Poku\u0161ajte ponovo", "HeaderYouSaid": "Rekao si...", - "MessageWeDidntRecognizeCommand": "Na\u017ealost, nismo prepoznali tu naredbu.", "MessageIfYouBlockedVoice": "Ako ste zabranili glasovni pristup aplikaciji morate ponovo podesiti prije ponovnog poku\u0161aja.", + "ButtonTryAgain": "Poku\u0161ajte ponovo", + "MessageWeDidntRecognizeCommand": "Na\u017ealost, nismo prepoznali tu naredbu.", "ValueDiscNumber": "Disk {0}", - "Unrated": "Neocijenjeno", "Favorite": "Omiljeni", + "Unrated": "Neocijenjeno", "Like": "Svi\u0111a mi se", "Dislike": "Ne svi\u0111a mi se", - "RefreshDialogHelp": "Meta-podaci se osvje\u017eavaju na temelju postavki i internet usluga koje su omogu\u0107ene u nadzornoj plo\u010di Emby Server-a.", "Open": "Otvori", - "Play": "Pokreni", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Mije\u0161aj", - "Identify": "Identificiraj", - "EditImages": "Ure\u0111ivanje slika", - "EditInfo": "Ure\u0111ivanje informacija", - "Sync": "Sink.", - "InstantMix": "Trenutno mije\u0161anje", "ViewAlbum": "Pogledaj album", "ViewArtist": "Pogledaj umjetnika", + "Play": "Pokreni", + "Shuffle": "Mije\u0161aj", + "InstantMix": "Trenutno mije\u0161anje", "QueueAllFromHere": "Stavi u red \u010dekanja sve odavde", "PlayAllFromHere": "Pokreni sve odavde", + "Identify": "Identificiraj", + "EditImages": "Ure\u0111ivanje slika", + "Sync": "Sink.", + "EditInfo": "Ure\u0111ivanje informacija", + "RemoveFromPlaylist": "Ukloni iz popisa", "PlayFromBeginning": "Igraj od po\u010detka", "ResumeAt": "Nastavi od {0}", - "RemoveFromPlaylist": "Ukloni iz popisa", - "RemoveFromCollection": "Ukloni iz kolekcije", "Trailer": "Kratki video", "MarkPlayed": "Ozna\u010di pogledan", "MarkUnplayed": "Ozna\u010di nepogledan", "GroupVersions": "Verzija grupe", "PleaseSelectTwoItems": "Molimo odaberite najmanje dvije stavke.", + "Error": "Gre\u0161ka", "TryMultiSelect": "Poku\u0161ajte vi\u0161estruki odabir", "TryMultiSelectMessage": "Da biste uredili vi\u0161e medijskih stavaka, samo kliknite i dr\u017eite bilo koji plakat i odaberite stavke kojima \u017eelite upravljati. Probaj!", "HeaderConfirmRecordingCancellation": "Potvrdi otkazivanje snimanja", "MessageConfirmRecordingCancellation": "Jeste li sigurni da \u017eelite poni\u0161titi ovu snimku?", - "Error": "Gre\u0161ka", + "HeaderAddToCollection": "Dodaj u kolekciju", + "HeaderAddToPlaylist": "Dodaj u popis", + "RemoveFromCollection": "Ukloni iz kolekcije", "VoiceInput": "Ulazni glas", - "LabelContentType": "Tip sadr\u017eaja:", + "Add": "Dodaj", "LabelPath": "Putanja:", + "LabelContentType": "Tip sadr\u017eaja:", "LabelTitle": "Naslov:", "LabelOriginalTitle": "Originalni naslov:", "LabelSortTitle": "Naziv vrste:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Podesite kako se datum dodavanja odre\u0111uje na nadzornoj plo\u010di Emby Server-a u postavkama biblioteke", "LabelStatus": "Status:", "LabelArtists": "Izvo\u0111a\u010di:", - "LabelArtistsHelp": "Odvoji vi\u0161estruko koriste\u0107i ;", "LabelAlbumArtists": "Izvo\u0111a\u010di albuma", + "LabelArtistsHelp": "Odvoji vi\u0161estruko koriste\u0107i ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Ocjene zajednice:", "LabelVoteCount": "Prebrojavanje glasova:", + "LabelCommunityRating": "Ocjene zajednice:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Ocjene kritike:", "LabelCriticRatingSummary": "Sa\u017eetak ocjena kritike:", "LabelAwardSummary": "Sa\u017eetak nagrada:", "LabelWebsite": "Web stranica:", "LabelTagline": "Slogan:", - "LabelOverview": "Pregled:", "LabelShortOverview": "Kratki pregled:", + "LabelOverview": "Pregled:", "LabelReleaseDate": "Datum izdavanja:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Datum ro\u0111enja:", "LabelAirDays": "Dani emitiranja:", "LabelAirTime": "Vrijeme emitiranja:", - "LabelRuntimeMinutes": "Vrijeme izvo\u0111enja (minuta):", "LabelParentalRating": "Roditeljska ocjena:", - "LabelCustomRating": "Prilago\u0111ena ocjena:", - "LabelBudget": "Bud\u017eet", + "LabelRuntimeMinutes": "Vrijeme izvo\u0111enja (minuta):", "LabelRevenue": "Prihod ($):", - "LabelOriginalAspectRatio": "Originalni omjer gledanja:", + "LabelBudget": "Bud\u017eet", + "LabelCustomRating": "Prilago\u0111ena ocjena:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Originalni omjer gledanja:", + "LabelAbsoluteEpisodeNumber": "Apsolutni broj epizode:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternativni brojevi epizoda", "LabelDvdSeasonNumber": "Dvd broj sezone:", "LabelDvdEpisodeNumber": "Dvd broj epizode:", - "LabelAbsoluteEpisodeNumber": "Apsolutni broj epizode:", "HeaderSpecialEpisodeInfo": "Posebni podaci o epizodi", "LabelAirsBeforeSeason": "Emitiranje prije sezone:", "LabelAirsAfterSeason": "Emitiranje nakon sezona:", @@ -201,172 +173,195 @@ "People": "Ljudi", "LabelMetadataDownloadLanguage": "\u017deljeni jezik za preuzimanje:", "LabelLockItemToPreventChanges": "Zaklju\u010dajte ovu stavku kako bi se sprije\u010dile budu\u0107e promjene", - "MessageLeaveEmptyToInherit": "Ostavite prazno da naslijedi postavke od roditelja stavke ili globalnu zadanu vrijednost.", "LabelCountry": "Zemlja:", + "MessageLeaveEmptyToInherit": "Ostavite prazno da naslijedi postavke od roditelja stavke ili globalnu zadanu vrijednost.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Godina ro\u0111enja:", "LabelBirthDate": "Datum ro\u0111enja:", - "LabelDeathDate": "Datum smrti:", "LabelEndDate": "Datum zavr\u0161etka:", + "LabelDeathDate": "Datum smrti:", "LabelSeasonNumber": "Broj sezone:", "LabelEpisodeNumber": "Broj epizode:", "LabelTrackNumber": "Broj pjesme:", "LabelNumber": "Broj:", "LabelDiscNumber": "Broj diska", - "LabelParentNumber": "Broj roditelja", "SortName": "Ime vrste", + "LabelParentNumber": "Broj roditelja", "ReleaseDate": "Datum izdavanja", "Continuing": "Nastavlja se", - "Ended": "Zavr\u0161eno", "HeaderEnabledFields": "Omogu\u0107i polja", + "Ended": "Zavr\u0161eno", + "Keywords": "Klju\u010dne rije\u010di", "HeaderEnabledFieldsHelp": "Poni\u0161ti polje za zaklju\u010davanje i sprije\u010di njihove podatke od toga da budu promijenjeni.", + "Name": "Naziv", "Backdrops": "Pozadine", "Images": "Slike", - "Keywords": "Klju\u010dne rije\u010di", "Runtime": "Trajanje", - "ProductionLocations": "Lokacije proizvodnje", + "Actor": "Glumac", "BirthLocation": "Lokacije ro\u0111enja", + "ProductionLocations": "Lokacije proizvodnje", "ParentalRating": "Parental Rating", - "Name": "Naziv", "Overview": "Pregled", "LabelType": "Tip:", "LabelPersonRole": "Uloga:", "LabelPersonRoleHelp": "Primjer: voza\u010d kamiona sa sladoledom", - "Actor": "Glumac", "Composer": "Kompozitor", - "Director": "Re\u017eiser", "GuestStar": "Zvijezda gost", + "Director": "Re\u017eiser", "Producer": "Producent", "Writer": "Pisac", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Instaliranje {0}", + "MessageItemSaved": "Stavka je snimljena.", "PackageInstallCompleted": "{0} instaliranje zavr\u0161eno.", + "InstallingPackage": "Instaliranje {0}", "PackageInstallFailed": "{0} instaliranje neuspjelo.", "PackageInstallCancelled": "{0} instaliranje otkazano.", "SeriesYearToPresent": "{0} - sada", - "ValueOneItem": "1 item", "ValueOneSong": "1 pjesma", "ValueSongCount": "{0} pjesma", "ValueOneMovie": "1 film", "ValueMovieCount": "{0} filmova", "ValueOneSeries": "1 serija", - "ValueSeriesCount": "{0} serija", "ValueOneEpisode": "1 epizoda", + "ValueSeriesCount": "{0} serija", "ValueEpisodeCount": "{0} epizoda", "ValueOneGame": "1 igra", - "ValueGameCount": "{0} igra", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albuma", + "ValueGameCount": "{0} igra", "ValueOneMusicVideo": "1 glazbeni video", + "ValueAlbumCount": "{0} albuma", "ValueMusicVideoCount": "{0} glazbenih videa", "ValueMinutes": "{0} minuta", "HeaderIdentifyItemHelp": "Unesite jednu ili vi\u0161e kriterija pretra\u017eivanja. Uklonite kriterije za pove\u0107anje rezultata pretra\u017eivanja.", "PleaseEnterNameOrId": "Unesite naziv ili vanjski Id.", - "MessageItemSaved": "Stavka je snimljena.", "SearchResults": "Rezultati pretra\u017eivanja", "SyncToOtherDevice": "Sinkronizacija na druge ure\u0111aje", "MakeAvailableOffline": "Dostupno izvanmre\u017eno", - "ServerNameIsRestarting": "Emby Server - {0} se ponovo pokre\u0107e.", + "ButtonRestart": "Ponovo pokreni", "ServerNameIsShuttingDown": "Emby Server - {0} se gasi.", + "PleaseRestartServerName": "Ponovno pokrenite Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} se ponovo pokre\u0107e.", "HeaderDeleteItems": "Brisanje stavki", "ConfirmDeleteItems": "Brisanjem ove stavke \u0107e se izbrisati iz oba datote\u010dnog sustava i medijskoj biblioteci. Jeste li sigurni da \u017eelite nastaviti?", - "PleaseRestartServerName": "Ponovno pokrenite Emby Server - {0}.", "SyncJobCreated": "Sinkronizacijski posao je stvoren.", "LabelSyncTo": "Sinkroniziraj na:", "LabelSyncJobName": "Ime sinkronizacijskog posla:", - "LabelQuality": "Kvaliteta:", "LabelSyncNoTargetsHelp": "Izgleda da trenutno nemate aplikacija koje podr\u017eavaju sinkronizaciju.", - "DownloadScheduled": "Zakazana preuzimanja", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Kvaliteta:", "LearnMore": "Nau\u010di jo\u0161", - "LabelProfile": "Profil:", + "DownloadScheduled": "Zakazana preuzimanja", "LabelBitrateMbps": "Brzina prijenosa (Mbps):", + "LabelProfile": "Profil:", "SyncUnwatchedVideosOnly": "Sinkroniziraj samo nepogledani video", - "SyncUnwatchedVideosOnlyHelp": "Samo nepogledani videi \u0107e biti sinkronizirani, videi \u0107e biti uklonjeni iz ure\u0111aja nakon \u0161to su pogledani.", "AutomaticallySyncNewContent": "Automatski sinkroniziraj novi sadr\u017eaj", - "AutomaticallySyncNewContentHelp": "Novi sadr\u017eaj u ovoj mapi automatski \u0107e se sinkronizirati na ure\u0111aj.", - "LabelItemLimit": "Ograni\u010denje stavke:", - "LabelItemLimitHelp": "Neobvezno. Postavi ograni\u010denje na broj stavaka koje \u0107e biti sinkronizirane.", "PleaseSelectDeviceToSyncTo": "Odaberite ure\u0111aj za sinkronizaciju.", + "LabelItemLimit": "Ograni\u010denje stavke:", + "SyncUnwatchedVideosOnlyHelp": "Samo nepogledani videi \u0107e biti sinkronizirani, videi \u0107e biti uklonjeni iz ure\u0111aja nakon \u0161to su pogledani.", + "LabelItemLimitHelp": "Neobvezno. Postavi ograni\u010denje na broj stavaka koje \u0107e biti sinkronizirane.", + "AutomaticallySyncNewContentHelp": "Novi sadr\u017eaj u ovoj mapi automatski \u0107e se sinkronizirati na ure\u0111aj.", + "Premiere": "Premijera", + "Live": "U\u017eivo", + "Repeat": "Ponovi", + "Settings": "Postavke", + "DefaultErrorMessage": "Do\u0161lo je do pogre\u0161ke prilikom obrade zahtjeva. Molimo poku\u0161ajte ponovo kasnije.", "Screenshots": "Isje\u010dci slika", "MoveRight": "Pomakni udesno", "MoveLeft": "Pomakni ulijevo", "ConfirmDeleteImage": "Izbri\u0161i sliku?", "HeaderEditImages": "Ure\u0111ivanje slika", - "Settings": "Postavke", "ShowIndicatorsFor": "Prika\u017ei pokazatelja za:", "NewEpisodes": "Nove epizode", + "Premieres": "Premijere", "HDPrograms": "HD programi", "LiveBroadcasts": "Emitiranja u\u017eivo", - "Premieres": "Premijere", "RepeatEpisodes": "Reprize", "DvrSubscriptionRequired": "Emby DVR zahtijeva aktivnu pretplatu Emby Premijere.", "HeaderCancelRecording": "Prekini snimanje", - "CancelRecording": "Prekini snimanje", - "HeaderKeepRecording": "Zadr\u017ei snimanje", - "HeaderCancelSeries": "Otka\u017ei serije", - "HeaderKeepSeries": "Zadr\u017ei serije", + "PromoConvertRecordingsToStreamingFormat": "Automatski pretvoriti snimke na prijateljskom formatu strujanja s Emby Premijerom. Snimke \u0107e se pretvoriti u letu u MP4 ili MKV na temelju postavki Emby poslu\u017eitelja.", + "HeaderConvertYourRecordings": "Konvertiraj snimke", "HeaderLearnMore": "Nau\u010di jo\u0161", + "HeaderKeepRecording": "Zadr\u017ei snimanje", "DeleteMedia": "Izbri\u0161i medij", "SeriesSettings": "Postavke serija", "HeaderRecordingOptions": "Opcije snimanja", - "CancelSeries": "Odustani od serije", "DoNotRecord": "Ne snimi", - "HeaderSeriesOptions": "Opcije serija", + "CancelSeries": "Odustani od serije", "LabelChannels": "Kanali:", + "HeaderSeriesOptions": "Opcije serija", "ChannelNameOnly": "Kanali {0} samo", "Anytime": "Bilo kada", "AroundTime": "Oko {0}", "LabelAirtime": "Vrijeme emitiranja:", - "AllChannels": "Svi kanali", "LabelRecord": "Snimka:", + "AllChannels": "Svi kanali", "NewEpisodesOnly": "Samo nove epizode", "AllEpisodes": "Sve epizode", "LabelStartWhenPossible": "Po\u010dni kada je mogu\u0107e:", "LabelStopWhenPossible": "Zaustavi kada je mogu\u0107e:", "MinutesBefore": "Minuta prije", - "MinutesAfter": "Minuta nakon", - "SkipEpisodesAlreadyInMyLibrary": "Presko\u010di epizode koje su ve\u0107 u mojoj biblioteci", "SkipEpisodesAlreadyInMyLibraryHelp": "Epizode \u0107e se usporediti pomo\u0107u sezone i broja epizode, kada su dostupni.", + "SkipEpisodesAlreadyInMyLibrary": "Presko\u010di epizode koje su ve\u0107 u mojoj biblioteci", + "MinutesAfter": "Minuta nakon", "LabelKeepUpTo": "Dr\u017ei se na:", "AsManyAsPossible": "\u0160to vi\u0161e je mogu\u0107e", - "DefaultErrorMessage": "Do\u0161lo je do pogre\u0161ke prilikom obrade zahtjeva. Molimo poku\u0161ajte ponovo kasnije.", - "LabelKeep:": "Zadr\u017ei:", "UntilIDelete": "Dok ne izbri\u0161em", + "LabelKeep:": "Zadr\u017ei:", "UntilSpaceNeeded": "Dok ne treba prostora", - "Categories": "Kategorije", "Sports": "Sportovi", + "Categories": "Kategorije", "News": "Vijesti", "Movies": "Filmovi", "Kids": "Djeca", "EnableColorCodedBackgrounds": "Omogu\u0107i kodirane boje pozadine", "SortChannelsBy": "Slo\u017ei kanale po:", - "RecentlyWatched": "Nedavno pogledano", "ChannelNumber": "Broj kanala", + "RecentlyWatched": "Nedavno pogledano", + "PlaceFavoriteChannelsAtBeginning": "Postavi omiljene kanale na po\u010detak", + "SeriesCancelled": "Serija je otkazana.", + "HeaderKeepSeries": "Zadr\u017ei serije", + "HeaderCancelSeries": "Otka\u017ei serije", + "CancelRecording": "Prekini snimanje", + "MessageUnlockAppWithSupporter": "Otklju\u010daj ovu mogu\u0107nost sa pretplatom Emby Premijere.", + "MessageUnlockAppWithPurchaseOrSupporter": "Otklju\u010daj ovu mogu\u0107nost s malom jednokratnom kupnjom ili s aktivnom pretplatom Emby Premijere.", + "MessageToValidateSupporter": "Ako imate aktivnu pretplatu Emby Premijere provjerite dali ste postavili Emby Premijeru u svojoj nadzornoj plo\u010di Emby Server-a kojoj mo\u017eete pristupiti klikom Emby Premijera u glavnom izborniku.", + "HeaderCinemaMode": "Kino na\u010din", + "HeaderCloudSync": "Sink. preko oblaka", + "HeaderOfflineDownloads": "Izvanmre\u017eni mediji", + "HeaderOfflineDownloadsDescription": "Preuzimanje medija na svojim ure\u0111ajima za jednostavnu upotrebu izvan mre\u017ee.", + "CloudSyncFeatureDescription": "Sinkronizirajte svoje medije na oblaku za jednostavni backup, arhiviranje i konvertiranje.", + "CoverArtFeatureDescription": "\"Cover Art\" stvara zabavne naslovnice i druge tretmane koji \u0107e vam pomo\u0107i personalizirati va\u0161e medijske slike.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Kino na\u010din vam daje pravi do\u017eivljaj kina s kratkim filmovima i prilago\u0111enim isje\u010dcima prije odabrane zna\u010dajke.", + "HeaderFreeApps": "Besplatne Emby aplikacije", + "FreeAppsFeatureDescription": "U\u017eivajte u slobodnom pristupu Emby aplikacija za svoje ure\u0111aje.", + "LabelEmailAddress": "E-mail adresa:", "HeaderBenefitsEmbyPremiere": "Prednosti Emby premijere", "ThankYouForTryingEnjoyOneMinute": "Molimo Vas da u\u017eivate u jednoj minuti reprodukcije. Hvala \u0161to ste isprobali Emby.", "HeaderTryPlayback": "Isprobajte reprodukciju", + "IPurchasedThisApp": "Kupio sam ovu aplikaciju", "HowDidYouPay": "Kako ste platili?", "IHaveEmbyPremiere": "Imam Emby Premijeru", - "IPurchasedThisApp": "Kupio sam ovu aplikaciju", "ButtonRestorePreviousPurchase": "Vrati kupovinu", "ButtonUnlockWithPurchase": "Otklju\u010daj s kupovinom", "ButtonUnlockPrice": "Otklju\u010daj {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Reproduciraj jednu minutu", - "PlaceFavoriteChannelsAtBeginning": "Postavi omiljene kanale na po\u010detak", "HeaderUnlockFeature": "Otklju\u010daj zna\u010dajke", "MessageDidYouKnowCinemaMode": "Jeste li znali da s Emby Premijerom mo\u017eete pobolj\u0161ati svoje iskustvo sa zna\u010dajkama kao \u0161to su na\u010din kina?", "MessageDidYouKnowCinemaMode2": "Kino na\u010din vam daje pravi do\u017eivljaj kina s kratkim filmovima i prilago\u0111enim isje\u010dcima prije odabrane zna\u010dajke.", - "HeaderPlayMyMedia": "Reproduciraj moje medije", "HeaderDiscoverEmbyPremiere": "Otkrijte Emby Premijeru", - "Items": "Items", + "HeaderPlayMyMedia": "Reproduciraj moje medije", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json b/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json index bb8784a2b2..4415845d2a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Megoszt\u00e1s", - "Add": "Hozz\u00e1ad", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "\u00daj", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Ism\u00e9tl\u00e9s", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Megoszt\u00e1s", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "V\u00e1rhat\u00f3 befejez\u00e9s {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "M\u00e9gsem", + "ButtonOk": "Ok", "ButtonGotIt": "\u00c9rtettem", - "ButtonRestart": "\u00dajraind\u00edt\u00e1s", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "\u00daj Felv\u00e9tel", "Sunday": "Vas\u00e1rnap", "Monday": "H\u00e9tf\u0151", "Tuesday": "Kedd", "Wednesday": "Szerda", "Thursday": "Cs\u00fct\u00f6rt\u00f6k", - "Friday": "P\u00e9ntek", "Saturday": "Szombat", "Days": "Nap", + "Friday": "P\u00e9ntek", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Emby Premiere beszerz\u00e9se", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Felv\u00e9tel", + "Advanced": "Halad\u00f3", + "Download": "Let\u00f6lt\u00e9s", + "Refresh": "Friss\u00edt\u00e9s", + "RefreshQueued": "Refresh queued.", "Save": "Ment\u00e9s", "Edit": "Szerkeszt\u00e9s", - "Download": "Let\u00f6lt\u00e9s", - "Advanced": "Halad\u00f3", "Delete": "T\u00f6rl\u00e9s", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Friss\u00edt\u00e9s", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Hozz\u00e1ad\u00e1s gy\u0171jtem\u00e9nyhez", - "HeaderAddToCollection": "Hozz\u00e1ad\u00e1s gy\u0171jtem\u00e9nyhez", "NewCollection": "\u00daj Gy\u0171jtem\u00e9ny", + "AddToCollection": "Hozz\u00e1ad\u00e1s gy\u0171jtem\u00e9nyhez", "LabelCollection": "Collection:", "Help": "Seg\u00edts\u00e9g", + "LabelName": "N\u00e9v:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "N\u00e9v:", "NewCollectionNameExample": "P\u00e9ld\u00e1ul: Star Wars Gy\u0171jtem\u00e9ny", - "MessageItemsAdded": "Items added.", "OptionNew": "\u00daj...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Lej\u00e1tsz\u00e1si list\u00e1hoz hozz\u00e1adni", - "HeaderAddToPlaylist": "Lej\u00e1tsz\u00e1si List\u00e1hoz hozz\u00e1adni", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Nyelv:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Feliratok szerkeszt\u00e9se", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Kedvenc", + "Unrated": "Unrated", "Like": "Tettszik", "Dislike": "Nem tettszik", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Megnyit\u00e1s", - "Play": "Lej\u00e1tsz\u00e1s", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Kever\u00e9s", - "Identify": "Azonos\u00edt\u00e1s", - "EditImages": "K\u00e9pek szerkeszt\u00e9se", - "EditInfo": "Adatok szerkeszt\u00e9se", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Lej\u00e1tsz\u00e1s", + "Shuffle": "Kever\u00e9s", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "\u00d6sszes vet\u00edt\u00e9se innen", + "Identify": "Azonos\u00edt\u00e1s", + "EditImages": "K\u00e9pek szerkeszt\u00e9se", + "Sync": "Sync", + "EditInfo": "Adatok szerkeszt\u00e9se", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "El\u0151zetes", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Hozz\u00e1ad\u00e1s gy\u0171jtem\u00e9nyhez", + "HeaderAddToPlaylist": "Lej\u00e1tsz\u00e1si List\u00e1hoz hozz\u00e1adni", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Tartalom t\u00edpusa:", + "Add": "Hozz\u00e1ad", "LabelPath": "\u00datvonal:", + "LabelContentType": "Tartalom t\u00edpusa:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "St\u00e1tusz:", "LabelArtists": "El\u0151ad\u00f3k:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "K\u00f6z\u00f6ss\u00e9gi \u00e9rt\u00e9kel\u00e9s:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "K\u00f6z\u00f6ss\u00e9gi \u00e9rt\u00e9kel\u00e9s:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Megjelen\u00e9s d\u00e1tuma:", "LabelYear": "\u00c9v:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "J\u00e1t\u00e9kid\u0151 (perc):", "LabelParentalRating": "Korhat\u00e1r besorol\u00e1s:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "J\u00e1t\u00e9kid\u0151 (perc):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd epiz\u00f3d sz\u00e1ma:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "El\u0151nyben r\u00e9szes\u00edtett let\u00f6ltend\u0151 nyelv:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Orsz\u00e1g:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Sz\u00fclet\u00e9si \u00e9v:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "\u00c9vad sz\u00e1ma:", "LabelEpisodeNumber": "Epiz\u00f3d sz\u00e1ma:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Korhat\u00e1r besorol\u00e1s", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Rendez\u0151", "GuestStar": "Guest star", + "Director": "Rendez\u0151", "Producer": "Producer", "Writer": "\u00cdr\u00f3", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "{0} Telep\u00edt\u00e9se", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} telep\u00edt\u00e9se befejezve.", + "InstallingPackage": "{0} Telep\u00edt\u00e9se", "PackageInstallFailed": "{0} telep\u00edt\u00e9se nem siker\u00fclt.", "PackageInstallCancelled": "{0} telep\u00edt\u00e9se megszak\u00edtva.", "SeriesYearToPresent": "{0} - Napjainkig", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} film", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} \u00fajraindul.", + "ButtonRestart": "\u00dajraind\u00edt\u00e1s", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "K\u00e9rlek ind\u00edtsd \u00fajra az Emby Server-t - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} \u00fajraindul.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "K\u00e9rlek ind\u00edtsd \u00fajra az Emby Server-t - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Min\u0151s\u00e9g:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Min\u0151s\u00e9g:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Elemsz\u00e1m limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Elemsz\u00e1m limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Ism\u00e9tl\u00e9s", + "Settings": "Be\u00e1ll\u00edt\u00e1sok", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Be\u00e1ll\u00edt\u00e1sok", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "\u00daj epiz\u00f3dok", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "Csak \u00faj epiz\u00f3dok", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Hozz\u00e1adva {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/id.json b/dashboard-ui/bower_components/emby-webcomponents/strings/id.json index e4016f00a7..37f9bd5ba0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/id.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/id.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Add", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "Cancel", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", "Wednesday": "Wednesday", "Thursday": "Thursday", - "Friday": "Friday", "Saturday": "Saturday", "Days": "Days", + "Friday": "Friday", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "Save", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "Name:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "Name:", "NewCollectionNameExample": "Example: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Bahasa:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Tipe konten:", + "Add": "Add", "LabelPath": "Path:", + "LabelContentType": "Tipe konten:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Negara:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/it.json b/dashboard-ui/bower_components/emby-webcomponents/strings/it.json index a261a354c5..cfd0b61d59 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/it.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/it.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Sblocca questa funzionalit\u00e0 con un piccolo acquisto singolo, o con un abbonamento Emby Premiere.", - "MessageUnlockAppWithSupporter": "Sblocca questa funzionalit\u00e0 con un abbonamento Emby Premiere", - "MessageToValidateSupporter": "Se hai un abbonamento Emby Premiere, assicurati di averlo configurato nel Pannello di Controllo del Server, a cui puoi accedere cliccando su Emby Premiere dal menu principale.", "ValueSpecialEpisodeName": "Speciale - {0}", - "Share": "Condividi", - "Add": "Aggiungi", - "ServerUpdateNeeded": "Questo server Emby deve essere aggiornato. Per scaricare l'ultima versione vai su {0}", - "LiveTvGuideRequiresUnlock": "La Guida TV \u00e8 attualmente limitata a {0} canali. Premi il tasto di sblocco per scoprire come ottenere la funzionalit\u00e0 completa.", + "OptionTuesdayShort": "Mar", + "OptionMondayShort": "Lun", "AttributeNew": "Nuovo", - "Premiere": "Prima visione", - "Live": "In diretta", - "Repeat": "Ripeti", + "ServerUpdateNeeded": "Questo server Emby deve essere aggiornato. Per scaricare l'ultima versione vai su {0}", + "Share": "Condividi", + "OptionSundayShort": "Dom", + "OptionThursdayShort": "Gio", + "OptionSaturdayShort": "Sab", + "OptionWednesdayShort": "Mer", + "OptionFridayShort": "Ven", + "HeaderSelectDate": "Scegli una data", "TrackCount": "{0} tracce", "ItemCount": "{0} elementi", - "ReleaseYearValue": "Anno di uscita: {0}", "OriginalAirDateValue": "Prima messa in onda (originale): {0}", + "ReleaseYearValue": "Anno di uscita: {0}", "EndsAtValue": "Finir\u00e0 alle {0}", - "OptionSundayShort": "Dom", - "OptionMondayShort": "Lun", - "OptionTuesdayShort": "Mar", - "OptionWednesdayShort": "Mer", - "OptionThursdayShort": "Gio", - "OptionFridayShort": "Ven", - "OptionSaturdayShort": "Sab", - "HeaderSelectDate": "Scegli una data", - "ButtonOk": "Ok", "ButtonCancel": "Annulla", + "ButtonOk": "Ok", "ButtonGotIt": "Ho capito", - "ButtonRestart": "Riavvia", - "RecordingCancelled": "Registrazione annullata.", - "SeriesCancelled": "Serie TV annullate.", + "LiveTvGuideRequiresUnlock": "La Guida TV \u00e8 attualmente limitata a {0} canali. Premi il tasto di sblocco per scoprire come ottenere la funzionalit\u00e0 completa.", "RecordingScheduled": "Registrazione pianificata.", - "SeriesRecordingScheduled": "Registrazione serie TV pianificata.", "HeaderNewRecording": "Nuova Registrazione", "Sunday": "Domenica", "Monday": "Luned\u00ec", "Tuesday": "Marted\u00ec", "Wednesday": "Mercoled\u00ec", "Thursday": "Gioved\u00ec", - "Friday": "Venerd\u00ec", "Saturday": "Sabato", "Days": "Giorni", + "Friday": "Venerd\u00ec", "RecordSeries": "Registra serie TV", - "HeaderCinemaMode": "Modalit\u00e0 Cinema", - "HeaderCloudSync": "Sinc. nel Cloud", - "HeaderOfflineDownloads": "Media Offline", - "HeaderOfflineDownloadsDescription": "Scarica facilmente i media sui tuoi dispositivi per vederli offline.", - "CloudSyncFeatureDescription": "Sincronizza i tuoi media nel cloud per un facile backup, archiviazione e conversione.", - "CoverArtFeatureDescription": "Copertine crea delle copertine divertenti ed altri effetti per aiutarti a personalizzare le immagini dei tuoi media.", - "CoverArt": "Copertine", - "ButtonCancelSyncJob": "Annulla sinc.", - "CancelSyncJobConfirmation": "La cancellazione dell'attivit\u00e0 di sincronizzazione causer\u00e0, alla prossima sincronizzazione, la rimozione di tutti i media sincronizzati dal dispositivo. Sei sicuro di voler procedere?", - "CinemaModeFeatureDescription": "Modalit\u00e0 Cinema ti fa provare la vera esperienza del cinema con trailer ed intro personalizzate prima del contenuto principale.", - "HeaderFreeApps": "App Gratuite Emby", - "FreeAppsFeatureDescription": "Godi dell'accesso gratuito alle App Emby dai tuoi dispositivi.", "HeaderBecomeProjectSupporter": "Ottieni Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Un abbonamento a Emby Premiere \u00e8 necessario per creare registrazioni personalizzate delle serie tv", - "LabelEmailAddress": "Indirizzo e-mail:", - "PromoConvertRecordingsToStreamingFormat": "Converti automaticamente le registrazioni in un formato adatto allo streaming con Emby Premiere. Le registrazioni saranno convertite in tempo reale ad MP4 o MKV, in base alle impostazioni del server.", "FeatureRequiresEmbyPremiere": "Questa funzionalit\u00e0 richiede un abbonamento ad Emby Premiere.", - "HeaderConvertYourRecordings": "Converti le tue Registrazioni", "Record": "Registra", + "Advanced": "Avanzate", + "Download": "Scarica", + "Refresh": "Aggiorna", + "RefreshQueued": "Aggiornamento programmato.", "Save": "Salva", "Edit": "Modifica", - "Download": "Scarica", - "Advanced": "Avanzate", "Delete": "Elimina", "HeaderDeleteItem": "Elimina Elemento", "ConfirmDeleteItem": "L'eliminazione di questo elemento lo canceller\u00e0 sia dal disco che dalla libreria multimediale. Sei sicuro di voler continuare?", - "Refresh": "Aggiorna", - "RefreshQueued": "Aggiornamento programmato.", - "AddToCollection": "Aggiungi ad una collezione", - "HeaderAddToCollection": "Aggiungi ad una Collezione", "NewCollection": "Nuova Collezione", + "AddToCollection": "Aggiungi ad una collezione", "LabelCollection": "Collezione:", "Help": "Aiuto", + "LabelName": "Nome:", "NewCollectionHelp": "Le collezioni ti permettono di creare raccolte personalizzate di film ed altri contenuti della libreria.", "SearchForCollectionInternetMetadata": "Cerca su internet le immagini ed i metadati", - "LabelName": "Nome:", "NewCollectionNameExample": "Esempio: Collezione Star wars", - "MessageItemsAdded": "Elementi aggiunti.", "OptionNew": "Nuovo...", + "MessageItemsAdded": "Elementi aggiunti.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Aggiungi alla playlist", - "HeaderAddToPlaylist": "Aggiungi alla Playlist", + "RecordingCancelled": "Registrazione annullata.", + "SeriesRecordingScheduled": "Registrazione serie TV pianificata.", "Subtitles": "Sottotitoli", - "SearchForSubtitles": "Cerca Sottotitoli", "LabelLanguage": "Lingua:", "Search": "Cerca", "NoSubtitleSearchResultsFound": "Nessun risultato.", @@ -99,54 +68,57 @@ "MySubtitles": "I miei Sottotitoli", "MessageDownloadQueued": "Scaricamento programmato.", "EditSubtitles": "Modifica i sottotitoli", + "SearchForSubtitles": "Cerca Sottotitoli", "UnlockGuide": "Sblocca Guida", "RefreshMetadata": "Aggiorna i Metadati", "ReplaceExistingImages": "Sovrascrivi immagini esistenti", "ReplaceAllMetadata": "Sostituisci tutti i metadati", "SearchForMissingMetadata": "Cerca metadati mancanti", "LabelRefreshMode": "Modalit\u00e0 di aggiornamento:", + "RefreshDialogHelp": "I Metadati sono aggiornati in base alle impostazioni ed ai servizi Internet abilitati nel Pannello di Controllo del Server Emby.", "NoItemsFound": "Nessun elemento trovato.", "HeaderSaySomethingLike": "Pronuncia qualcosa come...", - "ButtonTryAgain": "Riprova ancora", "HeaderYouSaid": "Hai detto...", - "MessageWeDidntRecognizeCommand": "Ci dispiace, non riconosciamo il comando.", "MessageIfYouBlockedVoice": "Se hai negato l'accesso vocale all'app dovrai riconfigurarlo prima di riprovare di nuovo.", + "ButtonTryAgain": "Riprova ancora", + "MessageWeDidntRecognizeCommand": "Ci dispiace, non riconosciamo il comando.", "ValueDiscNumber": "Disco {0}", - "Unrated": "Non votato", "Favorite": "Preferito", + "Unrated": "Non votato", "Like": "Mi piace", "Dislike": "Non mi piace", - "RefreshDialogHelp": "I Metadati sono aggiornati in base alle impostazioni ed ai servizi Internet abilitati nel Pannello di Controllo del Server Emby.", "Open": "Apri", - "Play": "Riproduci", - "AddToPlayQueue": "Aggiungi alla coda di riproduzione", - "Shuffle": "Casuale", - "Identify": "Identifica", - "EditImages": "Modifica immagini", - "EditInfo": "Modifica Info", - "Sync": "Sincronizza", - "InstantMix": "Mix istantaneo", "ViewAlbum": "Visualizza album", "ViewArtist": "Visualizza artista", + "Play": "Riproduci", + "Shuffle": "Casuale", + "InstantMix": "Mix istantaneo", "QueueAllFromHere": "In coda tutto da qui in poi", "PlayAllFromHere": "Riproduci tutto da qui in poi", + "Identify": "Identifica", + "EditImages": "Modifica immagini", + "Sync": "Sincronizza", + "EditInfo": "Modifica Info", + "RemoveFromPlaylist": "Rimuovi dalla playlist", "PlayFromBeginning": "Riproduci dall'inizio", "ResumeAt": "Riprendi da {0}", - "RemoveFromPlaylist": "Rimuovi dalla playlist", - "RemoveFromCollection": "Rimuovi dalla collezione", "Trailer": "Trailer", "MarkPlayed": "Segna visto", "MarkUnplayed": "Segna non visto", "GroupVersions": "Raggruppa versioni", "PleaseSelectTwoItems": "Seleziona almeno due elementi.", + "Error": "Errore", "TryMultiSelect": "Prova la selezione multipla", "TryMultiSelectMessage": "Per modificare pi\u00f9 elementi, clicca e tieni premuto su un poster e seleziona gli elementi che vuoi gestire. Prova!", "HeaderConfirmRecordingCancellation": "Conferma Eliminazione Registrazione", "MessageConfirmRecordingCancellation": "Sei sicuro di voler eliminare questa registrazione?", - "Error": "Errore", + "HeaderAddToCollection": "Aggiungi ad una Collezione", + "HeaderAddToPlaylist": "Aggiungi alla Playlist", + "RemoveFromCollection": "Rimuovi dalla collezione", "VoiceInput": "Comandi Vocali", - "LabelContentType": "Tipo di contenuto:", + "Add": "Aggiungi", "LabelPath": "Percorso:", + "LabelContentType": "Tipo di contenuto:", "LabelTitle": "Titolo:", "LabelOriginalTitle": "Titolo originale:", "LabelSortTitle": "Titolo per ordinamento:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Scegli come determinare la data di aggiunta dal Pannello di Controllo del Server Emby, nelle impostazioni della Libreria.", "LabelStatus": "Stato:", "LabelArtists": "Artisti:", - "LabelArtistsHelp": "Separa valori multipli usando ;", "LabelAlbumArtists": "Artisti album:", + "LabelArtistsHelp": "Separa valori multipli usando ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Voto del pubblico:", "LabelVoteCount": "Numero di voti:", + "LabelCommunityRating": "Voto del pubblico:", "LabelMetascore": "Punteggio:", "LabelCriticRating": "Voto della critica:", "LabelCriticRatingSummary": "Sintesi voto della critica:", "LabelAwardSummary": "Sintesi premi:", "LabelWebsite": "Sito Web:", "LabelTagline": "Slogan:", - "LabelOverview": "Trama:", "LabelShortOverview": "Trama breve:", + "LabelOverview": "Trama:", "LabelReleaseDate": "Data di uscita:", "LabelYear": "Anno:", "LabelPlaceOfBirth": "Luogo di nascita:", "LabelAirDays": "In onda da (gg):", "LabelAirTime": "In onda da:", - "LabelRuntimeMinutes": "Durata (minuti):", "LabelParentalRating": "Classificazione per genitori:", - "LabelCustomRating": "Voto personalizzato:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Durata (minuti):", "LabelRevenue": "Incasso ($):", - "LabelOriginalAspectRatio": "Aspetto originale:", + "LabelBudget": "Budget", + "LabelCustomRating": "Voto personalizzato:", "LabelPlayers": "Riproduttori:", + "LabelOriginalAspectRatio": "Aspetto originale:", + "LabelAbsoluteEpisodeNumber": "Numero episodio assoluto:", "Label3DFormat": "Formato 3D:", "HeaderAlternateEpisodeNumbers": "Numeri Episodio Alternativi", "LabelDvdSeasonNumber": "Numero stagione DVD:", "LabelDvdEpisodeNumber": "Numero episodio DVD:", - "LabelAbsoluteEpisodeNumber": "Numero episodio assoluto:", "HeaderSpecialEpisodeInfo": "Informazioni Episodio Speciale", "LabelAirsBeforeSeason": "In onda prima della stagione:", "LabelAirsAfterSeason": "In onda dopo la stagione:", @@ -201,172 +173,195 @@ "People": "Attori", "LabelMetadataDownloadLanguage": "Lingua preferita per lo scaricamento:", "LabelLockItemToPreventChanges": "Blocca questo elemento per impedire modifiche future", - "MessageLeaveEmptyToInherit": "Lascia vuoto per ereditare le impostazioni dall'elemento principale, o il valore predefinito globale.", "LabelCountry": "Nazione:", + "MessageLeaveEmptyToInherit": "Lascia vuoto per ereditare le impostazioni dall'elemento principale, o il valore predefinito globale.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Anno di nascita:", "LabelBirthDate": "Data di nascita:", - "LabelDeathDate": "Anno di morte:", "LabelEndDate": "Data di fine:", + "LabelDeathDate": "Anno di morte:", "LabelSeasonNumber": "Numero stagione:", "LabelEpisodeNumber": "Numero espisodio:", "LabelTrackNumber": "Numero traccia:", "LabelNumber": "Numero:", "LabelDiscNumber": "Numero disco:", - "LabelParentNumber": "Numero precursore:", "SortName": "Nome ordinamento", + "LabelParentNumber": "Numero precursore:", "ReleaseDate": "Data di uscita", "Continuing": "In corso", - "Ended": "Finito", "HeaderEnabledFields": "Campi Abilitati", + "Ended": "Finito", + "Keywords": "Parole chiave", "HeaderEnabledFieldsHelp": "Deseleziona un campo per bloccarlo ed impedire che venga modificato.", + "Name": "Nome", "Backdrops": "Sfondi", "Images": "Immagini", - "Keywords": "Parole chiave", "Runtime": "Durata", - "ProductionLocations": "Sedi di produzione", + "Actor": "Attore", "BirthLocation": "Luogo di nascita", + "ProductionLocations": "Sedi di produzione", "ParentalRating": "Classificazione per genitori", - "Name": "Nome", "Overview": "Trama", "LabelType": "Tipo:", "LabelPersonRole": "Ruolo:", "LabelPersonRoleHelp": "Esempio: Autista di chiosco dei gelati", - "Actor": "Attore", "Composer": "Compositore", - "Director": "Regista", "GuestStar": "Personaggio famoso", + "Director": "Regista", "Producer": "Produttore", "Writer": "Scrittore", - "MessageNoSyncJobsFound": "Nessuna attivit\u00e0 di sincronizzazione trovata. Le attivit\u00e0 di sincronizzazione vengono create quando usi il pulsanti Sincronizza sull'applicazione.", - "MessageNoDownloadsFound": "Nessuno scaricamento trovato. Rendi i tuoi media disponibili offline usando l'opzione Rendi Disponibile Offline sull'applicazione.", - "InstallingPackage": "Installazione di {0}", + "MessageItemSaved": "Elemento salvato.", "PackageInstallCompleted": "Installazione di {0} completa.", + "InstallingPackage": "Installazione di {0}", "PackageInstallFailed": "Installazione di {0} fallita.", "PackageInstallCancelled": "Installazione di {0} annullata.", "SeriesYearToPresent": "{0} - Oggi", - "ValueOneItem": "1 elemento", "ValueOneSong": "1 brano", "ValueSongCount": "{0} brani", "ValueOneMovie": "1 film", "ValueMovieCount": "{0} film", "ValueOneSeries": "1 serie TV", - "ValueSeriesCount": "{0} serie TV", "ValueOneEpisode": "1 episodio", + "ValueSeriesCount": "{0} serie TV", "ValueEpisodeCount": "{0} episodi", "ValueOneGame": "1 gioco", - "ValueGameCount": "{0} giochi", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} album", + "ValueGameCount": "{0} giochi", "ValueOneMusicVideo": "1 video musicale", + "ValueAlbumCount": "{0} album", "ValueMusicVideoCount": "{0} video musicali", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Inserisci uno o pi\u00f9 criteri di ricerca. Rimuovi criteri per ottenere pi\u00f9 risultati.", "PleaseEnterNameOrId": "Per favore inserisci un nome o un id esterno.", - "MessageItemSaved": "Elemento salvato.", "SearchResults": "Risultati della Ricerca", "SyncToOtherDevice": "Invia ad un altro dispositivo", "MakeAvailableOffline": "Rendi disponibile offline", - "ServerNameIsRestarting": "Emby Server - {0} si sta riavviando.", + "ButtonRestart": "Riavvia", "ServerNameIsShuttingDown": "Emby Server - {0} si sta arrestando.", + "PleaseRestartServerName": "Per favore riavvia Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} si sta riavviando.", "HeaderDeleteItems": "Elimina Elementi", "ConfirmDeleteItems": "L'eliminazione di questi elementi li canceller\u00e0 sia dal disco che dalla tua libreria multimediale. Sei sicuro di voler continuare?", - "PleaseRestartServerName": "Per favore riavvia Emby Server - {0}.", "SyncJobCreated": "Attivit\u00e0 di Sinc. creata", "LabelSyncTo": "Sincronizza su:", "LabelSyncJobName": "Nome Attivit\u00e0 di Sinc.:", - "LabelQuality": "Qualit\u00e0:", "LabelSyncNoTargetsHelp": "Al momento non hai applicazioni che supportino la sincronizzazione.", - "DownloadScheduled": "Scaricamento pianificato", - "HeaderSyncRequiresSub": "La sincronizzazione richiede un abbonamento Emby Premiere.", + "LabelQuality": "Qualit\u00e0:", "LearnMore": "saperne di pi\u00f9", - "LabelProfile": "Profilo:", + "DownloadScheduled": "Scaricamento pianificato", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profilo:", "SyncUnwatchedVideosOnly": "Sincronizza solo i video non visti", - "SyncUnwatchedVideosOnlyHelp": "Solo i video non visti verranno sincronizzati, e verranno rimossi dal dispositivo non appena visti.", "AutomaticallySyncNewContent": "Sincronizza automaticamente i nuovi contenuti", - "AutomaticallySyncNewContentHelp": "I nuovi contenuti aggiunti verranno sincronizzati automaticamente al dispositivo.", - "LabelItemLimit": "Limite elementi:", - "LabelItemLimitHelp": "Facoltativo. Imposta un limite al numero di elementi che verranno sincronizzati.", "PleaseSelectDeviceToSyncTo": "Seleziona un dispositivo per sincronizzare.", + "LabelItemLimit": "Limite elementi:", + "SyncUnwatchedVideosOnlyHelp": "Solo i video non visti verranno sincronizzati, e verranno rimossi dal dispositivo non appena visti.", + "LabelItemLimitHelp": "Facoltativo. Imposta un limite al numero di elementi che verranno sincronizzati.", + "AutomaticallySyncNewContentHelp": "I nuovi contenuti aggiunti verranno sincronizzati automaticamente al dispositivo.", + "Premiere": "Prima visione", + "Live": "In diretta", + "Repeat": "Ripeti", + "Settings": "Impostazioni", + "DefaultErrorMessage": "Si \u00e8 verificato un errore durante l'elaborazione della richiesta. Si prega di riprovare pi\u00f9 tardi.", "Screenshots": "Screenshot", "MoveRight": "Sposta a destra", "MoveLeft": "Sposta a sinistra", "ConfirmDeleteImage": "Elimina immagine?", "HeaderEditImages": "Modifica Immagini", - "Settings": "Impostazioni", "ShowIndicatorsFor": "Mostra indicatori per:", "NewEpisodes": "Nuovi episodi", + "Premieres": "Prime Visioni", "HDPrograms": "Programmi HD", "LiveBroadcasts": "Tramissioni in diretta", - "Premieres": "Prime Visioni", "RepeatEpisodes": "Ripeti episodi", "DvrSubscriptionRequired": "Emby DVR richiede un abbonamento ad Emby Premiere.", "HeaderCancelRecording": "Annulla la Registrazione", - "CancelRecording": "Annulla la registrazione", - "HeaderKeepRecording": "Mantieni la registrazione", - "HeaderCancelSeries": "Annulla Serie TV", - "HeaderKeepSeries": "Mantieni Serie TV", + "PromoConvertRecordingsToStreamingFormat": "Converti automaticamente le registrazioni in un formato adatto allo streaming con Emby Premiere. Le registrazioni saranno convertite in tempo reale ad MP4 o MKV, in base alle impostazioni del server.", + "HeaderConvertYourRecordings": "Converti le tue Registrazioni", "HeaderLearnMore": "Saperne di pi\u00f9", + "HeaderKeepRecording": "Mantieni la registrazione", "DeleteMedia": "Elimina media", "SeriesSettings": "Impostazioni Serie TV", "HeaderRecordingOptions": "Opzioni di Registrazione", - "CancelSeries": "Annulla Serie TV", "DoNotRecord": "Non registrare", - "HeaderSeriesOptions": "Impostazioni Serie TV", + "CancelSeries": "Annulla Serie TV", "LabelChannels": "Canali:", + "HeaderSeriesOptions": "Impostazioni Serie TV", "ChannelNameOnly": "Solo il canale {0}", "Anytime": "In qualsiasi momento", "AroundTime": "Circa {0}", "LabelAirtime": "Messa in onda:", - "AllChannels": "Tutti i canali", "LabelRecord": "Registra:", + "AllChannels": "Tutti i canali", "NewEpisodesOnly": "Solo i nuovi episodi", "AllEpisodes": "Tutti gli episodi", "LabelStartWhenPossible": "Avvia appena possibile:", "LabelStopWhenPossible": "Ferma appena possibile:", "MinutesBefore": "minuti prima", - "MinutesAfter": "minuti dopo", - "SkipEpisodesAlreadyInMyLibrary": "Non registrare gli espisodi che sono gi\u00e0 in libreria", "SkipEpisodesAlreadyInMyLibraryHelp": "Gli episodi verranno confrontati usando la stagione ed il numero dell'episodio, quando disponibili.", + "SkipEpisodesAlreadyInMyLibrary": "Non registrare gli espisodi che sono gi\u00e0 in libreria", + "MinutesAfter": "minuti dopo", "LabelKeepUpTo": "Conservane fino a:", "AsManyAsPossible": "Tutto il possibile", - "DefaultErrorMessage": "Si \u00e8 verificato un errore durante l'elaborazione della richiesta. Si prega di riprovare pi\u00f9 tardi.", - "LabelKeep:": "Conserva:", "UntilIDelete": "Finch\u00e8 li elimino", + "LabelKeep:": "Conserva:", "UntilSpaceNeeded": "Finch\u00e8 c'\u00e8 spazio", - "Categories": "Categorie", "Sports": "Sport", + "Categories": "Categorie", "News": "Notizie", "Movies": "Film", "Kids": "Bambini", "EnableColorCodedBackgrounds": "Abilita sfondi a colori", "SortChannelsBy": "Ordina canali per:", - "RecentlyWatched": "Visti di recente", "ChannelNumber": "Numero canale", + "RecentlyWatched": "Visti di recente", + "PlaceFavoriteChannelsAtBeginning": "Mostra prima i canali preferiti", + "SeriesCancelled": "Serie TV annullate.", + "HeaderKeepSeries": "Mantieni Serie TV", + "HeaderCancelSeries": "Annulla Serie TV", + "CancelRecording": "Annulla la registrazione", + "MessageUnlockAppWithSupporter": "Sblocca questa funzionalit\u00e0 con un abbonamento Emby Premiere", + "MessageUnlockAppWithPurchaseOrSupporter": "Sblocca questa funzionalit\u00e0 con un piccolo acquisto singolo, o con un abbonamento Emby Premiere.", + "MessageToValidateSupporter": "Se hai un abbonamento Emby Premiere, assicurati di averlo configurato nel Pannello di Controllo del Server, a cui puoi accedere cliccando su Emby Premiere dal menu principale.", + "HeaderCinemaMode": "Modalit\u00e0 Cinema", + "HeaderCloudSync": "Sinc. nel Cloud", + "HeaderOfflineDownloads": "Media Offline", + "HeaderOfflineDownloadsDescription": "Scarica facilmente i media sui tuoi dispositivi per vederli offline.", + "CloudSyncFeatureDescription": "Sincronizza i tuoi media nel cloud per un facile backup, archiviazione e conversione.", + "CoverArtFeatureDescription": "Copertine crea delle copertine divertenti ed altri effetti per aiutarti a personalizzare le immagini dei tuoi media.", + "CoverArt": "Copertine", + "CinemaModeFeatureDescription": "Modalit\u00e0 Cinema ti fa provare la vera esperienza del cinema con trailer ed intro personalizzate prima del contenuto principale.", + "HeaderFreeApps": "App Gratuite Emby", + "FreeAppsFeatureDescription": "Godi dell'accesso gratuito alle App Emby dai tuoi dispositivi.", + "LabelEmailAddress": "Indirizzo e-mail:", "HeaderBenefitsEmbyPremiere": "Benefici di Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Siamo lieti di offrirti un minuto di riproduzione. Grazie per aver provato Emby.", "HeaderTryPlayback": "Prova la riproduzione", + "IPurchasedThisApp": "Ho acquistato questa app", "HowDidYouPay": "Come hai pagato?", "IHaveEmbyPremiere": "Sono abbonato ad Emby Premiere", - "IPurchasedThisApp": "Ho acquistato questa app", "ButtonRestorePreviousPurchase": "Ripristina Acquisto", "ButtonUnlockWithPurchase": "Sblocca con l'Acquisto", "ButtonUnlockPrice": "Sblocca {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Mensile {0}", - "HeaderAlreadyPaid": "Hai gi\u00e0 pagato?", "ButtonPlayOneMinute": "Riproduci un minuto", - "PlaceFavoriteChannelsAtBeginning": "Mostra prima i canali preferiti", "HeaderUnlockFeature": "Sblocca Funzionalit\u00e0", "MessageDidYouKnowCinemaMode": "Sapevi che con Emby Premiere puoi migliorare la tua esperienza d'uso con funzionalit\u00e0 come la Modalit\u00e0 Cinema?", "MessageDidYouKnowCinemaMode2": "Modalit\u00e0 Cinema ti fa provare la vera esperienza del cinema con trailer ed intro personalizzate prima del contenuto principale.", - "HeaderPlayMyMedia": "Riproduci i miei Media", "HeaderDiscoverEmbyPremiere": "Scopri Emby Premiere", - "Items": "Elementi", + "HeaderPlayMyMedia": "Riproduci i miei Media", "OneChannel": "Un canale", - "ConfirmRemoveDownload": "Rimuovi scaricamento?", - "RemoveDownload": "Rimuovi scaricamento", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Mensile {0}", + "HeaderAlreadyPaid": "Hai gi\u00e0 pagato?", "AddedOnValue": "Aggiunto {0}", + "ConfirmRemoveDownload": "Rimuovi scaricamento?", + "CancelSyncJobConfirmation": "La cancellazione dell'attivit\u00e0 di sincronizzazione causer\u00e0, alla prossima sincronizzazione, la rimozione di tutti i media sincronizzati dal dispositivo. Sei sicuro di voler procedere?", + "ButtonCancelSyncJob": "Annulla sinc.", + "MessageNoSyncJobsFound": "Nessuna attivit\u00e0 di sincronizzazione trovata. Le attivit\u00e0 di sincronizzazione vengono create quando usi il pulsanti Sincronizza sull'applicazione.", + "MessageNoDownloadsFound": "Nessuno scaricamento trovato. Rendi i tuoi media disponibili offline usando l'opzione Rendi Disponibile Offline sull'applicazione.", + "ValueOneItem": "1 elemento", + "HeaderSyncRequiresSub": "La sincronizzazione richiede un abbonamento Emby Premiere.", + "Items": "Elementi", + "RemoveDownload": "Rimuovi scaricamento", "RemovingFromDevice": "Rimuovendo dal dispositivo", "RemoveFromDevice": "Rimuovi dal dispositivo", "KeepOnDevice": "Mantieni sul dispositivo", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Pronto per il trasferimento", "SyncJobItemStatusSyncedMarkForRemoval": "Rimuovendo dal dispositivo", "SyncJobItemStatusQueued": "In coda", - "SyncJobItemStatusConverting": "Convertendo", "SyncJobItemStatusTransferring": "Trasferendo", - "SyncJobItemStatusSynced": "Scaricato", - "SyncJobItemStatusFailed": "Fallito", + "SyncJobItemStatusConverting": "Convertendo", "SyncJobItemStatusRemovedFromDevice": "Rimosso dal dispositivo", "SyncJobItemStatusCancelled": "Annullato", + "SyncJobItemStatusSynced": "Scaricato", + "SyncJobItemStatusFailed": "Fallito", "Retry": "Riprova", "HeaderMyDevice": "Il Mio Dispositivo", + "ContinueInSecondsValue": "Continua tra {0} secondi.", "Continue": "Continua", - "ContinueInSecondsValue": "Continua tra {0} secondi." + "AddToPlayQueue": "Aggiungi alla coda di riproduzione", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnetti", + "EnableDisplayMirroring": "Abilita visualizzazione remota", + "HeaderSelectPlayer": "Seleziona Riproduttore", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json index 0ecfa48ca9..dee7421fd5 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "\u0410\u0436\u044b\u0440\u0430\u0442\u0443", - "EnableDisplayMirroring": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u0443\u0434\u0456\u04a3 \u0442\u0435\u043b\u043d\u04b1\u0441\u049b\u0430\u0441\u044b\u043d \u049b\u043e\u0441\u0443", - "HeaderSelectPlayer": "\u041e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u044b \u0442\u0430\u04a3\u0434\u0430\u0443", - "MessageUnlockAppWithPurchaseOrSupporter": "\u041e\u0441\u044b \u049b\u04b1\u0440\u0430\u043c\u0434\u0430\u0441\u0442\u044b \u0431\u0456\u0440 \u0436\u043e\u043b\u0493\u044b \u0441\u0430\u0442\u044b\u043f \u0430\u043b\u0443, \u043d\u0435\u043c\u0435\u0441\u0435 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u04b1\u0440\u0441\u0430\u0443\u0434\u0430\u043d \u0431\u043e\u0441\u0430\u0442\u0443.", - "MessageUnlockAppWithSupporter": "\u041e\u0441\u044b \u049b\u04b1\u0440\u0430\u043c\u0434\u0430\u0441\u0442\u044b \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u04b1\u0440\u0441\u0430\u0443\u0434\u0430\u043d \u0431\u043e\u0441\u0430\u0442\u0443.", - "MessageToValidateSupporter": "\u0415\u0433\u0435\u0440 \u0441\u0456\u0437\u0434\u0435 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u0431\u043e\u043b\u0441\u0430, Emby Server \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d\u0434\u0430\u0493\u044b Emby Premiere \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u044b\u043f \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d\u0456\u043d\u0435 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437. \u0411\u04b1\u043b \u0431\u0430\u0441\u0442\u044b \u043c\u04d9\u0437\u0456\u0440\u0434\u0435 Emby Premiere \u0434\u0435\u0433\u0435\u043d\u0434\u0456 \u043d\u04b1\u049b\u044b\u043f \u049b\u0430\u0442\u044b\u043d\u0430\u0443\u043b\u044b.", "ValueSpecialEpisodeName": "\u0410\u0440\u043d\u0430\u0439\u044b - {0}", - "Share": "\u041e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443", - "Add": "\u04ae\u0441\u0442\u0435\u0443", - "ServerUpdateNeeded": "\u041e\u0441\u044b Emby Server \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0443\u044b \u049b\u0430\u0436\u0435\u0442. \u0421\u043e\u04a3\u0493\u044b \u043d\u04b1\u0441\u049b\u0430\u0441\u044b\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u04af\u0448\u0456\u043d, {0} \u043a\u0456\u0440\u0456\u04a3\u0456\u0437", - "LiveTvGuideRequiresUnlock": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0435\u043b\u0435\u0433\u0438\u0434\u0442\u0435 \u049b\u0430\u0437\u0456\u0440\u0433\u0456 \u0443\u0430\u049b\u044b\u0442\u0442\u0430 {0} \u0430\u0440\u043d\u0430\u043b\u0430\u0440 \u0448\u0435\u043a\u0442\u0435\u043b\u0435\u0434\u0456. \u0422\u043e\u043b\u044b\u049b \u0442\u04d9\u0436\u0440\u0438\u0431\u0435 \u0430\u043b\u0443\u0493\u0430 \u04af\u0439\u0440\u0435\u043d\u0443 \u04af\u0448\u0456\u043d \u049a\u04b1\u0440\u0441\u0430\u0443\u044b\u043d \u0431\u043e\u0441\u0430\u0442\u0443 \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456\u043d \u0431\u0430\u0441\u044b\u04a3\u044b\u0437.", + "OptionTuesdayShort": "\u0441\u0435\u0439", + "OptionMondayShort": "\u0434\u04af\u0439", "AttributeNew": "\u0416\u0430\u04a3\u0430", - "Premiere": "\u0422\u04b1\u0441\u0430\u0443\u043a\u0435\u0441\u0435\u0440\u0456", - "Live": "\u0422\u0456\u043a\u0435\u043b\u0435\u0439", - "Repeat": "\u049a\u0430\u0439\u0442\u0430\u043b\u0430\u0443", + "ServerUpdateNeeded": "\u041e\u0441\u044b Emby Server \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0443\u044b \u049b\u0430\u0436\u0435\u0442. \u0421\u043e\u04a3\u0493\u044b \u043d\u04b1\u0441\u049b\u0430\u0441\u044b\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u04af\u0448\u0456\u043d, {0} \u043a\u0456\u0440\u0456\u04a3\u0456\u0437", + "Share": "\u041e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443", + "OptionSundayShort": "\u0436\u0435\u043a", + "OptionThursdayShort": "\u0431\u0435\u0439", + "OptionSaturdayShort": "\u0441\u0435\u043d", + "OptionWednesdayShort": "\u0441\u04d9\u0440", + "OptionFridayShort": "\u0436\u04b1\u043c", + "HeaderSelectDate": "\u041a\u04af\u043d\u0434\u0456 \u0442\u0430\u04a3\u0434\u0430\u0443", "TrackCount": "{0} \u0436\u043e\u043b\u0448\u044b\u049b", "ItemCount": "{0} \u0442\u0430\u0440\u043c\u0430\u049b", - "ReleaseYearValue": "\u0428\u044b\u0493\u0430\u0440\u0443 \u0436\u043e\u043b\u044b: {0}", "OriginalAirDateValue": "\u0411\u0430\u0441\u0442\u0430\u043f\u049b\u044b \u044d\u0444\u0438\u0440: {0}", + "ReleaseYearValue": "\u0428\u044b\u0493\u0430\u0440\u0443 \u0436\u043e\u043b\u044b: {0}", "EndsAtValue": "\u0410\u044f\u049b\u0442\u0430\u043b\u0443\u044b: {0}", - "OptionSundayShort": "\u0436\u0435\u043a", - "OptionMondayShort": "\u0434\u04af\u0439", - "OptionTuesdayShort": "\u0441\u0435\u0439", - "OptionWednesdayShort": "\u0441\u04d9\u0440", - "OptionThursdayShort": "\u0431\u0435\u0439", - "OptionFridayShort": "\u0436\u04b1\u043c", - "OptionSaturdayShort": "\u0441\u0435\u043d", - "HeaderSelectDate": "\u041a\u04af\u043d\u0434\u0456 \u0442\u0430\u04a3\u0434\u0430\u0443", - "ButtonOk": "\u0416\u0430\u0440\u0430\u0439\u0434\u044b", "ButtonCancel": "\u0411\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", + "ButtonOk": "\u0416\u0430\u0440\u0430\u0439\u0434\u044b", "ButtonGotIt": "\u0422\u04af\u0441\u0456\u043d\u0456\u043a\u0442\u0456", - "ButtonRestart": "\u049a\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443", - "RecordingCancelled": "\u0416\u0430\u0437\u0431\u0430 \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b.", - "SeriesCancelled": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b.", + "LiveTvGuideRequiresUnlock": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0435\u043b\u0435\u0433\u0438\u0434\u0442\u0435 \u049b\u0430\u0437\u0456\u0440\u0433\u0456 \u0443\u0430\u049b\u044b\u0442\u0442\u0430 {0} \u0430\u0440\u043d\u0430\u043b\u0430\u0440 \u0448\u0435\u043a\u0442\u0435\u043b\u0435\u0434\u0456. \u0422\u043e\u043b\u044b\u049b \u0442\u04d9\u0436\u0440\u0438\u0431\u0435 \u0430\u043b\u0443\u0493\u0430 \u04af\u0439\u0440\u0435\u043d\u0443 \u04af\u0448\u0456\u043d \u049a\u04b1\u0440\u0441\u0430\u0443\u044b\u043d \u0431\u043e\u0441\u0430\u0442\u0443 \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456\u043d \u0431\u0430\u0441\u044b\u04a3\u044b\u0437.", "RecordingScheduled": "\u0416\u0430\u0437\u0443 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d.", - "SeriesRecordingScheduled": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u0436\u0430\u0437\u0443\u044b \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d.", "HeaderNewRecording": "\u0416\u0430\u04a3\u0430 \u0436\u0430\u0437\u0443", "Sunday": "\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456", "Monday": "\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456", "Tuesday": "\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456", "Wednesday": "\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456", "Thursday": "\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456", - "Friday": "\u0436\u04b1\u043c\u0430", "Saturday": "\u0441\u0435\u043d\u0431\u0456", "Days": "\u041a\u04af\u043d\u0434\u0435\u0440", + "Friday": "\u0436\u04b1\u043c\u0430", "RecordSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u0436\u0430\u0437\u0443", - "HeaderCinemaMode": "\u041a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440 \u0440\u0435\u0436\u0456\u043c\u0456", - "HeaderCloudSync": "\u0411\u04b1\u043b\u0442 \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", - "HeaderOfflineDownloads": "\u0414\u0435\u0440\u0431\u0435\u0441 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a", - "HeaderOfflineDownloadsDescription": "\u041e\u04a3\u0430\u0439 \u0434\u0435\u0440\u0431\u0435\u0441 \u049b\u043e\u043b\u0434\u0430\u043d\u0443 \u04af\u0448\u0456\u043d \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b\u04a3\u044b\u0437\u0493\u0430 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u044b\u04a3\u044b\u0437.", - "CloudSyncFeatureDescription": "\u0421\u0430\u049b\u0442\u044b\u049b \u043a\u04e9\u0448\u0456\u0440\u043c\u0435\u043d\u0456, \u043c\u04b1\u0440\u0430\u0493\u0430\u0442\u0442\u0430\u0443\u0434\u044b \u0436\u04d9\u043d\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443\u0434\u0456 \u0436\u0435\u04a3\u0456\u043b\u0434\u0435\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0431\u04b1\u043b\u0442\u043f\u0435\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0456\u04a3\u0456\u0437.", - "CoverArtFeatureDescription": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0436\u0435\u043a\u0435\u043b\u0435\u0443\u0433\u0435 \u043a\u04e9\u043c\u0435\u043a\u0442\u0435\u0441\u0443 \u04af\u0448\u0456\u043d Cover Art \u049b\u044b\u0437\u044b\u049b\u0442\u044b \u043c\u04b1\u049b\u0430\u0431\u0430\u043b\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u049b\u0430 \u0434\u0430 \u04e9\u04a3\u0434\u0435\u0442\u0443\u043b\u0435\u0440\u0434\u0456 \u0436\u0430\u0441\u0430\u0439\u0434\u044b.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443\u0434\u0456 \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", - "CancelSyncJobConfirmation": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u044b\u043d \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443\u044b \u043a\u0435\u043b\u0435\u0441\u0456 \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0456 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0456\u043b\u0433\u0435\u043d \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0436\u043e\u044f\u0434\u044b. \u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043a\u0456\u0440\u0456\u0441\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", - "CinemaModeFeatureDescription": "\u041a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440 \u0440\u0435\u0436\u0456\u043c\u0456 \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440\u0434\u0456 \u0436\u04d9\u043d\u0435 \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043a\u04e9\u0440\u043d\u0435\u0443\u0434\u0456 \u0444\u0438\u043b\u044c\u043c \u0430\u043b\u0434\u044b\u043d\u0434\u0430 \u043e\u0439\u043d\u0430\u0442\u0443 \u043a\u0438\u043d\u043e\u0437\u0430\u043b \u04d9\u0441\u0435\u0440\u0456\u043d \u0436\u0435\u0442\u043a\u0456\u0437\u0435\u0434\u0456.", - "HeaderFreeApps": "\u0422\u0435\u0433\u0456\u043d Emby \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b", - "FreeAppsFeatureDescription": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b\u04a3\u044b\u0437 \u04af\u0448\u0456\u043d Emby-\u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b\u043d\u0430 \u0442\u0435\u0433\u0456\u043d \u049b\u0430\u0442\u044b\u043d\u0430\u04a3\u044b\u0437.", "HeaderBecomeProjectSupporter": "Emby Premiere \u0430\u043b\u0443", "MessageActiveSubscriptionRequiredSeriesRecordings": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043b\u0430\u0440\u0434\u044b\u04a3 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0436\u0430\u0437\u0431\u0430\u0441\u044b\u043d \u0436\u0430\u0441\u0430\u0443 \u04af\u0448\u0456\u043d \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u049b\u0430\u0436\u0435\u0442.", - "LabelEmailAddress": "\u042d-\u043f\u043e\u0448\u0442\u0430 \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b:", - "PromoConvertRecordingsToStreamingFormat": "Emby Premiere \u0430\u0440\u049b\u044b\u043b\u044b \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443\u0493\u0430 \u043e\u04a3\u0430\u0439 \u043f\u0456\u0448\u0456\u043d\u0434\u0435 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443. \u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440 Emby Server \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456 \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435, \u043d\u0430\u049b\u0442\u044b \u0443\u0430\u049b\u044b\u0442\u0442\u0430 MP4 \u043d\u0435\u043c\u0435\u0441\u0435 MKV \u043f\u0456\u0448\u0456\u043c\u0456\u043d\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0456\u043b\u0435\u0434\u0456.", "FeatureRequiresEmbyPremiere": "\u041e\u0441\u044b \u049b\u04b1\u0440\u0430\u043c\u0434\u0430\u0441 \u04af\u0448\u0456\u043d \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u049b\u0430\u0436\u0435\u0442", - "HeaderConvertYourRecordings": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u044b\u04a3\u044b\u0437\u0434\u044b \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443", "Record": "\u0416\u0430\u0437\u0443", + "Advanced": "\u041a\u0435\u04a3\u0435\u0439\u0442\u0456\u043b\u0433\u0435\u043d", + "Download": "\u0416\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443", + "Refresh": "\u0416\u0430\u04a3\u0493\u044b\u0440\u0442\u0443", + "RefreshQueued": "\u0416\u0430\u04a3\u0493\u044b\u0440\u0442\u0443 \u043a\u0435\u0437\u0435\u043a\u0442\u0435.", "Save": "\u0421\u0430\u049b\u0442\u0430\u0443", "Edit": "\u04e8\u04a3\u0434\u0435\u0443", - "Download": "\u0416\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443", - "Advanced": "\u041a\u0435\u04a3\u0435\u0439\u0442\u0456\u043b\u0433\u0435\u043d", "Delete": "\u0416\u043e\u044e", "HeaderDeleteItem": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u044b \u0436\u043e\u044e", "ConfirmDeleteItem": "\u041e\u0441\u044b \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u044b \u0436\u043e\u0439\u0493\u0430\u043d\u0434\u0430, \u043e\u043b \u0444\u0430\u0439\u043b \u0436\u04af\u0439\u0435\u0441\u0456\u043d\u0435\u043d \u0434\u0435, \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u04a3\u044b\u0437\u0434\u0430\u043d \u0434\u0430 \u0436\u043e\u0439\u044b\u043b\u0430\u0434\u044b. \u0428\u044b\u043d\u044b\u043c\u0435\u043d \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", - "Refresh": "\u0416\u0430\u04a3\u0493\u044b\u0440\u0442\u0443", - "RefreshQueued": "\u0416\u0430\u04a3\u0493\u044b\u0440\u0442\u0443 \u043a\u0435\u0437\u0435\u043a\u0442\u0435.", - "AddToCollection": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u049b\u0430 \u04af\u0441\u0442\u0435\u0443", - "HeaderAddToCollection": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u049b\u0430 \u04af\u0441\u0442\u0435\u0443", "NewCollection": "\u0416\u0430\u04a3\u0430 \u0436\u0438\u044b\u043d\u0442\u044b\u049b", + "AddToCollection": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u049b\u0430 \u04af\u0441\u0442\u0435\u0443", "LabelCollection": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b:", "Help": "\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0442\u0435\u0433\u0456 \u0430\u043d\u044b\u049b\u0442\u0430\u043c\u0430\u0493\u0430", + "LabelName": "\u0410\u0442\u044b:", "NewCollectionHelp": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440 \u0441\u0456\u0437\u0433\u0435 \u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440\u0434\u0456\u04a3 \u0436\u04d9\u043d\u0435 \u0442\u0430\u0493\u044b \u0431\u0430\u0441\u049b\u0430 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b\u04a3 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0434\u0435\u0440\u0431\u0435\u0441\u0442\u0435\u043d\u0434\u0456\u0440\u0456\u043b\u0433\u0435\u043d \u0442\u043e\u043f\u0442\u0430\u0443\u043b\u0430\u0440\u044b\u043c\u0435\u043d \u0442\u0430\u043c\u0430\u0448\u0430\u043b\u0430\u043d\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456.", "SearchForCollectionInternetMetadata": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435\u043b\u0435\u0440 \u0431\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0442\u0435\u043d \u0456\u0437\u0434\u0435\u0443", - "LabelName": "\u0410\u0442\u044b:", "NewCollectionNameExample": "\u041c\u044b\u0441\u0430\u043b: \u0416\u04b1\u043b\u0434\u044b\u0437 \u0441\u043e\u0493\u044b\u0441\u0442\u0430\u0440\u044b (\u0436\u0438\u044b\u043d\u0442\u044b\u049b)", - "MessageItemsAdded": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440 \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d.", "OptionNew": "\u0416\u0430\u04a3\u0430...", + "MessageItemsAdded": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440 \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d.", "LabelPlaylist": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0456:", "AddToPlaylist": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0456\u043d\u0435 \u04af\u0441\u0442\u0435\u0443", - "HeaderAddToPlaylist": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0456\u043d\u0435 \u04af\u0441\u0442\u0435\u0443", + "RecordingCancelled": "\u0416\u0430\u0437\u0431\u0430 \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b.", + "SeriesRecordingScheduled": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u0436\u0430\u0437\u0443\u044b \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d.", "Subtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440", - "SearchForSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u0456\u0437\u0434\u0435\u0443", "LabelLanguage": "\u0422\u0456\u043b:", "Search": "\u0406\u0437\u0434\u0435\u0443", "NoSubtitleSearchResultsFound": "\u0415\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u043d\u04d9\u0442\u0438\u0436\u0435\u043b\u0435\u0440 \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b.", @@ -99,54 +68,57 @@ "MySubtitles": "\u041c\u0435\u043d\u0456\u04a3 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440\u0456\u043c", "MessageDownloadQueued": "\u0416\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u043a\u0435\u0437\u0435\u043a\u0442\u0435.", "EditSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u04e9\u04a3\u0434\u0435\u0443", + "SearchForSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u0456\u0437\u0434\u0435\u0443", "UnlockGuide": "\u0422\u0435\u043b\u0435\u0433\u0438\u0434\u0442\u0456 \u049b\u04b1\u0440\u0441\u0430\u0443\u0434\u0430\u043d \u0431\u043e\u0441\u0430\u0442\u0443", "RefreshMetadata": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u0443", "ReplaceExistingImages": "\u0411\u0430\u0440 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0430\u0443\u044b\u0441\u0442\u044b\u0440\u0443", "ReplaceAllMetadata": "\u0411\u0430\u0440\u043b\u044b\u049b \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0430\u0443\u044b\u0441\u0442\u044b\u0440\u0443", "SearchForMissingMetadata": "\u0416\u043e\u049b \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0456\u0437\u0434\u0435\u0443", "LabelRefreshMode": "\u0416\u0430\u04a3\u0493\u044b\u0440\u0442\u0443 \u0440\u0435\u0436\u0456\u043c\u0456:", + "RefreshDialogHelp": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u043c\u0435\u043d Emby Server \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d\u0434\u0430 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u049b\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440\u0456 \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u044b\u043b\u0430\u0434\u044b.", "NoItemsFound": "\u0415\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440 \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b.", "HeaderSaySomethingLike": "\u041e\u0441\u044b\u043d\u0434\u0430\u0439 \u0441\u0438\u044f\u049b\u0442\u044b\u043d\u044b \u0430\u0439\u0442\u044b\u04a3\u044b\u0437...", - "ButtonTryAgain": "\u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u0443", "HeaderYouSaid": "\u0421\u0456\u0437 \u0430\u0439\u0442\u049b\u0430\u043d\u044b\u04a3\u044b\u0437...", - "MessageWeDidntRecognizeCommand": "\u041e\u0441\u044b\u043d\u0434\u0430\u0439 \u043f\u04d9\u0440\u043c\u0435\u043d\u0434\u0456 \u0442\u0430\u043d\u044b\u043f \u0430\u0439\u044b\u0440\u043c\u0430\u0434\u044b\u049b.", "MessageIfYouBlockedVoice": "\u0415\u0433\u0435\u0440 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0493\u0430 \u0434\u0430\u0443\u044b\u0441\u0442\u044b\u049b \u049b\u0430\u0442\u044b\u043d\u0430\u0443\u0434\u0430\u043d \u0431\u0430\u0441 \u0442\u0430\u0440\u0442\u0441\u0430\u04a3\u044b\u0437, \u049b\u0430\u0439\u0442\u0430 \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0435\u043d\u0443\u0456\u04a3\u0456\u0437\u0434\u0435\u043d \u0430\u043b\u0434\u044b\u043d\u0430\u043d \u049b\u0430\u0439\u0442\u0430 \u0442\u0435\u04a3\u0448\u0435\u0443\u0456\u04a3\u0456\u0437 \u049b\u0430\u0436\u0435\u0442 \u0431\u043e\u043b\u0430\u0434\u044b.", + "ButtonTryAgain": "\u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u0443", + "MessageWeDidntRecognizeCommand": "\u041e\u0441\u044b\u043d\u0434\u0430\u0439 \u043f\u04d9\u0440\u043c\u0435\u043d\u0434\u0456 \u0442\u0430\u043d\u044b\u043f \u0430\u0439\u044b\u0440\u043c\u0430\u0434\u044b\u049b.", "ValueDiscNumber": "{0}-\u0434\u0438\u0441\u043a\u0456", - "Unrated": "\u0411\u0430\u0493\u0430\u043b\u0430\u043d\u0431\u0430\u0493\u0430\u043d", "Favorite": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b", + "Unrated": "\u0411\u0430\u0493\u0430\u043b\u0430\u043d\u0431\u0430\u0493\u0430\u043d", "Like": "\u04b0\u043d\u0430\u0439\u0434\u044b", "Dislike": "\u04b0\u043d\u0430\u043c\u0430\u0439\u0434\u044b", - "RefreshDialogHelp": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u043c\u0435\u043d Emby Server \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d\u0434\u0430 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u049b\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440\u0456 \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u044b\u043b\u0430\u0434\u044b.", "Open": "\u0410\u0448\u0443", - "Play": "\u041e\u0439\u043d\u0430\u0442\u0443", - "AddToPlayQueue": "\u041e\u0439\u043d\u0430\u0442\u0443 \u043a\u0435\u0437\u0435\u0433\u0456\u043d\u0435 \u04af\u0441\u0442\u0435\u0443", - "Shuffle": "\u0410\u0440\u0430\u043b\u0430\u0441\u0442\u044b\u0440\u0443", - "Identify": "\u0410\u043d\u044b\u049b\u0442\u0430\u0443", - "EditImages": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u04e9\u04a3\u0434\u0435\u0443", - "EditInfo": "\u041c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u04e9\u04a3\u0434\u0435\u0443", - "Sync": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", - "InstantMix": "\u041b\u0435\u0437\u0434\u0456\u043a \u049b\u043e\u0441\u043f\u0430\u043b\u0430\u0443", "ViewAlbum": "\u0410\u043b\u044c\u0431\u043e\u043c\u0434\u044b \u049b\u0430\u0440\u0430\u0443", "ViewArtist": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043d\u044b \u049b\u0430\u0440\u0430\u0443", + "Play": "\u041e\u0439\u043d\u0430\u0442\u0443", + "Shuffle": "\u0410\u0440\u0430\u043b\u0430\u0441\u0442\u044b\u0440\u0443", + "InstantMix": "\u041b\u0435\u0437\u0434\u0456\u043a \u049b\u043e\u0441\u043f\u0430\u043b\u0430\u0443", "QueueAllFromHere": "\u0411\u04b1\u043b \u0430\u0440\u0430\u0434\u0430\u043d \u0431\u04d9\u0440\u0456\u043d \u043a\u0435\u0437\u0435\u043a\u043a\u0435", "PlayAllFromHere": "\u0411\u04b1\u043b \u0430\u0440\u0430\u0434\u0430\u043d \u0431\u04d9\u0440\u0456\u043d \u043e\u0439\u043d\u0430\u0442\u0443", + "Identify": "\u0410\u043d\u044b\u049b\u0442\u0430\u0443", + "EditImages": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u04e9\u04a3\u0434\u0435\u0443", + "Sync": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", + "EditInfo": "\u041c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u04e9\u04a3\u0434\u0435\u0443", + "RemoveFromPlaylist": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0456\u043d\u0435\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u0443", "PlayFromBeginning": "\u0411\u0430\u0441\u044b\u043d\u0430\u043d \u043e\u0439\u043d\u0430\u0442\u0443", "ResumeAt": "{0} \u0431\u0430\u0441\u0442\u0430\u043f \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443", - "RemoveFromPlaylist": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0456\u043d\u0435\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u0443", - "RemoveFromCollection": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u0443", "Trailer": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440", "MarkPlayed": "\u041e\u0439\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d \u0434\u0435\u043f \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u0443", "MarkUnplayed": "\u041e\u0439\u043d\u0430\u0442\u044b\u043b\u043c\u0430\u0493\u0430\u043d \u0434\u0435\u043f \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u0443", "GroupVersions": "\u041d\u04b1\u0441\u049b\u0430\u043b\u0430\u0440\u0434\u044b \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u0443", "PleaseSelectTwoItems": "\u0415\u04a3 \u043a\u0435\u043c\u0456\u043d\u0434\u0435 \u0435\u043a\u0456 \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u044b \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.", + "Error": "\u049a\u0430\u0442\u0435", "TryMultiSelect": "\u04ae\u043d\u0434\u0435\u0441\u043a\u0435\u043d \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u0443\u0434\u0456 \u0441\u044b\u043d\u0430\u043f \u043a\u04e9\u0440\u0443", "TryMultiSelectMessage": "\u0411\u0456\u0440\u043d\u0435\u0448\u0435 \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0456\u043d \u04e9\u04a3\u0434\u0435\u0443 \u04af\u0448\u0456\u043d, \u043a\u0435\u0437 \u043a\u0435\u043b\u0433\u0435\u043d \u043f\u043e\u0441\u0442\u0435\u0440\u0434\u0456 \u0436\u0430\u0439 \u0493\u0430\u043d\u0430 \u0442\u0456\u043d\u0442\u0443\u0456\u0440 \u0431\u0430\u0442\u044b\u0440\u043c\u0430\u0493\u0430 \u0431\u0430\u0441\u044b\u043f \u0442\u04b1\u0440\u044b\u043f \u043d\u04b1\u049b\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u049b\u0430\u0440\u0443\u044b\u043d \u049b\u0430\u043b\u0430\u0493\u0430\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0434\u0456 \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u04a3\u0456\u0437. \u0421\u044b\u043d\u0430\u043f \u043a\u04e9\u0440\u0456\u04a3\u0456\u0437!", "HeaderConfirmRecordingCancellation": "\u0416\u0430\u0437\u0431\u0430 \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443\u0434\u044b \u0440\u0430\u0441\u0442\u0430\u0443", "MessageConfirmRecordingCancellation": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043e\u0441\u044b \u0436\u0430\u0437\u0431\u0430\u043d\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", - "Error": "\u049a\u0430\u0442\u0435", + "HeaderAddToCollection": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u049b\u0430 \u04af\u0441\u0442\u0435\u0443", + "HeaderAddToPlaylist": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0456\u043d\u0435 \u04af\u0441\u0442\u0435\u0443", + "RemoveFromCollection": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u0443", "VoiceInput": "\u0414\u0430\u0443\u044b\u0441\u0442\u044b\u049b \u0435\u043d\u0433\u0456\u0437\u0443", - "LabelContentType": "\u041c\u0430\u0437\u043c\u04b1\u043d \u0442\u04af\u0440\u0456:", + "Add": "\u04ae\u0441\u0442\u0435\u0443", "LabelPath": "\u0416\u043e\u043b\u044b:", + "LabelContentType": "\u041c\u0430\u0437\u043c\u04b1\u043d \u0442\u04af\u0440\u0456:", "LabelTitle": "\u0410\u0442\u0430\u0443\u044b:", "LabelOriginalTitle": "\u0411\u0430\u0441\u0442\u0430\u043f\u049b\u044b \u0430\u0442\u0430\u0443\u044b:", "LabelSortTitle": "\u0410\u0442\u0430\u0443 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0441\u04b1\u0440\u044b\u043f\u0442\u0430\u0443", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456 Emby Server \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456\u043d\u0434\u0435 \u0430\u043d\u044b\u049b\u0442\u0430\u043b\u0430\u0434\u044b", "LabelStatus": "\u041a\u04af\u0439:", "LabelArtists": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440:", - "LabelArtistsHelp": "\u0411\u0456\u0440\u043d\u0435\u0448\u0443\u0456\u043d (;) \u0430\u0440\u049b\u044b\u043b\u044b \u0431\u04e9\u043b\u0456\u04a3\u0456\u0437", "LabelAlbumArtists": "\u0410\u043b\u044c\u0431\u043e\u043c \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b:", + "LabelArtistsHelp": "\u0411\u0456\u0440\u043d\u0435\u0448\u0443\u0456\u043d (;) \u0430\u0440\u049b\u044b\u043b\u044b \u0431\u04e9\u043b\u0456\u04a3\u0456\u0437", "LabelAlbum": "\u0410\u043b\u044c\u0431\u043e\u043c:", - "LabelCommunityRating": "\u049a\u0430\u0443\u044b\u043c \u0431\u0430\u0493\u0430\u043b\u0430\u0443\u044b:", "LabelVoteCount": "\u0414\u0430\u0443\u044b\u0441 \u0435\u0441\u0435\u0431\u0456:", + "LabelCommunityRating": "\u049a\u0430\u0443\u044b\u043c \u0431\u0430\u0493\u0430\u043b\u0430\u0443\u044b:", "LabelMetascore": "Metascore \u0431\u0430\u0493\u0430\u043b\u0430\u0443\u044b:", "LabelCriticRating": "\u0421\u044b\u043d\u0448\u044b\u043b\u0430\u0440 \u0431\u0430\u0493\u0430\u043b\u0430\u0443\u044b:", "LabelCriticRatingSummary": "\u0421\u044b\u043d\u0448\u044b\u043b\u0430\u0440 \u0431\u0430\u0493\u0430\u043b\u0430\u0443 \u0430\u049b\u043f\u0430\u0440\u044b:", "LabelAwardSummary": "\u041c\u0430\u0440\u0430\u043f\u0430\u0442 \u0430\u049b\u043f\u0430\u0440\u044b:", "LabelWebsite": "\u0492\u0430\u043b\u0430\u043c\u0442\u043e\u0440 \u0441\u0430\u0439\u0442\u044b:", "LabelTagline": "\u041d\u0435\u0433\u0456\u0437\u0433\u0456 \u0441\u04e9\u0439\u043b\u0435\u043c:", - "LabelOverview": "\u0416\u0430\u043b\u043f\u044b \u0448\u043e\u043b\u0443:", "LabelShortOverview": "\u049a\u044b\u0441\u049b\u0430\u0448\u0430 \u0448\u043e\u043b\u0443:", + "LabelOverview": "\u0416\u0430\u043b\u043f\u044b \u0448\u043e\u043b\u0443:", "LabelReleaseDate": "\u0428\u044b\u0493\u0430\u0440\u0443 \u043a\u04af\u043d\u0456:", "LabelYear": "\u0416\u044b\u043b:", "LabelPlaceOfBirth": "\u0422\u0443\u0493\u0430\u043d \u0436\u0435\u0440\u0456:", "LabelAirDays": "\u042d\u0444\u0438\u0440 \u043a\u04af\u043d\u0434\u0435\u0440\u0456:", "LabelAirTime": "\u042d\u0444\u0438\u0440 \u0443\u0430\u049b\u044b\u0442\u044b:", - "LabelRuntimeMinutes": "\u04b0\u0437\u0430\u049b\u0442\u044b\u0493\u044b, \u043c\u0438\u043d:", "LabelParentalRating": "\u0416\u0430\u0441\u0442\u0430\u0441 \u0441\u0430\u043d\u0430\u0442\u044b:", - "LabelCustomRating": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u0441\u0430\u043d\u0430\u0442:", - "LabelBudget": "\u0411\u044e\u0434\u0436\u0435\u0442\u0456", + "LabelRuntimeMinutes": "\u04b0\u0437\u0430\u049b\u0442\u044b\u0493\u044b, \u043c\u0438\u043d:", "LabelRevenue": "\u0422\u04af\u0441\u0456\u043c\u0456, $:", - "LabelOriginalAspectRatio": "\u0411\u0430\u0441\u0442\u0430\u043f\u049b\u044b \u043f\u0456\u0448\u0456\u043c\u0434\u0456\u043a \u0430\u0440\u0430\u049b\u0430\u0442\u044b\u043d\u0430\u0441\u044b:", + "LabelBudget": "\u0411\u044e\u0434\u0436\u0435\u0442\u0456", + "LabelCustomRating": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u0441\u0430\u043d\u0430\u0442:", "LabelPlayers": "\u041e\u0439\u044b\u043d\u0448\u044b\u043b\u0430\u0440:", + "LabelOriginalAspectRatio": "\u0411\u0430\u0441\u0442\u0430\u043f\u049b\u044b \u043f\u0456\u0448\u0456\u043c\u0434\u0456\u043a \u0430\u0440\u0430\u049b\u0430\u0442\u044b\u043d\u0430\u0441\u044b:", + "LabelAbsoluteEpisodeNumber": "\u041d\u0430\u049b\u043f\u0430-\u043d\u0430\u049b \u0431\u04e9\u043b\u0456\u043c \u043d\u04e9\u043c\u0456\u0440\u0456", "Label3DFormat": "3D \u043f\u0456\u0448\u0456\u043c\u0456:", "HeaderAlternateEpisodeNumbers": "\u0411\u0430\u043b\u0430\u043c\u0430\u043b\u044b \u0431\u04e9\u043b\u0456\u043c \u043d\u04e9\u043c\u0456\u0440\u043b\u0435\u0440\u0456", "LabelDvdSeasonNumber": "DVD \u043c\u0430\u0443\u0441\u044b\u043c \u043d\u04e9\u043c\u0456\u0440\u0456", "LabelDvdEpisodeNumber": "DVD \u0431\u04e9\u043b\u0456\u043c \u043d\u04e9\u043c\u0456\u0440\u0456", - "LabelAbsoluteEpisodeNumber": "\u041d\u0430\u049b\u043f\u0430-\u043d\u0430\u049b \u0431\u04e9\u043b\u0456\u043c \u043d\u04e9\u043c\u0456\u0440\u0456", "HeaderSpecialEpisodeInfo": "\u0410\u0440\u043d\u0430\u0439\u044b \u0431\u04e9\u043b\u0456\u043c \u0442\u0443\u0440\u0430\u043b\u044b", "LabelAirsBeforeSeason": "\"Airs before\" \u043c\u0430\u0443\u0441\u044b\u043c\u044b", "LabelAirsAfterSeason": "\"Airs after\" \u043c\u0430\u0443\u0441\u044b\u043c\u044b", @@ -201,172 +173,195 @@ "People": "\u0410\u0434\u0430\u043c\u0434\u0430\u0440", "LabelMetadataDownloadLanguage": "\u0416\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u0442\u0456\u043b\u0456\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456:", "LabelLockItemToPreventChanges": "\u041e\u0441\u044b \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u044b \u043a\u0435\u043b\u0435\u0448\u0435\u043a \u04e9\u0437\u0433\u0435\u0440\u0442\u0443\u043b\u0435\u0440\u0434\u0435\u043d \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u0430\u0443", - "MessageLeaveEmptyToInherit": "\u0422\u0435\u043a\u0442\u0456\u043a \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u043d, \u043d\u0435\u043c\u0435\u0441\u0435 \u0493\u0430\u043b\u0430\u043c\u0434\u044b\u049b \u04d9\u0434\u0435\u043f\u043a\u0456 \u043c\u04d9\u043d\u0456\u043d\u0435\u043d\u0456. \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u043c\u04b1\u0440\u0430\u0441\u044b\u043d\u0430 \u0438\u0435\u043b\u0435\u043d\u0443 \u04af\u0448\u0456\u043d \u0431\u043e\u0441 \u049b\u0430\u043b\u0434\u044b\u0440\u044b\u04a3\u044b\u0437.", "LabelCountry": "\u0415\u043b:", + "MessageLeaveEmptyToInherit": "\u0422\u0435\u043a\u0442\u0456\u043a \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u043d, \u043d\u0435\u043c\u0435\u0441\u0435 \u0493\u0430\u043b\u0430\u043c\u0434\u044b\u049b \u04d9\u0434\u0435\u043f\u043a\u0456 \u043c\u04d9\u043d\u0456\u043d\u0435\u043d\u0456. \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u043c\u04b1\u0440\u0430\u0441\u044b\u043d\u0430 \u0438\u0435\u043b\u0435\u043d\u0443 \u04af\u0448\u0456\u043d \u0431\u043e\u0441 \u049b\u0430\u043b\u0434\u044b\u0440\u044b\u04a3\u044b\u0437.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "\u0422\u0443\u0493\u0430\u043d \u0436\u044b\u043b\u044b:", "LabelBirthDate": "\u0422\u0443\u0493\u0430\u043d \u043a\u04af\u043d\u0456:", - "LabelDeathDate": "\u04e8\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456:", "LabelEndDate": "\u0410\u044f\u049b\u0442\u0430\u043b\u0443 \u043a\u04af\u043d\u0456:", + "LabelDeathDate": "\u04e8\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456:", "LabelSeasonNumber": "\u041c\u0430\u0443\u0441\u044b\u043c \u043d\u04e9\u043c\u0456\u0440\u0456:", "LabelEpisodeNumber": "\u0411\u04e9\u043b\u0456\u043c \u043d\u04e9\u043c\u0456\u0440\u0456:", "LabelTrackNumber": "\u0416\u043e\u043b\u0448\u044b\u049b \u043d\u04e9\u043c\u0456\u0440\u0456:", "LabelNumber": "\u041d\u04e9\u043c\u0456\u0440\u0456:", "LabelDiscNumber": "\u0414\u0438\u0441\u043a\u0456 \u043d\u04e9\u043c\u0456\u0440\u0456:", - "LabelParentNumber": "\u0422\u0435\u043a\u0442\u0456\u043a \u043d\u04e9\u043c\u0456\u0440:", "SortName": "\u0421\u04b1\u0440\u044b\u043f\u0442\u0430\u043b\u0430\u0442\u044b\u043d \u0430\u0442\u044b", + "LabelParentNumber": "\u0422\u0435\u043a\u0442\u0456\u043a \u043d\u04e9\u043c\u0456\u0440:", "ReleaseDate": "\u0428\u044b\u0493\u0430\u0440\u0443 \u043a\u0435\u0437\u0456", "Continuing": "\u0416\u0430\u043b\u0493\u0430\u0441\u0443\u0434\u0430", - "Ended": "\u0410\u044f\u049b\u0442\u0430\u043b\u0434\u044b", "HeaderEnabledFields": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d \u04e9\u0440\u0456\u0441\u0442\u0435\u0440", + "Ended": "\u0410\u044f\u049b\u0442\u0430\u043b\u0434\u044b", + "Keywords": "\u041a\u0456\u043b\u0442 \u0441\u04e9\u0437\u0434\u0435\u0440", "HeaderEnabledFieldsHelp": "\u049a\u04b1\u0440\u0441\u0430\u0443\u043b\u0430\u0443 \u04af\u0448\u0456\u043d \u0436\u04d9\u043d\u0435 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u04e9\u0437\u0433\u0435\u0440\u0442\u0443\u0456\u043d\u0435 \u0442\u044b\u0439\u044b\u043c \u0441\u0430\u043b\u0443 \u04af\u0448\u0456\u043d, \u04e9\u0440\u0456\u0441\u0442\u0435\u043d \u049b\u04b1\u0441\u0431\u0435\u043b\u0433\u0456\u043d\u0456 \u0430\u043b\u044b\u04a3\u044b\u0437.", + "Name": "\u0410\u0442\u044b", "Backdrops": "\u0410\u0440\u0442\u049b\u044b \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440", "Images": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440", - "Keywords": "\u041a\u0456\u043b\u0442 \u0441\u04e9\u0437\u0434\u0435\u0440", "Runtime": "\u04b0\u0437\u0430\u049b\u0442\u044b\u0493\u044b", - "ProductionLocations": "\u04e8\u043d\u0434\u0456\u0440\u0443 \u043e\u0440\u044b\u043d\u0434\u0430\u0440\u044b", + "Actor": "\u0410\u043a\u0442\u0435\u0440", "BirthLocation": "\u0422\u0443\u0493\u0430\u043d \u043e\u0440\u043d\u044b", + "ProductionLocations": "\u04e8\u043d\u0434\u0456\u0440\u0443 \u043e\u0440\u044b\u043d\u0434\u0430\u0440\u044b", "ParentalRating": "\u0416\u0430\u0441\u0442\u0430\u0441 \u0441\u0430\u043d\u0430\u0442\u044b", - "Name": "\u0410\u0442\u044b", "Overview": "\u0416\u0430\u043b\u043f\u044b \u0448\u043e\u043b\u0443", "LabelType": "\u0422\u04af\u0440\u0456:", "LabelPersonRole": "\u0420\u04e9\u043b\u0456:", "LabelPersonRoleHelp": "\u041c\u044b\u0441\u0430\u043b: \u0411\u0430\u043b\u043c\u04b1\u0437\u0434\u0430\u049b \u0444\u0443\u0440\u0433\u043e\u043d\u044b\u043d\u044b\u04a3 \u0436\u04af\u0440\u0433\u0456\u0437\u0443\u0448\u0456\u0441\u0456", - "Actor": "\u0410\u043a\u0442\u0435\u0440", "Composer": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043e\u0440", - "Director": "\u0420\u0435\u0436\u0438\u0441\u0441\u0435\u0440", "GuestStar": "\u0428\u0430\u049b\u044b\u0440\u044b\u043b\u0493\u0430\u043d \u0430\u043a\u0442\u0435\u0440", + "Director": "\u0420\u0435\u0436\u0438\u0441\u0441\u0435\u0440", "Producer": "\u041f\u0440\u043e\u0434\u044e\u0441\u0435\u0440", "Writer": "\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439\u0448\u0456", - "MessageNoSyncJobsFound": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u0442\u0430\u0440\u044b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b. \u0411\u04af\u043a\u0456\u043b \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0434\u0430\u0493\u044b \u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u043a\u0442\u0435\u0440\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043f \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u0442\u0430\u0440\u044b\u043d \u0436\u0430\u0441\u0430\u04a3\u044b\u0437.", - "MessageNoDownloadsFound": "\u0415\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u0434\u0435\u0440\u0431\u0435\u0441 \u0436\u04af\u043a\u0442\u0435\u0443\u043b\u0435\u0440 \u0436\u043e\u049b. \u0411\u04af\u043a\u0456\u043b \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0434\u0430\u0493\u044b \u0414\u0435\u0440\u0431\u0435\u0441 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u0442\u0443 \u0434\u0435\u0433\u0435\u043d\u0434\u0456 \u043d\u04b1\u049b\u044b\u043f \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u04a3\u0456\u0437\u0434\u0456 \u0434\u0435\u0440\u0431\u0435\u0441 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u0442\u0456\u04a3\u0456\u0437.", - "InstallingPackage": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0443\u0434\u0430", + "MessageItemSaved": "\u0422\u0430\u0440\u043c\u0430\u049b \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.", "PackageInstallCompleted": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0443\u044b \u0430\u044f\u049b\u0442\u0430\u043b\u0434\u044b.", + "InstallingPackage": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0443\u0434\u0430", "PackageInstallFailed": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0443\u044b \u0441\u04d9\u0442\u0441\u0456\u0437.", "PackageInstallCancelled": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0443\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b.", "SeriesYearToPresent": "{0} - \u049b\u0430\u0437\u0456\u0440\u0434\u0435", - "ValueOneItem": "1 \u0442\u0430\u0440\u043c\u0430\u049b", "ValueOneSong": "1 \u04d9\u0443\u0435\u043d", "ValueSongCount": "{0} \u04d9\u0443\u0435\u043d", "ValueOneMovie": "1 \u0444\u0438\u043b\u044c\u043c", "ValueMovieCount": "{0} \u0444\u0438\u043b\u044c\u043c", "ValueOneSeries": "1 \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f", - "ValueSeriesCount": "{0} \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f", "ValueOneEpisode": "1 \u0431\u04e9\u043b\u0456\u043c", + "ValueSeriesCount": "{0} \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f", "ValueEpisodeCount": "{0} \u0431\u04e9\u043b\u0456\u043c", "ValueOneGame": "1 \u043e\u0439\u044b\u043d", - "ValueGameCount": "{0} \u043e\u0439\u044b\u043d", "ValueOneAlbum": "1 \u0430\u043b\u044c\u0431\u043e\u043c", - "ValueAlbumCount": "{0} \u0430\u043b\u044c\u0431\u043e\u043c", + "ValueGameCount": "{0} \u043e\u0439\u044b\u043d", "ValueOneMusicVideo": "1 \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044b\u049b \u0431\u0435\u0439\u043d\u0435", + "ValueAlbumCount": "{0} \u0430\u043b\u044c\u0431\u043e\u043c", "ValueMusicVideoCount": "{0} \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044b\u049b \u0431\u0435\u0439\u043d\u0435", "ValueMinutes": "{0} \u043c\u0438\u043d", "HeaderIdentifyItemHelp": "\u0406\u0437\u0434\u0435\u0443\u0434\u0456\u04a3 \u0431\u0456\u0440 \u043d\u0435 \u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0448\u0430\u0440\u0442\u044b\u043d \u0435\u043d\u0433\u0456\u0437\u0456\u04a3\u0456\u0437. \u0406\u0437\u0434\u0435\u0443 \u043d\u04d9\u0442\u0438\u0436\u0435\u043b\u0435\u0440\u0456\u043d \u043a\u04e9\u0431\u0435\u0439\u0442\u0443 \u04af\u0448\u0456\u043d \u0448\u0430\u0440\u0442\u0442\u044b \u0430\u043b\u0430\u0441\u0442\u0430\u04a3\u044b\u0437.", "PleaseEnterNameOrId": "\u0410\u0442\u044b\u043d \u043d\u0435\u043c\u0435\u0441\u0435 \u0441\u044b\u0440\u0442\u049b\u044b ID \u0435\u043d\u0433\u0456\u0437\u0456\u04a3\u0456\u0437.", - "MessageItemSaved": "\u0422\u0430\u0440\u043c\u0430\u049b \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.", "SearchResults": "\u0406\u0437\u0434\u0435\u0443 \u043d\u04d9\u0442\u0438\u0436\u0435\u043b\u0435\u0440\u0456", "SyncToOtherDevice": "\u0411\u0430\u0441\u049b\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043c\u0435\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", "MakeAvailableOffline": "\u0414\u0435\u0440\u0431\u0435\u0441 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u0442\u0443", - "ServerNameIsRestarting": "Emby Server - {0} \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443\u0434\u0430.", + "ButtonRestart": "\u049a\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443", "ServerNameIsShuttingDown": "Emby Server - {0} \u0436\u04b1\u043c\u044b\u0441\u044b\u043d \u0430\u044f\u049b\u0442\u0430\u0443\u0434\u0430.", + "PleaseRestartServerName": "Emby Server \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443\u0434\u0430.", "HeaderDeleteItems": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u043e\u044e", "ConfirmDeleteItems": "\u041e\u0441\u044b \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u043e\u0439\u0493\u0430\u043d\u0434\u0430, \u043e\u043b\u0430\u0440 \u0444\u0430\u0439\u043b\u0434\u044b\u049b \u0436\u04af\u0439\u0435\u0441\u0456\u043d\u0435\u043d \u0434\u0435 \u0436\u04d9\u043d\u0435 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u04a3\u044b\u0437\u0434\u0430\u043d \u0434\u0430 \u0435\u043a\u0435\u0443\u0456\u043d\u0434\u0435 \u0436\u043e\u0439\u044b\u043b\u0430\u0434. \u0421\u0456\u0437 \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u049b\u0430\u043b\u0430\u0439\u0441\u044b\u0437 \u0431\u0430? \u0428\u044b\u043d\u044b\u043c\u0435\u043d \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", - "PleaseRestartServerName": "Emby Server \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 - {0}.", "SyncJobCreated": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u044b \u0436\u0430\u0441\u0430\u043b\u0434\u044b.", "LabelSyncTo": "\u041e\u0441\u044b\u043c\u0435\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443:", "LabelSyncJobName": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u044b\u043d\u044b\u04a3 \u0430\u0442\u044b:", - "LabelQuality": "\u0421\u0430\u043f\u0430\u0441\u044b:", "LabelSyncNoTargetsHelp": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443\u0434\u0456 \u049b\u043e\u043b\u0434\u0430\u0439\u0442\u044b\u043d \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b.", - "DownloadScheduled": "\u0416\u04af\u043a\u0442\u0435\u0443 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d", - "HeaderSyncRequiresSub": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u04af\u0448\u0456\u043d \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u049b\u0430\u0436\u0435\u0442", + "LabelQuality": "\u0421\u0430\u043f\u0430\u0441\u044b:", "LearnMore": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a \u0431\u0456\u043b\u0443", - "LabelProfile": "\u041f\u0440\u043e\u0444\u0430\u0439\u043b:", + "DownloadScheduled": "\u0416\u04af\u043a\u0442\u0435\u0443 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d", "LabelBitrateMbps": "\u049a\u0430\u0440\u049b\u044b\u043d\u044b (\u041c\u0431\u0438\u0442\/\u0441):", + "LabelProfile": "\u041f\u0440\u043e\u0444\u0430\u0439\u043b:", "SyncUnwatchedVideosOnly": "\u049a\u0430\u0440\u0430\u043b\u043c\u0430\u0493\u0430\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0434\u0456 \u04af\u043d\u0434-\u0456\u0440\u0443", - "SyncUnwatchedVideosOnlyHelp": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u049b\u0430\u0440\u0430\u043b\u043c\u0430\u0493\u0430\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440 \u04af\u043d\u0434-\u0434\u0456, \u049b\u0430\u0440\u0430\u043b\u0493\u0430\u043d\u043d\u0430\u043d \u043a\u0435\u0439\u0456\u043d \u049b\u04b1\u0440-\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u043b\u0430\u0434\u044b.", "AutomaticallySyncNewContent": "\u0416\u0430\u04a3\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", - "AutomaticallySyncNewContentHelp": "\u041e\u0441\u044b \u049b\u0430\u043b\u044c\u0430\u0493\u0430 \u0436\u0430\u04a3\u0430\u0434\u0430\u043d \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d \u043c\u0430\u0437\u043c\u04b1\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u043e\u0441\u044b \u049b\u04b1\u0440-\u043c\u0435\u043d \u04af\u043d\u0434-\u0434\u0456.", - "LabelItemLimit": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440 \u0448\u0435\u0433\u0456:", - "LabelItemLimitHelp": "\u041c\u0456\u043d\u0434\u0435\u0442\u0442\u0456 \u0435\u043c\u0435\u0441: \u04ae\u043d\u0434-\u0442\u0456\u043d \u0442\u0430\u0440\u043c\u0430\u049b \u0441\u0430\u043d\u044b \u0448\u0435\u0433\u0456\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u04a3\u044b\u0437.", "PleaseSelectDeviceToSyncTo": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0456\u043b\u0435\u0442\u0456\u043d \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.", + "LabelItemLimit": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440 \u0448\u0435\u0433\u0456:", + "SyncUnwatchedVideosOnlyHelp": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u049b\u0430\u0440\u0430\u043b\u043c\u0430\u0493\u0430\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440 \u04af\u043d\u0434-\u0434\u0456, \u049b\u0430\u0440\u0430\u043b\u0493\u0430\u043d\u043d\u0430\u043d \u043a\u0435\u0439\u0456\u043d \u049b\u04b1\u0440-\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u043b\u0430\u0434\u044b.", + "LabelItemLimitHelp": "\u041c\u0456\u043d\u0434\u0435\u0442\u0442\u0456 \u0435\u043c\u0435\u0441: \u04ae\u043d\u0434-\u0442\u0456\u043d \u0442\u0430\u0440\u043c\u0430\u049b \u0441\u0430\u043d\u044b \u0448\u0435\u0433\u0456\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u04a3\u044b\u0437.", + "AutomaticallySyncNewContentHelp": "\u041e\u0441\u044b \u049b\u0430\u043b\u044c\u0430\u0493\u0430 \u0436\u0430\u04a3\u0430\u0434\u0430\u043d \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d \u043c\u0430\u0437\u043c\u04b1\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u043e\u0441\u044b \u049b\u04b1\u0440-\u043c\u0435\u043d \u04af\u043d\u0434-\u0434\u0456.", + "Premiere": "\u0422\u04b1\u0441\u0430\u0443\u043a\u0435\u0441\u0435\u0440\u0456", + "Live": "\u0422\u0456\u043a\u0435\u043b\u0435\u0439", + "Repeat": "\u049a\u0430\u0439\u0442\u0430\u043b\u0430\u0443", + "Settings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440", + "DefaultErrorMessage": "\u0421\u0430\u0443\u0430\u043b \u04e9\u04a3\u0434\u0435\u043b\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u043a\u0435\u0439\u0456\u043d \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437.", "Screenshots": "\u042d\u043a\u0440\u0430\u043d \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456", "MoveRight": "\u041e\u04a3\u0493\u0430 \u0436\u044b\u043b\u0436\u044b\u0442\u0443", "MoveLeft": "\u0421\u043e\u043b\u0493\u0430 \u0436\u044b\u043b\u0436\u044b\u0442\u0443", "ConfirmDeleteImage": "\u0421\u0443\u0440\u0435\u0442\u0442\u0456 \u0436\u043e\u044f\u043c\u044b\u0437 \u0431\u0430?", "HeaderEditImages": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u04e9\u04a3\u0434\u0435\u0443", - "Settings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440", "ShowIndicatorsFor": "\u041c\u044b\u043d\u0430\u0443 \u04af\u0448\u0456\u043d \u0431\u0435\u043b\u0433\u0456 \u043a\u04e9\u0440\u0441\u0435\u0442\u0443:", "NewEpisodes": "\u0416\u0430\u04a3\u0430 \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440", + "Premieres": "\u041f\u0440\u0435\u043c\u044c\u0435\u0440\u0430\u043b\u0430\u0440", "HDPrograms": "HD-\u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043c\u0434\u0435\u0440", "LiveBroadcasts": "\u0422\u0456\u043a\u0435\u043b\u0435\u0439 \u0442\u0430\u0440\u0430\u0442\u044b\u043c\u0434\u0430\u0440", - "Premieres": "\u041f\u0440\u0435\u043c\u044c\u0435\u0440\u0430\u043b\u0430\u0440", "RepeatEpisodes": "\u0411\u04e9\u043b\u0456\u043c\u0434\u0435\u0440\u0434\u0456\u04a3 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u043d\u0443\u044b", "DvrSubscriptionRequired": "Emby DVR \u04af\u0448\u0456\u043d \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u049b\u0430\u0436\u0435\u0442", "HeaderCancelRecording": "\u0416\u0430\u0437\u0431\u0430\u043d\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", - "CancelRecording": "\u0416\u0430\u0437\u0443\u0434\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", - "HeaderKeepRecording": "\u0416\u0430\u0437\u0443\u0434\u044b \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u0443", - "HeaderCancelSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", - "HeaderKeepSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u0443", + "PromoConvertRecordingsToStreamingFormat": "Emby Premiere \u0430\u0440\u049b\u044b\u043b\u044b \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443\u0493\u0430 \u043e\u04a3\u0430\u0439 \u043f\u0456\u0448\u0456\u043d\u0434\u0435 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443. \u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440 Emby Server \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456 \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435, \u043d\u0430\u049b\u0442\u044b \u0443\u0430\u049b\u044b\u0442\u0442\u0430 MP4 \u043d\u0435\u043c\u0435\u0441\u0435 MKV \u043f\u0456\u0448\u0456\u043c\u0456\u043d\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0456\u043b\u0435\u0434\u0456.", + "HeaderConvertYourRecordings": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u044b\u04a3\u044b\u0437\u0434\u044b \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443", "HeaderLearnMore": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a \u0431\u0456\u043b\u0443", + "HeaderKeepRecording": "\u0416\u0430\u0437\u0443\u0434\u044b \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u0443", "DeleteMedia": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0456 \u0436\u043e\u044e", "SeriesSettings": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", "HeaderRecordingOptions": "\u0416\u0430\u0437\u0443 \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u044b", - "CancelSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", "DoNotRecord": "\u0416\u0430\u0437\u0443\u0493\u0430 \u0431\u043e\u043b\u043c\u0430\u0439\u0434\u044b", - "HeaderSeriesOptions": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u044b", + "CancelSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", "LabelChannels": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440:", + "HeaderSeriesOptions": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u044b", "ChannelNameOnly": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 {0} \u0430\u0440\u043d\u0430\u0441\u044b", "Anytime": "\u04d8\u0440\u043a\u0435\u0437\u0434\u0435", "AroundTime": "{0} \u0430\u0439\u043d\u0430\u043b\u0430\u0441\u044b\u043d\u0434\u0430", "LabelAirtime": "\u042d\u0444\u0438\u0440 \u0443\u0430\u049b\u044b\u0442\u044b:", - "AllChannels": "\u0411\u0430\u0440\u043b\u044b\u049b \u0430\u0440\u043d\u0430\u043b\u0430\u0440", "LabelRecord": "\u0416\u0430\u0437\u0443:", + "AllChannels": "\u0411\u0430\u0440\u043b\u044b\u049b \u0430\u0440\u043d\u0430\u043b\u0430\u0440", "NewEpisodesOnly": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u0430\u04a3\u0430 \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440\u0434\u0456", "AllEpisodes": "\u0411\u0430\u0440\u043b\u044b\u049b \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440", "LabelStartWhenPossible": "\u041c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430 \u0431\u0430\u0441\u0442\u0430\u0443:", "LabelStopWhenPossible": "\u041c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430 \u0442\u043e\u049b\u0442\u0430\u0442\u0443:", "MinutesBefore": "\u043c\u0438\u043d\u0443\u0442 \u0430\u043b\u0434\u044b\u043d\u0434\u0430", - "MinutesAfter": "\u043c\u0438\u043d\u0443\u0442 \u0441\u043e\u04a3\u044b\u04a3\u0434\u0430", - "SkipEpisodesAlreadyInMyLibrary": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043c\u0434\u0430 \u0431\u0430\u0440 \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440\u0434\u0456 \u0436\u0430\u0437\u0431\u0430\u0443", "SkipEpisodesAlreadyInMyLibraryHelp": "\u049a\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430, \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440 \u043c\u0430\u0443\u0441\u044b\u043c \u0436\u04d9\u043d\u0435 \u0431\u04e9\u043b\u0456\u043c \u043d\u04e9\u043c\u0456\u0440\u043b\u0435\u0440\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0441\u0430\u043b\u044b\u0441\u0442\u044b\u0440\u044b\u043b\u0430\u0434\u044b.", + "SkipEpisodesAlreadyInMyLibrary": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043c\u0434\u0430 \u0431\u0430\u0440 \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440\u0434\u0456 \u0436\u0430\u0437\u0431\u0430\u0443", + "MinutesAfter": "\u043c\u0438\u043d\u0443\u0442 \u0441\u043e\u04a3\u044b\u04a3\u0434\u0430", "LabelKeepUpTo": "\u041e\u0441\u044b\u0493\u0430\u043d \u0434\u0435\u0439\u0456\u043d \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u0443:", "AsManyAsPossible": "\u041c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u043d\u0448\u0435 \u043a\u04e9\u043f", - "DefaultErrorMessage": "\u0421\u0430\u0443\u0430\u043b \u04e9\u04a3\u0434\u0435\u043b\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u043a\u0435\u0439\u0456\u043d \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437.", - "LabelKeep:": "\u04b0\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u0443:", "UntilIDelete": "\u041c\u0435\u043d \u0436\u043e\u0439\u0493\u0430\u043d\u0448\u0430 \u0434\u0435\u0439\u0456\u043d", + "LabelKeep:": "\u04b0\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u0443:", "UntilSpaceNeeded": "\u041e\u0440\u044b\u043d \u043a\u0435\u0440\u0435\u043a \u0431\u043e\u043b\u0493\u0430\u043d\u0448\u0430 \u0434\u0435\u0439\u0456\u043d", - "Categories": "\u0421\u0430\u043d\u0430\u0442\u0442\u0430\u0440", "Sports": "\u0421\u043f\u043e\u0440\u0442", + "Categories": "\u0421\u0430\u043d\u0430\u0442\u0442\u0430\u0440", "News": "\u0416\u0430\u04a3\u0430\u043b\u044b\u049b", "Movies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440", "Kids": "\u0411\u0430\u043b\u0430\u043b\u044b\u049b", "EnableColorCodedBackgrounds": "\u0422\u04af\u0441\u043f\u0435\u043d \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u043d\u0433\u0435\u043d \u04e9\u04a3\u0434\u0435\u0440\u0434\u0456 \u049b\u043e\u0441\u0443", "SortChannelsBy": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440\u0434\u044b \u0441\u04b1\u0440\u044b\u043f\u0442\u0430\u0443 \u0442\u04d9\u0441\u0456\u043b\u0456:", - "RecentlyWatched": "\u0416\u0443\u044b\u049b\u0442\u0430 \u049b\u0430\u0440\u0430\u043b\u0493\u0430\u043d", "ChannelNumber": "\u0410\u0440\u043d\u0430 \u043d\u04e9\u043c\u0456\u0440\u0456", + "RecentlyWatched": "\u0416\u0443\u044b\u049b\u0442\u0430 \u049b\u0430\u0440\u0430\u043b\u0493\u0430\u043d", + "PlaceFavoriteChannelsAtBeginning": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0430\u0440\u043d\u0430\u043b\u0430\u0440\u0434\u044b \u0435\u04a3 \u0431\u0430\u0441\u044b\u043d\u0430\u043d \u043e\u0440\u043d\u0430\u043b\u0430\u0441\u0442\u044b\u0440\u0443", + "SeriesCancelled": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b.", + "HeaderKeepSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u0443", + "HeaderCancelSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", + "CancelRecording": "\u0416\u0430\u0437\u0443\u0434\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", + "MessageUnlockAppWithSupporter": "\u041e\u0441\u044b \u049b\u04b1\u0440\u0430\u043c\u0434\u0430\u0441\u0442\u044b \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u04b1\u0440\u0441\u0430\u0443\u0434\u0430\u043d \u0431\u043e\u0441\u0430\u0442\u0443.", + "MessageUnlockAppWithPurchaseOrSupporter": "\u041e\u0441\u044b \u049b\u04b1\u0440\u0430\u043c\u0434\u0430\u0441\u0442\u044b \u0431\u0456\u0440 \u0436\u043e\u043b\u0493\u044b \u0441\u0430\u0442\u044b\u043f \u0430\u043b\u0443, \u043d\u0435\u043c\u0435\u0441\u0435 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u04b1\u0440\u0441\u0430\u0443\u0434\u0430\u043d \u0431\u043e\u0441\u0430\u0442\u0443.", + "MessageToValidateSupporter": "\u0415\u0433\u0435\u0440 \u0441\u0456\u0437\u0434\u0435 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u0431\u043e\u043b\u0441\u0430, Emby Server \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d\u0434\u0430\u0493\u044b Emby Premiere \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u044b\u043f \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d\u0456\u043d\u0435 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437. \u0411\u04b1\u043b \u0431\u0430\u0441\u0442\u044b \u043c\u04d9\u0437\u0456\u0440\u0434\u0435 Emby Premiere \u0434\u0435\u0433\u0435\u043d\u0434\u0456 \u043d\u04b1\u049b\u044b\u043f \u049b\u0430\u0442\u044b\u043d\u0430\u0443\u043b\u044b.", + "HeaderCinemaMode": "\u041a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440 \u0440\u0435\u0436\u0456\u043c\u0456", + "HeaderCloudSync": "\u0411\u04b1\u043b\u0442 \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", + "HeaderOfflineDownloads": "\u0414\u0435\u0440\u0431\u0435\u0441 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a", + "HeaderOfflineDownloadsDescription": "\u041e\u04a3\u0430\u0439 \u0434\u0435\u0440\u0431\u0435\u0441 \u049b\u043e\u043b\u0434\u0430\u043d\u0443 \u04af\u0448\u0456\u043d \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b\u04a3\u044b\u0437\u0493\u0430 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u044b\u04a3\u044b\u0437.", + "CloudSyncFeatureDescription": "\u0421\u0430\u049b\u0442\u044b\u049b \u043a\u04e9\u0448\u0456\u0440\u043c\u0435\u043d\u0456, \u043c\u04b1\u0440\u0430\u0493\u0430\u0442\u0442\u0430\u0443\u0434\u044b \u0436\u04d9\u043d\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443\u0434\u0456 \u0436\u0435\u04a3\u0456\u043b\u0434\u0435\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0431\u04b1\u043b\u0442\u043f\u0435\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0456\u04a3\u0456\u0437.", + "CoverArtFeatureDescription": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0436\u0435\u043a\u0435\u043b\u0435\u0443\u0433\u0435 \u043a\u04e9\u043c\u0435\u043a\u0442\u0435\u0441\u0443 \u04af\u0448\u0456\u043d Cover Art \u049b\u044b\u0437\u044b\u049b\u0442\u044b \u043c\u04b1\u049b\u0430\u0431\u0430\u043b\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u049b\u0430 \u0434\u0430 \u04e9\u04a3\u0434\u0435\u0442\u0443\u043b\u0435\u0440\u0434\u0456 \u0436\u0430\u0441\u0430\u0439\u0434\u044b.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "\u041a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440 \u0440\u0435\u0436\u0456\u043c\u0456 \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440\u0434\u0456 \u0436\u04d9\u043d\u0435 \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043a\u04e9\u0440\u043d\u0435\u0443\u0434\u0456 \u0444\u0438\u043b\u044c\u043c \u0430\u043b\u0434\u044b\u043d\u0434\u0430 \u043e\u0439\u043d\u0430\u0442\u0443 \u043a\u0438\u043d\u043e\u0437\u0430\u043b \u04d9\u0441\u0435\u0440\u0456\u043d \u0436\u0435\u0442\u043a\u0456\u0437\u0435\u0434\u0456.", + "HeaderFreeApps": "\u0422\u0435\u0433\u0456\u043d Emby \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b", + "FreeAppsFeatureDescription": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b\u04a3\u044b\u0437 \u04af\u0448\u0456\u043d Emby-\u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b\u043d\u0430 \u0442\u0435\u0433\u0456\u043d \u049b\u0430\u0442\u044b\u043d\u0430\u04a3\u044b\u0437.", + "LabelEmailAddress": "\u042d-\u043f\u043e\u0448\u0442\u0430 \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b:", "HeaderBenefitsEmbyPremiere": "Emby Premiere \u0430\u0440\u0442\u044b\u049b\u0448\u044b\u043b\u044b\u049b\u0442\u0430\u0440\u044b", "ThankYouForTryingEnjoyOneMinute": "\u0411\u0456\u0440 \u043c\u0438\u043d\u04e9\u0442 \u043e\u0439\u043d\u0430\u0442\u0443\u0434\u044b \u0442\u0430\u043c\u0430\u0448\u0430\u043b\u0430\u04a3\u044b\u0437. Emby \u0441\u044b\u043d\u0430\u043f \u043a\u04e9\u0440\u0433\u0435\u043d\u0456\u04a3\u0456\u0437\u0433\u0435 \u0440\u0430\u049b\u043c\u0435\u0442.", "HeaderTryPlayback": "\u041e\u0439\u043d\u0430\u0442\u0443\u0434\u044b \u0441\u044b\u043d\u0430\u043f \u043a\u04e9\u0440\u0456\u04a3\u0456\u0437", + "IPurchasedThisApp": "\u041c\u0435\u043d \u043e\u0441\u044b \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043d\u044b \u0441\u0430\u0442\u044b\u043f \u0430\u043b\u0434\u044b\u043c", "HowDidYouPay": "\u049a\u0430\u043b\u0430\u0439 \u0442\u04e9\u043b\u0435\u0434\u0456\u04a3\u0456\u0437?", "IHaveEmbyPremiere": "\u041c\u0435\u043d\u0434\u0435 Emby Premiere \u0431\u0430\u0440", - "IPurchasedThisApp": "\u041c\u0435\u043d \u043e\u0441\u044b \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043d\u044b \u0441\u0430\u0442\u044b\u043f \u0430\u043b\u0434\u044b\u043c", "ButtonRestorePreviousPurchase": "\u0421\u0430\u0442\u044b\u043f \u0430\u043b\u0493\u0430\u043d\u0434\u044b \u049b\u0430\u043b\u043f\u044b\u043d\u0430 \u043a\u0435\u043b\u0442\u0456\u0440\u0443", "ButtonUnlockWithPurchase": "\u0421\u0430\u0442\u044b\u043f \u0430\u043b\u0443\u043c\u0435\u043d \u049b\u04b1\u0440\u0441\u0430\u0443\u0434\u0430\u043d \u0431\u043e\u0441\u0430\u0442\u0443", "ButtonUnlockPrice": "{0} \u049b\u04b1\u043b\u044b\u043f\u0442\u0430\u043c\u0430\u0443", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere \u0430\u0439 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 {0}", - "HeaderAlreadyPaid": "\u04d8\u043b\u0434\u0435\u049b\u0430\u0448\u0430\u043d \u0442\u04e9\u043b\u0435\u043d\u0434\u0456 \u043c\u0435?", "ButtonPlayOneMinute": "\u0411\u0456\u0440 \u043c\u0438\u043d\u04e9\u0442 \u043e\u0439\u043d\u0430\u0442\u0443", - "PlaceFavoriteChannelsAtBeginning": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0430\u0440\u043d\u0430\u043b\u0430\u0440\u0434\u044b \u0435\u04a3 \u0431\u0430\u0441\u044b\u043d\u0430\u043d \u043e\u0440\u043d\u0430\u043b\u0430\u0441\u0442\u044b\u0440\u0443", "HeaderUnlockFeature": "\u0410\u0440\u0442\u044b\u049b\u0448\u044b\u043b\u044b\u049b \u049b\u04b1\u0440\u0441\u0430\u0443\u044b\u043d \u0431\u043e\u0441\u0430\u0442\u0443", "MessageDidYouKnowCinemaMode": "Emby Premiere \u0430\u0440\u049b\u044b\u043b\u044b, \u041a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440 \u0440\u0435\u0436\u0456\u043c\u0456 \u0441\u0438\u044f\u049b\u0442\u044b \u049b\u04b1\u0440\u0430\u043c\u0434\u0430\u0441\u0442\u0430\u0440\u043c\u0435\u043d \u0442\u04d9\u0436\u0456\u0440\u0438\u0431\u0435\u04a3\u0456\u0437\u0434\u0456 \u0436\u0430\u049b\u0441\u0430\u0440\u0442\u0443\u044b\u04a3\u044b\u0437 \u043c\u04af\u043c\u043a\u0456\u043d \u0442\u0443\u0440\u0430\u043b\u044b \u0431\u0456\u043b\u0435\u0441\u0456\u0437 \u0431\u0435?", "MessageDidYouKnowCinemaMode2": "\u041a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440 \u0440\u0435\u0436\u0456\u043c\u0456 \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440\u0434\u0456 \u0436\u04d9\u043d\u0435 \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043a\u04e9\u0440\u043d\u0435\u0443\u0434\u0456 \u043d\u0435\u0433\u0456\u0437\u0433\u0456 \u0444\u0438\u043b\u044c\u043c \u0430\u043b\u0434\u044b\u043d\u0434\u0430 \u043e\u0439\u043d\u0430\u0442\u0443 \u043a\u0438\u043d\u043e\u0437\u0430\u043b \u04d9\u0441\u0435\u0440\u0456\u043d \u0436\u0435\u0442\u043a\u0456\u0437\u0435\u0434\u0456.", - "HeaderPlayMyMedia": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043c\u0434\u0456 \u043e\u0439\u043d\u0430\u0442\u0443", "HeaderDiscoverEmbyPremiere": "Emby Premiere \u0430\u0448\u044b\u04a3\u044b\u0437", - "Items": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440", + "HeaderPlayMyMedia": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043c\u0434\u0456 \u043e\u0439\u043d\u0430\u0442\u0443", "OneChannel": "\u0411\u0456\u0440 \u0430\u0440\u043d\u0430\u0434\u0430\u043d", - "ConfirmRemoveDownload": "\u0416\u04af\u043a\u0442\u0435\u0443\u0434\u0456 \u0430\u043b\u0430\u0441\u0442\u0430\u0439\u043c\u044b\u0437 \u0431\u0430?", - "RemoveDownload": "\u0416\u04af\u043a\u0442\u0435\u0443\u0434\u0456 \u0430\u043b\u0430\u0441\u0442\u0430\u0443", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere \u0430\u0439 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 {0}", + "HeaderAlreadyPaid": "\u04d8\u043b\u0434\u0435\u049b\u0430\u0448\u0430\u043d \u0442\u04e9\u043b\u0435\u043d\u0434\u0456 \u043c\u0435?", "AddedOnValue": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d\u0456 {0}", + "ConfirmRemoveDownload": "\u0416\u04af\u043a\u0442\u0435\u0443\u0434\u0456 \u0430\u043b\u0430\u0441\u0442\u0430\u0439\u043c\u044b\u0437 \u0431\u0430?", + "CancelSyncJobConfirmation": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u044b\u043d \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443\u044b \u043a\u0435\u043b\u0435\u0441\u0456 \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0456 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0456\u043b\u0433\u0435\u043d \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0436\u043e\u044f\u0434\u044b. \u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043a\u0456\u0440\u0456\u0441\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", + "ButtonCancelSyncJob": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443\u0434\u0456 \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", + "MessageNoSyncJobsFound": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u0442\u0430\u0440\u044b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b. \u0411\u04af\u043a\u0456\u043b \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0434\u0430\u0493\u044b \u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u043a\u0442\u0435\u0440\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043f \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u0442\u0430\u0440\u044b\u043d \u0436\u0430\u0441\u0430\u04a3\u044b\u0437.", + "MessageNoDownloadsFound": "\u0415\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u0434\u0435\u0440\u0431\u0435\u0441 \u0436\u04af\u043a\u0442\u0435\u0443\u043b\u0435\u0440 \u0436\u043e\u049b. \u0411\u04af\u043a\u0456\u043b \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0434\u0430\u0493\u044b \u0414\u0435\u0440\u0431\u0435\u0441 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u0442\u0443 \u0434\u0435\u0433\u0435\u043d\u0434\u0456 \u043d\u04b1\u049b\u044b\u043f \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u04a3\u0456\u0437\u0434\u0456 \u0434\u0435\u0440\u0431\u0435\u0441 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u0442\u0456\u04a3\u0456\u0437.", + "ValueOneItem": "1 \u0442\u0430\u0440\u043c\u0430\u049b", + "HeaderSyncRequiresSub": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u04af\u0448\u0456\u043d \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u049b\u0430\u0436\u0435\u0442", + "Items": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440", + "RemoveDownload": "\u0416\u04af\u043a\u0442\u0435\u0443\u0434\u0456 \u0430\u043b\u0430\u0441\u0442\u0430\u0443", "RemovingFromDevice": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u0443\u0434\u0430", "RemoveFromDevice": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u0443", "KeepOnDevice": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430 \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u0443", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "\u0410\u0443\u044b\u0441\u0442\u044b\u0440\u044b\u043b\u0443\u0493\u0430 \u0434\u0430\u0439\u044b\u043d", "SyncJobItemStatusSyncedMarkForRemoval": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u0443\u0434\u0430", "SyncJobItemStatusQueued": "\u041a\u0435\u0437\u0435\u043a\u0442\u0435", - "SyncJobItemStatusConverting": "\u0422\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443\u0434\u0435", "SyncJobItemStatusTransferring": "\u0410\u0443\u044b\u0441\u0442\u044b\u0440\u044b\u043b\u0443\u0434\u0430", - "SyncJobItemStatusSynced": "\u0416\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0434\u044b", - "SyncJobItemStatusFailed": "\u0421\u04d9\u0442\u0441\u0456\u0437", + "SyncJobItemStatusConverting": "\u0422\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443\u0434\u0435", "SyncJobItemStatusRemovedFromDevice": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u043b\u0493\u0430\u043d", "SyncJobItemStatusCancelled": "\u0411\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b", + "SyncJobItemStatusSynced": "\u0416\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0434\u044b", + "SyncJobItemStatusFailed": "\u0421\u04d9\u0442\u0441\u0456\u0437", "Retry": "\u049a\u0430\u0439\u0442\u0430\u043b\u0430\u0443", "HeaderMyDevice": "\u041c\u0435\u043d\u0456\u04a3 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043c", + "ContinueInSecondsValue": "\u0416\u0430\u043b\u0493\u0430\u0441\u044b {0} \u0441 \u043a\u0435\u0439\u0456\u043d", "Continue": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443", - "ContinueInSecondsValue": "{0} \u0441 \u043a\u0435\u0439\u0456\u043d \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443" + "AddToPlayQueue": "\u041e\u0439\u043d\u0430\u0442\u0443 \u043a\u0435\u0437\u0435\u0433\u0456\u043d\u0435 \u04af\u0441\u0442\u0435\u0443", + "HeaderRemoteControl": "\u049a\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443", + "Disconnect": "\u0410\u0436\u044b\u0440\u0430\u0442\u0443", + "EnableDisplayMirroring": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u0443\u0434\u0456\u04a3 \u0442\u0435\u043b\u043d\u04b1\u0441\u049b\u0430\u0441\u044b\u043d \u049b\u043e\u0441\u0443", + "HeaderSelectPlayer": "\u041e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u044b \u0442\u0430\u04a3\u0434\u0430\u0443", + "Quality": "\u0421\u0430\u043f\u0430\u0441\u044b", + "Auto": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json index 8f55463444..a376db84e1 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "\ucd94\uac00", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "TV \ubc29\uc1a1 \uac00\uc774\ub4dc\ub294 \ud604\uc7ac {0} \ucc44\ub110\uc5d0 \uc81c\ud55c\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc81c\ud55c \ud480\uae30 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \ubaa8\ub4e0 \uacbd\ud5d8\uc744 \uc990\uae30\uc138\uc694.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "\ubc18\ubcf5", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "\ub0a0\uc9dc \uc120\ud0dd", "TrackCount": "{0} tracks", "ItemCount": "{0} \ud56d\ubaa9", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "\ub0a0\uc9dc \uc120\ud0dd", - "ButtonOk": "OK", "ButtonCancel": "\ucde8\uc18c", + "ButtonOk": "OK", "ButtonGotIt": "Got It", - "ButtonRestart": "\ub2e4\uc2dc \uc2dc\uc791", - "RecordingCancelled": "\ub179\ud654\uac00 \ucde8\uc18c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "TV \ubc29\uc1a1 \uac00\uc774\ub4dc\ub294 \ud604\uc7ac {0} \ucc44\ub110\uc5d0 \uc81c\ud55c\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc81c\ud55c \ud480\uae30 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \ubaa8\ub4e0 \uacbd\ud5d8\uc744 \uc990\uae30\uc138\uc694.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "\ub300\uae30", "Monday": "\uc6d4\uc694\uc77c", "Tuesday": "\ud654\uc694\uc77c", "Wednesday": "\uc218\uc694\uc77c", "Thursday": "\ubaa9\uc694\uc77c", - "Friday": "\uae08\uc694\uc77c", "Saturday": "\ud1a0\uc694\uc77c", "Days": "\uc77c", + "Friday": "\uae08\uc694\uc77c", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "\uc790\ub3d9 \uc2dc\ub9ac\uc988 \ub179\ud654\ub97c \uc608\uc57d\ud558\ub824\uba74 Emby \ud504\ub9ac\ubbf8\uc5b4 \uac00\uc785\uc774 \ud544\uc694\ud569\ub2c8\ub2e4.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "\ub179\ud654", + "Advanced": "Advanced", + "Download": "\ub2e4\uc6b4\ub85c\ub4dc", + "Refresh": "\uc0c8\ub85c \uace0\uce68", + "RefreshQueued": "Refresh queued.", "Save": "\uc800\uc7a5", "Edit": "\ud3b8\uc9d1", - "Download": "\ub2e4\uc6b4\ub85c\ub4dc", - "Advanced": "Advanced", "Delete": "\uc0ad\uc81c", "HeaderDeleteItem": "\ud56d\ubaa9 \uc0ad\uc81c", "ConfirmDeleteItem": "\uc774 \ud56d\ubaa9\uc744 \uc0ad\uc81c\ud558\uba74 \ud30c\uc77c \uc2dc\uc2a4\ud15c\uacfc \ub77c\uc774\ube0c\ub7ec\ub9ac \ubaa8\ub450\uc5d0\uc11c \uc0ad\uc81c\ub429\ub2c8\ub2e4. \uacc4\uc18d\ud558\uaca0\uc2b5\ub2c8\uae4c?", - "Refresh": "\uc0c8\ub85c \uace0\uce68", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "\uceec\ub809\uc158\uc5d0 \ucd94\uac00", "NewCollection": "\uc0c8 \uceec\ub809\uc158", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "\ub3c4\uc6c0\ub9d0", + "LabelName": "Name:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "\uc778\ud130\ub137\uc5d0\uc11c \uc544\ud2b8\uc6cc\ud06c\uc640 \uba54\ud0c0\ub370\uc774\ud130 \uac80\uc0c9", - "LabelName": "Name:", "NewCollectionNameExample": "Example: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "\uc7ac\uc0dd\ubaa9\ub85d:", "AddToPlaylist": "\uc7ac\uc0dd\ubaa9\ub85d\uc5d0 \ucd94\uac00", - "HeaderAddToPlaylist": "\uc7ac\uc0dd\ubaa9\ub85d\uc5d0 \ucd94\uac00", + "RecordingCancelled": "\ub179\ud654\uac00 \ucde8\uc18c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "\uc790\ub9c9 \uac80\uc0c9", "LabelLanguage": "\uc5b8\uc5b4:", "Search": "\ucc3e\uae30", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "\uc790\ub9c9 \ud3b8\uc9d1", + "SearchForSubtitles": "\uc790\ub9c9 \uac80\uc0c9", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "\uba54\ud0c0\ub370\uc774\ud130 \uc0c8\ub85c \uace0\uce68", "ReplaceExistingImages": "\ud604\uc7ac \uc774\ubbf8\uc9c0 \uad50\uccb4", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "\ud56d\ubaa9\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "\ub2e4\uc2dc \uc2dc\ub3c4\ud558\uc138\uc694", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "\ub2e4\uc2dc \uc2dc\ub3c4\ud558\uc138\uc694", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "\ub514\uc2a4\ud06c {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "\uc88b\uc544\ud568", "Dislike": "\uc2eb\uc5b4\ud568", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "\uc5f4\uae30", - "Play": "\uc7ac\uc0dd", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "\uc778\uc2a4\ud134\ud2b8 \ubbf9\uc2a4", "ViewAlbum": "\uc568\ubc94 \ubcf4\uae30", "ViewArtist": "\uc544\ud2f0\uc2a4\ud2b8 \ubcf4\uae30", + "Play": "\uc7ac\uc0dd", + "Shuffle": "Shuffle", + "InstantMix": "\uc778\uc2a4\ud134\ud2b8 \ubbf9\uc2a4", "QueueAllFromHere": "\uc5ec\uae30\ubd80\ud130 \ubaa8\ub450 \ub300\uae30\uc5f4\uc5d0 \ucd94\uac00", "PlayAllFromHere": "\uc5ec\uae30\ubd80\ud130 \ubaa8\ub450 \uc7ac\uc0dd", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "\uc7ac\uc0dd\ubaa9\ub85d\uc5d0\uc11c \uc81c\uac70", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "\uc7ac\uc0dd\ubaa9\ub85d\uc5d0\uc11c \uc81c\uac70", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "\ucd5c\uc18c \ub450 \uac1c\uc758 \ud56d\ubaa9\uc744 \uc120\ud0dd\ud558\uc138\uc694.", + "Error": "\uc624\ub958", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "\ub179\ud654 \ucde8\uc18c \ud655\uc778", "MessageConfirmRecordingCancellation": "\uc774 \ub179\ud654\ub97c \ucde8\uc18c\ud558\uaca0\uc2b5\ub2c8\uae4c?", - "Error": "\uc624\ub958", + "HeaderAddToCollection": "\uceec\ub809\uc158\uc5d0 \ucd94\uac00", + "HeaderAddToPlaylist": "\uc7ac\uc0dd\ubaa9\ub85d\uc5d0 \ucd94\uac00", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "\ucf58\ud150\uce20 \uc885\ub958:", + "Add": "\ucd94\uac00", "LabelPath": "Path:", + "LabelContentType": "\ucf58\ud150\uce20 \uc885\ub958:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "\uc0c1\ud0dc:", "LabelArtists": "\uc544\ud2f0\uc2a4\ud2b8:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "\uc568\ubc94 \uc544\ud2f0\uc2a4\ud2b8:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "\uc568\ubc94", - "LabelCommunityRating": "\ucee4\ubba4\ub2c8\ud2f0 \ud3c9\uc810:", "LabelVoteCount": "\ud3c9\uac00 \ud69f\uc218:", + "LabelCommunityRating": "\ucee4\ubba4\ub2c8\ud2f0 \ud3c9\uc810:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic \ud3c9\uc810:", "LabelCriticRatingSummary": "Critic \ud3c9\uc810 \uc694\uc57d:", "LabelAwardSummary": "\uc218\uc0c1 \uc694\uc57d:", "LabelWebsite": "\uc6f9\uc0ac\uc774\ud2b8:", "LabelTagline": "\ud0dc\uadf8\ub77c\uc778:", - "LabelOverview": "\uc904\uac70\ub9ac:", "LabelShortOverview": "\uc904\uac70\ub9ac \uc694\uc57d:", + "LabelOverview": "\uc904\uac70\ub9ac:", "LabelReleaseDate": "\uac1c\ubd09\uc77c:", "LabelYear": "Year:", "LabelPlaceOfBirth": "\ucd9c\uc0dd\uc9c0:", "LabelAirDays": "\ubc29\uc601\uc77c:", "LabelAirTime": "\ubc29\uc601 \uc2dc\uac01:", - "LabelRuntimeMinutes": "\uc0c1\uc601 \uc2dc\uac04 (\ubd84):", "LabelParentalRating": "\ub4f1\uae09:", - "LabelCustomRating": "\uc0ac\uc6a9\uc790 \ud3c9\uc810:", - "LabelBudget": "\uc81c\uc791\ube44", + "LabelRuntimeMinutes": "\uc0c1\uc601 \uc2dc\uac04 (\ubd84):", "LabelRevenue": "\uc218\uc775 ($):", - "LabelOriginalAspectRatio": "\uc6d0 \ud654\uba74\ube44\uc728:", + "LabelBudget": "\uc81c\uc791\ube44", + "LabelCustomRating": "\uc0ac\uc6a9\uc790 \ud3c9\uc810:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "\uc6d0 \ud654\uba74\ube44\uc728:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D \ud615\uc2dd:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "DVD \uc2dc\uc98c \ubc88\ud638:", "LabelDvdEpisodeNumber": "DVD \uc5d0\ud53c\uc18c\ub4dc \ubc88\ud638:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "\uc2a4\ud398\uc15c \uc5d0\ud53c\uc18c\ub4dc \uc815\ubcf4", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "\ub2e4\uc6b4\ub85c\ub4dc \uc120\ud638 \uc5b8\uc5b4:", "LabelLockItemToPreventChanges": "\ubcc0\uacbd\ud560 \uc218 \uc5c6\uac8c \ud56d\ubaa9 \uc7a0\uae08", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "\uad6d\uac00:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "\uc0dd\ub144:", "LabelBirthDate": "\uc0dd\uc77c:", - "LabelDeathDate": "\uc0ac\ub9dd\uc77c:", "LabelEndDate": "End date:", + "LabelDeathDate": "\uc0ac\ub9dd\uc77c:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "\ud2b8\ub799 \ubc88\ud638:", "LabelNumber": "\ubc88\ud638:", "LabelDiscNumber": "\ub514\uc2a4\ud06c \ubc88\ud638", - "LabelParentNumber": "Parent number:", "SortName": "\uc815\ub82c \uc81c\ubaa9", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "\ud0a4\uc6cc\ub4dc", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "\ubc30\uacbd", "Images": "\uc774\ubbf8\uc9c0", - "Keywords": "\ud0a4\uc6cc\ub4dc", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "\ubc30\uc6b0", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "\ubc30\uc6b0", "Composer": "\uc791\uace1\uac00", - "Director": "\uac10\ub3c5", "GuestStar": "Guest star", + "Director": "\uac10\ub3c5", "Producer": "\ud504\ub85c\ub4c0\uc11c", "Writer": "\uc791\uac00", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "{0} \uc124\uce58 \uc911", + "MessageItemSaved": "\ud56d\ubaa9\uc774 \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", "PackageInstallCompleted": "{0} \uc124\uce58 \uc644\ub8cc.", + "InstallingPackage": "{0} \uc124\uce58 \uc911", "PackageInstallFailed": "{0} \uc124\uce58 \uc2e4\ud328.", "PackageInstallCancelled": "{0} \uc124\uce58 \ucde8\uc18c.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 \ub178\ub798", "ValueSongCount": "{0} \ub178\ub798", "ValueOneMovie": "1 \uc601\ud654", "ValueMovieCount": "{0} \uc601\ud654", "ValueOneSeries": "1 \uc2dc\ub9ac\uc988", - "ValueSeriesCount": "{0} \uc2dc\ub9ac\uc988", "ValueOneEpisode": "1 \uc5d0\ud53c\uc18c\ub4dc", + "ValueSeriesCount": "{0} \uc2dc\ub9ac\uc988", "ValueEpisodeCount": "{0} \uc5d0\ud53c\uc18c\ub4dc", "ValueOneGame": "1 \uac8c\uc784", - "ValueGameCount": "{0} \uac8c\uc784", "ValueOneAlbum": "1 \uc568\ubc94", - "ValueAlbumCount": "{0} \uc568\ubc94", + "ValueGameCount": "{0} \uac8c\uc784", "ValueOneMusicVideo": "1 \ubba4\uc9c1 \ube44\ub514\uc624", + "ValueAlbumCount": "{0} \uc568\ubc94", "ValueMusicVideoCount": "{0} \ubba4\uc9c1 \ube44\ub514\uc624", "ValueMinutes": "{0} \ubd84", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "\ud56d\ubaa9\uc774 \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "\ub2e4\uc2dc \uc2dc\uc791", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "\ub3d9\uae30\ud654 \uc791\uc5c5\uc774 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", "LabelSyncTo": "\ub3d9\uae30\ud654 \uc7a5\uce58:", "LabelSyncJobName": "\ub3d9\uae30\ud654 \uc791\uc5c5 \uc774\ub984:", - "LabelQuality": "\ud488\uc9c8:", "LabelSyncNoTargetsHelp": "\ud604\uc7ac \ub3d9\uae30\ud654\ub97c \uc9c0\uc6d0\ud558\ub294 \uc571\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "\ud488\uc9c8:", "LearnMore": "\ub354 \uc54c\uc544\ubcf4\uae30", - "LabelProfile": "\ud504\ub85c\ud30c\uc77c:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "\ube44\ud2b8\ub808\uc774\ud2b8 (Mbps):", + "LabelProfile": "\ud504\ub85c\ud30c\uc77c:", "SyncUnwatchedVideosOnly": "\uc2dc\uccad\ud558\uc9c0 \uc54a\uc740 \ube44\ub514\uc624\ub9cc \ub3d9\uae30\ud654", - "SyncUnwatchedVideosOnlyHelp": "\uc2dc\uccad\ud558\uc9c0 \uc54a\uc740 \ube44\ub514\uc624\ub9cc \ub3d9\uae30\ud654\ub418\uba70 \uc2dc\uccad\ud55c \ube44\ub514\uc624\ub294 \uc7a5\uce58\uc5d0\uc11c \uc0ad\uc81c\ub429\ub2c8\ub2e4.", "AutomaticallySyncNewContent": "\uc0c8 \ucf58\ud150\ud2b8 \uc790\ub3d9 \ub3d9\uae30\ud654", - "AutomaticallySyncNewContentHelp": "\uc0c8 \ucf58\ud150\ud2b8\uac00 \uc7a5\uce58\ub85c \ub3d9\uae30\ud654\ub418\uc5b4 \uc790\ub3d9\uc73c\ub85c \ucd94\uac00\ub429\ub2c8\ub2e4.", - "LabelItemLimit": "\ud56d\ubaa9 \uc81c\ud55c:", - "LabelItemLimitHelp": "\uc120\ud0dd\uc0ac\ud56d. \ub3d9\uae30\ud654 \ud560 \ud56d\ubaa9 \uc218\ub97c \uc81c\ud55c\ud569\ub2c8\ub2e4.", "PleaseSelectDeviceToSyncTo": "\ub3d9\uae30\ud654 \ud560 \uc7a5\uce58\ub97c \uc120\ud0dd\ud558\uc138\uc694.", + "LabelItemLimit": "\ud56d\ubaa9 \uc81c\ud55c:", + "SyncUnwatchedVideosOnlyHelp": "\uc2dc\uccad\ud558\uc9c0 \uc54a\uc740 \ube44\ub514\uc624\ub9cc \ub3d9\uae30\ud654\ub418\uba70 \uc2dc\uccad\ud55c \ube44\ub514\uc624\ub294 \uc7a5\uce58\uc5d0\uc11c \uc0ad\uc81c\ub429\ub2c8\ub2e4.", + "LabelItemLimitHelp": "\uc120\ud0dd\uc0ac\ud56d. \ub3d9\uae30\ud654 \ud560 \ud56d\ubaa9 \uc218\ub97c \uc81c\ud55c\ud569\ub2c8\ub2e4.", + "AutomaticallySyncNewContentHelp": "\uc0c8 \ucf58\ud150\ud2b8\uac00 \uc7a5\uce58\ub85c \ub3d9\uae30\ud654\ub418\uc5b4 \uc790\ub3d9\uc73c\ub85c \ucd94\uac00\ub429\ub2c8\ub2e4.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "\ubc18\ubcf5", + "Settings": "\uc124\uc815", + "DefaultErrorMessage": "\uc694\uad6c \ucc98\ub9ac \uacfc\uc815\uc5d0 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uc600\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud558\uc138\uc694.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "\uc124\uc815", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "\uc694\uad6c \ucc98\ub9ac \uacfc\uc815\uc5d0 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uc600\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud558\uc138\uc694.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json index 471c427e2e..b322fb989f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Add", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "Cancel", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", "Wednesday": "Wednesday", "Thursday": "Thursday", - "Friday": "Friday", "Saturday": "Saturday", "Days": "Days", + "Friday": "Friday", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "Save", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "Name:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "Name:", "NewCollectionNameExample": "Example: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Language:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Content type:", + "Add": "Add", "LabelPath": "Path:", + "LabelContentType": "Content type:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Country:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json index 72671b7ebd..9bb769535c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Spesial - {0}", - "Share": "Del", - "Add": "Legg til", - "ServerUpdateNeeded": "Denne Emby serveren m\u00e5 oppdateres. For \u00e5 laste ned siste versjonen, vennligst bes\u00f8k: {0}", - "LiveTvGuideRequiresUnlock": "Live TV Guide er forel\u00f8pig begrenset til {0} kanaler. Klikk p\u00e5 utl\u00f8serknappen for \u00e5 l\u00e6re hvorda du kan f\u00e5 nyte den fulle opplevelsen.", + "OptionTuesdayShort": "Tir", + "OptionMondayShort": "Man", "AttributeNew": "Ny", - "Premiere": "Premiere", - "Live": "Direkte", - "Repeat": "Gjenta", + "ServerUpdateNeeded": "Denne Emby serveren m\u00e5 oppdateres. For \u00e5 laste ned siste versjonen, vennligst bes\u00f8k: {0}", + "Share": "Del", + "OptionSundayShort": "S\u00f8n", + "OptionThursdayShort": "Tor", + "OptionSaturdayShort": "L\u00f8r", + "OptionWednesdayShort": "Ons", + "OptionFridayShort": "Fre", + "HeaderSelectDate": "Velg dato", "TrackCount": "{0} spor", "ItemCount": "{0} elementer", - "ReleaseYearValue": "Utgivelse \u00e5r: {0}", "OriginalAirDateValue": "Original utgivelse dato: {0}", + "ReleaseYearValue": "Utgivelse \u00e5r: {0}", "EndsAtValue": "Ender p\u00e5 {0}", - "OptionSundayShort": "S\u00f8n", - "OptionMondayShort": "Man", - "OptionTuesdayShort": "Tir", - "OptionWednesdayShort": "Ons", - "OptionThursdayShort": "Tor", - "OptionFridayShort": "Fre", - "OptionSaturdayShort": "L\u00f8r", - "HeaderSelectDate": "Velg dato", - "ButtonOk": "Ok", "ButtonCancel": "Avbryt", + "ButtonOk": "Ok", "ButtonGotIt": "Har det", - "ButtonRestart": "Omstart", - "RecordingCancelled": "Opptak er Avbrutt.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "Live TV Guide er forel\u00f8pig begrenset til {0} kanaler. Klikk p\u00e5 utl\u00f8serknappen for \u00e5 l\u00e6re hvorda du kan f\u00e5 nyte den fulle opplevelsen.", "RecordingScheduled": "Opptak planlegger", - "SeriesRecordingScheduled": "Serie opptak planlagt.", "HeaderNewRecording": "Nye opptak:", "Sunday": "S\u00f8ndag", "Monday": "Mandag", "Tuesday": "Tirsdag", "Wednesday": "Onsdag", "Thursday": "Torsdag", - "Friday": "Fredag", "Saturday": "L\u00f8rdag", "Days": "Dager", + "Friday": "Fredag", "RecordSeries": "Ta opp serien", - "HeaderCinemaMode": "Kino Modus", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Skaff Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Et aktivt Emby Premiere abonnement er p\u00e5krevd for \u00e5 kunne automatisere serieopptak.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Denne funksjonen krever et aktivt Emby Premiere abonnement.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Opptak", + "Advanced": "Avansert", + "Download": "Nedlasting", + "Refresh": "Oppdater", + "RefreshQueued": "Oppdatering k\u00f8", "Save": "Lagre", "Edit": "Rediger", - "Download": "Nedlasting", - "Advanced": "Avansert", "Delete": "Slett", "HeaderDeleteItem": "Slett element", "ConfirmDeleteItem": "Sletter elementet fra b\u00e5de filsystemet og biblioteket. Er du sikker p\u00e5 at du vil fortsette?", - "Refresh": "Oppdater", - "RefreshQueued": "Oppdatering k\u00f8", - "AddToCollection": "Legg til i samling", - "HeaderAddToCollection": "Legg til samling", "NewCollection": "Ny Samling", + "AddToCollection": "Legg til i samling", "LabelCollection": "Samling:", "Help": "Hjelp", + "LabelName": "Navn", "NewCollectionHelp": "Samlinger tillate deg \u00e5 lage personlige grupperinger av filmer og annet bibliotek innhold.", "SearchForCollectionInternetMetadata": "S\u00f8k p\u00e5 internet for artwork og metadata", - "LabelName": "Navn", "NewCollectionNameExample": "Eksempel: Star Wars-samling", - "MessageItemsAdded": "Elementer lagt til.", "OptionNew": "Ny...", + "MessageItemsAdded": "Elementer lagt til.", "LabelPlaylist": "Spilleliste", "AddToPlaylist": "Legg til spilleliste", - "HeaderAddToPlaylist": "Legg til Spilleliste", + "RecordingCancelled": "Opptak er Avbrutt.", + "SeriesRecordingScheduled": "Serie opptak planlagt.", "Subtitles": "Undertekster", - "SearchForSubtitles": "S\u00f8k etter undertekster", "LabelLanguage": "Spr\u00e5k:", "Search": "S\u00f8k", "NoSubtitleSearchResultsFound": "Ingen resulterer funnet.", @@ -99,54 +68,57 @@ "MySubtitles": "Mine undertekster", "MessageDownloadQueued": "Nedlasting satt til i k\u00f8", "EditSubtitles": "Endre undertekster", + "SearchForSubtitles": "S\u00f8k etter undertekster", "UnlockGuide": "L\u00e5s opp Guide", "RefreshMetadata": "Oppfrisk Metadata", "ReplaceExistingImages": "Bytt ut eksisterende bilder", "ReplaceAllMetadata": "Erstatt all metadata", "SearchForMissingMetadata": "S\u00f8k etter manglende metadata", "LabelRefreshMode": "Oppdatering modus:", + "RefreshDialogHelp": "Metadata er oppdatert basert p\u00e5 innstillinger og internett-tjenester som er aktivert i Emby Server dashbordet", "NoItemsFound": "Ingen elementer funnet", "HeaderSaySomethingLike": "Si noenting slik som...", - "ButtonTryAgain": "Pr\u00f8v igjen", "HeaderYouSaid": "Du sa...", - "MessageWeDidntRecognizeCommand": "Vi beklager, Vi kunne ikke forst\u00e5 denne kommandoen.", "MessageIfYouBlockedVoice": "Hvis du nektet tale tilgang til applikasjonen m\u00e5 du rekonfigurere f\u00f8r du pr\u00f8ver igjen.", + "ButtonTryAgain": "Pr\u00f8v igjen", + "MessageWeDidntRecognizeCommand": "Vi beklager, Vi kunne ikke forst\u00e5 denne kommandoen.", "ValueDiscNumber": "Disk {0}", - "Unrated": "Uvurdert", "Favorite": "Favoritt", + "Unrated": "Uvurdert", "Like": "Liker", "Dislike": "Misliker", - "RefreshDialogHelp": "Metadata er oppdatert basert p\u00e5 innstillinger og internett-tjenester som er aktivert i Emby Server dashbordet", "Open": "\u00c5pne", - "Play": "Spill", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identifiser", - "EditImages": "Endre bilder", - "EditInfo": "Endre informasjon", - "Sync": "Synk", - "InstantMix": "Direktemiks", "ViewAlbum": "Vis album", "ViewArtist": "See artist", + "Play": "Spill", + "Shuffle": "Shuffle", + "InstantMix": "Direktemiks", "QueueAllFromHere": "K\u00f8 alt herfra", "PlayAllFromHere": "Spill alt herfra", + "Identify": "Identifiser", + "EditImages": "Endre bilder", + "Sync": "Synk", + "EditInfo": "Endre informasjon", + "RemoveFromPlaylist": "Fjern fra spilleliste", "PlayFromBeginning": "Start fra starten", "ResumeAt": "Forsett fra {0}", - "RemoveFromPlaylist": "Fjern fra spilleliste", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Merker som sett", "MarkUnplayed": "Merker som usett", "GroupVersions": "Gruppering av versjoner", "PleaseSelectTwoItems": "Vennligst velg minst to elementer.", + "Error": "Feil", "TryMultiSelect": "Pr\u00f8v flervalg", "TryMultiSelectMessage": "Hvis du vil redigere flere medier elementer, klikker du bare og hold en plakat og velg elementene du \u00f8nsker \u00e5 administrere. Pr\u00f8v det!", "HeaderConfirmRecordingCancellation": "Bekreft Avbryt Opptak", "MessageConfirmRecordingCancellation": "Er du sikker p\u00e5 at du vil avbryte dette opptaket?", - "Error": "Feil", + "HeaderAddToCollection": "Legg til samling", + "HeaderAddToPlaylist": "Legg til Spilleliste", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Innholdstype:", + "Add": "Legg til", "LabelPath": "Sti:", + "LabelContentType": "Innholdstype:", "LabelTitle": "Tittel:", "LabelOriginalTitle": "Original tittel:", "LabelSortTitle": "Forkortet tittel:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Konfigurer hvordan dato er fastsatt i Emby Server sitt dashbord under Bibliotek innstillinger", "LabelStatus": "Status:", "LabelArtists": "Artister:", - "LabelArtistsHelp": "Skill flere med semikolon ;", "LabelAlbumArtists": "Album artister:", + "LabelArtistsHelp": "Skill flere med semikolon ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Fellesskap anmeldelse:", "LabelVoteCount": "Stemme tall:", + "LabelCommunityRating": "Fellesskap anmeldelse:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Kritiker anmeldelse:", "LabelCriticRatingSummary": "Kritiker anmeldelse sammendrag:", "LabelAwardSummary": "Pris sammendrag:", "LabelWebsite": "Nettsted:", "LabelTagline": "Slagord:", - "LabelOverview": "Oversikt:", "LabelShortOverview": "Kort oversikt:", + "LabelOverview": "Oversikt:", "LabelReleaseDate": "Utgivelsesdato:", "LabelYear": "Year:", "LabelPlaceOfBirth": "F\u00f8dested:", "LabelAirDays": "Sendings dager:", "LabelAirTime": "Sendings tid:", - "LabelRuntimeMinutes": "Spilletid (minutter):", "LabelParentalRating": "Foreldresensur:", - "LabelCustomRating": "Kunde anmeldelse:", - "LabelBudget": "Budsjett", + "LabelRuntimeMinutes": "Spilletid (minutter):", "LabelRevenue": "Inntjening ($):", - "LabelOriginalAspectRatio": "Originalt sideforhold:", + "LabelBudget": "Budsjett", + "LabelCustomRating": "Kunde anmeldelse:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Originalt sideforhold:", + "LabelAbsoluteEpisodeNumber": "absolutt episode nummer:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternativ Episode nummerering", "LabelDvdSeasonNumber": "Dvd sesong nummer:", "LabelDvdEpisodeNumber": "Dvd episode nummer:", - "LabelAbsoluteEpisodeNumber": "absolutt episode nummer:", "HeaderSpecialEpisodeInfo": "Spesial Episode info", "LabelAirsBeforeSeason": "Send f\u00f8r sesong:", "LabelAirsAfterSeason": "Sendt etter sesong:", @@ -201,172 +173,195 @@ "People": "Mennesker", "LabelMetadataDownloadLanguage": "Foretrukket nedlastingsspr\u00e5k:", "LabelLockItemToPreventChanges": "L\u00e5s dette elementet for \u00e5 hindre fremtidige endringer", - "MessageLeaveEmptyToInherit": "La v\u00e6re blank for \u00e5 arve innstillinger fra et foreldre element, eller den globale standard verdien.", "LabelCountry": "Land:", + "MessageLeaveEmptyToInherit": "La v\u00e6re blank for \u00e5 arve innstillinger fra et foreldre element, eller den globale standard verdien.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "F\u00f8dsels\u00e5r:", "LabelBirthDate": "F\u00f8dselsdato:", - "LabelDeathDate": "D\u00f8dsdato:", "LabelEndDate": "Slutt dato:", + "LabelDeathDate": "D\u00f8dsdato:", "LabelSeasonNumber": "Sesong nummer:", "LabelEpisodeNumber": "Episode nummer:", "LabelTrackNumber": "Spor nummer:", "LabelNumber": "Nummer:", "LabelDiscNumber": "Disk nummer", - "LabelParentNumber": "Forelder-ID", "SortName": "Sorterings navn", + "LabelParentNumber": "Forelder-ID", "ReleaseDate": "Utgivelse dao", "Continuing": "Fortsetter", - "Ended": "Avsluttet", "HeaderEnabledFields": "Aktiverte felt", + "Ended": "Avsluttet", + "Keywords": "N\u00f8kkelord", "HeaderEnabledFieldsHelp": "Fjern merket et felt for \u00e5 l\u00e5se den og hindre sine data blir endret.", + "Name": "Navn", "Backdrops": "Backdrops", "Images": "Bilder", - "Keywords": "N\u00f8kkelord", "Runtime": "Spilletid", - "ProductionLocations": "Production locations", + "Actor": "Skuespiller", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Navn", "Overview": "Oversikt", "LabelType": "Type:", "LabelPersonRole": "Rolle:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Skuespiller", "Composer": "Komponist", - "Director": "Regiss\u00f8r", "GuestStar": "Gjeste skuespiller", + "Director": "Regiss\u00f8r", "Producer": "Produsent", "Writer": "Manus", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installerer {0}", + "MessageItemSaved": "Element lagret.", "PackageInstallCompleted": "{0} installering fullf\u00f8rt.", + "InstallingPackage": "Installerer {0}", "PackageInstallFailed": "{0} installasjon feilet.", "PackageInstallCancelled": "{0} installasjon avbrutt.", "SeriesYearToPresent": "{0}-N\u00e5", - "ValueOneItem": "1 item", "ValueOneSong": "1 sang", "ValueSongCount": "{0} sanger", "ValueOneMovie": "1 film", "ValueMovieCount": "{0} filmer", "ValueOneSeries": "1 serie", - "ValueSeriesCount": "{0} serier", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} serier", "ValueEpisodeCount": "{0} episoder", "ValueOneGame": "1 spill", - "ValueGameCount": "{0} spill", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} album", + "ValueGameCount": "{0} spill", "ValueOneMusicVideo": "1 musikkvideo", + "ValueAlbumCount": "{0} album", "ValueMusicVideoCount": "{0} musikkvideoer", "ValueMinutes": "{0} minutter", "HeaderIdentifyItemHelp": "Oppgi ett eller flere s\u00f8ke kriterier. Fjern kriterie for \u00e5 \u00f8ke s\u00f8ke resultater.", "PleaseEnterNameOrId": "Vennligst skriv ett navn eller en ekstern id.", - "MessageItemSaved": "Element lagret.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Omstart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Slett elementer", "ConfirmDeleteItems": "Slette disse elementene vil slette dem fra b\u00e5de filsystemet og mediebiblioteket . Er du sikker p\u00e5 at du vil fortsette?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Synkroniseringsjobb p\u00e5begynt.", "LabelSyncTo": "Synkroniser til:", "LabelSyncJobName": "Navn p\u00e5 synkroniseringsjobb:", - "LabelQuality": "Kvalitet:", "LabelSyncNoTargetsHelp": "Det ser ikke ut til at du har noen applikasjoner som st\u00f8tter synkronisering.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Kvalitet:", "LearnMore": "L\u00e6re mer", - "LabelProfile": "Profil:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profil:", "SyncUnwatchedVideosOnly": "Synkroniser kun usette videoer", - "SyncUnwatchedVideosOnlyHelp": "Kun usette videoer blir synkronisert, og videoer blir fjernet fra enheten s\u00e5 snart de er sett.", "AutomaticallySyncNewContent": "Automatisk synkroniser nytt innhold", - "AutomaticallySyncNewContentHelp": "Nytt innhold blir automatisk synkronisert til enheten.", - "LabelItemLimit": "Begrenset antall:", - "LabelItemLimitHelp": "Valgfri. Sett en grense for hvor mange enheter som skal synkroniseres.", "PleaseSelectDeviceToSyncTo": "Velg enhet \u00e5 synkronisere til.", + "LabelItemLimit": "Begrenset antall:", + "SyncUnwatchedVideosOnlyHelp": "Kun usette videoer blir synkronisert, og videoer blir fjernet fra enheten s\u00e5 snart de er sett.", + "LabelItemLimitHelp": "Valgfri. Sett en grense for hvor mange enheter som skal synkroniseres.", + "AutomaticallySyncNewContentHelp": "Nytt innhold blir automatisk synkronisert til enheten.", + "Premiere": "Premiere", + "Live": "Direkte", + "Repeat": "Gjenta", + "Settings": "Innstillinger", + "DefaultErrorMessage": "Det skjedde en feil under behandling av foresp\u00f8rselen. Vennligst pr\u00f8v igjen senere.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Innstillinger", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "Det skjedde en feil under behandling av foresp\u00f8rselen. Vennligst pr\u00f8v igjen senere.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Kino Modus", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json index f35d5315f2..cf0e162562 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Ontgrendel deze functie met een kleine eenmalige aankoop, of met een actief Emby Premiere abonnement.", - "MessageUnlockAppWithSupporter": "Ontgrendel deze functie met een actief Emby Premiere abonnement.", - "MessageToValidateSupporter": "Als u een actieve Emby Premiere abonnement heeft , zorg er dan voor dat u deze activeert in uw Emby Server Dashboard door te klikken op Emby Premiere in het hoofdmenu.", "ValueSpecialEpisodeName": "Speciaal - {0}", - "Share": "Delen", - "Add": "Toevoegen", - "ServerUpdateNeeded": "Deze Emby Server moet worden bijgewerkt. Om de laatste versie te downloaden, gaat u naar {0}", - "LiveTvGuideRequiresUnlock": "De Live TV Gids is momenteel gelimiteerd tot {0} kanalen. Klik op de Geef vrij knop om te zien hoe u deze limiet op kunt heffen.", + "OptionTuesdayShort": "Di", + "OptionMondayShort": "Ma", "AttributeNew": "Nieuw", - "Premiere": "Premi\u00e8re", - "Live": "Live", - "Repeat": "Herhaling", + "ServerUpdateNeeded": "Deze Emby Server moet worden bijgewerkt. Om de laatste versie te downloaden, gaat u naar {0}", + "Share": "Delen", + "OptionSundayShort": "Zo", + "OptionThursdayShort": "Do", + "OptionSaturdayShort": "Za", + "OptionWednesdayShort": "Wo", + "OptionFridayShort": "Vr", + "HeaderSelectDate": "Selecteer Datum", "TrackCount": "{0} nummers", "ItemCount": "{0} items", - "ReleaseYearValue": "Jaar van uitgifte: {0}", "OriginalAirDateValue": "Originele uitzenddatum: {0}", + "ReleaseYearValue": "Jaar van uitgifte: {0}", "EndsAtValue": "Eindigt om {0}", - "OptionSundayShort": "Zo", - "OptionMondayShort": "Ma", - "OptionTuesdayShort": "Di", - "OptionWednesdayShort": "Wo", - "OptionThursdayShort": "Do", - "OptionFridayShort": "Vr", - "OptionSaturdayShort": "Za", - "HeaderSelectDate": "Selecteer Datum", - "ButtonOk": "Ok", "ButtonCancel": "Annuleren", + "ButtonOk": "Ok", "ButtonGotIt": "Begrepen", - "ButtonRestart": "Herstart", - "RecordingCancelled": "Opname geannuleerd.", - "SeriesCancelled": "Serie geannuleerd.", + "LiveTvGuideRequiresUnlock": "De Live TV Gids is momenteel gelimiteerd tot {0} kanalen. Klik op de Geef vrij knop om te zien hoe u deze limiet op kunt heffen.", "RecordingScheduled": "Opname schema", - "SeriesRecordingScheduled": "Serieopname gepland.", "HeaderNewRecording": "Nieuwe opname", "Sunday": "Zondag", "Monday": "Maandag", "Tuesday": "Dinsdag", "Wednesday": "Woensdag", "Thursday": "Donderdag", - "Friday": "Vrijdag", "Saturday": "Zaterdag", "Days": "Dagen", + "Friday": "Vrijdag", "RecordSeries": "Series Opnemen", - "HeaderCinemaMode": "Bioscoop mode", - "HeaderCloudSync": "Cloud Synchronisatie", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media naar je apparaten voor gemakkelijk offlineebruik.", - "CloudSyncFeatureDescription": "Synchroniseer uw media naar de cloud voor eenvoudige backup, archivering en conversie.", - "CoverArtFeatureDescription": "Cover Art cre\u00ebert leuke covers en andere bewerkingen om u te helpen uw mediabeelden te personaliseren.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Bioscoop mode geeft u de ware bioscoopervaring met trailers en aangepaste intro voor de weergave van uw keuze.", - "HeaderFreeApps": "Gratis Emby Apps", - "FreeAppsFeatureDescription": "Geniet van gratis toegang tot Emby apps voor uw apparaten.", "HeaderBecomeProjectSupporter": "Verkrijg Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Er is een actief Emby Premiere abonnement benodigd om een automatische serie opname aan te maken.", - "LabelEmailAddress": "E-mailadres:", - "PromoConvertRecordingsToStreamingFormat": "Automatisch converteren opnames naar een streaming formaat met Emby Premiere. Opnames zullen on the fly worden omgezet naar MP4 of MKV, op basis van deEmby server instellingen.", "FeatureRequiresEmbyPremiere": "Deze functie vereist een actieve Emby Premiere abonnement.", - "HeaderConvertYourRecordings": "Opnames omzetten", "Record": "Opnemen", + "Advanced": "Geavanceerd", + "Download": "Downloaden", + "Refresh": "Vernieuwen", + "RefreshQueued": "Vernieuwen wachtrij", "Save": "Opslaan", "Edit": "Bewerken", - "Download": "Downloaden", - "Advanced": "Geavanceerd", "Delete": "Verwijderen", "HeaderDeleteItem": "Item verwijderen", "ConfirmDeleteItem": "Verwijderen van dit item zal het verwijderen uit zowel het bestandssysteem als de Media Bibliotheek. Weet u zeker dat u wilt doorgaan?", - "Refresh": "Vernieuwen", - "RefreshQueued": "Vernieuwen wachtrij", - "AddToCollection": "Toevoegen aan Collectie", - "HeaderAddToCollection": "Toevoegen aan Collectie", "NewCollection": "Nieuwe Collectie", + "AddToCollection": "Toevoegen aan Collectie", "LabelCollection": "Collectie", "Help": "Hulp", + "LabelName": "Naam:", "NewCollectionHelp": "Collecties maken het u mogelijk om gepersonaliseerde groeperingen van films en andere bibliotheek inhoud te maken.", "SearchForCollectionInternetMetadata": "Zoeken op het internet voor afbeeldingen en metadata", - "LabelName": "Naam:", "NewCollectionNameExample": "Voorbeeld: Star Wars Collectie", - "MessageItemsAdded": "Items toegevoegd", "OptionNew": "Nieuw ...", + "MessageItemsAdded": "Items toegevoegd", "LabelPlaylist": "Afspeellijst:", "AddToPlaylist": "Toevoegen aan afspeellijst", - "HeaderAddToPlaylist": "Toevoegen aan Afspeellijst", + "RecordingCancelled": "Opname geannuleerd.", + "SeriesRecordingScheduled": "Serieopname gepland.", "Subtitles": "Ondertiteling", - "SearchForSubtitles": "Zoeken naar ondertitels", "LabelLanguage": "Taal:", "Search": "Zoeken", "NoSubtitleSearchResultsFound": "Geen resultaten gevonden.", @@ -99,54 +68,57 @@ "MySubtitles": "Mijn Ondertitels", "MessageDownloadQueued": "Download in de wachtrij geplaatst.", "EditSubtitles": "Bewerk ondertiteling", + "SearchForSubtitles": "Zoeken naar ondertitels", "UnlockGuide": "Gids vrijgeven", "RefreshMetadata": "Vernieuw metagegevens", "ReplaceExistingImages": "Bestaande afbeeldingen vervangen", "ReplaceAllMetadata": "Alle metadata vervangen", "SearchForMissingMetadata": "Zoeken naar missende metadata", "LabelRefreshMode": "Vernieuw-modus", + "RefreshDialogHelp": "Metadata wordt vernieuwd op basis van de instellingen en internet diensten die zijn ingeschakeld in het dashboard van de Emby Server.", "NoItemsFound": "Geen items gevonden.", "HeaderSaySomethingLike": "Zeg iets zoals...", - "ButtonTryAgain": "Opnieuw Proberen", "HeaderYouSaid": "U zei...", - "MessageWeDidntRecognizeCommand": "Sorry, dat commande herkennen we niet.", "MessageIfYouBlockedVoice": "Als u spraak toegang uitgeschakeld heeft moet u dit opnieuw configureren voordat u verder gaat.", + "ButtonTryAgain": "Opnieuw Proberen", + "MessageWeDidntRecognizeCommand": "Sorry, dat commande herkennen we niet.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Geen rating", "Favorite": "Favoriet", + "Unrated": "Geen rating", "Like": "Leuk", "Dislike": "Niet leuk", - "RefreshDialogHelp": "Metadata wordt vernieuwd op basis van de instellingen en internet diensten die zijn ingeschakeld in het dashboard van de Emby Server.", "Open": "Openen", - "Play": "Afspelen", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Willekeurig", - "Identify": "Identificeer", - "EditImages": "Bewerk afbeeldingen", - "EditInfo": "Bewerk Info", - "Sync": "Synchronisatie", - "InstantMix": "Instant mix", "ViewAlbum": "Bekijk album", "ViewArtist": "Bekijk artiest", + "Play": "Afspelen", + "Shuffle": "Willekeurig", + "InstantMix": "Instant mix", "QueueAllFromHere": "Plaats in de wachtrij vanaf hier", "PlayAllFromHere": "Speel allemaal vanaf hier", + "Identify": "Identificeer", + "EditImages": "Bewerk afbeeldingen", + "Sync": "Synchronisatie", + "EditInfo": "Bewerk Info", + "RemoveFromPlaylist": "Verwijderen uit afspeellijst", "PlayFromBeginning": "Afspelen vanaf begin", "ResumeAt": "Hervatten vanaf {0}", - "RemoveFromPlaylist": "Verwijderen uit afspeellijst", - "RemoveFromCollection": "Verwijder uit collectie", "Trailer": "Trailer", "MarkPlayed": "Markeren als Afgespeeld", "MarkUnplayed": "Markeren als Niet Afgespeeld", "GroupVersions": "Versies groeperen", "PleaseSelectTwoItems": "Selecteer ten minste twee items.", + "Error": "Fout", "TryMultiSelect": "Probeer multi-select", "TryMultiSelectMessage": "Als u meerdere media-items wilt bewerken, klikt u er op een poster en hou even vast, selecteer nu de items die u wilt beheren. Probeer maar!", "HeaderConfirmRecordingCancellation": "Bevestigen Annulering Opname", "MessageConfirmRecordingCancellation": "Weet u zeker dat u deze opname wilt annuleren?", - "Error": "Fout", + "HeaderAddToCollection": "Toevoegen aan Collectie", + "HeaderAddToPlaylist": "Toevoegen aan Afspeellijst", + "RemoveFromCollection": "Verwijder uit collectie", "VoiceInput": "Spraak invoer", - "LabelContentType": "Inhoud type:", + "Add": "Toevoegen", "LabelPath": "Pad:", + "LabelContentType": "Inhoud type:", "LabelTitle": "Titel:", "LabelOriginalTitle": "Orginele titel:", "LabelSortTitle": "Sorteer titel:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configureer hoe datum toegevoegd wordt bepaald in het Emby Server dashboard onder de instellingen van de documentbibliotheek", "LabelStatus": "Status:", "LabelArtists": "Artiest:", - "LabelArtistsHelp": "Scheidt meerdere met een ;", "LabelAlbumArtists": "Album artiesten:", + "LabelArtistsHelp": "Scheidt meerdere met een ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Beoordeling gemeenschap:", "LabelVoteCount": "Aantal stemmen:", + "LabelCommunityRating": "Beoordeling gemeenschap:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Beoordeling critici:", "LabelCriticRatingSummary": "Samenvatting beoordeling critici:", "LabelAwardSummary": "Samenvatting prijzen:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overzicht:", "LabelShortOverview": "Kort overzicht:", + "LabelOverview": "Overzicht:", "LabelReleaseDate": "Uitgave datum:", "LabelYear": "Jaar:", "LabelPlaceOfBirth": "Geboorteplaats:", "LabelAirDays": "Uitzend dagen:", "LabelAirTime": "Uitzend tijd:", - "LabelRuntimeMinutes": "Speelduur (minuten):", "LabelParentalRating": "Kijkwijzer classificatie:", - "LabelCustomRating": "Aangepaste classificatie:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Speelduur (minuten):", "LabelRevenue": "Omzet ($):", - "LabelOriginalAspectRatio": "Originele aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Aangepaste classificatie:", "LabelPlayers": "Spelers:", + "LabelOriginalAspectRatio": "Originele aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absoluut afleveringsnummer:", "Label3DFormat": "3D formaat", "HeaderAlternateEpisodeNumbers": "Afwijkende afleveringsnummers", "LabelDvdSeasonNumber": "Dvd seizoensnummer:", "LabelDvdEpisodeNumber": "Dvd afleveringsnummer:", - "LabelAbsoluteEpisodeNumber": "Absoluut afleveringsnummer:", "HeaderSpecialEpisodeInfo": "Speciale afleveringsinformatie", "LabelAirsBeforeSeason": "Uitgezonden voor seizoen:", "LabelAirsAfterSeason": "Uitgezonden na seizoen:", @@ -201,172 +173,195 @@ "People": "Personen", "LabelMetadataDownloadLanguage": "Voorkeurs taal:", "LabelLockItemToPreventChanges": "Blokkeer dit item tegen wijzigingen", - "MessageLeaveEmptyToInherit": "Leeg laten om instellingen van bovenliggend item of de algemene waarde over te nemen.", "LabelCountry": "Land:", + "MessageLeaveEmptyToInherit": "Leeg laten om instellingen van bovenliggend item of de algemene waarde over te nemen.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Geboorte jaar:", "LabelBirthDate": "Geboortedatum:", - "LabelDeathDate": "Overlijdens datum:", "LabelEndDate": "Eind datum|", + "LabelDeathDate": "Overlijdens datum:", "LabelSeasonNumber": "Seizoensnummer:", "LabelEpisodeNumber": "Afleveringsnummer:", "LabelTrackNumber": "Tracknummer:", "LabelNumber": "Nummer:", "LabelDiscNumber": "Disc nummer", - "LabelParentNumber": "Bovenliggend nummer", "SortName": "Sorteerbaar", + "LabelParentNumber": "Bovenliggend nummer", "ReleaseDate": "Uitgave datum", "Continuing": "Wordt vervolgd...", - "Ended": "Gestopt", "HeaderEnabledFields": "Schakel velden in", + "Ended": "Gestopt", + "Keywords": "Trefwoorden", "HeaderEnabledFieldsHelp": "Schakel een veld uit om dit te blokkeren van wijzigingen.", + "Name": "Naam", "Backdrops": "Achtergronden", "Images": "Afbeeldingen", - "Keywords": "Trefwoorden", "Runtime": "Speelduur", - "ProductionLocations": "Productie Locaties", + "Actor": "Acteur", "BirthLocation": "Geboorte Locatie", + "ProductionLocations": "Productie Locaties", "ParentalRating": "Kijkwijzer classificatie", - "Name": "Naam", "Overview": "Overzicht", "LabelType": "Type:", "LabelPersonRole": "Rol:", "LabelPersonRoleHelp": "Voorbeeld: Chauffeur Koeltransport", - "Actor": "Acteur", "Composer": "Componist", - "Director": "Regiseur", "GuestStar": "Gast ster", + "Director": "Regiseur", "Producer": "Producent", "Writer": "Schrijver", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installeren van {0}", + "MessageItemSaved": "Item opgeslagen.", "PackageInstallCompleted": "{0} installatie voltooid.", + "InstallingPackage": "Installeren van {0}", "PackageInstallFailed": "{0} installatie is mislukt.", "PackageInstallCancelled": "{0} installatie geannuleerd.", "SeriesYearToPresent": "{0}-Heden", - "ValueOneItem": "1 item", "ValueOneSong": "1 titel", "ValueSongCount": "{0} titels", "ValueOneMovie": "1 film", "ValueMovieCount": "{0} films", "ValueOneSeries": "1 serie", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 aflevering", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} afleveringen", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 muziek video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} muziek video's", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Vul \u00e9\u00e9n of meer zoek criteria in. Verwijder criteria om zoekresultaten te vergroten.", "PleaseEnterNameOrId": "Voer een naam of een externe Id in", - "MessageItemSaved": "Item opgeslagen.", "SearchResults": "Zoekresultaten", "SyncToOtherDevice": "Synchroniseren met een ander apparaat", "MakeAvailableOffline": "Maak offline beschikbaar", - "ServerNameIsRestarting": "Emby Server - {0} is opnieuw aan het opstarten.", + "ButtonRestart": "Herstart", "ServerNameIsShuttingDown": "Emby Server - {0} is aan het afsluiten.", + "PleaseRestartServerName": "Herstart Emby Server - {0} aub.", + "ServerNameIsRestarting": "Emby Server - {0} is opnieuw aan het opstarten.", "HeaderDeleteItems": "Verwijder items", "ConfirmDeleteItems": "Het verwijderen van deze items verwijdert ze van het bestandssysteem en uit uw bibliotheek. Weet u zeker dat u verder wilt gaan?", - "PleaseRestartServerName": "Herstart Emby Server - {0} aub.", "SyncJobCreated": "Synchronisatie taak gemaakt.", "LabelSyncTo": "Synchroniseer naar:", "LabelSyncJobName": "Naam synchroniseer taak:", - "LabelQuality": "Kwaliteit", "LabelSyncNoTargetsHelp": "Het lijkt erop dat u momenteel geen apps heeft die synchroniseren ondersteunen.", - "DownloadScheduled": "Download gepland", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Kwaliteit", "LearnMore": "Meer informatie", - "LabelProfile": "profiel:", + "DownloadScheduled": "Download gepland", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "profiel:", "SyncUnwatchedVideosOnly": "Synchroniseer alleen onbekeken video's", - "SyncUnwatchedVideosOnlyHelp": "Alleen onbekeken video's zullen worden gesynchroniseerd en van het apparaat worden verwijderd als ze bekeken zijn.", "AutomaticallySyncNewContent": "Nieuwe inhoud automatisch synchroniseren", - "AutomaticallySyncNewContentHelp": "Nieuwe inhoud zal automatisch met het apparaat gesynchroniseerd worden.", - "LabelItemLimit": "Item limiet:", - "LabelItemLimitHelp": "Optioneel. Een limiet stellen aan het aantal items die zullen worden gesynchroniseerd.", "PleaseSelectDeviceToSyncTo": "Selecteer een apparaat om mee te synchroniseren.", + "LabelItemLimit": "Item limiet:", + "SyncUnwatchedVideosOnlyHelp": "Alleen onbekeken video's zullen worden gesynchroniseerd en van het apparaat worden verwijderd als ze bekeken zijn.", + "LabelItemLimitHelp": "Optioneel. Een limiet stellen aan het aantal items die zullen worden gesynchroniseerd.", + "AutomaticallySyncNewContentHelp": "Nieuwe inhoud zal automatisch met het apparaat gesynchroniseerd worden.", + "Premiere": "Premi\u00e8re", + "Live": "Live", + "Repeat": "Herhaling", + "Settings": "Instellingen", + "DefaultErrorMessage": "Er is een fout opgetreden. Probeer later opnieuw.", "Screenshots": "Screenshots", "MoveRight": "Naar rechts verplaatsen", "MoveLeft": "Naar links verplaatsen", "ConfirmDeleteImage": "Afbeelding verwijderen?", "HeaderEditImages": "Afbeeldingen bewerken", - "Settings": "Instellingen", "ShowIndicatorsFor": "Toon indicatoren voor:", "NewEpisodes": "Nieuwe afleveringen", + "Premieres": "Premi\u00e8res", "HDPrograms": "HD Programma's", "LiveBroadcasts": "Live uitzendingen", - "Premieres": "Premi\u00e8res", "RepeatEpisodes": "Herhaal afleveringen", "DvrSubscriptionRequired": "Emby DVR vereist een actieve Emby premi\u00e8re-abonnement.", "HeaderCancelRecording": "Opname Annuleren", - "CancelRecording": "Opname annuleren", - "HeaderKeepRecording": "Bewaar opname", - "HeaderCancelSeries": "Annuleren Series", - "HeaderKeepSeries": "Series behouden", + "PromoConvertRecordingsToStreamingFormat": "Automatisch converteren opnames naar een streaming formaat met Emby Premiere. Opnames zullen on the fly worden omgezet naar MP4 of MKV, op basis van deEmby server instellingen.", + "HeaderConvertYourRecordings": "Opnames omzetten", "HeaderLearnMore": "Meer informatie", + "HeaderKeepRecording": "Bewaar opname", "DeleteMedia": "Verwijder media", "SeriesSettings": "Series instellingen", "HeaderRecordingOptions": "Opname instellingen", - "CancelSeries": "Cancel series", "DoNotRecord": "Niet opnemen", - "HeaderSeriesOptions": "Series Opties", + "CancelSeries": "Cancel series", "LabelChannels": "Kanalen:", + "HeaderSeriesOptions": "Series Opties", "ChannelNameOnly": "Alleen kanaal {0}", "Anytime": "Op elk moment", "AroundTime": "Rond {0}", "LabelAirtime": "Uitzendtijd:", - "AllChannels": "Alle kanalen", "LabelRecord": "Opnemen:", + "AllChannels": "Alle kanalen", "NewEpisodesOnly": "Alleen nieuwe afleveringen", "AllEpisodes": "Alle afleveringen", "LabelStartWhenPossible": "Start indien mogelijk:", "LabelStopWhenPossible": "Stop indien mogelijk:", "MinutesBefore": "minuten voor", - "MinutesAfter": "minuten na", - "SkipEpisodesAlreadyInMyLibrary": "Sla afleveringen over die al in mijn bibliotheek voorkomen", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Sla afleveringen over die al in mijn bibliotheek voorkomen", + "MinutesAfter": "minuten na", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "Er is een fout opgetreden. Probeer later opnieuw.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Serie geannuleerd.", + "HeaderKeepSeries": "Series behouden", + "HeaderCancelSeries": "Annuleren Series", + "CancelRecording": "Opname annuleren", + "MessageUnlockAppWithSupporter": "Ontgrendel deze functie met een actief Emby Premiere abonnement.", + "MessageUnlockAppWithPurchaseOrSupporter": "Ontgrendel deze functie met een kleine eenmalige aankoop, of met een actief Emby Premiere abonnement.", + "MessageToValidateSupporter": "Als u een actieve Emby Premiere abonnement heeft , zorg er dan voor dat u deze activeert in uw Emby Server Dashboard door te klikken op Emby Premiere in het hoofdmenu.", + "HeaderCinemaMode": "Bioscoop mode", + "HeaderCloudSync": "Cloud Synchronisatie", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media naar je apparaten voor gemakkelijk offlineebruik.", + "CloudSyncFeatureDescription": "Synchroniseer uw media naar de cloud voor eenvoudige backup, archivering en conversie.", + "CoverArtFeatureDescription": "Cover Art cre\u00ebert leuke covers en andere bewerkingen om u te helpen uw mediabeelden te personaliseren.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Bioscoop mode geeft u de ware bioscoopervaring met trailers en aangepaste intro voor de weergave van uw keuze.", + "HeaderFreeApps": "Gratis Emby Apps", + "FreeAppsFeatureDescription": "Geniet van gratis toegang tot Emby apps voor uw apparaten.", + "LabelEmailAddress": "E-mailadres:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json index e6b068a834..2dc73dbe50 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Dodaj", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Wt.", + "OptionMondayShort": "Pon.", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Powt\u00f3rz", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Ndz.", + "OptionThursdayShort": "Czw.", + "OptionSaturdayShort": "Sob.", + "OptionWednesdayShort": "\u015ar.", + "OptionFridayShort": "Pi\u0105.", + "HeaderSelectDate": "Wybierz Dat\u0119", "TrackCount": "{0} tracks", "ItemCount": "{0} pozycji", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Ndz.", - "OptionMondayShort": "Pon.", - "OptionTuesdayShort": "Wt.", - "OptionWednesdayShort": "\u015ar.", - "OptionThursdayShort": "Czw.", - "OptionFridayShort": "Pi\u0105.", - "OptionSaturdayShort": "Sob.", - "HeaderSelectDate": "Wybierz Dat\u0119", - "ButtonOk": "Ok", "ButtonCancel": "Anuluj", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Nagranie anulowane.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Nagranie zosta\u0142o zaplanowane.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "Nowe nagranie", "Sunday": "Niedziela", "Monday": "Poniedzia\u0142ek", "Tuesday": "Wtorek", "Wednesday": "\u015aroda", "Thursday": "Czwartek", - "Friday": "Pi\u0105tek", "Saturday": "Sobota", "Days": "Dni", + "Friday": "Pi\u0105tek", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Kup Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Aktywna subskrypcja Emby Premiere jest wymagana aby tworzy\u0107 automatyczne nagrania seriali.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Ta funkcja wymaga aktywnej subskrypcji Emby Premiere.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Nagrywaj", + "Advanced": "Zaawansowane", + "Download": "Pobierz", + "Refresh": "Od\u015bwie\u017c", + "RefreshQueued": "Refresh queued.", "Save": "Zapisz", "Edit": "Edytuj", - "Download": "Pobierz", - "Advanced": "Zaawansowane", "Delete": "Skasuj", "HeaderDeleteItem": "Usu\u0144 pozycje", "ConfirmDeleteItem": "Usuni\u0119cie tej pozycji usunie j\u0105 zar\u00f3wno z systemu plik\u00f3w jak i z biblioteki medi\u00f3w. Czy chcesz kontynuowa\u0107?", - "Refresh": "Od\u015bwie\u017c", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Dodaj do kolekcji", - "HeaderAddToCollection": "Dodaj do Kolekcji", "NewCollection": "Nowa Kolekcja", + "AddToCollection": "Dodaj do kolekcji", "LabelCollection": "Collection:", "Help": "Pomoc", + "LabelName": "Imi\u0119:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Szukaj artwork\u00f3w i metadanych w internecie", - "LabelName": "Imi\u0119:", "NewCollectionNameExample": "Przyk\u0142ad: Star Wars Kolekcja", - "MessageItemsAdded": "Items added.", "OptionNew": "Nowy...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlista:", "AddToPlaylist": "Dodaj do Playlisty", - "HeaderAddToPlaylist": "Dodaj do Playlisty", + "RecordingCancelled": "Nagranie anulowane.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Szukaj Napis\u00f3w", "LabelLanguage": "J\u0119zyk:", "Search": "Szukaj", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edytuj napisy", + "SearchForSubtitles": "Szukaj Napis\u00f3w", "UnlockGuide": "Odblokuj Przewodnik", "RefreshMetadata": "Od\u015bwie\u017c metadane", "ReplaceExistingImages": "Zast\u0105p istniej\u0105ce obrazy", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "Nic nie znaleziono.", "HeaderSaySomethingLike": "Powiedz co\u015b jak...", - "ButtonTryAgain": "Spr\u00f3buj ponownie", "HeaderYouSaid": "Powiedzia\u0142e\u015b...", - "MessageWeDidntRecognizeCommand": "Przepraszamy, nie rozpoznali\u015bmy tej komendy.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Spr\u00f3buj ponownie", + "MessageWeDidntRecognizeCommand": "Przepraszamy, nie rozpoznali\u015bmy tej komendy.", "ValueDiscNumber": "P\u0142yta {0}", - "Unrated": "Nieokre\u015blone", "Favorite": "Ulubione", + "Unrated": "Nieokre\u015blone", "Like": "Lubie", "Dislike": "Nie Lubie", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Otw\u00f3rz", - "Play": "Odtwarzaj", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Losowo", - "Identify": "Identyfikuj", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Natychmiastowy mix", "ViewAlbum": "Zobacz album", "ViewArtist": "Zobacz artyst\u00f3w", + "Play": "Odtwarzaj", + "Shuffle": "Losowo", + "InstantMix": "Natychmiastowy mix", "QueueAllFromHere": "Kolejkuj wszystko z tej lokalizacji", "PlayAllFromHere": "Odtwarzaj wszystko z tej lokalizacji", + "Identify": "Identyfikuj", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Usu\u0144 z playlisty", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Usu\u0144 z playlisty", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Prosz\u0119 wybierz przynajmniej dwie pozycje.", + "Error": "B\u0142\u0105d", "TryMultiSelect": "Wypr\u00f3buj multi-zaznaczanie", "TryMultiSelectMessage": "Aby edytowa\u0107 kilka rzeczy naraz, po prostu kliknij i przytrzymaj jak\u0105kolwiek miniaturk\u0119 i zaznacz obiekty kt\u00f3rymi chesz zarz\u0105dza\u0107. To proste!", "HeaderConfirmRecordingCancellation": "Potwierd\u017a Anulowanie Nagrania", "MessageConfirmRecordingCancellation": "Czy jeste\u015b pewien \u017ce chcesz anulowa\u0107 to nagranie?", - "Error": "B\u0142\u0105d", + "HeaderAddToCollection": "Dodaj do Kolekcji", + "HeaderAddToPlaylist": "Dodaj do Playlisty", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Typ zawarto\u015bci", + "Add": "Dodaj", "LabelPath": "\u015acie\u017cka:", + "LabelContentType": "Typ zawarto\u015bci", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Arty\u015bci:", - "LabelArtistsHelp": "Oddziel wiele u\u017cywaj\u0105c ;", "LabelAlbumArtists": "Wynonawcy albumu", + "LabelArtistsHelp": "Oddziel wiele u\u017cywaj\u0105c ;", "LabelAlbum": "Album", - "LabelCommunityRating": "Ocena spo\u0142eczno\u015bci:", "LabelVoteCount": "Liczba g\u0142os\u00f3w:", + "LabelCommunityRating": "Ocena spo\u0142eczno\u015bci:", "LabelMetascore": "Ocena:", "LabelCriticRating": "Ocena krytyk\u00f3w:", "LabelCriticRatingSummary": "Podsumowanie oceny krytyk\u00f3w:", "LabelAwardSummary": "Zdobyte nagrody:", "LabelWebsite": "Strona internetowa", "LabelTagline": "Tagi", - "LabelOverview": "Opis:", "LabelShortOverview": "Streszczenie:", + "LabelOverview": "Opis:", "LabelReleaseDate": "Data wydania:", "LabelYear": "Rok:", "LabelPlaceOfBirth": "Miejsce urodzenia:", "LabelAirDays": "Dni transmisji:", "LabelAirTime": "Czas transmisji:", - "LabelRuntimeMinutes": "Czas (w minutach):", "LabelParentalRating": "Ocena rodzicielska:", - "LabelCustomRating": "Ocena w\u0142asna:", - "LabelBudget": "Bud\u017cet", + "LabelRuntimeMinutes": "Czas (w minutach):", "LabelRevenue": "Doch\u00f3d ($):", - "LabelOriginalAspectRatio": "Oryginalny format obrazu:", + "LabelBudget": "Bud\u017cet", + "LabelCustomRating": "Ocena w\u0142asna:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Oryginalny format obrazu:", + "LabelAbsoluteEpisodeNumber": "Bezwzgl\u0119dny numer odcinka:", "Label3DFormat": "Format 3D:", "HeaderAlternateEpisodeNumbers": "Alternatywna numeracja epizod\u00f3w", "LabelDvdSeasonNumber": "Numer sezonu DVD:", "LabelDvdEpisodeNumber": "Numer odcinka DVD:", - "LabelAbsoluteEpisodeNumber": "Bezwzgl\u0119dny numer odcinka:", "HeaderSpecialEpisodeInfo": "Specjalne informacje o odcinku", "LabelAirsBeforeSeason": "Transmisja prze sezonem:", "LabelAirsAfterSeason": "Transmisja po sezonie:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferowany j\u0119zyk pobierania:", "LabelLockItemToPreventChanges": "Zablokuj t\u0105 pozycj\u0119 aby zapobiec przysz\u0142ym zmianom", - "MessageLeaveEmptyToInherit": "Zostaw puste aby odziedziczy\u0107 ustawienia z nadrz\u0119dnej pozycji, lub globalnej warto\u015bci domy\u015blnej.", "LabelCountry": "Kraj:", + "MessageLeaveEmptyToInherit": "Zostaw puste aby odziedziczy\u0107 ustawienia z nadrz\u0119dnej pozycji, lub globalnej warto\u015bci domy\u015blnej.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Rok urodzenia:", "LabelBirthDate": "Data urodzenia:", - "LabelDeathDate": "Data \u015bmierci:", "LabelEndDate": "Data zako\u0144czenia:", + "LabelDeathDate": "Data \u015bmierci:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Numer utworu:", "LabelNumber": "Numer:", "LabelDiscNumber": "Numer dysku", - "LabelParentNumber": "Numer nadrz\u0119dny", "SortName": "Kr\u00f3tka nazwa:", + "LabelParentNumber": "Numer nadrz\u0119dny", "ReleaseDate": "Release date", "Continuing": "Dalej wy\u015bwietlane", - "Ended": "Zako\u0144czony", "HeaderEnabledFields": "Odblokuj pola", + "Ended": "Zako\u0144czony", + "Keywords": "S\u0142owa kluczowe", "HeaderEnabledFieldsHelp": "Odznacz pole aby zablokowa\u0107 i zapobiec zmianie danych.", + "Name": "Name", "Backdrops": "T\u0142a tematyczne", "Images": "Obrazki", - "Keywords": "S\u0142owa kluczowe", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Aktor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Typ:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Aktor", "Composer": "Kompozytor", - "Director": "Re\u017cyser", "GuestStar": "Guest star", + "Director": "Re\u017cyser", "Producer": "Producent", "Writer": "Scenarzysta", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Instalowanie {0}", + "MessageItemSaved": "Obiekt zapisany.", "PackageInstallCompleted": "Instalacja {0} zako\u0144czona.", + "InstallingPackage": "Instalowanie {0}", "PackageInstallFailed": "Instalacja {0} nieudana.", "PackageInstallCancelled": "Instalacja {0} anulowana.", "SeriesYearToPresent": "{0} - Obecnych", - "ValueOneItem": "1 item", "ValueOneSong": "1 utw\u00f3r", "ValueSongCount": "{0} utwory", "ValueOneMovie": "1 film", "ValueMovieCount": "{0} filmy", "ValueOneSeries": "1 serial", - "ValueSeriesCount": "{0} seriale", "ValueOneEpisode": "1 odcinek", + "ValueSeriesCount": "{0} seriale", "ValueEpisodeCount": "{0} odcinki", "ValueOneGame": "1 gra", - "ValueGameCount": "{0} gry", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albumy", + "ValueGameCount": "{0} gry", "ValueOneMusicVideo": "1 teledysk", + "ValueAlbumCount": "{0} albumy", "ValueMusicVideoCount": "{0} teledyski", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Wpisz kryteria wyszukiwania. Zmniejszaj\u0105c ilo\u015b\u0107 kryteri\u00f3w zwi\u0119kszysz ilo\u015b\u0107 wynik\u00f3w.", "PleaseEnterNameOrId": "Prosz\u0119 wprowad\u017a nazw\u0119 lub zewn\u0119trzne Id.", - "MessageItemSaved": "Obiekt zapisany.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Usu\u0144 pliki", "ConfirmDeleteItems": "Usuni\u0119cie tej pozycji usunie j\u0105 zar\u00f3wno z systemu plik\u00f3w jak i z biblioteki medi\u00f3w. Czy chcesz kontynuowa\u0107?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Utworzono zadanie synchronizacji.", "LabelSyncTo": "Synchronizuj do:", "LabelSyncJobName": "Nazwa zadania synchronizacji", - "LabelQuality": "Jako\u015b\u0107:", "LabelSyncNoTargetsHelp": "Wygl\u0105da na to, \u017ce nie masz \u017cadnych aplikacji wspieraj\u0105cych synchronizacj\u0119.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Jako\u015b\u0107:", "LearnMore": "Dowiedz si\u0119 wi\u0119cej", - "LabelProfile": "Profil:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Przep\u0142ywno\u015b\u0107 (Mbps):", + "LabelProfile": "Profil:", "SyncUnwatchedVideosOnly": "Synchronizuj tylko nieobejrzane filmy", - "SyncUnwatchedVideosOnlyHelp": "Tylko nieobejrzane filmy zostan\u0105 zsynchronizowane a obejrzane b\u0119d\u0105 sukcesywnie usuwane z urz\u0105dzenia.", "AutomaticallySyncNewContent": "Automatycznie synchronizuj now\u0105 zawarto\u015b\u0107", - "AutomaticallySyncNewContentHelp": "Nowododana zawarto\u015b\u0107 zostanie automatycznie zsynchronizowana z urz\u0105dzeniem.", - "LabelItemLimit": "Limit pozycji:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Wybierz urz\u0105dzenie do synchronizacji", + "LabelItemLimit": "Limit pozycji:", + "SyncUnwatchedVideosOnlyHelp": "Tylko nieobejrzane filmy zostan\u0105 zsynchronizowane a obejrzane b\u0119d\u0105 sukcesywnie usuwane z urz\u0105dzenia.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "Nowododana zawarto\u015b\u0107 zostanie automatycznie zsynchronizowana z urz\u0105dzeniem.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Powt\u00f3rz", + "Settings": "Ustawienia", + "DefaultErrorMessage": "Wyst\u0105pi\u0142 bl\u0105d podczas przetwarzania twojego rz\u0105dania. Prosz\u0119 spr\u00f3bowa\u0107 ponownie po\u017aniej.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Ustawienia", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "Wyst\u0105pi\u0142 bl\u0105d podczas przetwarzania twojego rz\u0105dania. Prosz\u0119 spr\u00f3bowa\u0107 ponownie po\u017aniej.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-br.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-br.json index 24bf002151..01f6fe6387 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-br.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-br.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Desbloqueie esta funcionalidade com uma pequena compra \u00fanica, ou com uma assinatura ativa do Emby Premiere.", - "MessageUnlockAppWithSupporter": "Desbloqueie esta funcionalidade com uma assinatura ativa do Emby Premiere.", - "MessageToValidateSupporter": "Se tiver uma assinatura ativa do Emby Premiere, assegure-se que configurou o Emby Premiere no Painel do Servidor Emby, que pode ser acessado clicando Emby Premiere no menu principal.", "ValueSpecialEpisodeName": "Especial - {0}", - "Share": "Compartilhar", - "Add": "Adicionar", - "ServerUpdateNeeded": "Este Servidor Emby precisa ser atualizado. Para fazer download da vers\u00e3o mais recente, por favor visite {0}", - "LiveTvGuideRequiresUnlock": "O Guia de TV ao Vivo est\u00e1 atualmente limitado a {0} canais. Clique no bot\u00e3o desbloquear para saber como aproveitar a experi\u00eancia completa.", + "OptionTuesdayShort": "Ter", + "OptionMondayShort": "Seg", "AttributeNew": "Novo", - "Premiere": "Premiere", - "Live": "Ao vivo", - "Repeat": "Repetir", + "ServerUpdateNeeded": "Este Servidor Emby precisa ser atualizado. Para fazer download da vers\u00e3o mais recente, por favor visite {0}", + "Share": "Compartilhar", + "OptionSundayShort": "Dom", + "OptionThursdayShort": "Qui", + "OptionSaturdayShort": "S\u00e1b", + "OptionWednesdayShort": "Qua", + "OptionFridayShort": "Sex", + "HeaderSelectDate": "Selecionar Data", "TrackCount": "{0} faixas", "ItemCount": "{0} itens", - "ReleaseYearValue": "Ano do lan\u00e7amento: {0}", "OriginalAirDateValue": "Data de exibi\u00e7\u00e3o original: {0}", + "ReleaseYearValue": "Ano do lan\u00e7amento: {0}", "EndsAtValue": "Termina \u00e0s {0}", - "OptionSundayShort": "Dom", - "OptionMondayShort": "Seg", - "OptionTuesdayShort": "Ter", - "OptionWednesdayShort": "Qua", - "OptionThursdayShort": "Qui", - "OptionFridayShort": "Sex", - "OptionSaturdayShort": "S\u00e1b", - "HeaderSelectDate": "Selecionar Data", - "ButtonOk": "Ok", "ButtonCancel": "Cancelar", + "ButtonOk": "Ok", "ButtonGotIt": "Feito", - "ButtonRestart": "Reiniciar", - "RecordingCancelled": "Grava\u00e7\u00e3o cancelada.", - "SeriesCancelled": "S\u00e9rie cancelada.", + "LiveTvGuideRequiresUnlock": "O Guia de TV ao Vivo est\u00e1 atualmente limitado a {0} canais. Clique no bot\u00e3o desbloquear para saber como aproveitar a experi\u00eancia completa.", "RecordingScheduled": "Grava\u00e7\u00e3o agendada.", - "SeriesRecordingScheduled": "Grava\u00e7\u00e3o de s\u00e9rie agendada.", "HeaderNewRecording": "Nova Grava\u00e7\u00e3o", "Sunday": "Domingo", "Monday": "Segunda-feira", "Tuesday": "Ter\u00e7a-feira", "Wednesday": "Quarta-feira", "Thursday": "Quinta-feira", - "Friday": "Sexta-feira", "Saturday": "S\u00e1bado", "Days": "Dias", + "Friday": "Sexta-feira", "RecordSeries": "Gravar s\u00e9rie", - "HeaderCinemaMode": "Modo Cinema", - "HeaderCloudSync": "Sincroniza\u00e7\u00e3o na Nuvem", - "HeaderOfflineDownloads": "M\u00eddia Offline", - "HeaderOfflineDownloadsDescription": "Download sua m\u00eddia para seus dispositivos para uso offline f\u00e1cil.", - "CloudSyncFeatureDescription": "Sincronize sua m\u00eddia para a nuvem para backup, arquivamento e convers\u00e3o f\u00e1ceis.", - "CoverArtFeatureDescription": "Arta da Capa cria capas divertidas e d\u00e1 outros tratamentos para ajudar na personaliza\u00e7\u00e3o das imagens da sua m\u00eddia.", - "CoverArt": "Arta da Capa", - "ButtonCancelSyncJob": "Cancelar sincroniza\u00e7\u00e3o", - "CancelSyncJobConfirmation": "Cancelar a tarefa de sincroniza\u00e7\u00e3o remover\u00e1 as m\u00eddias sincronizadas do dispositivo durante o pr\u00f3ximo processo de sincroniza\u00e7\u00e3o. Deseja realmente continuar?", - "CinemaModeFeatureDescription": "Modo Cinema oferece a voc\u00ea uma verdadeira experi\u00eancia de cinema com trailers e intros customizados antes da funcionalidade.", - "HeaderFreeApps": "Apps Emby gr\u00e1tis", - "FreeAppsFeatureDescription": "Aproveite acesso gr\u00e1tis a apps Emby para seus dispositivos.", "HeaderBecomeProjectSupporter": "Obter Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Uma subscri\u00e7\u00e3o ativa do Emby Premiere \u00e9 requerida para criar a grava\u00e7\u00e3o automatizada de s\u00e9ries.", - "LabelEmailAddress": "Endere\u00e7o de E-mail:", - "PromoConvertRecordingsToStreamingFormat": "Converter automaticamente grava\u00e7\u00f5es para um formato amig\u00e1vel para streaming com Emby Premiere. Grava\u00e7\u00f5es ser\u00e3o convertidas em tempo real para MP4 ou MKV, baseado nas configura\u00e7\u00f5es do Servidor Emby.", "FeatureRequiresEmbyPremiere": "Este recurso requer uma subscri\u00e7\u00e3o ativa do Emby Premiere", - "HeaderConvertYourRecordings": "Converter suas Grava\u00e7\u00f5es", "Record": "Gravar", + "Advanced": "Avan\u00e7ado", + "Download": "Download", + "Refresh": "Atualizar", + "RefreshQueued": "Atualiza\u00e7\u00e3o iniciada.", "Save": "Salvar", "Edit": "Editar", - "Download": "Download", - "Advanced": "Avan\u00e7ado", "Delete": "Excluir", "HeaderDeleteItem": "Excluir item", "ConfirmDeleteItem": "Excluir este item o excluir\u00e1 do sistema de arquivos e tamb\u00e9m da biblioteca de m\u00eddias. Deseja realmente continuar?", - "Refresh": "Atualizar", - "RefreshQueued": "Atualiza\u00e7\u00e3o iniciada.", - "AddToCollection": "Adicionar \u00e0 colet\u00e2nea", - "HeaderAddToCollection": "Adicionar \u00e0 Colet\u00e2nea", "NewCollection": "Nova Colet\u00e2nea", + "AddToCollection": "Adicionar \u00e0 colet\u00e2nea", "LabelCollection": "Colet\u00e2nea:", "Help": "Ajuda", + "LabelName": "Nome:", "NewCollectionHelp": "Colet\u00e2neas permitem que voc\u00ea crie grupos personalizados de filmes e outros conte\u00fados da biblioteca.", "SearchForCollectionInternetMetadata": "Buscar artwork e metadados na internet", - "LabelName": "Nome:", "NewCollectionNameExample": "Exemplo: Colet\u00e2nea Star Wars", - "MessageItemsAdded": "Itens adicionados.", "OptionNew": "Nova...", + "MessageItemsAdded": "Itens adicionados.", "LabelPlaylist": "Lista de Reprodu\u00e7\u00e3o:", "AddToPlaylist": "Adicionar \u00e0 lista de reprodu\u00e7\u00e3o", - "HeaderAddToPlaylist": "Adicionar \u00e0 Lista de Reprodu\u00e7\u00e3o", + "RecordingCancelled": "Grava\u00e7\u00e3o cancelada.", + "SeriesRecordingScheduled": "Grava\u00e7\u00e3o de s\u00e9rie agendada.", "Subtitles": "Legendas", - "SearchForSubtitles": "Buscar Legendas", "LabelLanguage": "Idioma:", "Search": "Busca", "NoSubtitleSearchResultsFound": "Nenhum resultado encontrado.", @@ -99,54 +68,57 @@ "MySubtitles": "Minhas Legendas", "MessageDownloadQueued": "Download enfileirado.", "EditSubtitles": "Editar legendas", + "SearchForSubtitles": "Buscar Legendas", "UnlockGuide": "Desbloquear Guia", "RefreshMetadata": "Atualizar Metadados", "ReplaceExistingImages": "Substituir imagens existentes", "ReplaceAllMetadata": "Substituir todos os metadados", "SearchForMissingMetadata": "Buscar por metadados que faltam", "LabelRefreshMode": "Mode de atualiza\u00e7\u00e3o:", + "RefreshDialogHelp": "Os metadados s\u00e3o atualizados com bases nas defini\u00e7\u00f5es e nos servi\u00e7os de internet que est\u00e3o ativos no painel do Servidor Emby.", "NoItemsFound": "Nenhum item encontrado.", "HeaderSaySomethingLike": "Diga Alguma Coisa Como...", - "ButtonTryAgain": "Tente Novamente", "HeaderYouSaid": "Voc\u00ea Disse...", - "MessageWeDidntRecognizeCommand": "Desculpe, n\u00e3o reconhecemos este comando.", "MessageIfYouBlockedVoice": "Se voc\u00ea negou o acesso de voz ao app, voc\u00ea necessitar\u00e1 reconfigurar antes de tentar novamente.", + "ButtonTryAgain": "Tente Novamente", + "MessageWeDidntRecognizeCommand": "Desculpe, n\u00e3o reconhecemos este comando.", "ValueDiscNumber": "Disco {0}", - "Unrated": "N\u00e3o-classificado", "Favorite": "Favorito", + "Unrated": "N\u00e3o-classificado", "Like": "Curti", "Dislike": "N\u00e3o curti", - "RefreshDialogHelp": "Os metadados s\u00e3o atualizados com bases nas defini\u00e7\u00f5es e nos servi\u00e7os de internet que est\u00e3o ativos no painel do Servidor Emby.", "Open": "Abrir", - "Play": "Reproduzir", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Aleat\u00f3rio", - "Identify": "Identificar", - "EditImages": "Editar imagens", - "EditInfo": "Editar informa\u00e7\u00f5es", - "Sync": "Sincronizar", - "InstantMix": "Mix inst\u00e2ntaneo", "ViewAlbum": "Ver \u00e1lbum", "ViewArtist": "Ver artista", + "Play": "Reproduzir", + "Shuffle": "Aleat\u00f3rio", + "InstantMix": "Mix inst\u00e2ntaneo", "QueueAllFromHere": "Enfileirar todas a partir daqui", "PlayAllFromHere": "Reproduzir todas a partir daqui", + "Identify": "Identificar", + "EditImages": "Editar imagens", + "Sync": "Sincronizar", + "EditInfo": "Editar informa\u00e7\u00f5es", + "RemoveFromPlaylist": "Remover da lista de reprodu\u00e7\u00e3o", "PlayFromBeginning": "Reproduzir do in\u00edcio", "ResumeAt": "Retomar de {0}", - "RemoveFromPlaylist": "Remover da lista de reprodu\u00e7\u00e3o", - "RemoveFromCollection": "Remover da cole\u00e7\u00e3o", "Trailer": "Trailer", "MarkPlayed": "Marcar como reproduzido", "MarkUnplayed": "Marcar como n\u00e3o-reproduzido", "GroupVersions": "Agrupar vers\u00f5es", "PleaseSelectTwoItems": "Por favor selecione pelo menos dois itens.", + "Error": "Erro", "TryMultiSelect": "Experimentar a Sele\u00e7\u00e3o M\u00faltipla", "TryMultiSelectMessage": "Para editar itens m\u00faltiplos de m\u00eddia, basta clicar e segurar qualquer capa e selecionar os itens que gostaria de gerenciar. Experimente!", "HeaderConfirmRecordingCancellation": "Confirmar Cancelamento da Grava\u00e7\u00e3o", "MessageConfirmRecordingCancellation": "Deseja realmente cancelar esta grava\u00e7\u00e3o?", - "Error": "Erro", + "HeaderAddToCollection": "Adicionar \u00e0 Colet\u00e2nea", + "HeaderAddToPlaylist": "Adicionar \u00e0 Lista de Reprodu\u00e7\u00e3o", + "RemoveFromCollection": "Remover da cole\u00e7\u00e3o", "VoiceInput": "Entrada de voz", - "LabelContentType": "Tipo de conte\u00fado:", + "Add": "Adicionar", "LabelPath": "Local:", + "LabelContentType": "Tipo de conte\u00fado:", "LabelTitle": "T\u00edtulo:", "LabelOriginalTitle": "T\u00edtulo original:", "LabelSortTitle": "T\u00edtulo para ordena\u00e7\u00e3o:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure como a data de adi\u00e7\u00e3o \u00e9 determinada no painel do Servidor Emby nas defini\u00e7\u00f5es de Biblioteca", "LabelStatus": "Status:", "LabelArtists": "Artistas:", - "LabelArtistsHelp": "Separar m\u00faltiplos usando ;", "LabelAlbumArtists": "Artistas do \u00c1lbum:", + "LabelArtistsHelp": "Separar m\u00faltiplos usando ;", "LabelAlbum": "\u00c1lbum:", - "LabelCommunityRating": "Avalia\u00e7\u00e3o da comunidade:", "LabelVoteCount": "Contagem de votos:", + "LabelCommunityRating": "Avalia\u00e7\u00e3o da comunidade:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Avalia\u00e7\u00e3o da cr\u00edtica:", "LabelCriticRatingSummary": "Resumo da avalia\u00e7\u00e3o da cr\u00edtica:", "LabelAwardSummary": "Resumo da premia\u00e7\u00e3o:", "LabelWebsite": "Website:", "LabelTagline": "Slogan:", - "LabelOverview": "Sinopse:", "LabelShortOverview": "Sinopse curta:", + "LabelOverview": "Sinopse:", "LabelReleaseDate": "Data do lan\u00e7amento:", "LabelYear": "Ano:", "LabelPlaceOfBirth": "Local de nascimento:", "LabelAirDays": "Dias da exibi\u00e7\u00e3o:", "LabelAirTime": "Hor\u00e1rio:", - "LabelRuntimeMinutes": "Dura\u00e7\u00e3o (minutos):", "LabelParentalRating": "Classifica\u00e7\u00e3o et\u00e1ria:", - "LabelCustomRating": "Classifica\u00e7\u00e3o personalizada:", - "LabelBudget": "Or\u00e7amento", + "LabelRuntimeMinutes": "Dura\u00e7\u00e3o (minutos):", "LabelRevenue": "Faturamento ($):", - "LabelOriginalAspectRatio": "Propor\u00e7\u00e3o da imagem original:", + "LabelBudget": "Or\u00e7amento", + "LabelCustomRating": "Classifica\u00e7\u00e3o personalizada:", "LabelPlayers": "Jogadores:", + "LabelOriginalAspectRatio": "Propor\u00e7\u00e3o da imagem original:", + "LabelAbsoluteEpisodeNumber": "N\u00famero absoluto do epis\u00f3dio:", "Label3DFormat": "Formato 3D:", "HeaderAlternateEpisodeNumbers": "N\u00fameros de Epis\u00f3dios Alternativos", "LabelDvdSeasonNumber": "N\u00famero da temporada do Dvd:", "LabelDvdEpisodeNumber": "N\u00famero do epis\u00f3dio do Dvd:", - "LabelAbsoluteEpisodeNumber": "N\u00famero absoluto do epis\u00f3dio:", "HeaderSpecialEpisodeInfo": "Informa\u00e7\u00e3o do Epis\u00f3dio Especial", "LabelAirsBeforeSeason": "Exibido antes da temporada:", "LabelAirsAfterSeason": "Exibido depois da temporada:", @@ -201,172 +173,195 @@ "People": "Pessoas", "LabelMetadataDownloadLanguage": "Idioma preferido para download:", "LabelLockItemToPreventChanges": "Bloquear este item para evitar altera\u00e7\u00f5es futuras", - "MessageLeaveEmptyToInherit": "Deixar em branco para herdar os ajustes de um item superior, ou o valor padr\u00e3o global", "LabelCountry": "Pa\u00eds:", + "MessageLeaveEmptyToInherit": "Deixar em branco para herdar os ajustes de um item superior, ou o valor padr\u00e3o global", "LabelDynamicExternalId": "Id de {0}:", "LabelBirthYear": "Ano de nascimento:", "LabelBirthDate": "Data de nascimento:", - "LabelDeathDate": "Data da morte:", "LabelEndDate": "Data final:", + "LabelDeathDate": "Data da morte:", "LabelSeasonNumber": "N\u00famero da temporada:", "LabelEpisodeNumber": "N\u00famero do epis\u00f3dio:", "LabelTrackNumber": "N\u00famero da faixa:", "LabelNumber": "N\u00famero:", "LabelDiscNumber": "N\u00famero do disco:", - "LabelParentNumber": "N\u00famero do superior:", "SortName": "Nome para ordena\u00e7\u00e3o", + "LabelParentNumber": "N\u00famero do superior:", "ReleaseDate": "Data de lan\u00e7amento", "Continuing": "Em Exibi\u00e7\u00e3o", - "Ended": "Finalizada", "HeaderEnabledFields": "Campos Ativados", + "Ended": "Finalizada", + "Keywords": "Palavras-chave", "HeaderEnabledFieldsHelp": "Desmarque um campo para bloque\u00e1-lo e evitar que seus dados sejam alterados.", + "Name": "Nome", "Backdrops": "Imagens de Fundo", "Images": "Imagens", - "Keywords": "Palavras-chave", "Runtime": "Dura\u00e7\u00e3o", - "ProductionLocations": "Locais de produ\u00e7\u00e3o", + "Actor": "Ator", "BirthLocation": "Local de nascimento", + "ProductionLocations": "Locais de produ\u00e7\u00e3o", "ParentalRating": "Classifica\u00e7\u00e3o Et\u00e1ria", - "Name": "Nome", "Overview": "Sinopse", "LabelType": "Tipo:", "LabelPersonRole": "Personagem:", "LabelPersonRoleHelp": "Exemplo: motorista do carrinho de sorvete", - "Actor": "Ator", "Composer": "Compositor", - "Director": "Diretor", "GuestStar": "Convidado Especial", + "Director": "Diretor", "Producer": "Produtor", "Writer": "Escritor", - "MessageNoSyncJobsFound": "Nenhuma tarefa de sincroniza\u00e7\u00e3o encontrada. Crie tarefas de sincroniza\u00e7\u00e3o usando os bot\u00f5es Sincroniza\u00e7\u00e3o encontrados no app.", - "MessageNoDownloadsFound": "Nenhum download offline. Deixe sua m\u00eddia dispon\u00edvel offline clicando em Deixar Dispon\u00edvel Offline no app.", - "InstallingPackage": "Instalando {0}", + "MessageItemSaved": "Item salvo.", "PackageInstallCompleted": "Instala\u00e7\u00e3o de {0} conclu\u00edda.", + "InstallingPackage": "Instalando {0}", "PackageInstallFailed": "Instala\u00e7\u00e3o de {0} falhou.", "PackageInstallCancelled": "Instala\u00e7\u00e3o de {0} cancelada.", "SeriesYearToPresent": "{0} - Presente", - "ValueOneItem": "1 item", "ValueOneSong": "1 m\u00fasica", "ValueSongCount": "{0} m\u00fasicas", "ValueOneMovie": "1 filme", "ValueMovieCount": "{0} filmes", "ValueOneSeries": "1 s\u00e9rie", - "ValueSeriesCount": "{0} s\u00e9ries", "ValueOneEpisode": "1 epis\u00f3dio", + "ValueSeriesCount": "{0} s\u00e9ries", "ValueEpisodeCount": "{0} epis\u00f3dios", "ValueOneGame": "1 jogo", - "ValueGameCount": "{0} jogos", "ValueOneAlbum": "1 \u00e1lbum", - "ValueAlbumCount": "{0} \u00e1lbuns", + "ValueGameCount": "{0} jogos", "ValueOneMusicVideo": "1 v\u00eddeo musical", + "ValueAlbumCount": "{0} \u00e1lbuns", "ValueMusicVideoCount": "{0} v\u00eddeos musicais", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Digite um ou mais crit\u00e9rios de busca. Exclua o crit\u00e9rio para aumentar os resultados da busca.", "PleaseEnterNameOrId": "Por favor, digite um nome ou Id externo.", - "MessageItemSaved": "Item salvo.", "SearchResults": "Resultados da Busca", "SyncToOtherDevice": "Sincronizar para outro dispositivo", "MakeAvailableOffline": "Disponibilizar Offline", - "ServerNameIsRestarting": "Servidor Emby - {0} est\u00e1 reiniciando.", + "ButtonRestart": "Reiniciar", "ServerNameIsShuttingDown": "Servidor Emby - {0} est\u00e1 desligando.", + "PleaseRestartServerName": "Por favor reinicie o Servidor Emby - {0}.", + "ServerNameIsRestarting": "Servidor Emby - {0} est\u00e1 reiniciando.", "HeaderDeleteItems": "Excluir Itens", "ConfirmDeleteItems": "Ao excluir estes itens voc\u00ea os excluir\u00e1 do sistema de arquivos e de sua biblioteca de m\u00eddias. Deseja realmente continuar?", - "PleaseRestartServerName": "Por favor reinicie o Servidor Emby - {0}.", "SyncJobCreated": "Tarefa de sincroniza\u00e7\u00e3o criada.", "LabelSyncTo": "Sincronizar para:", "LabelSyncJobName": "Nome da tarefa de sincroniza\u00e7\u00e3o:", - "LabelQuality": "Qualidade:", "LabelSyncNoTargetsHelp": "Parece que voc\u00ea n\u00e3o possui nenhuma app que suporta sincroniza\u00e7\u00e3o.", - "DownloadScheduled": "Download agendado", - "HeaderSyncRequiresSub": "A sincroniza\u00e7\u00e3o requer uma subscri\u00e7\u00e3o ativa do Emby Premiere.", + "LabelQuality": "Qualidade:", "LearnMore": "Saiba mais", - "LabelProfile": "Perfil:", + "DownloadScheduled": "Download agendado", "LabelBitrateMbps": "Taxa (Mbps):", + "LabelProfile": "Perfil:", "SyncUnwatchedVideosOnly": "Sincronizar apenas v\u00eddeos n\u00e3o assistidos", - "SyncUnwatchedVideosOnlyHelp": "Apenas v\u00eddeos n\u00e3o assistidos ser\u00e3o sincronizados, e os v\u00eddeos ser\u00e3o removidos do dispositivo assim que forem assistidos.", "AutomaticallySyncNewContent": "Sincronizar novo conte\u00fado automaticamente", - "AutomaticallySyncNewContentHelp": "Novo conte\u00fado adicionado a esta pasta ser\u00e1 automaticamente sincronizado com o dispositivo.", - "LabelItemLimit": "Limite de itens:", - "LabelItemLimitHelp": "Opcional. Defina o n\u00famero limite de itens que ser\u00e3o sincronizados.", "PleaseSelectDeviceToSyncTo": "Por favor, selecione um dispositivo para sincronizar.", + "LabelItemLimit": "Limite de itens:", + "SyncUnwatchedVideosOnlyHelp": "Apenas v\u00eddeos n\u00e3o assistidos ser\u00e3o sincronizados, e os v\u00eddeos ser\u00e3o removidos do dispositivo assim que forem assistidos.", + "LabelItemLimitHelp": "Opcional. Defina o n\u00famero limite de itens que ser\u00e3o sincronizados.", + "AutomaticallySyncNewContentHelp": "Novo conte\u00fado adicionado a esta pasta ser\u00e1 automaticamente sincronizado com o dispositivo.", + "Premiere": "Premiere", + "Live": "Ao vivo", + "Repeat": "Repetir", + "Settings": "Ajustes", + "DefaultErrorMessage": "Ocorreu um erro ao processar o pedido. Por favor, tente novamente mais tarde.", "Screenshots": "Screenshots", "MoveRight": "Mover para direita", "MoveLeft": "Mover para esquerda", "ConfirmDeleteImage": "Apagar imagem?", "HeaderEditImages": "Editar Imagens", - "Settings": "Ajustes", "ShowIndicatorsFor": "Mostrar indicadores para:", "NewEpisodes": "Novos epis\u00f3dios", + "Premieres": "Estr\u00e9ias", "HDPrograms": "Programas em HD", "LiveBroadcasts": "Broadcasts ao vivo", - "Premieres": "Estr\u00e9ias", "RepeatEpisodes": "Repetir epis\u00f3dios", "DvrSubscriptionRequired": "Emby DVR requer uma assinatura ativa do Emby Premiere", "HeaderCancelRecording": "Cancelar Grava\u00e7\u00e3o", - "CancelRecording": "Cancelar grava\u00e7\u00e3o", - "HeaderKeepRecording": "Continuar Gravando", - "HeaderCancelSeries": "Cancelar S\u00e9rie", - "HeaderKeepSeries": "Manter S\u00e9rie", + "PromoConvertRecordingsToStreamingFormat": "Converter automaticamente grava\u00e7\u00f5es para um formato amig\u00e1vel para streaming com Emby Premiere. Grava\u00e7\u00f5es ser\u00e3o convertidas em tempo real para MP4 ou MKV, baseado nas configura\u00e7\u00f5es do Servidor Emby.", + "HeaderConvertYourRecordings": "Converter suas Grava\u00e7\u00f5es", "HeaderLearnMore": "Saiba Mais", + "HeaderKeepRecording": "Continuar Gravando", "DeleteMedia": "Excluir m\u00eddia", "SeriesSettings": "Configura\u00e7\u00f5es da s\u00e9rie", "HeaderRecordingOptions": "Op\u00e7\u00f5es de Grava\u00e7\u00e3o", - "CancelSeries": "Cancelar s\u00e9rie", "DoNotRecord": "N\u00e3o gravar", - "HeaderSeriesOptions": "Op\u00e7\u00f5es da S\u00e9rie", + "CancelSeries": "Cancelar s\u00e9rie", "LabelChannels": "Canais:", + "HeaderSeriesOptions": "Op\u00e7\u00f5es da S\u00e9rie", "ChannelNameOnly": "Somente canal {0}", "Anytime": "A qualquer momento", "AroundTime": "Em torno de {0}", "LabelAirtime": "Hor\u00e1rio de exibi\u00e7\u00e3o:", - "AllChannels": "Todos os canais", "LabelRecord": "Gravar:", + "AllChannels": "Todos os canais", "NewEpisodesOnly": "Apenas novos epis\u00f3dios", "AllEpisodes": "Todos os epis\u00f3dios", "LabelStartWhenPossible": "Iniciar quando poss\u00edvel:", "LabelStopWhenPossible": "Parar quando poss\u00edvel:", "MinutesBefore": "minutos antes de", - "MinutesAfter": "minutos ap\u00f3s", - "SkipEpisodesAlreadyInMyLibrary": "N\u00e3o gravar epis\u00f3dios que j\u00e1 estejam em minha biblioteca", "SkipEpisodesAlreadyInMyLibraryHelp": "Epis\u00f3dios ser\u00e3o comparados utilizando temporada e n\u00fameros de epis\u00f3dios, quando dispon\u00edveis.", + "SkipEpisodesAlreadyInMyLibrary": "N\u00e3o gravar epis\u00f3dios que j\u00e1 estejam em minha biblioteca", + "MinutesAfter": "minutos ap\u00f3s", "LabelKeepUpTo": "Manter at\u00e9:", "AsManyAsPossible": "Quantos forem poss\u00edveis", - "DefaultErrorMessage": "Ocorreu um erro ao processar o pedido. Por favor, tente novamente mais tarde.", - "LabelKeep:": "Manter:", "UntilIDelete": "At\u00e9 eu excluir", + "LabelKeep:": "Manter:", "UntilSpaceNeeded": "At\u00e9 o espa\u00e7o necess\u00e1rio", - "Categories": "Categorias", "Sports": "Esportes", + "Categories": "Categorias", "News": "Not\u00edcias", "Movies": "Filmes", "Kids": "Crian\u00e7as", "EnableColorCodedBackgrounds": "Habilitar cores de fundo por c\u00f3digo", "SortChannelsBy": "Ordenar canais por:", - "RecentlyWatched": "Assistido recentemente", "ChannelNumber": "N\u00famero do canal", + "RecentlyWatched": "Assistido recentemente", + "PlaceFavoriteChannelsAtBeginning": "Colocar canais favoritos no in\u00edcio", + "SeriesCancelled": "S\u00e9rie cancelada.", + "HeaderKeepSeries": "Manter S\u00e9rie", + "HeaderCancelSeries": "Cancelar S\u00e9rie", + "CancelRecording": "Cancelar grava\u00e7\u00e3o", + "MessageUnlockAppWithSupporter": "Desbloqueie esta funcionalidade com uma assinatura ativa do Emby Premiere.", + "MessageUnlockAppWithPurchaseOrSupporter": "Desbloqueie esta funcionalidade com uma pequena compra \u00fanica, ou com uma assinatura ativa do Emby Premiere.", + "MessageToValidateSupporter": "Se tiver uma assinatura ativa do Emby Premiere, assegure-se que configurou o Emby Premiere no Painel do Servidor Emby, que pode ser acessado clicando Emby Premiere no menu principal.", + "HeaderCinemaMode": "Modo Cinema", + "HeaderCloudSync": "Sincroniza\u00e7\u00e3o na Nuvem", + "HeaderOfflineDownloads": "M\u00eddia Offline", + "HeaderOfflineDownloadsDescription": "Download sua m\u00eddia para seus dispositivos para uso offline f\u00e1cil.", + "CloudSyncFeatureDescription": "Sincronize sua m\u00eddia para a nuvem para backup, arquivamento e convers\u00e3o f\u00e1ceis.", + "CoverArtFeatureDescription": "Arta da Capa cria capas divertidas e d\u00e1 outros tratamentos para ajudar na personaliza\u00e7\u00e3o das imagens da sua m\u00eddia.", + "CoverArt": "Arta da Capa", + "CinemaModeFeatureDescription": "Modo Cinema oferece a voc\u00ea uma verdadeira experi\u00eancia de cinema com trailers e intros customizados antes da funcionalidade.", + "HeaderFreeApps": "Apps Emby gr\u00e1tis", + "FreeAppsFeatureDescription": "Aproveite acesso gr\u00e1tis a apps Emby para seus dispositivos.", + "LabelEmailAddress": "Endere\u00e7o de E-mail:", "HeaderBenefitsEmbyPremiere": "Benef\u00edcios do Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Por favor aproveite um minuto de reprodu\u00e7\u00e3o. Obrigado por testar Emby.", "HeaderTryPlayback": "Testar Reprodu\u00e7\u00e3o", + "IPurchasedThisApp": "Eu comprei este app", "HowDidYouPay": "Como voc\u00ea pagou?", "IHaveEmbyPremiere": "Eu tenho Emby Premiere", - "IPurchasedThisApp": "Eu comprei este app", "ButtonRestorePreviousPurchase": "Recuperar Compra", "ButtonUnlockWithPurchase": "Desbloquear com Compra", "ButtonUnlockPrice": "Desbloquear {0}", - "EmbyPremiereMonthlyWithPrice": "Mensalidade Emby Premiere {0}", - "HeaderAlreadyPaid": "J\u00e1 Pagou?", "ButtonPlayOneMinute": "Reproduzir Um Minuto", - "PlaceFavoriteChannelsAtBeginning": "Colocar canais favoritos no in\u00edcio", "HeaderUnlockFeature": "Desbloquear Funcionalidade", "MessageDidYouKnowCinemaMode": "Voc\u00ea sabia que com Emby Premiere, voc\u00ea pode melhorar sua experi\u00eancia com funcionalidades como o Modo Cinema?", "MessageDidYouKnowCinemaMode2": "Modo Cinema lhe d\u00e1 uma verdadeira experi\u00eancia de cinema com trailers e introdu\u00e7\u00f5es customizadas antes da apresenta\u00e7\u00e3o principal.", - "HeaderPlayMyMedia": "Reproduzir minha M\u00eddia", "HeaderDiscoverEmbyPremiere": "Descobrir o Emby Premiere", - "Items": "itens", + "HeaderPlayMyMedia": "Reproduzir minha M\u00eddia", "OneChannel": "Um canal", - "ConfirmRemoveDownload": "Remover download?", - "RemoveDownload": "Remover download", + "EmbyPremiereMonthlyWithPrice": "Mensalidade Emby Premiere {0}", + "HeaderAlreadyPaid": "J\u00e1 Pagou?", "AddedOnValue": "Adicionado {0}", + "ConfirmRemoveDownload": "Remover download?", + "CancelSyncJobConfirmation": "Cancelar a tarefa de sincroniza\u00e7\u00e3o remover\u00e1 as m\u00eddias sincronizadas do dispositivo durante o pr\u00f3ximo processo de sincroniza\u00e7\u00e3o. Deseja realmente continuar?", + "ButtonCancelSyncJob": "Cancelar sincroniza\u00e7\u00e3o", + "MessageNoSyncJobsFound": "Nenhuma tarefa de sincroniza\u00e7\u00e3o encontrada. Crie tarefas de sincroniza\u00e7\u00e3o usando os bot\u00f5es Sincroniza\u00e7\u00e3o encontrados no app.", + "MessageNoDownloadsFound": "Nenhum download offline. Deixe sua m\u00eddia dispon\u00edvel offline clicando em Deixar Dispon\u00edvel Offline no app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "A sincroniza\u00e7\u00e3o requer uma subscri\u00e7\u00e3o ativa do Emby Premiere.", + "Items": "itens", + "RemoveDownload": "Remover download", "RemovingFromDevice": "Removendo do dispositivo", "RemoveFromDevice": "Remover do dispositivo", "KeepOnDevice": "Manter no dispositivo", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Pronto para Transferir", "SyncJobItemStatusSyncedMarkForRemoval": "Removendo do dispositivo", "SyncJobItemStatusQueued": "Enfileirado", - "SyncJobItemStatusConverting": "Convertendo", "SyncJobItemStatusTransferring": "Transferindo", - "SyncJobItemStatusSynced": "Baixado", - "SyncJobItemStatusFailed": "Falha", + "SyncJobItemStatusConverting": "Convertendo", "SyncJobItemStatusRemovedFromDevice": "Removido do dispositivo", "SyncJobItemStatusCancelled": "Cancelado", + "SyncJobItemStatusSynced": "Baixado", + "SyncJobItemStatusFailed": "Falha", "Retry": "Tentar Novamente", "HeaderMyDevice": "Meu Dispositivo", + "ContinueInSecondsValue": "Continuar em {0} segundos.", "Continue": "Continuar", - "ContinueInSecondsValue": "Continuar em {0} segundos." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-pt.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-pt.json index e6dc8d27bf..ab3f2a4a9e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-pt.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-pt.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Especial - {0}", - "Share": "Partilhar", - "Add": "Adicionar", - "ServerUpdateNeeded": "Este Servidor Emby precisa ser atualizado. Para fazer download da vers\u00e3o mais recente, por favor visite {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "Novo", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repetir", + "ServerUpdateNeeded": "Este Servidor Emby precisa ser atualizado. Para fazer download da vers\u00e3o mais recente, por favor visite {0}", + "Share": "Partilhar", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Selecionar Data", "TrackCount": "{0} faixas", "ItemCount": "{0} itens", - "ReleaseYearValue": "Ano de lan\u00e7amento: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Ano de lan\u00e7amento: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Selecionar Data", - "ButtonOk": "Ok", "ButtonCancel": "Cancelar", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Reiniciar", - "RecordingCancelled": "Grava\u00e7\u00e3o cancelada.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Grava\u00e7\u00e3o agendada.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "Nova Grava\u00e7\u00e3o", "Sunday": "Domingo", "Monday": "Segunda", "Tuesday": "Ter\u00e7a", "Wednesday": "Quarta", "Thursday": "Quinta", - "Friday": "Sexta", "Saturday": "S\u00e1bado", "Days": "Dias", + "Friday": "Sexta", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Uma subscri\u00e7\u00e3o Emby Premiere \u00e9 necess\u00e1ria para criar a grava\u00e7\u00e3o autom\u00e1tica de s\u00e9ries.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Este recurso requer uma subscri\u00e7\u00e3o ativa do Emby Premiere", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Gravar", + "Advanced": "Avan\u00e7ado", + "Download": "Download", + "Refresh": "Atualizar", + "RefreshQueued": "Refresh queued.", "Save": "Guardar", "Edit": "Editar", - "Download": "Download", - "Advanced": "Avan\u00e7ado", "Delete": "Remover", "HeaderDeleteItem": "Remover item", "ConfirmDeleteItem": "Excluir este item o excluir\u00e1 do sistema de arquivos e tamb\u00e9m da biblioteca multim\u00e9dia. Deseja realmente continuar?", - "Refresh": "Atualizar", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Adicionar \u00e0 Cole\u00e7\u00e3o", "NewCollection": "Nova Cole\u00e7\u00e3o", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Ajuda", + "LabelName": "Nome:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Procurar na internet por imagens e metadados", - "LabelName": "Nome:", "NewCollectionNameExample": "Exemplo: Cole\u00e7\u00e3o Guerra das Estrelas", - "MessageItemsAdded": "Items added.", "OptionNew": "Nova...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Adicionar \u00e0 lista de reprodu\u00e7\u00e3o", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Grava\u00e7\u00e3o cancelada.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Buscar Legendas", "LabelLanguage": "Idioma:", "Search": "Busca", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Buscar Legendas", "UnlockGuide": "Desbloquear Guia", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Substituir imagens existentes", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Abrir", - "Play": "Reproduzir", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Aleat\u00f3rio", - "Identify": "Identificar", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Mix inst\u00e2ntaneo", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Reproduzir", + "Shuffle": "Aleat\u00f3rio", + "InstantMix": "Mix inst\u00e2ntaneo", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identificar", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Por favor selecione pelo menos dois itens.", + "Error": "Erro", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "Para editar m\u00faltiplos ficheiros de multim\u00e9dia, basta clicar e segurar qualquer capa e selecionar os itens que gostaria de gerir. Experimente!", "HeaderConfirmRecordingCancellation": "Confirmar Cancelamento da Grava\u00e7\u00e3o", "MessageConfirmRecordingCancellation": "Deseja realmente cancelar esta grava\u00e7\u00e3o?", - "Error": "Erro", + "HeaderAddToCollection": "Adicionar \u00e0 Cole\u00e7\u00e3o", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Tipo de conte\u00fado:", + "Add": "Adicionar", "LabelPath": "Local:", + "LabelContentType": "Tipo de conte\u00fado:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Estado:", "LabelArtists": "Artistas:", - "LabelArtistsHelp": "Separa m\u00faltiplas com ;", "LabelAlbumArtists": "Artistas do \u00c1lbum:", + "LabelArtistsHelp": "Separa m\u00faltiplas com ;", "LabelAlbum": "\u00c1lbum:", - "LabelCommunityRating": "Avalia\u00e7\u00e3o da comunidade:", "LabelVoteCount": "Contagem de votos:", + "LabelCommunityRating": "Avalia\u00e7\u00e3o da comunidade:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Avalia\u00e7\u00e3o da cr\u00edtica:", "LabelCriticRatingSummary": "Resumo da avalia\u00e7\u00e3o da cr\u00edtica:", "LabelAwardSummary": "Resumo da premia\u00e7\u00e3o:", "LabelWebsite": "Website:", "LabelTagline": "Slogan:", - "LabelOverview": "Sinopse:", "LabelShortOverview": "Sinopse curta:", + "LabelOverview": "Sinopse:", "LabelReleaseDate": "Data do lan\u00e7amento:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Local de nascimento:", "LabelAirDays": "Dias da exibi\u00e7\u00e3o:", "LabelAirTime": "Hor\u00e1rio:", - "LabelRuntimeMinutes": "Dura\u00e7\u00e3o (minutos):", "LabelParentalRating": "Classifica\u00e7\u00e3o parental:", - "LabelCustomRating": "Classifica\u00e7\u00e3o personalizada:", - "LabelBudget": "Or\u00e7amento", + "LabelRuntimeMinutes": "Dura\u00e7\u00e3o (minutos):", "LabelRevenue": "Faturamento ($):", - "LabelOriginalAspectRatio": "Propor\u00e7\u00e3o da imagem original:", + "LabelBudget": "Or\u00e7amento", + "LabelCustomRating": "Classifica\u00e7\u00e3o personalizada:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Propor\u00e7\u00e3o da imagem original:", + "LabelAbsoluteEpisodeNumber": "N\u00famero absoluto do epis\u00f3dio:", "Label3DFormat": "Formato 3D:", "HeaderAlternateEpisodeNumbers": "N\u00fameros de Epis\u00f3dios Alternativos", "LabelDvdSeasonNumber": "N\u00famero da temporada do DVD:", "LabelDvdEpisodeNumber": "N\u00famero do epis\u00f3dio do DVD:", - "LabelAbsoluteEpisodeNumber": "N\u00famero absoluto do epis\u00f3dio:", "HeaderSpecialEpisodeInfo": "Informa\u00e7\u00e3o do Epis\u00f3dio Especial", "LabelAirsBeforeSeason": "Exibido antes da temporada:", "LabelAirsAfterSeason": "Exibido depois da temporada:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Idioma preferido para download:", "LabelLockItemToPreventChanges": "Bloquear este item para evitar altera\u00e7\u00f5es futuras", - "MessageLeaveEmptyToInherit": "Deixar em branco para herdar os ajustes de um item superior, ou o valor padr\u00e3o global", "LabelCountry": "Pa\u00eds:", + "MessageLeaveEmptyToInherit": "Deixar em branco para herdar os ajustes de um item superior, ou o valor padr\u00e3o global", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "Data final:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "A Continuar", - "Ended": "Terminado", "HeaderEnabledFields": "Campos Ativados", + "Ended": "Terminado", + "Keywords": "Palavras-chave", "HeaderEnabledFieldsHelp": "Desmarque um campo para bloque\u00e1-lo e evitar que seus dados sejam alterados.", + "Name": "Name", "Backdrops": "Imagens de Fundo", "Images": "Imagens", - "Keywords": "Palavras-chave", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Ator", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Tipo:", "LabelPersonRole": "Personagem:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Ator", "Composer": "Compositor", - "Director": "Diretor", "GuestStar": "Guest star", + "Director": "Diretor", "Producer": "Produtor", "Writer": "Escritor", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item salvo.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Digite um ou mais crit\u00e9rios de busca. Exclua o crit\u00e9rio para aumentar os resultados da busca.", "PleaseEnterNameOrId": "Por favor, digite um nome ou Id externo.", - "MessageItemSaved": "Item salvo.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Reiniciar", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Remover Itens", "ConfirmDeleteItems": "Ao excluir estes itens voc\u00ea os excluir\u00e1 do sistema de arquivos e de sua biblioteca multim\u00e9dia. Deseja realmente continuar?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "Parece que voc\u00ea n\u00e3o possui nenhuma app que suporta sincroniza\u00e7\u00e3o.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Saiba mais", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repetir", + "Settings": "Ajustes", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Ajustes", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json index 28d8a9a022..840520ba1b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Add", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "Anuleaza", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Duminica", "Monday": "Luni", "Tuesday": "Marti", "Wednesday": "Miercuri", "Thursday": "Joi", - "Friday": "Vineri", "Saturday": "Sambata", "Days": "Days", + "Friday": "Vineri", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "Salveaza", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Ajutor", + "LabelName": "Nume:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "C\u0103utare pe internet pentru postere \u0219i metadate", - "LabelName": "Nume:", "NewCollectionNameExample": "Exemplu: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Limba:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Tip continut:", + "Add": "Add", "LabelPath": "Path:", + "LabelContentType": "Tip continut:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artisti:", - "LabelArtistsHelp": "Folosire separata multipla", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Folosire separata multipla", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Tara:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continua", - "Ended": "S-a sfarsit", "HeaderEnabledFields": "Enabled Fields", + "Ended": "S-a sfarsit", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json index cb84abe0b4..457d34b7f9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "\u0420\u0430\u0437\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f", - "EnableDisplayMirroring": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", - "HeaderSelectPlayer": "\u0412\u044b\u0431\u043e\u0440 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044f", - "MessageUnlockAppWithPurchaseOrSupporter": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0439\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u043e\u043f\u043b\u0430\u0442\u044b, \u0438\u043b\u0438 \u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u043e\u0439 Emby Premiere .", - "MessageUnlockAppWithSupporter": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0439\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u043e\u0439 Emby Premiere.", - "MessageToValidateSupporter": "\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere, \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e Emby Premiere \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0432 \u0432\u0430\u0448\u0435\u0439 \u041f\u0430\u043d\u0435\u043b\u0438 Emby Server, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043f\u043e \u0449\u0435\u043b\u0447\u043a\u0443 \u043f\u043e Emby Premiere \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043c\u0435\u043d\u044e.", "ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u044d\u043f\u0438\u0437\u043e\u0434 - {0}", - "Share": "\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f", - "Add": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c", - "ServerUpdateNeeded": "\u0414\u0430\u043d\u043d\u044b\u0439 Emby Server \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0432\u0435\u0436\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 {0}", - "LiveTvGuideRequiresUnlock": "\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0442\u0435\u043b\u0435\u0433\u0438\u0434 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d {0} \u043a\u0430\u043d\u0430\u043b(\u043e\u043c\/\u0430\u043c\u0438). \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442.", + "OptionTuesdayShort": "\u0432\u0442\u0440", + "OptionMondayShort": "\u043f\u043d\u0434", "AttributeNew": "\u041d\u043e\u0432\u0438\u043d\u043a\u0430", - "Premiere": "\u041f\u0440\u0435\u043c\u044c\u0435\u0440\u0430", - "Live": "\u0422\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f", - "Repeat": "\u041f\u043e\u0432\u0442\u043e\u0440", + "ServerUpdateNeeded": "\u0414\u0430\u043d\u043d\u044b\u0439 Emby Server \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0432\u0435\u0436\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 {0}", + "Share": "\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f", + "OptionSundayShort": "\u0432\u0441\u043a", + "OptionThursdayShort": "\u0447\u0442\u0432", + "OptionSaturdayShort": "\u0441\u0431\u0442", + "OptionWednesdayShort": "\u0441\u0440\u0434", + "OptionFridayShort": "\u043f\u0442\u043d", + "HeaderSelectDate": "\u0412\u044b\u0431\u043e\u0440 \u0434\u0430\u0442\u044b", "TrackCount": "{0} \u0434\u043e\u0440\u043e\u0436(\u043a\u0438\/\u0435\u043a)", "ItemCount": "{0} \u044d\u043b\u0435\u043c\u0435\u043d\u0442(\u0430\/\u043e\u0432)", - "ReleaseYearValue": "\u0413\u043e\u0434 \u0432\u044b\u043f\u0443\u0441\u043a\u0430: {0}", "OriginalAirDateValue": "\u0414\u0430\u0442\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u044d\u0444\u0438\u0440\u0430: {0}", + "ReleaseYearValue": "\u0413\u043e\u0434 \u0432\u044b\u043f\u0443\u0441\u043a\u0430: {0}", "EndsAtValue": "\u041a\u043e\u043d\u0435\u0446 \u0432 {0}", - "OptionSundayShort": "\u0432\u0441\u043a", - "OptionMondayShort": "\u043f\u043d\u0434", - "OptionTuesdayShort": "\u0432\u0442\u0440", - "OptionWednesdayShort": "\u0441\u0440\u0434", - "OptionThursdayShort": "\u0447\u0442\u0432", - "OptionFridayShort": "\u043f\u0442\u043d", - "OptionSaturdayShort": "\u0441\u0431\u0442", - "HeaderSelectDate": "\u0412\u044b\u0431\u043e\u0440 \u0434\u0430\u0442\u044b", - "ButtonOk": "\u041e\u043a", "ButtonCancel": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c", + "ButtonOk": "\u041e\u043a", "ButtonGotIt": "\u041f\u043e\u043d\u044f\u0442\u043d\u043e", - "ButtonRestart": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c", - "RecordingCancelled": "\u0417\u0430\u043f\u0438\u0441\u044c \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430.", - "SeriesCancelled": "\u0421\u0435\u0440\u0438\u0430\u043b \u043e\u0442\u043c\u0435\u043d\u0451\u043d.", + "LiveTvGuideRequiresUnlock": "\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0442\u0435\u043b\u0435\u0433\u0438\u0434 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d {0} \u043a\u0430\u043d\u0430\u043b(\u043e\u043c\/\u0430\u043c\u0438). \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442.", "RecordingScheduled": "\u0417\u0430\u043f\u0438\u0441\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430.", - "SeriesRecordingScheduled": "\u0417\u0430\u043f\u0438\u0441\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430.", "HeaderNewRecording": "\u041d\u043e\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c", "Sunday": "\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "Monday": "\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "Tuesday": "\u0432\u0442\u043e\u0440\u043d\u0438\u043a", "Wednesday": "\u0441\u0440\u0435\u0434\u0430", "Thursday": "\u0447\u0435\u0442\u0432\u0435\u0440\u0433", - "Friday": "\u043f\u044f\u0442\u043d\u0438\u0446\u0430", "Saturday": "\u0441\u0443\u0431\u0431\u043e\u0442\u0430", "Days": "\u0414\u043d\u0438", + "Friday": "\u043f\u044f\u0442\u043d\u0438\u0446\u0430", "RecordSeries": "\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b", - "HeaderCinemaMode": "\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043d\u043e\u0437\u0430\u043b\u0430", - "HeaderCloudSync": "\u041e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f", - "HeaderOfflineDownloads": "\u0410\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0435 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", - "HeaderOfflineDownloadsDescription": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0432\u0430\u0448\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.", - "CloudSyncFeatureDescription": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0430\u0448\u0438\u0445 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0445 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f.", - "CoverArtFeatureDescription": "Cover Art \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u043b\u043e\u0436\u043a\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u0432\u0430\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u043a \u0432\u0430\u0448\u0438\u043c \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u043c.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e", - "CancelSyncJobConfirmation": "\u041e\u0442\u043c\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0438\u0437\u044a\u044f\u0442\u0438\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c?", - "CinemaModeFeatureDescription": "\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043d\u043e\u0437\u0430\u043b\u0430 \u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043b\u0430 \u0441 \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0434 \u0444\u0438\u043b\u044c\u043c\u043e\u043c.", - "HeaderFreeApps": "\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", - "FreeAppsFeatureDescription": "\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0434\u043b\u044f \u0432\u0430\u0448\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.", "HeaderBecomeProjectSupporter": "\u041f\u0440\u0438\u043e\u0431\u0440\u0435\u0441\u0442\u0438 Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "\u0414\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438.", - "LabelEmailAddress": "\u0410\u0434\u0440\u0435\u0441 \u042d-\u043f\u043e\u0447\u0442\u044b:", - "PromoConvertRecordingsToStreamingFormat": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Emby Premiere. \u0417\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 MP4 \u0438\u043b\u0438 MKV, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 Emby Server.", "FeatureRequiresEmbyPremiere": "\u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere.", - "HeaderConvertYourRecordings": "\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439", "Record": "\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c", + "Advanced": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435", + "Download": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c", + "Refresh": "\u041f\u043e\u0434\u043d\u043e\u0432\u0438\u0442\u044c", + "RefreshQueued": "\u041f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.", "Save": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", "Edit": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c", - "Download": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c", - "Advanced": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435", "Delete": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c", "HeaderDeleteItem": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430", "ConfirmDeleteItem": "\u041f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043e\u043d \u0443\u0434\u0430\u043b\u0438\u0442\u0441\u044f \u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0438 \u0438\u0437 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?", - "Refresh": "\u041f\u043e\u0434\u043d\u043e\u0432\u0438\u0442\u044c", - "RefreshQueued": "\u041f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.", - "AddToCollection": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e", - "HeaderAddToCollection": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e", "NewCollection": "\u041d\u043e\u0432\u0430\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f", + "AddToCollection": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e", "LabelCollection": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f:", "Help": "\u0421\u043f\u0440\u0430\u0432\u043a\u0430...", + "LabelName": "\u0418\u043c\u044f:", "NewCollectionHelp": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u043c\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438.", "SearchForCollectionInternetMetadata": "\u0418\u0441\u043a\u0430\u0442\u044c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435", - "LabelName": "\u0418\u043c\u044f:", "NewCollectionNameExample": "\u041f\u0440\u0438\u043c\u0435\u0440: \u0417\u0432\u0451\u0437\u0434\u043d\u044b\u0435 \u0432\u043e\u0439\u043d\u044b (\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f)", - "MessageItemsAdded": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b.", "OptionNew": "\u041d\u043e\u0432\u043e\u0435...", + "MessageItemsAdded": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b.", "LabelPlaylist": "\u041f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442:", "AddToPlaylist": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442", - "HeaderAddToPlaylist": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442", + "RecordingCancelled": "\u0417\u0430\u043f\u0438\u0441\u044c \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430.", + "SeriesRecordingScheduled": "\u0417\u0430\u043f\u0438\u0441\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430.", "Subtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b", - "SearchForSubtitles": "\u041f\u043e\u0438\u0441\u043a \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432", "LabelLanguage": "\u042f\u0437\u044b\u043a:", "Search": "\u041f\u043e\u0438\u0441\u043a", "NoSubtitleSearchResultsFound": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.", @@ -99,54 +68,57 @@ "MySubtitles": "\u041c\u043e\u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b", "MessageDownloadQueued": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.", "EditSubtitles": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b", + "SearchForSubtitles": "\u041f\u043e\u0438\u0441\u043a \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432", "UnlockGuide": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043b\u0435\u0433\u0438\u0434", "RefreshMetadata": "\u041f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", "ReplaceExistingImages": "\u0417\u0430\u043c\u0435\u043d\u0430 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432", "ReplaceAllMetadata": "\u0417\u0430\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", "SearchForMissingMetadata": "\u041f\u043e\u0438\u0441\u043a \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", "LabelRefreshMode": "\u0420\u0435\u0436\u0438\u043c \u043f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f:", + "RefreshDialogHelp": "\u041f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0443\u0441\u043b\u0443\u0433\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432 \u041f\u0430\u043d\u0435\u043b\u0438 Emby Server.", "NoItemsFound": "\u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.", "HeaderSaySomethingLike": "\u0421\u043a\u0430\u0436\u0438\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435...", - "ButtonTryAgain": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0443", "HeaderYouSaid": "\u0412\u044b \u0441\u043a\u0430\u0437\u0430\u043b\u0438...", - "MessageWeDidntRecognizeCommand": "\u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0430.", "MessageIfYouBlockedVoice": "\u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e, \u043f\u0435\u0440\u0435\u0434 \u043d\u043e\u0432\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430.", + "ButtonTryAgain": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0443", + "MessageWeDidntRecognizeCommand": "\u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0430.", "ValueDiscNumber": "\u0414\u0438\u0441\u043a {0}", - "Unrated": "\u0411\u0435\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438", "Favorite": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", + "Unrated": "\u0411\u0435\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438", "Like": "\u041d\u0440\u0430\u0432\u0438\u0442\u0441\u044f", "Dislike": "\u041d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f", - "RefreshDialogHelp": "\u041f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0443\u0441\u043b\u0443\u0433\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432 \u041f\u0430\u043d\u0435\u043b\u0438 Emby Server.", "Open": "\u041e\u0442\u043a\u0440\u044b\u0442\u044c", - "Play": "\u0412\u043e\u0441\u043f\u0440.", - "AddToPlayQueue": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f", - "Shuffle": "\u041f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c", - "Identify": "\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c", - "EditImages": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043a\u0438", - "EditInfo": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f", - "Sync": "\u0421\u0438\u043d\u0445\u0440\u043e", - "InstantMix": "\u0410\u0432\u0442\u043e\u043c\u0438\u043a\u0441...", "ViewAlbum": "\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0430\u043b\u044c\u0431\u043e\u043c", "ViewArtist": "\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f", + "Play": "\u0412\u043e\u0441\u043f\u0440.", + "Shuffle": "\u041f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c", + "InstantMix": "\u0410\u0432\u0442\u043e\u043c\u0438\u043a\u0441...", "QueueAllFromHere": "\u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u0441\u0435 \u043e\u0442\u0441\u044e\u0434\u0430", "PlayAllFromHere": "\u0412\u043e\u0441\u043f\u0440. \u0432\u0441\u0435 \u043e\u0442\u0441\u044e\u0434\u0430", + "Identify": "\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c", + "EditImages": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043a\u0438", + "Sync": "\u0421\u0438\u043d\u0445\u0440\u043e", + "EditInfo": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f", + "RemoveFromPlaylist": "\u0418\u0437\u044a\u044f\u0442\u044c \u0438\u0437 \u043f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442\u0430", "PlayFromBeginning": "\u0412\u043e\u0441\u043f\u0440. \u0441 \u043d\u0430\u0447\u0430\u043b\u0430", "ResumeAt": "\u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441 {0}", - "RemoveFromPlaylist": "\u0418\u0437\u044a\u044f\u0442\u044c \u0438\u0437 \u043f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442\u0430", - "RemoveFromCollection": "\u0418\u0437\u044a\u044f\u0442\u044c \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438", "Trailer": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440", "MarkPlayed": "\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043a\u0430\u043a \u0432\u043e\u0441\u043f\u0440-\u043e\u0435", "MarkUnplayed": "\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043a\u0430\u043a \u043d\u0435\u0432\u043e\u0441\u043f\u0440-\u043e\u0435", "GroupVersions": "\u0421\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u0438", "PleaseSelectTwoItems": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.", + "Error": "\u041e\u0448\u0438\u0431\u043a\u0430", "TryMultiSelect": "\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u043e\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435", "TryMultiSelectMessage": "\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u043e\u0441\u0442\u043e \u0449\u0451\u043b\u043a\u043d\u0438\u0442\u0435 \u0438 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0439\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u043c\u044b\u0448\u0438 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u0441\u0442\u0435\u0440\u0435 \u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u0435 \u0442\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u044d\u0442\u043e!", "HeaderConfirmRecordingCancellation": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0442\u043c\u0435\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0438", "MessageConfirmRecordingCancellation": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c?", - "Error": "\u041e\u0448\u0438\u0431\u043a\u0430", + "HeaderAddToCollection": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e", + "HeaderAddToPlaylist": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442", + "RemoveFromCollection": "\u0418\u0437\u044a\u044f\u0442\u044c \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438", "VoiceInput": "\u0413\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0432\u0432\u043e\u0434", - "LabelContentType": "\u0422\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f:", + "Add": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c", "LabelPath": "\u041f\u0443\u0442\u044c:", + "LabelContentType": "\u0422\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f:", "LabelTitle": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:", "LabelOriginalTitle": "\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:", "LabelSortTitle": "\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u0430\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u041f\u0430\u043d\u0435\u043b\u0438 Emby Server \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u041c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438", "LabelStatus": "\u0421\u0442\u0430\u0442\u0443\u0441:", "LabelArtists": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438:", - "LabelArtistsHelp": "\u0414\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 (;)", "LabelAlbumArtists": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430:", + "LabelArtistsHelp": "\u0414\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 (;)", "LabelAlbum": "\u0410\u043b\u044c\u0431\u043e\u043c", - "LabelCommunityRating": "\u041e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430:", "LabelVoteCount": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u043e\u043b\u043e\u0441\u043e\u0432:", + "LabelCommunityRating": "\u041e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430:", "LabelMetascore": "\u041e\u0446\u0435\u043d\u043a\u0430 Metascore:", "LabelCriticRating": "\u041e\u0446\u0435\u043d\u043a\u0430 \u043a\u0440\u0438\u0442\u0438\u043a\u043e\u0432:", "LabelCriticRatingSummary": "\u0421\u0432\u043e\u0434\u043a\u0430 \u043e\u0446\u0435\u043d\u043a\u0438 \u043a\u0440\u0438\u0442\u0438\u043a\u043e\u0432:", "LabelAwardSummary": "\u0421\u0432\u043e\u0434\u043a\u0430 \u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u0438\u0439:", "LabelWebsite": "\u0412\u0435\u0431\u0441\u0430\u0439\u0442:", "LabelTagline": "\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0444\u0440\u0430\u0437\u0430:", - "LabelOverview": "\u041e\u0431\u0437\u043e\u0440:", "LabelShortOverview": "\u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440:", + "LabelOverview": "\u041e\u0431\u0437\u043e\u0440:", "LabelReleaseDate": "\u0414\u0430\u0442\u0430 \u0432\u044b\u043f\u0443\u0441\u043a\u0430:", "LabelYear": "\u0413\u043e\u0434:", "LabelPlaceOfBirth": "\u041c\u0435\u0441\u0442\u043e \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f:", "LabelAirDays": "\u0414\u043d\u0438 \u044d\u0444\u0438\u0440\u0430:", "LabelAirTime": "\u0412\u0440\u0435\u043c\u044f \u044d\u0444\u0438\u0440\u0430:", - "LabelRuntimeMinutes": "\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043c\u0438\u043d:", "LabelParentalRating": "\u0412\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f:", - "LabelCustomRating": "\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0430\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f:", - "LabelBudget": "\u0411\u044e\u0434\u0436\u0435\u0442", + "LabelRuntimeMinutes": "\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043c\u0438\u043d:", "LabelRevenue": "\u0412\u044b\u0440\u0443\u0447\u043a\u0430, $:", - "LabelOriginalAspectRatio": "\u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0442-\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d:", + "LabelBudget": "\u0411\u044e\u0434\u0436\u0435\u0442", + "LabelCustomRating": "\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0430\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f:", "LabelPlayers": "\u0418\u0433\u0440\u043e\u043a\u0438:", + "LabelOriginalAspectRatio": "\u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0442-\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d:", + "LabelAbsoluteEpisodeNumber": "\u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u044d\u043f\u0438\u0437\u043e\u0434\u0430:", "Label3DFormat": "\u0424\u043e\u0440\u043c\u0430\u0442 3D:", "HeaderAlternateEpisodeNumbers": "\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432", "LabelDvdSeasonNumber": "\u041d\u043e\u043c\u0435\u0440 DVD-\u0441\u0435\u0437\u043e\u043d\u0430:", "LabelDvdEpisodeNumber": "\u041d\u043e\u043c\u0435\u0440 DVD-\u044d\u043f\u0438\u0437\u043e\u0434\u0430:", - "LabelAbsoluteEpisodeNumber": "\u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u044d\u043f\u0438\u0437\u043e\u0434\u0430:", "HeaderSpecialEpisodeInfo": "\u041e \u0441\u043f\u0435\u0446\u044d\u043f\u0438\u0437\u043e\u0434\u0435", "LabelAirsBeforeSeason": "\u0421\u0435\u0437\u043e\u043d airs_before:", "LabelAirsAfterSeason": "\u0421\u0435\u0437\u043e\u043d airs_after:", @@ -201,172 +173,195 @@ "People": "\u041b\u044e\u0434\u0438", "LabelMetadataDownloadLanguage": "\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e:", "LabelLockItemToPreventChanges": "\u0417\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0431\u0443\u0434\u0443\u0449\u0438\u0435 \u043f\u0440\u0430\u0432\u043a\u0438", - "MessageLeaveEmptyToInherit": "\u041d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0439\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.", "LabelCountry": "\u0421\u0442\u0440\u0430\u043d\u0430:", + "MessageLeaveEmptyToInherit": "\u041d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0439\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "\u0413\u043e\u0434 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f:", "LabelBirthDate": "\u0414\u0430\u0442\u0430 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f:", - "LabelDeathDate": "\u0414\u0430\u0442\u0430 \u0441\u043c\u0435\u0440\u0442\u0438:", "LabelEndDate": "\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0434\u0430\u0442\u0430:", + "LabelDeathDate": "\u0414\u0430\u0442\u0430 \u0441\u043c\u0435\u0440\u0442\u0438:", "LabelSeasonNumber": "\u041d\u043e\u043c\u0435\u0440 \u0441\u0435\u0437\u043e\u043d\u0430:", "LabelEpisodeNumber": "\u041d\u043e\u043c\u0435\u0440 \u044d\u043f\u0438\u0437\u043e\u0434\u0430:", "LabelTrackNumber": "\u041d\u043e\u043c\u0435\u0440 \u0434\u043e\u0440\u043e\u0436\u043a\u0438:", "LabelNumber": "\u041d\u043e\u043c\u0435\u0440:", "LabelDiscNumber": "\u041d\u043e\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430:", - "LabelParentNumber": "\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043d\u043e\u043c\u0435\u0440:", "SortName": "\u0418\u043c\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438", + "LabelParentNumber": "\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043d\u043e\u043c\u0435\u0440:", "ReleaseDate": "\u0414\u0430\u0442\u0430 \u0432\u044b\u043f.", "Continuing": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0449\u0435\u0435\u0441\u044f", - "Ended": "\u041f\u0440\u0435\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u043e\u0435", "HeaderEnabledFields": "\u0412\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044f", + "Ended": "\u041f\u0440\u0435\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u043e\u0435", + "Keywords": "\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430", "HeaderEnabledFieldsHelp": "\u0421\u043d\u0438\u043c\u0438\u0442\u0435 \u0444\u043b\u0430\u0436\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435 \u0438 \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u043d\u0435\u043d\u0438\u0439.", + "Name": "\u0418\u043c\u044f", "Backdrops": "\u0417\u0430\u0434\u043d\u0438\u043a\u0438", "Images": "\u0420\u0438\u0441\u0443\u043d\u043a\u0438", - "Keywords": "\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430", "Runtime": "\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c", - "ProductionLocations": "\u041c\u0435\u0441\u0442\u0430 \u0441\u044a\u0451\u043c\u043e\u043a", + "Actor": "\u0410\u043a\u0442\u0451\u0440", "BirthLocation": "\u041c\u0435\u0441\u0442\u043e \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f", + "ProductionLocations": "\u041c\u0435\u0441\u0442\u0430 \u0441\u044a\u0451\u043c\u043e\u043a", "ParentalRating": "\u0412\u043e\u0437\u0440. \u043a\u0430\u0442.", - "Name": "\u0418\u043c\u044f", "Overview": "\u041e\u0431\u0437\u043e\u0440", "LabelType": "\u0422\u0438\u043f:", "LabelPersonRole": "\u0420\u043e\u043b\u044c:", "LabelPersonRoleHelp": "\u041f\u0440\u0438\u043c\u0435\u0440: \u0412\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0444\u0443\u0440\u0433\u043e\u043d\u0430 \u043c\u043e\u0440\u043e\u0436\u0435\u043d\u0449\u0438\u043a\u0430", - "Actor": "\u0410\u043a\u0442\u0451\u0440", "Composer": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043e\u0440", - "Director": "\u0420\u0435\u0436\u0438\u0441\u0441\u0451\u0440", "GuestStar": "\u041f\u0440\u0438\u0433\u043b. \u0430\u043a\u0442\u0451\u0440", + "Director": "\u0420\u0435\u0436\u0438\u0441\u0441\u0451\u0440", "Producer": "\u041f\u0440\u043e\u0434\u044e\u0441\u0435\u0440", "Writer": "\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0441\u0442", - "MessageNoSyncJobsFound": "\u0417\u0430\u0434\u0430\u043d\u0438\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043d\u043e\u043f\u043e\u043a \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.", - "MessageNoDownloadsFound": "\u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a. \u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0432\u0430\u0448\u0438 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.", - "InstallingPackage": "\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f {0}", + "MessageItemSaved": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d.", "PackageInstallCompleted": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 {0} \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430.", + "InstallingPackage": "\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f {0}", "PackageInstallFailed": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 {0} \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430.", "PackageInstallCancelled": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 {0} \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430.", "SeriesYearToPresent": "{0} - \u041d.\u0412.", - "ValueOneItem": "1 \u044d\u043b\u0435\u043c\u0435\u043d\u0442", "ValueOneSong": "1 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f", "ValueSongCount": "{0} \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438(\u0438\/\u0439)", "ValueOneMovie": "1 \u0444\u0438\u043b\u044c\u043c", "ValueMovieCount": "{0} \u0444\u0438\u043b\u044c\u043c(\u0430\/\u043e\u0432)", "ValueOneSeries": "1 \u0441\u0435\u0440\u0438\u0430\u043b", - "ValueSeriesCount": "{0} \u0441\u0435\u0440\u0438\u0430\u043b(\u0430\/\u043e\u0432)", "ValueOneEpisode": "1 \u044d\u043f\u0438\u0437\u043e\u0434", + "ValueSeriesCount": "{0} \u0441\u0435\u0440\u0438\u0430\u043b(\u0430\/\u043e\u0432)", "ValueEpisodeCount": "{0} \u044d\u043f\u0438\u0437\u043e\u0434(\u0430\/\u043e\u0432)", "ValueOneGame": "1 \u0438\u0433\u0440\u0430", - "ValueGameCount": "{0} \u0438\u0433\u0440(\u044b)", "ValueOneAlbum": "1 \u0430\u043b\u044c\u0431\u043e\u043c", - "ValueAlbumCount": "{0} \u0430\u043b\u044c\u0431\u043e\u043c(\u0430\/\u043e\u0432)", + "ValueGameCount": "{0} \u0438\u0433\u0440(\u044b)", "ValueOneMusicVideo": "1 \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e", + "ValueAlbumCount": "{0} \u0430\u043b\u044c\u0431\u043e\u043c(\u0430\/\u043e\u0432)", "ValueMusicVideoCount": "{0} \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0438\u0434\u0435\u043e", "ValueMinutes": "{0} \u043c\u0438\u043d", "HeaderIdentifyItemHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043f\u043e\u0438\u0441\u043a\u0430. \u0418\u0437\u044b\u043c\u0438\u0442\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0440\u0430\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.", "PleaseEnterNameOrId": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 ID.", - "MessageItemSaved": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d.", "SearchResults": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430", "SyncToOtherDevice": "\u0421\u0438\u043d\u0445\u0440\u043e \u0441 \u0434\u0440. \u0443\u0441\u0442\u0440-\u043e\u043c", "MakeAvailableOffline": "\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e", - "ServerNameIsRestarting": "Emby Server - {0} \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.", + "ButtonRestart": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c", "ServerNameIsShuttingDown": "Emby Server - {0} \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443.", + "PleaseRestartServerName": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.", "HeaderDeleteItems": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432", "ConfirmDeleteItems": "\u041f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u043d \u0443\u0434\u0430\u043b\u0438\u0442\u0441\u044f \u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0438 \u0438\u0437 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?", - "PleaseRestartServerName": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 Emby Server - {0}.", "SyncJobCreated": "\u0417\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043e.", "LabelSyncTo": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441:", "LabelSyncJobName": "\u0418\u043c\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0441\u0438\u043d\u0445\u0440-\u0438\u0438:", - "LabelQuality": "\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e:", "LabelSyncNoTargetsHelp": "\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438 \u0431\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f.", - "DownloadScheduled": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e", - "HeaderSyncRequiresSub": "\u0414\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere.", + "LabelQuality": "\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e:", "LearnMore": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435...", - "LabelProfile": "\u041f\u0440\u043e\u0444\u0438\u043b\u044c:", + "DownloadScheduled": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e", "LabelBitrateMbps": "\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u041c\u0431\u0438\u0442\/\u0441:", + "LabelProfile": "\u041f\u0440\u043e\u0444\u0438\u043b\u044c:", "SyncUnwatchedVideosOnly": "\u0421\u0438\u043d\u0445\u0440-\u0442\u044c \u043d\u0435\u043f\u0440\u043e\u0441\u043c-\u044b\u0435 \u0432\u0438\u0434\u0435\u043e", - "SyncUnwatchedVideosOnlyHelp": "\u0421\u0438\u043d\u0445\u0440-\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u043c-\u044b\u0435 \u0432\u0438\u0434\u0435\u043e, \u0430 \u043f\u0440\u043e\u0441\u043c-\u044b\u0435 \u0438\u0437\u044b\u043c\u0430\u044e\u0442\u0441\u044f \u0441 \u0443\u0441\u0442\u0440-\u0432\u0430.", "AutomaticallySyncNewContent": "\u0421\u0438\u043d\u0445\u0440-\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435", - "AutomaticallySyncNewContentHelp": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432 \u044d\u0442\u0443 \u043f\u0430\u043f\u043a\u0443, \u0430\u0432\u0442\u043e-\u043a\u0438 \u0441\u0438\u043d\u0445\u0440-\u0442\u0441\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u0443\u0441\u0442\u0440-\u043e\u043c.", - "LabelItemLimit": "\u041b\u0438\u043c\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:", - "LabelItemLimitHelp": "\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041b\u0438\u043c\u0438\u0442 \u0447\u0438\u0441\u043b\u0430 \u0441\u0438\u043d\u0445\u0440-\u0435\u043c\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.", "PleaseSelectDeviceToSyncTo": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.", + "LabelItemLimit": "\u041b\u0438\u043c\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:", + "SyncUnwatchedVideosOnlyHelp": "\u0421\u0438\u043d\u0445\u0440-\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u043c-\u044b\u0435 \u0432\u0438\u0434\u0435\u043e, \u0430 \u043f\u0440\u043e\u0441\u043c-\u044b\u0435 \u0438\u0437\u044b\u043c\u0430\u044e\u0442\u0441\u044f \u0441 \u0443\u0441\u0442\u0440-\u0432\u0430.", + "LabelItemLimitHelp": "\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041b\u0438\u043c\u0438\u0442 \u0447\u0438\u0441\u043b\u0430 \u0441\u0438\u043d\u0445\u0440-\u0435\u043c\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.", + "AutomaticallySyncNewContentHelp": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432 \u044d\u0442\u0443 \u043f\u0430\u043f\u043a\u0443, \u0430\u0432\u0442\u043e-\u043a\u0438 \u0441\u0438\u043d\u0445\u0440-\u0442\u0441\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u0443\u0441\u0442\u0440-\u043e\u043c.", + "Premiere": "\u041f\u0440\u0435\u043c\u044c\u0435\u0440\u0430", + "Live": "\u0422\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f", + "Repeat": "\u041f\u043e\u0432\u0442\u043e\u0440", + "Settings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b", + "DefaultErrorMessage": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435.", "Screenshots": "\u0421\u043d\u0438\u043c\u043a\u0438 \u044d\u043a\u0440\u0430\u043d\u0430", "MoveRight": "\u0414\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043f\u0440\u0430\u0432\u043e", "MoveLeft": "\u0414\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043b\u0435\u0432\u043e", "ConfirmDeleteImage": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043e\u043a?", "HeaderEditImages": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043a\u0438", - "Settings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b", "ShowIndicatorsFor": "\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043a\u0438 \u0434\u043b\u044f:", "NewEpisodes": "\u041d\u043e\u0432\u044b\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b", + "Premieres": "\u041f\u0440\u0435\u043c\u044c\u0435\u0440\u044b", "HDPrograms": "HD-\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438", "LiveBroadcasts": "\u041f\u0440\u044f\u043c\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438", - "Premieres": "\u041f\u0440\u0435\u043c\u044c\u0435\u0440\u044b", "RepeatEpisodes": "\u041f\u043e\u0432\u0442\u043e\u0440 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432", "DvrSubscriptionRequired": "\u0414\u043b\u044f \u0432\u0438\u0434\u0435\u043e\u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440\u0430 Emby \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere.", "HeaderCancelRecording": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c", - "CancelRecording": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c", - "HeaderKeepRecording": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438", - "HeaderCancelSeries": "\u041e\u0442\u043c\u0435\u043d\u0430 \u0441\u0435\u0440\u0438\u0430\u043b\u0430", - "HeaderKeepSeries": "\u0421\u0431\u0435\u0440\u0435\u0447\u044c \u0441\u0435\u0440\u0438\u0430\u043b", + "PromoConvertRecordingsToStreamingFormat": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Emby Premiere. \u0417\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 MP4 \u0438\u043b\u0438 MKV, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 Emby Server.", + "HeaderConvertYourRecordings": "\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439", "HeaderLearnMore": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435...", + "HeaderKeepRecording": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438", "DeleteMedia": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", "SeriesSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0435\u0440\u0438\u0430\u043b\u0430", "HeaderRecordingOptions": "\u041e\u043f\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438", - "CancelSeries": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b", "DoNotRecord": "\u041d\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c", - "HeaderSeriesOptions": "\u041e\u043f\u0446\u0438\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0430", + "CancelSeries": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b", "LabelChannels": "\u041a\u0430\u043d\u0430\u043b\u044b:", + "HeaderSeriesOptions": "\u041e\u043f\u0446\u0438\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0430", "ChannelNameOnly": "\u0422\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043d\u0430\u043b {0}", "Anytime": "\u0412 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f", "AroundTime": "\u041e\u043a\u043e\u043b\u043e {0}", "LabelAirtime": "\u0412\u0440\u0435\u043c\u044f \u044d\u0444\u0438\u0440\u0430:", - "AllChannels": "\u0412\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b", "LabelRecord": "\u0417\u0430\u043f\u0438\u0441\u044c:", + "AllChannels": "\u0412\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b", "NewEpisodesOnly": "\u0422\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b", "AllEpisodes": "\u0412\u0441\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b", "LabelStartWhenPossible": "\u041d\u0430\u0447\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e:", "LabelStopWhenPossible": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e:", "MinutesBefore": "\u043c\u0438\u043d\u0443\u0442(\u0443\/\u044b) \u0434\u043e", - "MinutesAfter": "\u043c\u0438\u043d\u0443\u0442(\u0443\/\u044b) \u043f\u043e\u0441\u043b\u0435", - "SkipEpisodesAlreadyInMyLibrary": "\u041d\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u044d\u043f\u0438\u0437\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043c\u043e\u0435\u0439 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435", "SkipEpisodesAlreadyInMyLibraryHelp": "\u042d\u043f\u0438\u0437\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0441\u0435\u0437\u043e\u043d\u043e\u0432 \u0438 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442\u0441\u044f.", + "SkipEpisodesAlreadyInMyLibrary": "\u041d\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u044d\u043f\u0438\u0437\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043c\u043e\u0435\u0439 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435", + "MinutesAfter": "\u043c\u0438\u043d\u0443\u0442(\u0443\/\u044b) \u043f\u043e\u0441\u043b\u0435", "LabelKeepUpTo": "\u0421\u0431\u0435\u0440\u0435\u0433\u0430\u0442\u044c \u0434\u043e:", "AsManyAsPossible": "\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435", - "DefaultErrorMessage": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435.", - "LabelKeep:": "\u0421\u0431\u0435\u0440\u0435\u0433\u0430\u0442\u044c:", "UntilIDelete": "\u041f\u043e\u043a\u0430 \u044f \u043d\u0435 \u0443\u0434\u0430\u043b\u044e", + "LabelKeep:": "\u0421\u0431\u0435\u0440\u0435\u0433\u0430\u0442\u044c:", "UntilSpaceNeeded": "\u041f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e", - "Categories": "\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438", "Sports": "\u0421\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u044b\u0435", + "Categories": "\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438", "News": "\u041d\u043e\u0432\u043e\u0441\u0442\u043d\u044b\u0435", "Movies": "\u0424\u0438\u043b\u044c\u043c\u043e\u0432\u044b\u0435", "Kids": "\u0414\u0435\u0442\u0441\u043a\u0438\u0435", "EnableColorCodedBackgrounds": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0444\u043e\u043d", "SortChannelsBy": "\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u044b \u043f\u043e:", - "RecentlyWatched": "\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0435", "ChannelNumber": "\u041d\u043e\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430", + "RecentlyWatched": "\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0435", + "PlaceFavoriteChannelsAtBeginning": "\u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435", + "SeriesCancelled": "\u0421\u0435\u0440\u0438\u0430\u043b \u043e\u0442\u043c\u0435\u043d\u0451\u043d.", + "HeaderKeepSeries": "\u0421\u0431\u0435\u0440\u0435\u0447\u044c \u0441\u0435\u0440\u0438\u0430\u043b", + "HeaderCancelSeries": "\u041e\u0442\u043c\u0435\u043d\u0430 \u0441\u0435\u0440\u0438\u0430\u043b\u0430", + "CancelRecording": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c", + "MessageUnlockAppWithSupporter": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0439\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u043e\u0439 Emby Premiere.", + "MessageUnlockAppWithPurchaseOrSupporter": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0439\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u043e\u043f\u043b\u0430\u0442\u044b, \u0438\u043b\u0438 \u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u043e\u0439 Emby Premiere .", + "MessageToValidateSupporter": "\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere, \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e Emby Premiere \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0432 \u0432\u0430\u0448\u0435\u0439 \u041f\u0430\u043d\u0435\u043b\u0438 Emby Server, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043f\u043e \u0449\u0435\u043b\u0447\u043a\u0443 \u043f\u043e Emby Premiere \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043c\u0435\u043d\u044e.", + "HeaderCinemaMode": "\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043d\u043e\u0437\u0430\u043b\u0430", + "HeaderCloudSync": "\u041e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f", + "HeaderOfflineDownloads": "\u0410\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0435 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", + "HeaderOfflineDownloadsDescription": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0432\u0430\u0448\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.", + "CloudSyncFeatureDescription": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0430\u0448\u0438\u0445 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0445 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f.", + "CoverArtFeatureDescription": "Cover Art \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u043b\u043e\u0436\u043a\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u0432\u0430\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u043a \u0432\u0430\u0448\u0438\u043c \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u043c.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043d\u043e\u0437\u0430\u043b\u0430 \u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043b\u0430 \u0441 \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0434 \u0444\u0438\u043b\u044c\u043c\u043e\u043c.", + "HeaderFreeApps": "\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", + "FreeAppsFeatureDescription": "\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0434\u043b\u044f \u0432\u0430\u0448\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.", + "LabelEmailAddress": "\u0410\u0434\u0440\u0435\u0441 \u042d-\u043f\u043e\u0447\u0442\u044b:", "HeaderBenefitsEmbyPremiere": "\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u043e\u0434\u043d\u043e\u0439 \u043c\u0438\u043d\u0443\u0442\u043e\u0439 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u043c \u0432\u0430\u0441 \u0437\u0430 \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043d\u0438\u0435 Emby.", "HeaderTryPlayback": "\u041e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435", + "IPurchasedThisApp": "\u042f \u043f\u0440\u0438\u043e\u0431\u0440\u0451\u043b \u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435", "HowDidYouPay": "\u041a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b \u043e\u043f\u043b\u0430\u0442\u0438\u043b\u0438?", "IHaveEmbyPremiere": "\u0423 \u043c\u0435\u043d\u044f \u0438\u043c\u0435\u0435\u0442\u0441\u044f Emby Premiere", - "IPurchasedThisApp": "\u042f \u043f\u0440\u0438\u043e\u0431\u0440\u0451\u043b \u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435", "ButtonRestorePreviousPurchase": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u0435", "ButtonUnlockWithPurchase": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043e\u043f\u043b\u0430\u0442\u044b", "ButtonUnlockPrice": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere \u043d\u0430 \u043c\u0435\u0441\u044f\u0446 {0}", - "HeaderAlreadyPaid": "\u0423\u0436\u0435 \u043e\u043f\u043b\u0430\u0442\u0438\u043b\u0438?", "ButtonPlayOneMinute": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043e\u0434\u043d\u0443 \u043c\u0438\u043d\u0443\u0442\u0443", - "PlaceFavoriteChannelsAtBeginning": "\u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435", "HeaderUnlockFeature": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443", "MessageDidYouKnowCinemaMode": "\u0417\u043d\u0430\u0435\u0442\u0435 \u043b\u0438 \u0432\u044b, \u0447\u0442\u043e \u0441 Emby Premiere \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0420\u0435\u0436\u0438\u043c\u0443 \u043a\u0438\u043d\u043e\u0437\u0430\u043b\u0430?", "MessageDidYouKnowCinemaMode2": "\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043d\u043e\u0437\u0430\u043b\u0430 \u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043b\u0430 \u0441 \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0434 \u0444\u0438\u043b\u044c\u043c\u043e\u043c.", - "HeaderPlayMyMedia": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043c\u043e\u0438 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", "HeaderDiscoverEmbyPremiere": "\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u0434\u043b\u044f \u0441\u0435\u0431\u044f Emby Premiere", - "Items": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b", + "HeaderPlayMyMedia": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043c\u043e\u0438 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", "OneChannel": "\u041e\u0434\u0438\u043d \u043a\u0430\u043d\u0430\u043b", - "ConfirmRemoveDownload": "\u0418\u0437\u044a\u044f\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443?", - "RemoveDownload": "\u0418\u0437\u044a\u044f\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere \u043d\u0430 \u043c\u0435\u0441\u044f\u0446 {0}", + "HeaderAlreadyPaid": "\u0423\u0436\u0435 \u043e\u043f\u043b\u0430\u0442\u0438\u043b\u0438?", "AddedOnValue": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e {0}", + "ConfirmRemoveDownload": "\u0418\u0437\u044a\u044f\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443?", + "CancelSyncJobConfirmation": "\u041e\u0442\u043c\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0438\u0437\u044a\u044f\u0442\u0438\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c?", + "ButtonCancelSyncJob": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e", + "MessageNoSyncJobsFound": "\u0417\u0430\u0434\u0430\u043d\u0438\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043d\u043e\u043f\u043e\u043a \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.", + "MessageNoDownloadsFound": "\u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a. \u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0432\u0430\u0448\u0438 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.", + "ValueOneItem": "1 \u044d\u043b\u0435\u043c\u0435\u043d\u0442", + "HeaderSyncRequiresSub": "\u0414\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere.", + "Items": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b", + "RemoveDownload": "\u0418\u0437\u044a\u044f\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443", "RemovingFromDevice": "\u0418\u0437\u044b\u043c\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", "RemoveFromDevice": "\u0418\u0437\u044a\u044f\u0442\u044c \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", "KeepOnDevice": "\u0414\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "\u0413\u043e\u0442\u043e\u0432\u043e \u043a \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0443", "SyncJobItemStatusSyncedMarkForRemoval": "\u0418\u0437\u044b\u043c\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", "SyncJobItemStatusQueued": "\u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u0438", - "SyncJobItemStatusConverting": "\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f", "SyncJobItemStatusTransferring": "\u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0441\u044f", - "SyncJobItemStatusSynced": "\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e", - "SyncJobItemStatusFailed": "\u041d\u0435\u0443\u0434\u0430\u0447\u043d\u043e", + "SyncJobItemStatusConverting": "\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f", "SyncJobItemStatusRemovedFromDevice": "\u0418\u0437\u044a\u044f\u0442\u043e \u0438\u0437 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", "SyncJobItemStatusCancelled": "\u041e\u0442\u043c\u0435\u043d\u0435\u043d\u043e", + "SyncJobItemStatusSynced": "\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e", + "SyncJobItemStatusFailed": "\u041d\u0435\u0443\u0434\u0430\u0447\u043d\u043e", "Retry": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c", "HeaderMyDevice": "\u041c\u043e\u0451 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", + "ContinueInSecondsValue": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 {0} \u0441.", "Continue": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c", - "ContinueInSecondsValue": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 {0} \u0441." + "AddToPlayQueue": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f", + "HeaderRemoteControl": "\u0423\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435", + "Disconnect": "\u0420\u0430\u0437\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f", + "EnableDisplayMirroring": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", + "HeaderSelectPlayer": "\u0412\u044b\u0431\u043e\u0440 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044f", + "Quality": "\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e", + "Auto": "\u0410\u0432\u0442\u043e" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json index 471c427e2e..b322fb989f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Add", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "Cancel", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", "Wednesday": "Wednesday", "Thursday": "Thursday", - "Friday": "Friday", "Saturday": "Saturday", "Days": "Days", + "Friday": "Friday", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "Save", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "Name:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "Name:", "NewCollectionNameExample": "Example: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Language:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Content type:", + "Add": "Add", "LabelPath": "Path:", + "LabelContentType": "Content type:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Country:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sl-si.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sl-si.json index 445f785c7e..14ccb7f9c2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sl-si.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sl-si.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Add", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "Cancel", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", "Wednesday": "Wednesday", "Thursday": "Thursday", - "Friday": "Friday", "Saturday": "Saturday", "Days": "Days", + "Friday": "Friday", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Uporaba te funkcionalnosti zahteva aktivno Emby Premiere narocnino.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "Save", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Dodaj v Zbirko", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "Name:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "Name:", "NewCollectionNameExample": "Example: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Jezik:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Dodaj v Zbirko", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Tip vsebine:", + "Add": "Add", "LabelPath": "Path:", + "LabelContentType": "Tip vsebine:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Izvajalci:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Drzava:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Kvaliteta:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Kvaliteta:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Samodejno sinhroniziraj nove vsebine", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Nastavitve", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Nastavitve", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json index ee4810ac63..dae8ff0a2f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Specialavsnitt - {0}", - "Share": "Dela", - "Add": "L\u00e4gg till", - "ServerUpdateNeeded": "Den h\u00e4r Emby servern beh\u00f6ver uppdateras. F\u00f6r att ladda ner senaste versionen, g\u00e5 till {0}", - "LiveTvGuideRequiresUnlock": "LiveTV guiden \u00e4r f\u00f6r n\u00e4rvarande begr\u00e4nsad till {0} kanaler. Klicka p\u00e5 l\u00e5sa upp knappen f\u00f6r att veta hur du kan ut\u00f6ka upplevelsen.", + "OptionTuesdayShort": "Tis", + "OptionMondayShort": "M\u00e5n", "AttributeNew": "Ny", - "Premiere": "Premi\u00e4r", - "Live": "Live", - "Repeat": "Upprepa", + "ServerUpdateNeeded": "Den h\u00e4r Emby servern beh\u00f6ver uppdateras. F\u00f6r att ladda ner senaste versionen, g\u00e5 till {0}", + "Share": "Dela", + "OptionSundayShort": "S\u00f6n", + "OptionThursdayShort": "Tor", + "OptionSaturdayShort": "L\u00f6r", + "OptionWednesdayShort": "Ons", + "OptionFridayShort": "Fre", + "HeaderSelectDate": "V\u00e4lj datum", "TrackCount": "{0} sp\u00e5r", "ItemCount": "{0} objekt", - "ReleaseYearValue": "Utgivnings\u00e5r: {0}", "OriginalAirDateValue": "Ursprungligt s\u00e4ndningsdatum: {0}", + "ReleaseYearValue": "Utgivnings\u00e5r: {0}", "EndsAtValue": "Slutar vid: {0}", - "OptionSundayShort": "S\u00f6n", - "OptionMondayShort": "M\u00e5n", - "OptionTuesdayShort": "Tis", - "OptionWednesdayShort": "Ons", - "OptionThursdayShort": "Tor", - "OptionFridayShort": "Fre", - "OptionSaturdayShort": "L\u00f6r", - "HeaderSelectDate": "V\u00e4lj datum", - "ButtonOk": "Ok", "ButtonCancel": "Avbryt", + "ButtonOk": "Ok", "ButtonGotIt": "F\u00f6rst\u00e5tt", - "ButtonRestart": "Starta om", - "RecordingCancelled": "Inspelning avbruten.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "LiveTV guiden \u00e4r f\u00f6r n\u00e4rvarande begr\u00e4nsad till {0} kanaler. Klicka p\u00e5 l\u00e5sa upp knappen f\u00f6r att veta hur du kan ut\u00f6ka upplevelsen.", "RecordingScheduled": "Inspelning schemalagd", - "SeriesRecordingScheduled": "Serieinspelning schemalagd.", "HeaderNewRecording": "Ny inspelning", "Sunday": "S\u00f6ndag", "Monday": "M\u00e5ndag", "Tuesday": "Tisdag", "Wednesday": "Onsdag", "Thursday": "Torsdag", - "Friday": "Fredag", "Saturday": "L\u00f6rdag", "Days": "Dagar", + "Friday": "Fredag", "RecordSeries": "Spela in serie", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Skaffa Emby Premium", "MessageActiveSubscriptionRequiredSeriesRecordings": "Ett aktivt Emby Premium-medlemskap kr\u00e4vs f\u00f6r att skapa automatiska TV-serieinspelningar.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Den h\u00e4r funktionen kr\u00e4ver en aktiv Emby Premium prenumeration.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Spela in", + "Advanced": "Avancerat", + "Download": "Ladda ned", + "Refresh": "Uppdatera", + "RefreshQueued": "Uppdatering k\u00f6ad.", "Save": "Spara", "Edit": "\u00c4ndra", - "Download": "Ladda ned", - "Advanced": "Avancerat", "Delete": "Ta bort", "HeaderDeleteItem": "Radera objekt", "ConfirmDeleteItem": "Tar du bort det h\u00e4r objeketet tas det ocks\u00e5 bort fr\u00e5n bpde ditt filsystem och mediabibliotek. \u00c4r du s\u00e4ker p\u00e5 att du vill forts\u00e4tta?", - "Refresh": "Uppdatera", - "RefreshQueued": "Uppdatering k\u00f6ad.", - "AddToCollection": "L\u00e4gg till samling", - "HeaderAddToCollection": "L\u00e4gg till samling", "NewCollection": "Ny samling", + "AddToCollection": "L\u00e4gg till samling", "LabelCollection": "Samling:", "Help": "Hj\u00e4lp", + "LabelName": "Namn:", "NewCollectionHelp": "Samlingar g\u00f6r det m\u00f6jligt att skapa personanpassade grupperingar av filmer eller annat inneh\u00e5ll.", "SearchForCollectionInternetMetadata": "S\u00f6k p\u00e5 internet efter grafik och metadata", - "LabelName": "Namn:", "NewCollectionNameExample": "Exemple: Star Wars-samling", - "MessageItemsAdded": "Objekt tillagda.", "OptionNew": "Ny...", + "MessageItemsAdded": "Objekt tillagda.", "LabelPlaylist": "Spellista:", "AddToPlaylist": "L\u00e4gg till i spellista", - "HeaderAddToPlaylist": "L\u00e4gg till i Spellista", + "RecordingCancelled": "Inspelning avbruten.", + "SeriesRecordingScheduled": "Serieinspelning schemalagd.", "Subtitles": "Undertexter", - "SearchForSubtitles": "S\u00f6k efter undertexter", "LabelLanguage": "Spr\u00e5k:", "Search": "S\u00f6k", "NoSubtitleSearchResultsFound": "Inga resultat hittades.", @@ -99,54 +68,57 @@ "MySubtitles": "Mina undertexter", "MessageDownloadQueued": "Nedladdning k\u00f6ad.", "EditSubtitles": "\u00c4ndra undertexter", + "SearchForSubtitles": "S\u00f6k efter undertexter", "UnlockGuide": "L\u00e5s upp guide", "RefreshMetadata": "Uppdatera metadata", "ReplaceExistingImages": "Skriv \u00f6ver befintliga bilder", "ReplaceAllMetadata": "Ers\u00e4tt all metadata", "SearchForMissingMetadata": "S\u00f6k efter saknad metadata", "LabelRefreshMode": "Uppdateringsl\u00e4ge:", + "RefreshDialogHelp": "Metadata uppdateras baserat p\u00e5 inst\u00e4llningar och internettj\u00e4nster som har aktiverats under Emby servers kontrollpanel.", "NoItemsFound": "Inga objekt hittades.", "HeaderSaySomethingLike": "S\u00e4g n\u00e5got som...", - "ButtonTryAgain": "F\u00f6rs\u00f6k igen", "HeaderYouSaid": "Du sa...", - "MessageWeDidntRecognizeCommand": "Ledsen, men vi k\u00e4nner inte igen det kommandot.", "MessageIfYouBlockedVoice": "Om du nekade tillg\u00e5ng f\u00f6r r\u00f6st\u00e5tkomst till appen s\u00e5 beh\u00f6ver du konfigurerara om innan du f\u00f6rs\u00f6ker igen.", + "ButtonTryAgain": "F\u00f6rs\u00f6k igen", + "MessageWeDidntRecognizeCommand": "Ledsen, men vi k\u00e4nner inte igen det kommandot.", "ValueDiscNumber": "Skiva {0}", - "Unrated": "Ej klassad", "Favorite": "Favorit", + "Unrated": "Ej klassad", "Like": "Gilla", "Dislike": "Ogilla", - "RefreshDialogHelp": "Metadata uppdateras baserat p\u00e5 inst\u00e4llningar och internettj\u00e4nster som har aktiverats under Emby servers kontrollpanel.", "Open": "\u00d6ppna", - "Play": "Spela upp", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Blanda", - "Identify": "Identifiera", - "EditImages": "\u00c4ndra bilder", - "EditInfo": "Redigera info", - "Sync": "Synk", - "InstantMix": "Omedelbar mix", "ViewAlbum": "Bl\u00e4ddra album", "ViewArtist": "Bl\u00e4ddra artist", + "Play": "Spela upp", + "Shuffle": "Blanda", + "InstantMix": "Omedelbar mix", "QueueAllFromHere": "K\u00f6a alla fr o m h\u00e4r", "PlayAllFromHere": "Spela upp alla fr o m h\u00e4r", + "Identify": "Identifiera", + "EditImages": "\u00c4ndra bilder", + "Sync": "Synk", + "EditInfo": "Redigera info", + "RemoveFromPlaylist": "Ta bort fr\u00e5n spellista", "PlayFromBeginning": "Spela fr\u00e5n b\u00f6rjan", "ResumeAt": "\u00c5teruppta fr\u00e5n {0}", - "RemoveFromPlaylist": "Ta bort fr\u00e5n spellista", - "RemoveFromCollection": "Ta bort fr\u00e5n samling", "Trailer": "Trailer", "MarkPlayed": "Markera som spelad", "MarkUnplayed": "Markera som ospelad", "GroupVersions": "Gruppera versioner", "PleaseSelectTwoItems": "Var god v\u00e4lj minst tv\u00e5 objekt.", + "Error": "Fel", "TryMultiSelect": "Pr\u00f6va flervalsmarkering", "TryMultiSelectMessage": "F\u00f6r att redigera flera mediaobjekt, klicka och h\u00e5ll p\u00e5 ett omslag och markera sedan s\u00e5 m\u00e5nga du vill. Pr\u00f6va nu!", "HeaderConfirmRecordingCancellation": "Bekr\u00e4fta avbrott av inspelning", "MessageConfirmRecordingCancellation": "\u00c4r du s\u00e4ker p\u00e5 att du vill avbryta denna inspelning?", - "Error": "Fel", + "HeaderAddToCollection": "L\u00e4gg till samling", + "HeaderAddToPlaylist": "L\u00e4gg till i Spellista", + "RemoveFromCollection": "Ta bort fr\u00e5n samling", "VoiceInput": "R\u00f6stinspelning", - "LabelContentType": "Inneh\u00e5llstyp:", + "Add": "L\u00e4gg till", "LabelPath": "S\u00f6kv\u00e4g:", + "LabelContentType": "Inneh\u00e5llstyp:", "LabelTitle": "Titel:", "LabelOriginalTitle": "Original titel:", "LabelSortTitle": "Sorteringstitel:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Konfigurera hur tillagt datum best\u00e4ms i Emby servern under Biblioteksinst\u00e4llningar", "LabelStatus": "Status:", "LabelArtists": "Artister:", - "LabelArtistsHelp": "Separera med ; vid flera", "LabelAlbumArtists": "Albumartist:", + "LabelArtistsHelp": "Separera med ; vid flera", "LabelAlbum": "Album:", - "LabelCommunityRating": "Anv\u00e4ndaromd\u00f6me:", "LabelVoteCount": "Antal r\u00f6ster:", + "LabelCommunityRating": "Anv\u00e4ndaromd\u00f6me:", "LabelMetascore": "Metabetyg:", "LabelCriticRating": "Kritikerbetyg:", "LabelCriticRatingSummary": "Sammanfattning av kritikerbetyg:", "LabelAwardSummary": "Sammanfattning av utm\u00e4rkelser:", "LabelWebsite": "Hemsida:", "LabelTagline": "Slogan:", - "LabelOverview": "Synopsis:", "LabelShortOverview": "Kort synopsis:", + "LabelOverview": "Synopsis:", "LabelReleaseDate": "Premi\u00e4rdatum:", "LabelYear": "\u00c5r:", "LabelPlaceOfBirth": "F\u00f6delseort:", "LabelAirDays": "S\u00e4ndningsdagar:", "LabelAirTime": "S\u00e4ndningstid:", - "LabelRuntimeMinutes": "Speltid (min):", "LabelParentalRating": "\u00c5ldersgr\u00e4ns:", - "LabelCustomRating": "Anpassad \u00e5ldersgr\u00e4ns:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Speltid (min):", "LabelRevenue": "Int\u00e4kter ($):", - "LabelOriginalAspectRatio": "Ursprungligt bildf\u00f6rh\u00e5llande:", + "LabelBudget": "Budget", + "LabelCustomRating": "Anpassad \u00e5ldersgr\u00e4ns:", "LabelPlayers": "Spelare:", + "LabelOriginalAspectRatio": "Ursprungligt bildf\u00f6rh\u00e5llande:", + "LabelAbsoluteEpisodeNumber": "Avsnittsnummer fr\u00e5n start:", "Label3DFormat": "3D-format:", "HeaderAlternateEpisodeNumbers": "Alternativ avsnittsnumrering", "LabelDvdSeasonNumber": "S\u00e4songsnummer p\u00e5 DVD:", "LabelDvdEpisodeNumber": "Avsnittsnummer p\u00e5 DVD:", - "LabelAbsoluteEpisodeNumber": "Avsnittsnummer fr\u00e5n start:", "HeaderSpecialEpisodeInfo": "Information om specialavsnitt", "LabelAirsBeforeSeason": "S\u00e4nds f\u00f6re s\u00e4song:", "LabelAirsAfterSeason": "S\u00e4nds efter s\u00e4song:", @@ -201,172 +173,195 @@ "People": "Personer", "LabelMetadataDownloadLanguage": "\u00d6nskat spr\u00e5k:", "LabelLockItemToPreventChanges": "L\u00e5s det h\u00e4r objektet f\u00f6r att f\u00f6rhindra \u00e4ndringar", - "MessageLeaveEmptyToInherit": "L\u00e4mna tomt f\u00f6r att \u00e4rva inst\u00e4llningarna fr\u00e5n \u00f6verordnat objekt, eller anv\u00e4nda globalt f\u00f6rval.", "LabelCountry": "Land:", + "MessageLeaveEmptyToInherit": "L\u00e4mna tomt f\u00f6r att \u00e4rva inst\u00e4llningarna fr\u00e5n \u00f6verordnat objekt, eller anv\u00e4nda globalt f\u00f6rval.", "LabelDynamicExternalId": "{0} ID:", "LabelBirthYear": "F\u00f6delse\u00e5r:", "LabelBirthDate": "F\u00f6delsedatum:", - "LabelDeathDate": "D\u00f6d:", "LabelEndDate": "Slutdatum:", + "LabelDeathDate": "D\u00f6d:", "LabelSeasonNumber": "S\u00e4songsnummer:", "LabelEpisodeNumber": "Avsnittsnummer:", "LabelTrackNumber": "Sp\u00e5r nr", "LabelNumber": "Nr:", "LabelDiscNumber": "Skiva nr", - "LabelParentNumber": "F\u00f6r\u00e4lder nr", "SortName": "Sorteringstitel", + "LabelParentNumber": "F\u00f6r\u00e4lder nr", "ReleaseDate": "Releasedatum", "Continuing": "P\u00e5g\u00e5ende", - "Ended": "Avslutad", "HeaderEnabledFields": "Aktiverade f\u00e4lt", + "Ended": "Avslutad", + "Keywords": "Nyckelord", "HeaderEnabledFieldsHelp": "Bocka ur ett f\u00e4lt f\u00f6r att l\u00e5sa det och undvik att dess data \u00e4ndras.", + "Name": "Namn", "Backdrops": "Fondbilder", "Images": "Bilder", - "Keywords": "Nyckelord", "Runtime": "Speltid", - "ProductionLocations": "Produktionsplatser", + "Actor": "Sk\u00e5despelare", "BirthLocation": "F\u00f6delseort", + "ProductionLocations": "Produktionsplatser", "ParentalRating": "Parental Rating", - "Name": "Namn", "Overview": "\u00d6versikt", "LabelType": "Typ:", "LabelPersonRole": "Roll:", "LabelPersonRoleHelp": "Exempel: glassbilsf\u00f6rare", - "Actor": "Sk\u00e5despelare", "Composer": "Komposit\u00f6r", - "Director": "Regiss\u00f6r", "GuestStar": "G\u00e4stmedverkande", + "Director": "Regiss\u00f6r", "Producer": "Producent", "Writer": "Manusf\u00f6rfattare", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installerar {0}", + "MessageItemSaved": "Objektet har sparats.", "PackageInstallCompleted": "Installationen av {0} slutf\u00f6rdes.", + "InstallingPackage": "Installerar {0}", "PackageInstallFailed": "Installationen av {0} misslyckades.", "PackageInstallCancelled": "Installationen av {0} avbr\u00f6ts.", "SeriesYearToPresent": "{0} -nu", - "ValueOneItem": "1 item", "ValueOneSong": "1 l\u00e5t", "ValueSongCount": "{0} l\u00e5tar", "ValueOneMovie": "1 film", "ValueMovieCount": "{0} filmer", "ValueOneSeries": "1 serie", - "ValueSeriesCount": "{0} serier", "ValueOneEpisode": "1 avsnitt", + "ValueSeriesCount": "{0} serier", "ValueEpisodeCount": "{0} avsnitt", "ValueOneGame": "1 spel", - "ValueGameCount": "{0} spel", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} album", + "ValueGameCount": "{0} spel", "ValueOneMusicVideo": "1 musikvideo", + "ValueAlbumCount": "{0} album", "ValueMusicVideoCount": "{0} musikvideor", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Ange ett eller flera s\u00f6kkriterier. Ta bort kriterier f\u00f6r att f\u00e5 fler tr\u00e4ffar.", "PleaseEnterNameOrId": "Ange ett namn eller externt id.", - "MessageItemSaved": "Objektet har sparats.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "G\u00f6r tillg\u00e4nglig offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Starta om", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Ta bort objekt", "ConfirmDeleteItems": "Tar du bort dessa objekt tas dom ocks\u00e5 bort ifr\u00e5n b\u00e5de ditt filsystem och mediabibliotek. \u00c4r du s\u00e4ker p\u00e5 att du vill forts\u00e4tta?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Synkroniseringsjobb har skapats.", "LabelSyncTo": "Synka till:", "LabelSyncJobName": "Synkjobb:", - "LabelQuality": "Kvalitet", "LabelSyncNoTargetsHelp": "Det verkar som att du inte har n\u00e5gra appar som st\u00f6djer synkronisering.", - "DownloadScheduled": "Nedladdningsschema", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Kvalitet", "LearnMore": "L\u00e4s mer", - "LabelProfile": "Profil:", + "DownloadScheduled": "Nedladdningsschema", "LabelBitrateMbps": "Hastighet (Mbps)", + "LabelProfile": "Profil:", "SyncUnwatchedVideosOnly": "Synkronisera endast osedda videos", - "SyncUnwatchedVideosOnlyHelp": "Endast osedda videos kommer att synkroniseras, och videos kommer att tas bort fr\u00e5n enheten n\u00e4r de har tittats p\u00e5.", "AutomaticallySyncNewContent": "Synkronisera automatiskt nytt inneh\u00e5ll", - "AutomaticallySyncNewContentHelp": "Nytt inneh\u00e5ll kommer automatiskt att synkroniseras till den h\u00e4r enheten.", - "LabelItemLimit": "Max antal objekt:", - "LabelItemLimitHelp": "Valfritt. St\u00e4ll in antalet objekt som ska synkroniseras.", "PleaseSelectDeviceToSyncTo": "V\u00e4lj en enhet att synkronisera till.", + "LabelItemLimit": "Max antal objekt:", + "SyncUnwatchedVideosOnlyHelp": "Endast osedda videos kommer att synkroniseras, och videos kommer att tas bort fr\u00e5n enheten n\u00e4r de har tittats p\u00e5.", + "LabelItemLimitHelp": "Valfritt. St\u00e4ll in antalet objekt som ska synkroniseras.", + "AutomaticallySyncNewContentHelp": "Nytt inneh\u00e5ll kommer automatiskt att synkroniseras till den h\u00e4r enheten.", + "Premiere": "Premi\u00e4r", + "Live": "Live", + "Repeat": "Upprepa", + "Settings": "Inst\u00e4llningar", + "DefaultErrorMessage": "Ett fel uppstd vid beg\u00e4ran. F\u00f6rs\u00f6k igen senare.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Inst\u00e4llningar", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "Ett fel uppstd vid beg\u00e4ran. F\u00f6rs\u00f6k igen senare.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json index cb72ea3147..d9ca23d872 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Ekle", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "\u0130ptal", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Pazar", "Monday": "Pazartesi", "Tuesday": "Sal\u0131", "Wednesday": "\u00c7ar\u015famba", "Thursday": "Per\u015fembe", - "Friday": "Cuma", "Saturday": "Cumartesi", "Days": "G\u00fcnler", + "Friday": "Cuma", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Kay\u0131t", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "Kay\u0131t", "Edit": "D\u00fczenle", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Sil", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "Yeni Koleksiyon", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "\u0130sim", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "\u0130sim", "NewCollectionNameExample": "Example: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Dil", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "\u00c7al", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "\u00c7al", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Content type:", + "Add": "Ekle", "LabelPath": "Path:", + "LabelContentType": "Content type:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "\u00dclke", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Topluluk", - "Ended": "Bitmi\u015f", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Bitmi\u015f", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "T\u00fcr", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json index 7980320fec..e00fa7e349 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Add", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", "Wednesday": "Wednesday", "Thursday": "Thursday", - "Friday": "Friday", "Saturday": "Saturday", "Days": "Days", + "Friday": "Friday", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "\u0417\u0431\u0435\u0440\u0456\u0433\u0442\u0438", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "Name:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "Name:", "NewCollectionNameExample": "Example: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "\u041c\u043e\u0432\u0430:", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "\u0414\u0438\u0441\u043a {0}", - "Unrated": "Unrated", "Favorite": "\u0423\u043b\u044e\u0431\u043b\u0435\u043d\u0435", + "Unrated": "Unrated", "Like": "\u041f\u043e\u0434\u043e\u0431\u0430\u0454\u0442\u044c\u0441\u044f", "Dislike": "\u041d\u0435 \u043f\u043e\u0434\u043e\u0431\u0430\u0454\u0442\u044c\u0441\u044f", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Content type:", + "Add": "Add", "LabelPath": "\u0428\u043b\u044f\u0445:", + "LabelContentType": "Content type:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "\u041a\u0440\u0430\u0457\u043d\u0430:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "\u0420\u0456\u043a \u043d\u0430\u0440\u043e\u0434\u0436\u0435\u043d\u043d\u044f:", "LabelBirthDate": "\u0414\u0430\u0442\u0430 \u043d\u0430\u0440\u043e\u0434\u0436\u0435\u043d\u043d\u044f:", - "LabelDeathDate": "\u0414\u0430\u0442\u0430 \u0441\u043c\u0435\u0440\u0442\u0456:", "LabelEndDate": "End date:", + "LabelDeathDate": "\u0414\u0430\u0442\u0430 \u0441\u043c\u0435\u0440\u0442\u0456:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 \u043f\u0456\u0441\u043d\u044f", "ValueSongCount": "{0} \u043f\u0456\u0441\u0435\u043d\u044c", "ValueOneMovie": "1 \u0444\u0456\u043b\u044c\u043c", "ValueMovieCount": "{0} \u0444\u0456\u043b\u044c\u043c\u0456\u0432", "ValueOneSeries": "1 \u0441\u0435\u0440\u0456\u044f", - "ValueSeriesCount": "{0} \u0441\u0435\u0440\u0456\u0439", "ValueOneEpisode": "1 \u0435\u043f\u0456\u0437\u043e\u0434", + "ValueSeriesCount": "{0} \u0441\u0435\u0440\u0456\u0439", "ValueEpisodeCount": "{0} \u0435\u043f\u0456\u0437\u043e\u0434\u0456\u0432", "ValueOneGame": "1 \u0433\u0440\u0430", - "ValueGameCount": "{0} \u0456\u0433\u0440", "ValueOneAlbum": "1 \u0430\u043b\u044c\u0431\u043e\u043c", - "ValueAlbumCount": "{0} \u0430\u043b\u044c\u0431\u043e\u043c\u0456\u0432", + "ValueGameCount": "{0} \u0456\u0433\u0440", "ValueOneMusicVideo": "1 \u043c\u0443\u0437\u0438\u0447\u043d\u0438\u0439 \u043a\u043b\u0456\u043f", + "ValueAlbumCount": "{0} \u0430\u043b\u044c\u0431\u043e\u043c\u0456\u0432", "ValueMusicVideoCount": "{0} \u043c\u0443\u0437\u0438\u0447\u043d\u0438\u0445 \u043a\u043b\u0456\u043f\u0456\u0432", "ValueMinutes": "{0} \u0445\u0432\u0438\u043b\u0438\u043d", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json b/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json index a82263b325..93106e4d49 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "Th\u00eam", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "Select Date", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", "ButtonCancel": "Tho\u00e1t", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "Ch\u1ee7 Nh\u1eadt", "Monday": "Th\u1ee9 Hai", "Tuesday": "Tuesday", "Wednesday": "Wednesday", "Thursday": "Thursday", - "Friday": "Friday", "Saturday": "Th\u1ee9 B\u1ea3y", "Days": "Days", + "Friday": "Friday", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "Refresh", + "RefreshQueued": "Refresh queued.", "Save": "L\u01b0u", "Edit": "Edit", - "Download": "Download", - "Advanced": "Advanced", "Delete": "Delete", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "Help", + "LabelName": "T\u00ean:", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", - "LabelName": "T\u00ean:", "NewCollectionNameExample": "Example: Star Wars Collection", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Ng\u00f4n ng\u1eef", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "Edit subtitles", + "SearchForSubtitles": "Search for Subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "Play", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "Play", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Content type:", + "Add": "Th\u00eam", "LabelPath": "Path:", + "LabelContentType": "Content type:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "Qu\u1ed1c gia:", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "Continuing", - "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", + "Ended": "Ended", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-cn.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-cn.json index 1d49f63193..c0340c3e73 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-cn.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-cn.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "\u7279\u5178 - {0}", - "Share": "\u5171\u4eab", - "Add": "\u6dfb\u52a0", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "\u661f\u671f\u4e8c", + "OptionMondayShort": "\u661f\u671f\u4e00", "AttributeNew": "New", - "Premiere": "\u9996\u6620", - "Live": "\u76f4\u64ad", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "\u5171\u4eab", + "OptionSundayShort": "\u661f\u671f\u65e5", + "OptionThursdayShort": "\u661f\u671f\u56db", + "OptionSaturdayShort": "\u661f\u671f\u516d", + "OptionWednesdayShort": "\u661f\u671f\u4e09", + "OptionFridayShort": "\u661f\u671f\u4e94", + "HeaderSelectDate": "\u9009\u62e9\u65e5\u671f", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "\u53d1\u5e03\u5e74\u4efd\uff1a{0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "\u53d1\u5e03\u5e74\u4efd\uff1a{0}", "EndsAtValue": "\u7ed3\u675f\u4e8e {0}", - "OptionSundayShort": "\u661f\u671f\u65e5", - "OptionMondayShort": "\u661f\u671f\u4e00", - "OptionTuesdayShort": "\u661f\u671f\u4e8c", - "OptionWednesdayShort": "\u661f\u671f\u4e09", - "OptionThursdayShort": "\u661f\u671f\u56db", - "OptionFridayShort": "\u661f\u671f\u4e94", - "OptionSaturdayShort": "\u661f\u671f\u516d", - "HeaderSelectDate": "\u9009\u62e9\u65e5\u671f", - "ButtonOk": "\u786e\u5b9a", "ButtonCancel": "\u53d6\u6d88", + "ButtonOk": "\u786e\u5b9a", "ButtonGotIt": "\u77e5\u9053\u4e86", - "ButtonRestart": "\u91cd\u542f", - "RecordingCancelled": "\u5f55\u5236\u5df2\u53d6\u6d88\u3002", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "\u65b0\u5f55\u5236", "Sunday": "\u661f\u671f\u5929", "Monday": "\u661f\u671f\u4e00", "Tuesday": "\u661f\u671f\u4e8c", "Wednesday": "\u661f\u671f\u4e09", "Thursday": "\u661f\u671f\u56db", - "Friday": "\u661f\u671f\u4e94", "Saturday": "\u661f\u671f\u516d", "Days": "\u5929", + "Friday": "\u661f\u671f\u4e94", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "\u79bb\u7ebf\u5a92\u4f53", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "\u5c01\u9762\u56fe", - "ButtonCancelSyncJob": "\u53d6\u6d88\u540c\u6b65", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "\u514d\u8d39 Emby \u5e94\u7528", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "\u83b7\u53d6 Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "\u90ae\u7bb1\u5730\u5740\uff1a", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "\u8f6c\u6362\u60a8\u7684\u5f55\u5236", "Record": "\u5f55\u5236", + "Advanced": "\u9ad8\u7ea7", + "Download": "\u4e0b\u8f7d", + "Refresh": "\u5237\u65b0", + "RefreshQueued": "\u5217\u961f\u5df2\u5237\u65b0\u3002", "Save": "\u50a8\u5b58", "Edit": "\u7f16\u8f91", - "Download": "\u4e0b\u8f7d", - "Advanced": "\u9ad8\u7ea7", "Delete": "\u5220\u9664", "HeaderDeleteItem": "\u5220\u9664\u9879\u76ee", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "\u5237\u65b0", - "RefreshQueued": "\u5217\u961f\u5df2\u5237\u65b0\u3002", - "AddToCollection": "\u52a0\u5165\u5408\u96c6", - "HeaderAddToCollection": "\u52a0\u5165\u5408\u96c6", "NewCollection": "\u65b0\u5408\u96c6", + "AddToCollection": "\u52a0\u5165\u5408\u96c6", "LabelCollection": "\u5408\u96c6\uff1a", "Help": "\u5e2e\u52a9", + "LabelName": "\u540d\u5b57\uff1a", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "\u5728\u4e92\u8054\u7f51\u4e0a\u641c\u7d22\u5a92\u4f53\u56fe\u50cf\u548c\u8d44\u6599", - "LabelName": "\u540d\u5b57\uff1a", "NewCollectionNameExample": "\u4f8b\u5982\uff1a\u661f\u7403\u5927\u6218\u5408\u96c6", - "MessageItemsAdded": "\u9879\u76ee\u5df2\u6dfb\u52a0\u3002", "OptionNew": "\u66f4\u65b0...", + "MessageItemsAdded": "\u9879\u76ee\u5df2\u6dfb\u52a0\u3002", "LabelPlaylist": "\u64ad\u653e\u5217\u8868\uff1a", "AddToPlaylist": "\u6dfb\u52a0\u5230\u64ad\u653e\u5217\u8868", - "HeaderAddToPlaylist": "\u6dfb\u52a0\u5230\u64ad\u653e\u5217\u8868", + "RecordingCancelled": "\u5f55\u5236\u5df2\u53d6\u6d88\u3002", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "\u5b57\u5e55", - "SearchForSubtitles": "\u641c\u7d22\u5b57\u5e55", "LabelLanguage": "\u8bed\u8a00\uff1a", "Search": "\u641c\u7d22", "NoSubtitleSearchResultsFound": "\u672a\u627e\u5230\u7ed3\u679c\u3002", @@ -99,54 +68,57 @@ "MySubtitles": "\u6211\u7684\u5b57\u5e55", "MessageDownloadQueued": "\u4e0b\u8f7d\u5df2\u5217\u961f\u3002", "EditSubtitles": "\u4fee\u6539\u5b57\u5e55", + "SearchForSubtitles": "\u641c\u7d22\u5b57\u5e55", "UnlockGuide": "\u89e3\u9501\u6307\u5357", "RefreshMetadata": "\u5237\u65b0\u5a92\u4f53\u8d44\u6599", "ReplaceExistingImages": "\u66ff\u6362\u73b0\u6709\u56fe\u7247", "ReplaceAllMetadata": "\u8986\u76d6\u6240\u6709\u5a92\u4f53\u8d44\u6599", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "\u5237\u65b0\u6a21\u5f0f\uff1a", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "\u672a\u627e\u5230\u9879\u76ee\u3002", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "\u91cd\u8bd5", "HeaderYouSaid": "\u60a8\u8bf4\u4e86...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "\u91cd\u8bd5", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "\u76d8 {0}", - "Unrated": "Unrated", "Favorite": "\u6211\u7684\u6700\u7231", + "Unrated": "Unrated", "Like": "\u559c\u6b22", "Dislike": "\u4e0d\u559c\u6b22", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "\u6253\u5f00", - "Play": "\u64ad\u653e", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "\u968f\u673a\u64ad\u653e", - "Identify": "\u8bc6\u522b", - "EditImages": "\u4fee\u6539\u56fe\u7247", - "EditInfo": "\u7f16\u8f91\u4fe1\u606f", - "Sync": "\u540c\u6b65", - "InstantMix": "\u5373\u65f6\u6df7\u97f3", "ViewAlbum": "\u67e5\u770b\u4e13\u8f91", "ViewArtist": "\u67e5\u770b\u827a\u672f\u5bb6", + "Play": "\u64ad\u653e", + "Shuffle": "\u968f\u673a\u64ad\u653e", + "InstantMix": "\u5373\u65f6\u6df7\u97f3", "QueueAllFromHere": "\u8fd9\u91cc\u7684\u5168\u90e8\u5185\u5bb9\u90fd\u52a0\u5165\u961f\u5217", "PlayAllFromHere": "\u8fd9\u91cc\u7684\u5168\u90e8\u5185\u5bb9\u90fd\u5f00\u59cb\u64ad\u653e", + "Identify": "\u8bc6\u522b", + "EditImages": "\u4fee\u6539\u56fe\u7247", + "Sync": "\u540c\u6b65", + "EditInfo": "\u7f16\u8f91\u4fe1\u606f", + "RemoveFromPlaylist": "\u4ece\u64ad\u653e\u5217\u8868\u4e2d\u79fb\u9664", "PlayFromBeginning": "\u4ece\u5934\u64ad\u653e", "ResumeAt": "\u6062\u590d\u64ad\u653e\u4e8e{0}", - "RemoveFromPlaylist": "\u4ece\u64ad\u653e\u5217\u8868\u4e2d\u79fb\u9664", - "RemoveFromCollection": "Remove from collection", "Trailer": "\u9884\u544a\u7247", "MarkPlayed": "\u6807\u4e3a\u5df2\u64ad\u653e", "MarkUnplayed": "\u6807\u4e3a\u672a\u64ad\u653e", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "\u8bf7\u81f3\u5c11\u9009\u62e92\u4e2a\u9879\u76ee\u3002", + "Error": "\u9519\u8bef", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "\u786e\u8ba4\u53d6\u6d88\u5f55\u5236", "MessageConfirmRecordingCancellation": "\u4f60\u786e\u5b9a\u5e0c\u671b\u53d6\u6d88\u5f55\u5236\uff1f", - "Error": "\u9519\u8bef", + "HeaderAddToCollection": "\u52a0\u5165\u5408\u96c6", + "HeaderAddToPlaylist": "\u6dfb\u52a0\u5230\u64ad\u653e\u5217\u8868", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "\u8bed\u97f3\u8f93\u5165", - "LabelContentType": "\u5185\u5bb9\u7c7b\u578b", + "Add": "\u6dfb\u52a0", "LabelPath": "\u8def\u5f84\uff1a", + "LabelContentType": "\u5185\u5bb9\u7c7b\u578b", "LabelTitle": "\u6807\u9898\uff1a", "LabelOriginalTitle": "\u539f\u6807\u9898\uff1a", "LabelSortTitle": "\u77ed\u6807\u9898\uff1a", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "\u72b6\u6001\uff1a", "LabelArtists": "\u827a\u672f\u5bb6\uff1a", - "LabelArtistsHelp": "\u72ec\u7acb\u591a\u529f\u80fd\uff1b", "LabelAlbumArtists": "\u4e13\u8f91\u4f5c\u5bb6\uff1a", + "LabelArtistsHelp": "\u72ec\u7acb\u591a\u529f\u80fd\uff1b", "LabelAlbum": "\u4e13\u8f91\uff1a", - "LabelCommunityRating": "\u516c\u4f17\u8bc4\u5206\uff1a", "LabelVoteCount": "\u6295\u7968\u8ba1\u6570\uff1a", + "LabelCommunityRating": "\u516c\u4f17\u8bc4\u5206\uff1a", "LabelMetascore": "\u5a92\u4f53\u8bc4\u5206\uff1a", "LabelCriticRating": "\u5f71\u8bc4\u4eba\u8bc4\u5206\uff1a", "LabelCriticRatingSummary": "\u5f71\u8bc4\u4eba\u8bc4\u4ef7\uff1a", "LabelAwardSummary": "\u83b7\u5956\u6458\u8981\uff1a", "LabelWebsite": "\u7f51\u7ad9\uff1a", "LabelTagline": "\u53e3\u53f7\uff1a", - "LabelOverview": "\u5185\u5bb9\u6982\u8ff0\uff1a", "LabelShortOverview": "\u7b80\u4ecb\uff1a", + "LabelOverview": "\u5185\u5bb9\u6982\u8ff0\uff1a", "LabelReleaseDate": "\u53d1\u884c\u65e5\u671f\uff1a", "LabelYear": "\u5e74\u4efd\uff1a", "LabelPlaceOfBirth": "\u51fa\u751f\u5730\uff1a", "LabelAirDays": "\u64ad\u51fa\u65e5\u671f\uff1a", "LabelAirTime": "\u64ad\u51fa\u65f6\u95f4\uff1a", - "LabelRuntimeMinutes": "\u64ad\u653e\u65f6\u957f\uff08\u5206\u949f\uff09\uff1a", "LabelParentalRating": "\u5bb6\u957f\u5206\u7ea7\uff1a", - "LabelCustomRating": "\u81ea\u5b9a\u4e49\u5206\u7ea7\uff1a", - "LabelBudget": "\u6295\u8d44\u989d\uff1a", + "LabelRuntimeMinutes": "\u64ad\u653e\u65f6\u957f\uff08\u5206\u949f\uff09\uff1a", "LabelRevenue": "\u7968\u623f\u6536\u5165\uff1a", - "LabelOriginalAspectRatio": "\u539f\u59cb\u957f\u5bbd\u6bd4\uff1a", + "LabelBudget": "\u6295\u8d44\u989d\uff1a", + "LabelCustomRating": "\u81ea\u5b9a\u4e49\u5206\u7ea7\uff1a", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "\u539f\u59cb\u957f\u5bbd\u6bd4\uff1a", + "LabelAbsoluteEpisodeNumber": "\u7edd\u5bf9\u96c6\u6570\uff1a", "Label3DFormat": "3D\u683c\u5f0f\uff1a", "HeaderAlternateEpisodeNumbers": "\u5907\u9009\u7684\u5267\u96c6\u6570", "LabelDvdSeasonNumber": "Dvd \u5b63\u6570\uff1a", "LabelDvdEpisodeNumber": "Dvd \u96c6\u6570\uff1a", - "LabelAbsoluteEpisodeNumber": "\u7edd\u5bf9\u96c6\u6570\uff1a", "HeaderSpecialEpisodeInfo": "\u7279\u522b\u5267\u96c6\u4fe1\u606f", "LabelAirsBeforeSeason": "\u5b63\u64ad\u51fa\u524d\uff1a", "LabelAirsAfterSeason": "\u5b63\u64ad\u51fa\u540e\uff1a", @@ -201,172 +173,195 @@ "People": "\u4eba\u7269", "LabelMetadataDownloadLanguage": "\u9996\u9009\u4e0b\u8f7d\u8bed\u8a00\uff1a", "LabelLockItemToPreventChanges": "\u9501\u5b9a\u6b64\u9879\u76ee\u9632\u6b62\u6539\u52a8", - "MessageLeaveEmptyToInherit": "\u7559\u7a7a\u5219\u7ee7\u627f\u7236\u9879\u6216\u5168\u5c40\u9ed8\u8ba4\u503c\u8bbe\u7f6e\u3002", "LabelCountry": "\u56fd\u5bb6\uff1a", + "MessageLeaveEmptyToInherit": "\u7559\u7a7a\u5219\u7ee7\u627f\u7236\u9879\u6216\u5168\u5c40\u9ed8\u8ba4\u503c\u8bbe\u7f6e\u3002", "LabelDynamicExternalId": "{0} Id\uff1a", "LabelBirthYear": "\u51fa\u751f\u5e74\u4efd\uff1a", "LabelBirthDate": "\u51fa\u751f\u65e5\u671f\uff1a", - "LabelDeathDate": "\u53bb\u4e16\u65e5\u671f\uff1a", "LabelEndDate": "\u7ed3\u675f\u65e5\u671f\uff1a", + "LabelDeathDate": "\u53bb\u4e16\u65e5\u671f\uff1a", "LabelSeasonNumber": "\u5b63\u53f7\uff1a", "LabelEpisodeNumber": "\u96c6\u53f7\uff1a", "LabelTrackNumber": "\u97f3\u8f68\u53f7\u7801\uff1a", "LabelNumber": "\u7f16\u53f7\uff1a", "LabelDiscNumber": "\u5149\u76d8\u53f7\uff1a", - "LabelParentNumber": "\u7236\u7f16\u53f7\uff1a", "SortName": "\u6392\u5e8f\u540d\u79f0", + "LabelParentNumber": "\u7236\u7f16\u53f7\uff1a", "ReleaseDate": "\u53d1\u884c\u65e5\u671f", "Continuing": "\u7ee7\u7eed", - "Ended": "\u7ed3\u675f", "HeaderEnabledFields": "\u5df2\u542f\u7528\u7684\u680f", + "Ended": "\u7ed3\u675f", + "Keywords": "\u5173\u952e\u8bcd", "HeaderEnabledFieldsHelp": "\u53cd\u9009\u680f\u4ee5\u9501\u5b9a\u5e76\u4e0d\u8ba9\u5176\u6570\u636e\u88ab\u66f4\u6539\u3002", + "Name": "\u540d\u79f0", "Backdrops": "\u80cc\u666f", "Images": "\u56fe\u7247", - "Keywords": "\u5173\u952e\u8bcd", "Runtime": "\u64ad\u653e\u65f6\u957f", - "ProductionLocations": "Production locations", + "Actor": "\u6f14\u5458", "BirthLocation": "\u51fa\u751f\u5730", + "ProductionLocations": "Production locations", "ParentalRating": "\u5bb6\u957f\u5206\u7ea7", - "Name": "\u540d\u79f0", "Overview": "\u6982\u8ff0", "LabelType": "\u7c7b\u578b\uff1a", "LabelPersonRole": "\u89d2\u8272\uff1a", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "\u6f14\u5458", "Composer": "\u4f5c\u66f2\u5bb6", - "Director": "\u5bfc\u6f14", "GuestStar": "\u7279\u9080\u660e\u661f", + "Director": "\u5bfc\u6f14", "Producer": "\u5236\u7247\u4eba", "Writer": "\u7f16\u5267", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "\u6b63\u5728\u5b89\u88c5 {0}", + "MessageItemSaved": "\u9879\u76ee\u5df2\u4fdd\u5b58\u3002", "PackageInstallCompleted": "{0} \u5b89\u88c5\u5b8c\u6210\u3002", + "InstallingPackage": "\u6b63\u5728\u5b89\u88c5 {0}", "PackageInstallFailed": "{0} \u5b89\u88c5\u5931\u8d25\u3002", "PackageInstallCancelled": "{0} \u5b89\u88c5\u88ab\u53d6\u6d88\u3002", "SeriesYearToPresent": "{0} - \u73b0\u5728", - "ValueOneItem": "1 item", "ValueOneSong": "1\u9996\u6b4c", "ValueSongCount": "{0} \u9996\u6b4c", "ValueOneMovie": "1 \u4e2a\u7535\u5f71", "ValueMovieCount": "{0} \u4e2a\u7535\u5f71", "ValueOneSeries": "1 \u4e2a\u7cfb\u5217", - "ValueSeriesCount": "{0} \u4e2a\u7cfb\u5217", "ValueOneEpisode": "1 \u96c6", + "ValueSeriesCount": "{0} \u4e2a\u7cfb\u5217", "ValueEpisodeCount": "{0} \u96c6", "ValueOneGame": "1 \u4e2a\u6e38\u620f", - "ValueGameCount": "{0} \u4e2a\u6e38\u620f", "ValueOneAlbum": "1\u5f20\u4e13\u8f91", - "ValueAlbumCount": "{0} \u5f20\u4e13\u8f91", + "ValueGameCount": "{0} \u4e2a\u6e38\u620f", "ValueOneMusicVideo": "1\u4e2a\u97f3\u4e50\u89c6\u9891", + "ValueAlbumCount": "{0} \u5f20\u4e13\u8f91", "ValueMusicVideoCount": "{0} \u4e2a\u97f3\u4e50\u89c6\u9891", "ValueMinutes": "{0} \u5206\u949f", "HeaderIdentifyItemHelp": "\u8f93\u5165\u4e00\u4e2a\u6216\u591a\u4e2a\u641c\u7d22\u6761\u4ef6\u3002\u5220\u9664\u6761\u4ef6\u53ef\u5f97\u5230\u66f4\u591a\u641c\u7d22\u7ed3\u679c\u3002", "PleaseEnterNameOrId": "\u8bf7\u8f93\u5165\u4e00\u4e2a\u540d\u79f0\u6216\u4e00\u4e2a\u5916\u90e8ID\u3002", - "MessageItemSaved": "\u9879\u76ee\u5df2\u4fdd\u5b58\u3002", "SearchResults": "\u641c\u7d22\u7ed3\u679c", "SyncToOtherDevice": "\u540c\u6b65\u5230\u5176\u4ed6\u8bbe\u5907", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} \u91cd\u542f\u4e2d\u3002", + "ButtonRestart": "\u91cd\u542f", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} \u91cd\u542f\u4e2d\u3002", "HeaderDeleteItems": "\u5220\u9664\u9879\u76ee", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "\u540c\u6b65\u5230\uff1a", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "\u8d28\u91cf\uff1a", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "\u8d28\u91cf\uff1a", "LearnMore": "\u4e86\u89e3\u66f4\u591a", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "\u8bf7\u9009\u62e9\u60a8\u60f3\u8981\u540c\u6b65\u5230\u7684\u8bbe\u5907\u3002", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "\u9996\u6620", + "Live": "\u76f4\u64ad", + "Repeat": "Repeat", + "Settings": "\u8bbe\u7f6e", + "DefaultErrorMessage": "\u5904\u7406\u8bf7\u6c42\u65f6\u53d1\u751f\u9519\u8bef\u3002\u8bf7\u7a0d\u540e\u5c1d\u8bd5\u3002", "Screenshots": "\u622a\u56fe", "MoveRight": "\u53f3\u79fb", "MoveLeft": "\u5de6\u79fb", "ConfirmDeleteImage": "\u5220\u9664\u56fe\u7247\uff1f", "HeaderEditImages": "\u4fee\u6539\u56fe\u7247", - "Settings": "\u8bbe\u7f6e", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "\u9ad8\u6e05\u8282\u76ee", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "\u53d6\u6d88\u5f55\u5236", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "\u8f6c\u6362\u60a8\u7684\u5f55\u5236", "HeaderLearnMore": "\u4e86\u89e3\u66f4\u591a", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "\u5220\u9664\u5a92\u4f53", "SeriesSettings": "\u7cfb\u5217\u8bbe\u5b9a", "HeaderRecordingOptions": "\u5f55\u5236\u9009\u9879", - "CancelSeries": "\u53d6\u6d88\u7cfb\u5217", "DoNotRecord": "\u4e0d\u5f55\u5236", - "HeaderSeriesOptions": "\u7cfb\u5217\u9009\u9879", + "CancelSeries": "\u53d6\u6d88\u7cfb\u5217", "LabelChannels": "\u9891\u9053\uff1a", + "HeaderSeriesOptions": "\u7cfb\u5217\u9009\u9879", "ChannelNameOnly": "\u53ea\u5728\u9891\u9053 {0}", "Anytime": "\u4efb\u4f55\u65f6\u95f4", "AroundTime": "{0} \u5de6\u53f3", "LabelAirtime": "\u64ad\u6620\u65f6\u95f4\uff1a", - "AllChannels": "\u6240\u6709\u9891\u9053", "LabelRecord": "\u5f55\u5236\uff1a", + "AllChannels": "\u6240\u6709\u9891\u9053", "NewEpisodesOnly": "\u53ea\u65b0\u96c6", "AllEpisodes": "\u6240\u6709\u96c6", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "\u5206\u949f\u524d", - "MinutesAfter": "\u5206\u949f\u540e", - "SkipEpisodesAlreadyInMyLibrary": "\u4e0d\u5f55\u5236\u6211\u7684\u5a92\u4f53\u5e93\u91cc\u5df2\u5b58\u5728\u7684\u5267\u96c6", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "\u4e0d\u5f55\u5236\u6211\u7684\u5a92\u4f53\u5e93\u91cc\u5df2\u5b58\u5728\u7684\u5267\u96c6", + "MinutesAfter": "\u5206\u949f\u540e", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "\u5c3d\u53ef\u80fd\u591a", - "DefaultErrorMessage": "\u5904\u7406\u8bf7\u6c42\u65f6\u53d1\u751f\u9519\u8bef\u3002\u8bf7\u7a0d\u540e\u5c1d\u8bd5\u3002", - "LabelKeep:": "\u4fdd\u7559\uff1a", "UntilIDelete": "\u76f4\u5230\u6211\u5220\u9664", + "LabelKeep:": "\u4fdd\u7559\uff1a", "UntilSpaceNeeded": "\u76f4\u5230\u9700\u8981\u7a7a\u95f4", - "Categories": "\u5206\u7c7b", "Sports": "\u4f53\u80b2", + "Categories": "\u5206\u7c7b", "News": "\u65b0\u95fb", "Movies": "\u7535\u5f71", "Kids": "\u513f\u7ae5", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "\u6700\u8fd1\u89c2\u770b", "ChannelNumber": "Channel number", + "RecentlyWatched": "\u6700\u8fd1\u89c2\u770b", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "\u53d6\u6d88\u5f55\u5236", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "\u79bb\u7ebf\u5a92\u4f53", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "\u5c01\u9762\u56fe", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "\u514d\u8d39 Emby \u5e94\u7528", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "\u90ae\u7bb1\u5730\u5740\uff1a", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "\u6211\u5df2\u8d2d\u4e70\u6b64\u5e94\u7528", "HowDidYouPay": "\u4f60\u60f3\u5982\u4f55\u4ed8\u6b3e\uff1f", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "\u6211\u5df2\u8d2d\u4e70\u6b64\u5e94\u7528", "ButtonRestorePreviousPurchase": "\u6062\u590d\u8d2d\u4e70", "ButtonUnlockWithPurchase": "\u8d2d\u4e70\u4ee5\u89e3\u9501", "ButtonUnlockPrice": "\u89e3\u9501 {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "\u5df2\u4ed8\u6b3e\uff1f", "ButtonPlayOneMinute": "\u64ad\u653e\u4e00\u5206\u949f", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "\u89e3\u9501\u529f\u80fd", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "\u64ad\u653e\u6211\u7684\u5a92\u4f53", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "\u64ad\u653e\u6211\u7684\u5a92\u4f53", "OneChannel": "\u4e00\u4e2a\u9891\u9053", - "ConfirmRemoveDownload": "\u5220\u9664\u4e0b\u8f7d\uff1f", - "RemoveDownload": "\u79fb\u9664\u4e0b\u8f7d", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "\u5df2\u4ed8\u6b3e\uff1f", "AddedOnValue": "\u5df2\u6dfb\u52a0 {0}", + "ConfirmRemoveDownload": "\u5220\u9664\u4e0b\u8f7d\uff1f", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "\u53d6\u6d88\u540c\u6b65", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "\u79fb\u9664\u4e0b\u8f7d", "RemovingFromDevice": "\u4ece\u8bbe\u5907\u79fb\u9664\u4e2d", "RemoveFromDevice": "\u4ece\u8bbe\u5907\u79fb\u9664", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "\u4f20\u8f93\u5c31\u7eea", "SyncJobItemStatusSyncedMarkForRemoval": "\u4ece\u8bbe\u5907\u79fb\u9664\u4e2d", "SyncJobItemStatusQueued": "\u5df2\u5217\u961f", - "SyncJobItemStatusConverting": "\u8f6c\u6362\u4e2d", "SyncJobItemStatusTransferring": "\u4f20\u8f93\u4e2d", - "SyncJobItemStatusSynced": "\u5df2\u4e0b\u8f7d", - "SyncJobItemStatusFailed": "\u5df2\u5931\u8d25", + "SyncJobItemStatusConverting": "\u8f6c\u6362\u4e2d", "SyncJobItemStatusRemovedFromDevice": "\u5df2\u4ece\u8bbe\u5907\u79fb\u9664", "SyncJobItemStatusCancelled": "\u5df2\u53d6\u6d88", + "SyncJobItemStatusSynced": "\u5df2\u4e0b\u8f7d", + "SyncJobItemStatusFailed": "\u5df2\u5931\u8d25", "Retry": "\u91cd\u8bd5", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-hk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-hk.json index e7e63c53fa..28e2d6d286 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-hk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-hk.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", - "Add": "\u65b0\u589e", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", + "OptionTuesdayShort": "Tue", + "OptionMondayShort": "Mon", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", + "Share": "Share", + "OptionSundayShort": "Sun", + "OptionThursdayShort": "Thu", + "OptionSaturdayShort": "Sat", + "OptionWednesdayShort": "Wed", + "OptionFridayShort": "Fri", + "HeaderSelectDate": "\u9078\u64c7\u65e5\u671f", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", + "ReleaseYearValue": "Release year: {0}", "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "\u9078\u64c7\u65e5\u671f", - "ButtonOk": "Ok", "ButtonCancel": "\u53d6\u6d88", + "ButtonOk": "Ok", "ButtonGotIt": "Got It", - "ButtonRestart": "\u91cd\u65b0\u555f\u52d5", - "RecordingCancelled": "Recording cancelled.", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", "Sunday": "\u661f\u671f\u65e5", "Monday": "\u661f\u671f\u4e00", "Tuesday": "\u661f\u671f\u4e8c", "Wednesday": "\u661f\u671f\u4e09", "Thursday": "\u661f\u671f\u56db", - "Friday": "\u661f\u671f\u4e94", "Saturday": "\u661f\u671f\u516d", "Days": "\u9304\u5f71\u65e5", + "Friday": "\u661f\u671f\u4e94", "RecordSeries": "Record series", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "\u9304\u5f71", + "Advanced": "Advanced", + "Download": "Download", + "Refresh": "\u91cd\u65b0\u6574\u7406", + "RefreshQueued": "Refresh queued.", "Save": "\u5132\u5b58", "Edit": "\u7de8\u8f2f", - "Download": "Download", - "Advanced": "Advanced", "Delete": "\u5220\u9664", "HeaderDeleteItem": "Delete Item", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "\u91cd\u65b0\u6574\u7406", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "\u6dfb\u52a0\u5230\u6536\u85cf\u5eab", "NewCollection": "\u65b0\u6536\u85cf\u5eab", + "AddToCollection": "Add to collection", "LabelCollection": "Collection:", "Help": "\u5e6b\u52a9", + "LabelName": "\u540d\u7a31\uff1a", "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "\u5f9e\u4e92\u806f\u7db2\u641c\u5c0b\u76f8\u95dc\u5716\u7247\u548c\u8cc7\u6599\u5c6c\u6027", - "LabelName": "\u540d\u7a31\uff1a", "NewCollectionNameExample": "\u4f8b\u5982\uff1a\u661f\u7403\u5927\u6230\u6536\u85cf\u5eab", - "MessageItemsAdded": "Items added.", "OptionNew": "New...", + "MessageItemsAdded": "Items added.", "LabelPlaylist": "Playlist:", "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "Recording cancelled.", + "SeriesRecordingScheduled": "Series recording scheduled.", "Subtitles": "Subtitles", - "SearchForSubtitles": "\u5b57\u5e55\u641c\u7d22", "LabelLanguage": "\u8a9e\u8a00\uff1a", "Search": "Search", "NoSubtitleSearchResultsFound": "No results found.", @@ -99,54 +68,57 @@ "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", "EditSubtitles": "\u7de8\u8f2f\u5b57\u5e55", + "SearchForSubtitles": "\u5b57\u5e55\u641c\u7d22", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", "SearchForMissingMetadata": "Search for missing metadata", "LabelRefreshMode": "Refresh mode:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "NoItemsFound": "No items found.", "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", + "ButtonTryAgain": "Try Again", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "Favorite", + "Unrated": "Unrated", "Like": "Like", "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", - "Play": "\u64ad\u653e", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "\u64ad\u653e", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "Edit images", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "\u6dfb\u52a0\u5230\u6536\u85cf\u5eab", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "\u5167\u5bb9\u985e\u578b\uff1a", + "Add": "\u65b0\u589e", "LabelPath": "\u8def\u5f91:", + "LabelContentType": "\u5167\u5bb9\u985e\u578b\uff1a", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "\u72c0\u614b\uff1a", "LabelArtists": "\u85dd\u4eba\uff1a", - "LabelArtistsHelp": "\u5206\u958b\u591a\u91cd\u4f7f\u7528", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "\u5206\u958b\u591a\u91cd\u4f7f\u7528", "LabelAlbum": "Album:", - "LabelCommunityRating": "\u8a0e\u8ad6\u5340\u8a55\u5206", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "\u8a0e\u8ad6\u5340\u8a55\u5206", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "DVD \u5287\u96c6\u5b63\u5ea6\u6578\u76ee\uff1a", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "\u5c1a\u672a\u64ad\u653e\u5287\u96c6\u5b63\u5ea6\uff1a", "LabelAirsAfterSeason": "\u5df2\u64ad\u653e\u5287\u96c6\u5b63\u5ea6\uff1a", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "\u504f\u597d\u4e0b\u8f09\u8a9e\u8a00\uff1a", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "\u570b\u5bb6\uff1a", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "\u7e7c\u7e8c", - "Ended": "\u5b8c\u6210", "HeaderEnabledFields": "Enabled Fields", + "Ended": "\u5b8c\u6210", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} \u9996\u6b4c", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 \u5287\u96c6", - "ValueSeriesCount": "{0} \u5287\u96c6", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} \u5287\u96c6", "ValueEpisodeCount": "{0} \u5287\u96c6", "ValueOneGame": "1 game", - "ValueGameCount": "{0} \u904a\u6232", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} \u904a\u6232", "ValueOneMusicVideo": "1\u500b MV", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} \u500b MV", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "\u91cd\u65b0\u555f\u52d5", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-tw.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-tw.json index 5d404483fb..c152da9cff 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-tw.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-tw.json @@ -1,95 +1,64 @@ { - "HeaderRemoteControl": "Remote Control", - "Disconnect": "Disconnect", - "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player", - "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", - "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "ValueSpecialEpisodeName": "Special - {0}", - "Share": "\u5206\u4eab", - "Add": "\u6dfb\u52a0", - "ServerUpdateNeeded": "\u6b64Emby\u4f3a\u670d\u5668\u9700\u8981\u66f4\u65b0\uff0c\u8acb\u81f3{0}\u53d6\u5f97\u6700\u65b0\u7248\u672c", - "LiveTvGuideRequiresUnlock": "\u96fb\u8996\u6307\u5357\u76ee\u524d\u53ea\u9650\u65bc{0}\u500b\u983b\u9053\u3002\u9ede\u9078\u300c\u89e3\u9396\u300d\u4ee5\u4e86\u89e3\u5982\u4f55\u7372\u5f97\u66f4\u5b8c\u6574\u7684\u9ad4\u9a57", + "OptionTuesdayShort": "\u4e8c", + "OptionMondayShort": "\u4e00", "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", + "ServerUpdateNeeded": "\u6b64Emby\u4f3a\u670d\u5668\u9700\u8981\u66f4\u65b0\uff0c\u8acb\u81f3{0}\u53d6\u5f97\u6700\u65b0\u7248\u672c", + "Share": "\u5206\u4eab", + "OptionSundayShort": "\u65e5", + "OptionThursdayShort": "\u56db", + "OptionSaturdayShort": "\u516d", + "OptionWednesdayShort": "\u4e09", + "OptionFridayShort": "\u4e94", + "HeaderSelectDate": "\u9078\u64c7\u65e5\u671f", "TrackCount": "{0}\u500b\u66f2\u76ee", "ItemCount": "{0}\u500b\u9805\u76ee", - "ReleaseYearValue": "\u63a8\u51fa\u65e5\u671f\uff1a{0}", "OriginalAirDateValue": "\u539f\u59cb\u64ad\u51fa\u65e5\u671f\uff1a{0}", + "ReleaseYearValue": "\u63a8\u51fa\u65e5\u671f\uff1a{0}", "EndsAtValue": "\u5b8c\u7d50\u65bc{0}", - "OptionSundayShort": "\u65e5", - "OptionMondayShort": "\u4e00", - "OptionTuesdayShort": "\u4e8c", - "OptionWednesdayShort": "\u4e09", - "OptionThursdayShort": "\u56db", - "OptionFridayShort": "\u4e94", - "OptionSaturdayShort": "\u516d", - "HeaderSelectDate": "\u9078\u64c7\u65e5\u671f", - "ButtonOk": "\u78ba\u5b9a", "ButtonCancel": "\u53d6\u6d88", + "ButtonOk": "\u78ba\u5b9a", "ButtonGotIt": "\u6211\u77e5\u9053\u4e86", - "ButtonRestart": "Restart", - "RecordingCancelled": "\u5df2\u53d6\u6d88\u6392\u7a0b\u9304\u88fd", - "SeriesCancelled": "Series cancelled.", + "LiveTvGuideRequiresUnlock": "\u96fb\u8996\u6307\u5357\u76ee\u524d\u53ea\u9650\u65bc{0}\u500b\u983b\u9053\u3002\u9ede\u9078\u300c\u89e3\u9396\u300d\u4ee5\u4e86\u89e3\u5982\u4f55\u7372\u5f97\u66f4\u5b8c\u6574\u7684\u9ad4\u9a57", "RecordingScheduled": "\u5df2\u6392\u7a0b\u9304\u88fd", - "SeriesRecordingScheduled": "\u5df2\u6392\u7a0b\u9304\u88fd\u6574\u500b\u7cfb\u5217", "HeaderNewRecording": "\u65b0\u9304\u88fd", "Sunday": "\u661f\u671f\u5929", "Monday": "\u661f\u671f\u4e00", "Tuesday": "\u661f\u671f\u4e8c", "Wednesday": "\u661f\u671f\u4e09", "Thursday": "\u661f\u671f\u56db", - "Friday": "\u661f\u671f\u4e94", "Saturday": "\u661f\u671f\u516d", "Days": "\u9304\u5f71\u65e5", + "Friday": "\u661f\u671f\u4e94", "RecordSeries": "\u9304\u88fd\u6574\u500b\u7cfb\u5217", - "HeaderCinemaMode": "Cinema Mode", - "HeaderCloudSync": "Cloud Sync", - "HeaderOfflineDownloads": "Offline Media", - "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", - "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", - "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", - "CoverArt": "Cover Art", - "ButtonCancelSyncJob": "Cancel sync", - "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", - "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", - "HeaderFreeApps": "Free Emby Apps", - "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", "HeaderBecomeProjectSupporter": "\u7acb\u5373\u53d6\u5f97", "MessageActiveSubscriptionRequiredSeriesRecordings": "\u8981\u4f7f\u7528\u81ea\u52d5\u9304\u88fd\u7cfb\u5217\u7684\u529f\u80fd\uff0c\u9700\u8981\u6709\u6548\u7684Emby\u8c6a\u83ef\u7248\u8a02\u95b1", - "LabelEmailAddress": "E-mail address:", - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "\u6b64\u529f\u80fd\u9700\u8981\u6709\u6548\u7684Emby\u8c6a\u83ef\u7248\u8a02\u95b1", - "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "\u958b\u59cb\u9304\u5f71", + "Advanced": "\u9032\u968e", + "Download": "\u4e0b\u8f09", + "Refresh": "\u91cd\u65b0\u6574\u7406", + "RefreshQueued": "Refresh queued.", "Save": "\u4fdd\u5b58", "Edit": "\u7de8\u8f2f", - "Download": "\u4e0b\u8f09", - "Advanced": "\u9032\u968e", "Delete": "\u522a\u9664", "HeaderDeleteItem": "\u522a\u9664\u9805\u76ee", "ConfirmDeleteItem": "\u522a\u9664\u6b64\u9805\u76ee\u6642\uff0c\u4e5f\u6703\u4e00\u4f75\u5f9e\u6a94\u6848\u7cfb\u7d71\u53ca\u5a92\u9ad4\u6ac3\u4e2d\u522a\u9664\u3002\u78ba\u5b9a\u8981\u522a\u9664\u55ce\uff1f", - "Refresh": "\u91cd\u65b0\u6574\u7406", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "\u65b0\u589e\u5230\u6536\u85cf\u6ac3", - "HeaderAddToCollection": "Add to Collection", "NewCollection": "\u65b0\u5408\u96c6", + "AddToCollection": "\u65b0\u589e\u5230\u6536\u85cf\u6ac3", "LabelCollection": "\u6536\u85cf\u6ac3\uff1a", "Help": "\u8aaa\u660e", + "LabelName": "\u540d\u5b57\uff1a", "NewCollectionHelp": "\u6536\u85cf\u6ac3\u8b93\u60a8\u80fd\u5920\u5efa\u7acb\u500b\u4eba\u5316\u7684\u5f71\u97f3\u53ca\u5176\u4ed6\u5a92\u9ad4\u7684\u5206\u985e", "SearchForCollectionInternetMetadata": "\u5728\u4e92\u806f\u7db2\u4e0a\u641c\u7d22\u5a92\u9ad4\u5716\u50cf\u548c\u8cc7\u6599", - "LabelName": "\u540d\u5b57\uff1a", "NewCollectionNameExample": "\u4f8b\u5b50\uff1a\u661f\u7403\u5927\u6230\u5408\u96c6", - "MessageItemsAdded": "\u5df2\u65b0\u589e\u9805\u76ee", "OptionNew": "\u65b0\u589e...", + "MessageItemsAdded": "\u5df2\u65b0\u589e\u9805\u76ee", "LabelPlaylist": "\u64ad\u653e\u6e05\u55ae\uff1a", "AddToPlaylist": "\u65b0\u589e\u5230\u64ad\u653e\u6e05\u55ae", - "HeaderAddToPlaylist": "Add to Playlist", + "RecordingCancelled": "\u5df2\u53d6\u6d88\u6392\u7a0b\u9304\u88fd", + "SeriesRecordingScheduled": "\u5df2\u6392\u7a0b\u9304\u88fd\u6574\u500b\u7cfb\u5217", "Subtitles": "\u5b57\u5e55", - "SearchForSubtitles": "\u641c\u5c0b\u5b57\u5e55", "LabelLanguage": "\u8a9e\u8a00\uff1a", "Search": "\u641c\u5c0b", "NoSubtitleSearchResultsFound": "\u7121\u7d50\u679c", @@ -99,54 +68,57 @@ "MySubtitles": "\u6211\u7684\u5b57\u5e55", "MessageDownloadQueued": "\u9700\u8981\u4e0b\u8f09", "EditSubtitles": "\u7de8\u8f2f\u5b57\u5e55", + "SearchForSubtitles": "\u641c\u5c0b\u5b57\u5e55", "UnlockGuide": "\u89e3\u9396\u65b9\u5f0f", "RefreshMetadata": "\u66f4\u65b0\u8a73\u7d30\u8cc7\u6599", "ReplaceExistingImages": "\u53d6\u4ee3\u73fe\u6709\u5716\u7247", "ReplaceAllMetadata": "\u53d6\u4ee3\u6240\u6709\u8a73\u7d30\u8cc7\u6599", "SearchForMissingMetadata": "\u641c\u5c0b\u907a\u5931\u7684\u8a73\u7d30\u8cc7\u6599", "LabelRefreshMode": "\u66f4\u65b0\u6a21\u5f0f\uff1a", + "RefreshDialogHelp": "\u8a73\u7d30\u8cc7\u6599\u7684\u66f4\u65b0\u65b9\u5f0f\u6703\u4f9d\u64daEmby\u7684\u8a2d\u5b9a\u53ca\u5df2\u7d93\u555f\u7528\u7684\u7db2\u8def\u670d\u52d9\u4f86\u9032\u884c", "NoItemsFound": "\u7121\u9805\u76ee", "HeaderSaySomethingLike": "\u8aaa\u9ede\u6771\u897f\uff0c\u50cf\u662f...", - "ButtonTryAgain": "\u91cd\u8a66", "HeaderYouSaid": "\u60a8\u662f\u6307...", - "MessageWeDidntRecognizeCommand": "\u5f88\u62b1\u6b49\uff0c\u6211\u5011\u7121\u6cd5\u8fa8\u8b58\u6b64\u6307\u4ee4", "MessageIfYouBlockedVoice": "\u5982\u679c\u60a8\u62d2\u7d55\u7a0b\u5f0f\u4f7f\u7528\u8a9e\u97f3\u8fa8\u8b58\uff0c\u60a8\u5c07\u9700\u8981\u5728\u91cd\u8a66\u4e4b\u524d\u518d\u6b21\u8a2d\u5b9a", + "ButtonTryAgain": "\u91cd\u8a66", + "MessageWeDidntRecognizeCommand": "\u5f88\u62b1\u6b49\uff0c\u6211\u5011\u7121\u6cd5\u8fa8\u8b58\u6b64\u6307\u4ee4", "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", "Favorite": "\u52a0\u5230\u6700\u611b", + "Unrated": "Unrated", "Like": "\u559c\u6b61", "Dislike": "\u4e0d\u559c\u6b61", - "RefreshDialogHelp": "\u8a73\u7d30\u8cc7\u6599\u7684\u66f4\u65b0\u65b9\u5f0f\u6703\u4f9d\u64daEmby\u7684\u8a2d\u5b9a\u53ca\u5df2\u7d93\u555f\u7528\u7684\u7db2\u8def\u670d\u52d9\u4f86\u9032\u884c", "Open": "Open", - "Play": "\u64ad\u653e", - "AddToPlayQueue": "Add to play queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "\u7de8\u8f2f\u5716\u7247", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", "ViewAlbum": "View album", "ViewArtist": "View artist", + "Play": "\u64ad\u653e", + "Shuffle": "Shuffle", + "InstantMix": "Instant mix", "QueueAllFromHere": "Queue all from here", "PlayAllFromHere": "Play all from here", + "Identify": "Identify", + "EditImages": "\u7de8\u8f2f\u5716\u7247", + "Sync": "Sync", + "EditInfo": "Edit info", + "RemoveFromPlaylist": "Remove from playlist", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark played", "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", + "Error": "Error", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "RemoveFromCollection": "Remove from collection", "VoiceInput": "Voice Input", - "LabelContentType": "Content type:", + "Add": "\u6dfb\u52a0", "LabelPath": "Path:", + "LabelContentType": "Content type:", "LabelTitle": "Title:", "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", @@ -154,36 +126,36 @@ "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "LabelStatus": "Status:", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbumArtists": "Album artists:", + "LabelArtistsHelp": "Separate multiple using ;", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Community rating:", "LabelMetascore": "Metascore:", "LabelCriticRating": "Critic rating:", "LabelCriticRatingSummary": "Critic rating summary:", "LabelAwardSummary": "Award summary:", "LabelWebsite": "Website:", "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", "LabelShortOverview": "Short overview:", + "LabelOverview": "Overview:", "LabelReleaseDate": "Release date:", "LabelYear": "Year:", "LabelPlaceOfBirth": "Place of birth:", "LabelAirDays": "Air days:", "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", + "LabelRuntimeMinutes": "Run time (minutes):", "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelBudget": "Budget", + "LabelCustomRating": "Custom rating:", "LabelPlayers": "Players:", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "Label3DFormat": "3D format:", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "LabelDvdSeasonNumber": "Dvd season number:", "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", "HeaderSpecialEpisodeInfo": "Special Episode Info", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", @@ -201,172 +173,195 @@ "People": "People", "LabelMetadataDownloadLanguage": "Preferred download language:", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelCountry": "\u570b\u5bb6\uff1a", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", "LabelDynamicExternalId": "{0} Id:", "LabelBirthYear": "Birth year:", "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", "LabelEndDate": "End date:", + "LabelDeathDate": "Death date:", "LabelSeasonNumber": "Season number:", "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelDiscNumber": "Disc number:", - "LabelParentNumber": "Parent number:", "SortName": "Sort name", + "LabelParentNumber": "Parent number:", "ReleaseDate": "Release date", "Continuing": "\u6301\u7e8c", - "Ended": "\u5b8c\u7d50", "HeaderEnabledFields": "Enabled Fields", + "Ended": "\u5b8c\u7d50", + "Keywords": "Keywords", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "Name": "Name", "Backdrops": "Backdrops", "Images": "Images", - "Keywords": "Keywords", "Runtime": "Runtime", - "ProductionLocations": "Production locations", + "Actor": "Actor", "BirthLocation": "Birth location", + "ProductionLocations": "Production locations", "ParentalRating": "Parental Rating", - "Name": "Name", "Overview": "Overview", "LabelType": "Type:", "LabelPersonRole": "Role:", "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", "Composer": "Composer", - "Director": "Director", "GuestStar": "Guest star", + "Director": "Director", "Producer": "Producer", "Writer": "Writer", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "InstallingPackage": "Installing {0}", + "MessageItemSaved": "Item saved.", "PackageInstallCompleted": "{0} installation completed.", + "InstallingPackage": "Installing {0}", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", - "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", "ValueMovieCount": "{0} movies", "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", "ValueOneEpisode": "1 episode", + "ValueSeriesCount": "{0} series", "ValueEpisodeCount": "{0} episodes", "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", + "ValueGameCount": "{0} games", "ValueOneMusicVideo": "1 music video", + "ValueAlbumCount": "{0} albums", "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", + "ButtonRestart": "Restart", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "HeaderDeleteItems": "Delete Items", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "LabelQuality": "Quality:", "LearnMore": "Learn more", - "LabelProfile": "Profile:", + "DownloadScheduled": "Download scheduled", "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelProfile": "Profile:", "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "LabelItemLimit": "Item limit:", + "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", + "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", + "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", + "Premiere": "Premiere", + "Live": "Live", + "Repeat": "Repeat", + "Settings": "Settings", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", "ConfirmDeleteImage": "Delete image?", "HeaderEditImages": "Edit Images", - "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", + "Premieres": "Premieres", "HDPrograms": "HD programs", "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "CancelRecording": "Cancel recording", - "HeaderKeepRecording": "Keep Recording", - "HeaderCancelSeries": "Cancel Series", - "HeaderKeepSeries": "Keep Series", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", "SeriesSettings": "Series settings", "HeaderRecordingOptions": "Recording Options", - "CancelSeries": "Cancel series", "DoNotRecord": "Do not record", - "HeaderSeriesOptions": "Series Options", + "CancelSeries": "Cancel series", "LabelChannels": "Channels:", + "HeaderSeriesOptions": "Series Options", "ChannelNameOnly": "Channel {0} only", "Anytime": "Anytime", "AroundTime": "Around {0}", "LabelAirtime": "Airtime:", - "AllChannels": "All channels", "LabelRecord": "Record:", + "AllChannels": "All channels", "NewEpisodesOnly": "New episodes only", "AllEpisodes": "All episodes", "LabelStartWhenPossible": "Start when possible:", "LabelStopWhenPossible": "Stop when possible:", "MinutesBefore": "minutes before", - "MinutesAfter": "minutes after", - "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", + "MinutesAfter": "minutes after", "LabelKeepUpTo": "Keep up to:", "AsManyAsPossible": "As many as possible", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", - "LabelKeep:": "Keep:", "UntilIDelete": "Until I delete", + "LabelKeep:": "Keep:", "UntilSpaceNeeded": "Until space needed", - "Categories": "Categories", "Sports": "Sports", + "Categories": "Categories", "News": "News", "Movies": "Movies", "Kids": "Kids", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", "SortChannelsBy": "Sort channels by:", - "RecentlyWatched": "Recently watched", "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", + "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", + "HeaderCinemaMode": "Cinema Mode", + "HeaderCloudSync": "Cloud Sync", + "HeaderOfflineDownloads": "Offline Media", + "HeaderOfflineDownloadsDescription": "Download media to your devices for easy offline use.", + "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", + "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", + "CoverArt": "Cover Art", + "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", + "HeaderFreeApps": "Free Emby Apps", + "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", + "LabelEmailAddress": "E-mail address:", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.", "HeaderTryPlayback": "Try Playback", + "IPurchasedThisApp": "I purchased this app", "HowDidYouPay": "How did you pay?", "IHaveEmbyPremiere": "I have Emby Premiere", - "IPurchasedThisApp": "I purchased this app", "ButtonRestorePreviousPurchase": "Restore Purchase", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", - "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", - "HeaderAlreadyPaid": "Already Paid?", "ButtonPlayOneMinute": "Play One Minute", - "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "HeaderUnlockFeature": "Unlock Feature", "MessageDidYouKnowCinemaMode": "Did you know that with Emby Premiere, you can enhance your experience with features like Cinema Mode?", "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", - "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", - "Items": "Items", + "HeaderPlayMyMedia": "Play my Media", "OneChannel": "One channel", - "ConfirmRemoveDownload": "Remove download?", - "RemoveDownload": "Remove download", + "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", + "HeaderAlreadyPaid": "Already Paid?", "AddedOnValue": "Added {0}", + "ConfirmRemoveDownload": "Remove download?", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", + "ButtonCancelSyncJob": "Cancel sync", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "ValueOneItem": "1 item", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", + "Items": "Items", + "RemoveDownload": "Remove download", "RemovingFromDevice": "Removing from device", "RemoveFromDevice": "Remove from device", "KeepOnDevice": "Keep on device", @@ -374,14 +369,21 @@ "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", "SyncJobItemStatusQueued": "Queued", - "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusTransferring": "Transferring", - "SyncJobItemStatusSynced": "Downloaded", - "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusConverting": "Converting", "SyncJobItemStatusRemovedFromDevice": "Removed from device", "SyncJobItemStatusCancelled": "Cancelled", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", "Retry": "Retry", "HeaderMyDevice": "My Device", + "ContinueInSecondsValue": "Continue in {0} seconds.", "Continue": "Continue", - "ContinueInSecondsValue": "Continue in {0} seconds." + "AddToPlayQueue": "Add to play queue", + "HeaderRemoteControl": "Remote Control", + "Disconnect": "Disconnect", + "EnableDisplayMirroring": "Enable display mirroring", + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality", + "Auto": "Auto" } \ No newline at end of file From ca4b418eea90ce25537e7d87f767dfd00a994847 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 1 Feb 2017 15:55:56 -0500 Subject: [PATCH 14/19] improve video startup performance --- .../emby-webcomponents/playback/playbackmanager.js | 4 ++-- dashboard-ui/components/apphost.js | 2 +- dashboard-ui/dashboard/devicesupload.js | 2 +- dashboard-ui/device.html | 2 +- dashboard-ui/devices.html | 2 +- dashboard-ui/scripts/device.js | 2 +- dashboard-ui/scripts/devices.js | 2 +- dashboard-ui/scripts/site.js | 2 +- dashboard-ui/scripts/syncactivity.js | 2 +- dashboard-ui/scripts/syncsettings.js | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js b/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js index 0ae746ae39..7639e59fb7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js @@ -1,2 +1,2 @@ -define(["events","datetime","appSettings","pluginManager","userSettings","globalize","connectionManager","loading","serverNotifications","apphost","fullscreenManager","layoutManager"],function(events,datetime,appSettings,pluginManager,userSettings,globalize,connectionManager,loading,serverNotifications,apphost,fullscreenManager,layoutManager){"use strict";function enableLocalPlaylistManagement(player){return!!player.isLocalPlayer}function bindToFullscreenChange(player){events.on(fullscreenManager,"fullscreenchange",function(){events.trigger(player,"fullscreenchange")})}function PlaybackManager(){function triggerPlayerChange(newPlayer,newTarget,previousPlayer,previousTargetInfo){(newPlayer||previousPlayer)&&(newTarget&&previousTargetInfo&&newTarget.id===previousTargetInfo.id||events.trigger(self,"playerchange",[newPlayer,newTarget,previousPlayer]))}function displayPlayerInLocalGroup(player){return player.isLocalPlayer}function getSupportedCommands(player){if(player.isLocalPlayer){var list=["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","SetMaxStreamingBitrate","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"];return apphost.supports("fullscreenchange")&&!layoutManager.tv&&list.push("ToggleFullscreen"),player.supports&&player.supports("pictureinpicture")&&list.push("PictureInPicture"),list}throw new Error("player must define supported commands")}function createTarget(player){return{name:player.name,id:player.id,playerName:player.name,playableMediaTypes:["Audio","Video","Game"].map(player.canPlayMediaType),isLocalPlayer:player.isLocalPlayer,supportedCommands:getSupportedCommands(player)}}function getPlayerTargets(player){return player.getTargets?player.getTargets():Promise.resolve([createTarget(player)])}function getCurrentSubtitleStream(player){var index=getPlayerData(player).subtitleStreamIndex;return null==index||index===-1?null:getSubtitleStream(player,index)}function getSubtitleStream(player,index){return self.currentMediaSource(player).MediaStreams.filter(function(s){return"Subtitle"===s.Type&&s.Index===index})[0]}function setCurrentPlayerInternal(player,targetInfo){var previousPlayer=currentPlayer,previousTargetInfo=currentTargetInfo;if(player&&!targetInfo&&player.isLocalPlayer&&(targetInfo=createTarget(player)),player&&!targetInfo)throw new Error("targetInfo cannot be null");currentPairingId=null,currentPlayer=player,currentTargetInfo=targetInfo,targetInfo&&console.log("Active player: "+JSON.stringify(targetInfo)),player&&player.isLocalPlayer&&(lastLocalPlayer=player),previousPlayer&&self.endPlayerUpdates(previousPlayer),player&&self.beginPlayerUpdates(player),triggerPlayerChange(player,targetInfo,previousPlayer,previousTargetInfo)}function getAutomaticPlayers(){var player=currentPlayer;return player&&!enableLocalPlaylistManagement(player)?[player]:self.getPlayers().filter(enableLocalPlaylistManagement)}function canPlayerSeek(player){var currentSrc=(player.currentSrc()||"").toLowerCase();return currentSrc.indexOf(".m3u8")!==-1||player.duration()}function changeStream(player,ticks,params){if(canPlayerSeek(player)&&null==params)return void player.currentTime(parseInt(ticks/1e4));params=params||{};var liveStreamId=getPlayerData(player).streamInfo.liveStreamId,playSessionId=getPlayerData(player).streamInfo.playSessionId,playerData=getPlayerData(player),currentItem=playerData.streamInfo.item;player.getDeviceProfile(currentItem).then(function(deviceProfile){var audioStreamIndex=null==params.AudioStreamIndex?getPlayerData(player).audioStreamIndex:params.AudioStreamIndex,subtitleStreamIndex=null==params.SubtitleStreamIndex?getPlayerData(player).subtitleStreamIndex:params.SubtitleStreamIndex,currentMediaSource=playerData.streamInfo.mediaSource,apiClient=connectionManager.getApiClient(currentItem.ServerId);ticks&&(ticks=parseInt(ticks));var maxBitrate=params.MaxStreamingBitrate||self.getMaxStreamingBitrate(player);getPlaybackInfo(apiClient,currentItem.Id,deviceProfile,maxBitrate,ticks,currentMediaSource,audioStreamIndex,subtitleStreamIndex,liveStreamId).then(function(result){validatePlaybackInfoResult(result)&&(currentMediaSource=result.MediaSources[0],createStreamInfo(apiClient,currentItem.MediaType,currentItem,currentMediaSource,ticks).then(function(streamInfo){return streamInfo.fullscreen=currentPlayOptions.fullscreen,streamInfo.url?(getPlayerData(player).subtitleStreamIndex=subtitleStreamIndex,getPlayerData(player).audioStreamIndex=audioStreamIndex,getPlayerData(player).maxStreamingBitrate=maxBitrate,void changeStreamToUrl(apiClient,player,playSessionId,streamInfo)):(showPlaybackInfoErrorMessage("NoCompatibleStream"),void self.nextTrack())}))})})}function changeStreamToUrl(apiClient,player,playSessionId,streamInfo,newPositionTicks){clearProgressInterval(player),getPlayerData(player).isChangingStream=!0,"Video"===getPlayerData(player).MediaType?apiClient.stopActiveEncodings(playSessionId).then(function(){setSrcIntoPlayer(apiClient,player,streamInfo)}):setSrcIntoPlayer(apiClient,player,streamInfo)}function setSrcIntoPlayer(apiClient,player,streamInfo){player.play(streamInfo).then(function(){getPlayerData(player).isChangingStream=!1,getPlayerData(player).streamInfo=streamInfo,startProgressInterval(player),sendProgressUpdate(player)})}function getPlayerData(player){if(!player)throw new Error("player cannot be null");if(!player.name)throw new Error("player name cannot be null");var state=playerStates[player.name];return state||(playerStates[player.name]={},state=playerStates[player.name]),player}function getCurrentTicks(player){var playerTime=Math.floor(1e4*(player||currentPlayer).currentTime());return playerTime+=getPlayerData(player).streamInfo.transcodingOffsetTicks||0}function getNowPlayingItemForReporting(player,item,mediaSource){var nowPlayingItem=Object.assign({},item);return mediaSource&&(nowPlayingItem.RunTimeTicks=mediaSource.RunTimeTicks),nowPlayingItem.RunTimeTicks=nowPlayingItem.RunTimeTicks||1e4*player.duration(),nowPlayingItem}function translateItemsForPlayback(items,options){var promise,firstItem=items[0],serverId=firstItem.ServerId;return"Program"===firstItem.Type?promise=getItemsForPlayback(serverId,{Ids:firstItem.ChannelId}):"Playlist"===firstItem.Type?promise=getItemsForPlayback(serverId,{ParentId:firstItem.Id}):"MusicArtist"===firstItem.Type?promise=getItemsForPlayback(serverId,{ArtistIds:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio"}):"MusicGenre"===firstItem.Type?promise=getItemsForPlayback(serverId,{Genres:firstItem.Name,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio"}):firstItem.IsFolder?promise=getItemsForPlayback(serverId,{ParentId:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio,Video"}):"Episode"===firstItem.Type&&1===items.length&&getPlayer(firstItem,options).supportsProgress!==!1&&(promise=new Promise(function(resolve,reject){var apiClient=connectionManager.getApiClient(firstItem.ServerId);apiClient.getCurrentUser().then(function(user){return user.Configuration.EnableNextEpisodeAutoPlay&&firstItem.SeriesId?void apiClient.getEpisodes(firstItem.SeriesId,{IsVirtualUnaired:!1,IsMissing:!1,UserId:apiClient.getCurrentUserId(),Fields:"MediaSources,Chapters"}).then(function(episodesResult){var foundItem=!1;episodesResult.Items=episodesResult.Items.filter(function(e){return!!foundItem||e.Id===firstItem.Id&&(foundItem=!0,!0)}),episodesResult.TotalRecordCount=episodesResult.Items.length,resolve(episodesResult)},reject):void resolve(null)})})),promise?promise.then(function(result){return result?result.Items:items}):Promise.resolve(items)}function playWithIntros(items,options,user){var firstItem=items[0];"Video"===firstItem.MediaType;var afterPlayInternal=function(){for(var i=0,length=items.length;i=interceptors.length)return void resolve();var interceptor=interceptors[index];interceptor.intercept(options).then(function(){runNextPrePlay(interceptors,index+1,options,resolve,reject)},reject)}function playAfterBitrateDetect(connectionManager,maxBitrate,item,playOptions,onPlaybackStartedFn){var promise,startPosition=playOptions.startPositionTicks,player=getPlayer(item,playOptions),activePlayer=currentPlayer;return activePlayer?(playNextAfterEnded=!1,promise=onPlaybackChanging(activePlayer,player,item)):promise=Promise.resolve(),isServerItem(item)&&"Game"!==item.MediaType?Promise.all([promise,player.getDeviceProfile(item)]).then(function(responses){var deviceProfile=responses[1],apiClient=connectionManager.getApiClient(item.ServerId);return getPlaybackMediaSource(apiClient,deviceProfile,maxBitrate,item,startPosition).then(function(mediaSource){return createStreamInfo(apiClient,item.MediaType,item,mediaSource,startPosition).then(function(streamInfo){return streamInfo.fullscreen=playOptions.fullscreen,getPlayerData(player).isChangingStream=!1,getPlayerData(player).maxStreamingBitrate=maxBitrate,player.play(streamInfo).then(function(){loading.hide(),onPlaybackStartedFn(),onPlaybackStarted(player,playOptions,streamInfo,mediaSource)})})})}):promise.then(function(){var streamInfo=createStreamInfoFromUrlItem(item);return streamInfo.fullscreen=playOptions.fullscreen,getPlayerData(player).isChangingStream=!1,player.play(streamInfo).then(function(){loading.hide(),onPlaybackStartedFn(),onPlaybackStarted(player,playOptions,streamInfo)})})}function createStreamInfoFromUrlItem(item){return{url:item.Url||item.Path,playMethod:"DirectPlay",item:item,textTracks:[],mediaType:item.MediaType}}function backdropImageUrl(apiClient,item,options){return options=options||{},options.type=options.type||"Backdrop",options.maxWidth||options.width||options.maxHeight||options.height||(options.quality=100),item.BackdropImageTags&&item.BackdropImageTags.length?(options.tag=item.BackdropImageTags[0],apiClient.getScaledImageUrl(item.Id,options)):item.ParentBackdropImageTags&&item.ParentBackdropImageTags.length?(options.tag=item.ParentBackdropImageTags[0],apiClient.getScaledImageUrl(item.ParentBackdropItemId,options)):null}function getMimeType(type,container){if(container=(container||"").toLowerCase(),"audio"===type){if("opus"===container)return"audio/ogg";if("webma"===container)return"audio/webm";if("m4a"===container)return"audio/mp4"}else if("video"===type){if("mkv"===container)return"video/x-matroska";if("m4v"===container)return"video/mp4";if("mov"===container)return"video/quicktime";if("mpg"===container)return"video/mpeg";if("flv"===container)return"video/x-flv"}return type+"/"+container}function createStreamInfo(apiClient,type,item,mediaSource,startPosition){var mediaUrl,contentType,directOptions,transcodingOffsetTicks=0,playerStartPositionTicks=startPosition,liveStreamId=mediaSource.LiveStreamId,playMethod="Transcode",mediaSourceContainer=(mediaSource.Container||"").toLowerCase();if("Video"===type)contentType=getMimeType("video",mediaSourceContainer),mediaSource.enableDirectPlay?(mediaUrl=mediaSource.Path,playMethod="DirectPlay"):mediaSource.SupportsDirectStream?(directOptions={Static:!0,mediaSourceId:mediaSource.Id,deviceId:apiClient.deviceId(),api_key:apiClient.accessToken()},mediaSource.ETag&&(directOptions.Tag=mediaSource.ETag),mediaSource.LiveStreamId&&(directOptions.LiveStreamId=mediaSource.LiveStreamId),mediaUrl=apiClient.getUrl("Videos/"+item.Id+"/stream."+mediaSourceContainer,directOptions),playMethod="DirectStream"):mediaSource.SupportsTranscoding&&(mediaUrl=apiClient.getUrl(mediaSource.TranscodingUrl),"hls"===mediaSource.TranscodingSubProtocol?contentType="application/x-mpegURL":(playerStartPositionTicks=null,contentType=getMimeType("video",mediaSource.TranscodingContainer),mediaUrl.toLowerCase().indexOf("copytimestamps=true")===-1&&(transcodingOffsetTicks=startPosition||0)));else if("Audio"===type)if(contentType=getMimeType("audio",mediaSourceContainer),mediaSource.enableDirectPlay)mediaUrl=mediaSource.Path,playMethod="DirectPlay";else{var isDirectStream=mediaSource.SupportsDirectStream;isDirectStream?(directOptions={Static:!0,mediaSourceId:mediaSource.Id,deviceId:apiClient.deviceId(),api_key:apiClient.accessToken()},mediaSource.ETag&&(directOptions.Tag=mediaSource.ETag),mediaSource.LiveStreamId&&(directOptions.LiveStreamId=mediaSource.LiveStreamId),mediaUrl=apiClient.getUrl("Audio/"+item.Id+"/stream."+mediaSourceContainer,directOptions),playMethod="DirectStream"):mediaSource.SupportsTranscoding&&(mediaUrl=apiClient.getUrl(mediaSource.TranscodingUrl),"hls"===mediaSource.TranscodingSubProtocol?contentType="application/x-mpegURL":(transcodingOffsetTicks=startPosition||0,playerStartPositionTicks=null,contentType=getMimeType("audio",mediaSource.TranscodingContainer)))}else"Game"===type&&(mediaUrl=mediaSource.Path,playMethod="DirectPlay");!mediaUrl&&mediaSource.SupportsDirectPlay&&(mediaUrl=mediaSource.Path);var resultInfo={url:mediaUrl,mimeType:contentType,transcodingOffsetTicks:transcodingOffsetTicks,playMethod:playMethod,playerStartPositionTicks:playerStartPositionTicks,item:item,mediaSource:mediaSource,textTracks:getTextTracks(apiClient,mediaSource),tracks:getTextTracks(apiClient,mediaSource),mediaType:type,liveStreamId:liveStreamId,playSessionId:getParam("playSessionId",mediaUrl),title:item.Name},backdropUrl=backdropImageUrl(apiClient,item,{});return backdropUrl&&(resultInfo.backdropUrl=backdropUrl),Promise.resolve(resultInfo)}function getParam(name,url){name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regexS="[\\?&]"+name+"=([^&#]*)",regex=new RegExp(regexS,"i"),results=regex.exec(url);return null==results?"":decodeURIComponent(results[1].replace(/\+/g," "))}function getTextTracks(apiClient,mediaSource){for(var subtitleStreams=mediaSource.MediaStreams.filter(function(s){return"Subtitle"===s.Type}),textStreams=subtitleStreams.filter(function(s){return"External"===s.DeliveryMethod}),tracks=[],i=0,length=textStreams.length;i=playlistLength&&(newIndex=0);break;default:newIndex=self.getCurrentPlaylistIndex(player)+1}if(newIndex<0||newIndex>=playlistLength)return null;var item=playlist[newIndex];return item?{item:item,index:newIndex}:null}function queue(options,mode,player){if(player=player||currentPlayer,!player)return self.play(options);if(!enableLocalPlaylistManagement(player))return"next"===mode?player.queueNext(item):player.queue(item);if(options.items)return translateItemsForPlayback(options.items,options).then(function(items){queueAll(items,mode)});if(!options.serverId)throw new Error("serverId required!");return getItemsForPlayback(options.serverId,{Ids:options.ids.join(",")}).then(function(result){return translateItemsForPlayback(result.Items,options).then(function(items){queueAll(items,mode)})})}function queueAll(items,mode){for(var i=0,length=items.length;iintervalTime&&sendProgressUpdate(player)},500)}function sendProgressUpdate(player){player.lastProgressReport=(new Date).getTime(),self.getPlayerState(player).then(function(state){var currentItem=getPlayerData(player).streamInfo.item;reportPlayback(state,currentItem.ServerId,"reportPlaybackProgress")})}function reportPlayback(state,serverId,method){if(serverId){var info={QueueableMediaTypes:state.NowPlayingItem.MediaType,ItemId:state.NowPlayingItem.Id};for(var i in state.PlayState)info[i]=state.PlayState[i];var apiClient=connectionManager.getApiClient(serverId);apiClient[method](info)}}function clearProgressInterval(player){getPlayerData(player).currentProgressInterval&&(clearTimeout(getPlayerData(player).currentProgressInterval),getPlayerData(player).currentProgressInterval=null)}var currentPlayer,currentTargetInfo,lastLocalPlayer,currentPlaylistIndex,currentPlaylistItemId,currentPlayOptions,self=this,players=[],currentPairingId=null,repeatMode="RepeatNone",playlist=[],playNextAfterEnded=!0,playerStates={};self.currentItem=function(player){var data=getPlayerData(player);return data.streamInfo?data.streamInfo.item:null},self.currentMediaSource=function(player){var data=getPlayerData(player);return data.streamInfo?data.streamInfo.mediaSource:null},self.beginPlayerUpdates=function(player){player.beginPlayerUpdates&&player.beginPlayerUpdates()},self.endPlayerUpdates=function(player){player.endPlayerUpdates&&player.endPlayerUpdates()},self.getPlayerInfo=function(){var player=currentPlayer;if(!player)return null;var target=currentTargetInfo||{};return{name:player.name,isLocalPlayer:player.isLocalPlayer,id:target.id,deviceName:target.deviceName,playableMediaTypes:target.playableMediaTypes,supportedCommands:target.supportedCommands}},self.setActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name){if(currentPlayer&¤tPlayer.isLocalPlayer)return;return void setCurrentPlayerInternal(null,null)}if("string"==typeof player&&(player=players.filter(function(p){return p.name===player})[0]),!player)throw new Error("null player");setCurrentPlayerInternal(player,targetInfo)},self.trySetActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name)return void(currentPlayer&¤tPlayer.isLocalPlayer);if("string"==typeof player&&(player=players.filter(function(p){return p.name===player})[0]),!player)throw new Error("null player");if(currentPairingId!==targetInfo.id){currentPairingId=targetInfo.id;var promise=player.tryPair?player.tryPair(targetInfo):Promise.resolve();promise.then(function(){setCurrentPlayerInternal(player,targetInfo)},function(){currentPairingId===targetInfo.id&&(currentPairingId=null)})}},self.trySetActiveDeviceName=function(name){function normalizeName(t){return t.toLowerCase().replace(" ","")}name=normalizeName(name),self.getTargets().then(function(result){var target=result.filter(function(p){return normalizeName(p.name)===name})[0];target&&self.trySetActivePlayer(target.playerName,target)})},self.setDefaultPlayerActive=function(){self.setActivePlayer("localplayer")},self.removeActivePlayer=function(name){var playerInfo=self.getPlayerInfo();playerInfo&&playerInfo.name===name&&self.setDefaultPlayerActive()},self.removeActiveTarget=function(id){var playerInfo=self.getPlayerInfo();playerInfo&&playerInfo.id===id&&self.setDefaultPlayerActive()},self.disconnectFromPlayer=function(){var playerInfo=self.getPlayerInfo();playerInfo&&(playerInfo.supportedCommands.indexOf("EndSession")!==-1?require(["dialog"],function(dialog){var menuItems=[];menuItems.push({name:globalize.translate("ButtonYes"),id:"yes"}),menuItems.push({name:globalize.translate("ButtonNo"), -id:"no"}),dialog({buttons:menuItems,text:globalize.translate("ConfirmEndPlayerSession")}).then(function(id){switch(id){case"yes":self.getCurrentPlayer().endSession(),self.setDefaultPlayerActive();break;case"no":self.setDefaultPlayerActive()}})}):self.setDefaultPlayerActive())},self.getTargets=function(){var promises=players.filter(function(p){return!displayPlayerInLocalGroup(p)}).map(getPlayerTargets);return Promise.all(promises).then(function(responses){var targets=[];targets.push({name:globalize.translate("sharedcomponents#HeaderMyDevice"),id:"localplayer",playerName:"localplayer",playableMediaTypes:["Audio","Video","Game"],isLocalPlayer:!0,supportedCommands:getSupportedCommands({isLocalPlayer:!0})});for(var i=0;idatetime.parseISO8601Date(item.EndDate).getTime()||(new Date).getTime()ticks})[0];nextChapter?self.seek(nextChapter.StartPositionTicks,player):self.nextTrack(player)},self.previousChapter=function(player){player=player||currentPlayer;var item=self.currentItem(player),ticks=getCurrentTicks(player);ticks-=1e8,0===self.getCurrentPlaylistIndex(player)&&(ticks=Math.max(ticks,0));var previousChapters=(item.Chapters||[]).filter(function(i){return i.StartPositionTicks<=ticks});previousChapters.length?self.seek(previousChapters[previousChapters.length-1].StartPositionTicks,player):self.previousTrack(player)},self.fastForward=function(player){if(player=player||currentPlayer,null!=player.fastForward)return void player.fastForward(userSettings.skipForwardLength());var ticks=getCurrentTicks(player);ticks+=1e4*userSettings.skipForwardLength();var runTimeTicks=self.duration(player)||0;ticks0||canPlayerSeek(player)),item&&(state.NowPlayingItem=getNowPlayingItemForReporting(player,item,mediaSource)),state.MediaSource=mediaSource,Promise.resolve(state)},self.currentTime=function(player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.currentTime():getCurrentTicks(player)},self.duration=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.duration();var streamInfo=getPlayerData(player).streamInfo;if(streamInfo&&streamInfo.mediaSource&&streamInfo.mediaSource.RunTimeTicks)return streamInfo.mediaSource.RunTimeTicks;var playerDuration=player.duration();return playerDuration&&(playerDuration*=1e4),playerDuration};var currentId=0;self.getSubtitleUrl=function(textStream,serverId){var apiClient=connectionManager.getApiClient(serverId),textStreamUrl=textStream.IsExternalUrl?textStream.DeliveryUrl:apiClient.getUrl(textStream.DeliveryUrl);return textStreamUrl},self.setCurrentPlaylistItem=function(playlistItemId,player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.setCurrentPlaylistItem(playlistItemId);for(var newItem,newItemIndex,i=0,length=playlist.length;i=playlist.length)throw new Error("newIndex out of bounds");moveInArray(playlist,oldIndex,newIndex),events.trigger(player,"playlistitemmove",[{playlistItemId:playlistItemId,newIndex:newIndex}])}},self.getCurrentPlaylistIndex=function(i,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getCurrentPlaylistIndex():findPlaylistIndex(currentPlaylistItemId,playlist)},self.getCurrentPlaylistItemId=function(i,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getCurrentPlaylistItemId():currentPlaylistItemId},self.setRepeatMode=function(value,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.setRepeatMode(value):(repeatMode=value,void events.trigger(player,"repeatmodechange"))},self.getRepeatMode=function(player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getRepeatMode():repeatMode},self.nextTrack=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.nextTrack();var newItemInfo=getNextItemInfo(player);if(newItemInfo){console.log("playing next track");var playOptions=Object.assign({},currentPlayOptions,{startPositionTicks:0});playInternal(newItemInfo.item,playOptions,function(){setPlaylistState(newItemInfo.item.PlaylistItemId,newItemInfo.index)})}},self.previousTrack=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.previousTrack();var newIndex=self.getCurrentPlaylistIndex(player)-1;if(newIndex>=0){var newItem=playlist[newIndex];if(newItem){var playOptions=Object.assign({},currentPlayOptions,{startPositionTicks:0});playInternal(newItem,playOptions,function(){setPlaylistState(newItem.PlaylistItemId,newIndex)})}}},self.queue=function(options,player){queue(options,"",player)},self.queueNext=function(options,player){queue(options,"next",player)},events.on(pluginManager,"registered",function(e,plugin){"mediaplayer"===plugin.type&&initMediaPlayer(plugin)}),pluginManager.ofType("mediaplayer").map(initMediaPlayer),window.addEventListener("beforeunload",function(e){var player=currentPlayer;player&&getPlayerData(player).currentProgressInterval&&(playNextAfterEnded=!1,onPlaybackStopped.call(player))}),events.on(serverNotifications,"ServerShuttingDown",function(e,apiClient,data){self.setDefaultPlayerActive()}),events.on(serverNotifications,"ServerRestarting",function(e,apiClient,data){self.setDefaultPlayerActive()})}return new PlaybackManager}); \ No newline at end of file +define(["events","datetime","appSettings","pluginManager","userSettings","globalize","connectionManager","loading","serverNotifications","apphost","fullscreenManager","layoutManager"],function(events,datetime,appSettings,pluginManager,userSettings,globalize,connectionManager,loading,serverNotifications,apphost,fullscreenManager,layoutManager){"use strict";function enableLocalPlaylistManagement(player){return!!player.isLocalPlayer}function bindToFullscreenChange(player){events.on(fullscreenManager,"fullscreenchange",function(){events.trigger(player,"fullscreenchange")})}function PlaybackManager(){function triggerPlayerChange(newPlayer,newTarget,previousPlayer,previousTargetInfo){(newPlayer||previousPlayer)&&(newTarget&&previousTargetInfo&&newTarget.id===previousTargetInfo.id||events.trigger(self,"playerchange",[newPlayer,newTarget,previousPlayer]))}function displayPlayerInLocalGroup(player){return player.isLocalPlayer}function getSupportedCommands(player){if(player.isLocalPlayer){var list=["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","SetMaxStreamingBitrate","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"];return apphost.supports("fullscreenchange")&&!layoutManager.tv&&list.push("ToggleFullscreen"),player.supports&&player.supports("pictureinpicture")&&list.push("PictureInPicture"),list}throw new Error("player must define supported commands")}function createTarget(player){return{name:player.name,id:player.id,playerName:player.name,playableMediaTypes:["Audio","Video","Game"].map(player.canPlayMediaType),isLocalPlayer:player.isLocalPlayer,supportedCommands:getSupportedCommands(player)}}function getPlayerTargets(player){return player.getTargets?player.getTargets():Promise.resolve([createTarget(player)])}function getCurrentSubtitleStream(player){var index=getPlayerData(player).subtitleStreamIndex;return null==index||index===-1?null:getSubtitleStream(player,index)}function getSubtitleStream(player,index){return self.currentMediaSource(player).MediaStreams.filter(function(s){return"Subtitle"===s.Type&&s.Index===index})[0]}function setCurrentPlayerInternal(player,targetInfo){var previousPlayer=currentPlayer,previousTargetInfo=currentTargetInfo;if(player&&!targetInfo&&player.isLocalPlayer&&(targetInfo=createTarget(player)),player&&!targetInfo)throw new Error("targetInfo cannot be null");currentPairingId=null,currentPlayer=player,currentTargetInfo=targetInfo,targetInfo&&console.log("Active player: "+JSON.stringify(targetInfo)),player&&player.isLocalPlayer&&(lastLocalPlayer=player),previousPlayer&&self.endPlayerUpdates(previousPlayer),player&&self.beginPlayerUpdates(player),triggerPlayerChange(player,targetInfo,previousPlayer,previousTargetInfo)}function getAutomaticPlayers(){var player=currentPlayer;return player&&!enableLocalPlaylistManagement(player)?[player]:self.getPlayers().filter(enableLocalPlaylistManagement)}function canPlayerSeek(player){var currentSrc=(player.currentSrc()||"").toLowerCase();return currentSrc.indexOf(".m3u8")!==-1||player.duration()}function changeStream(player,ticks,params){if(canPlayerSeek(player)&&null==params)return void player.currentTime(parseInt(ticks/1e4));params=params||{};var liveStreamId=getPlayerData(player).streamInfo.liveStreamId,playSessionId=getPlayerData(player).streamInfo.playSessionId,playerData=getPlayerData(player),currentItem=playerData.streamInfo.item;player.getDeviceProfile(currentItem).then(function(deviceProfile){var audioStreamIndex=null==params.AudioStreamIndex?getPlayerData(player).audioStreamIndex:params.AudioStreamIndex,subtitleStreamIndex=null==params.SubtitleStreamIndex?getPlayerData(player).subtitleStreamIndex:params.SubtitleStreamIndex,currentMediaSource=playerData.streamInfo.mediaSource,apiClient=connectionManager.getApiClient(currentItem.ServerId);ticks&&(ticks=parseInt(ticks));var maxBitrate=params.MaxStreamingBitrate||self.getMaxStreamingBitrate(player);getPlaybackInfo(apiClient,currentItem.Id,deviceProfile,maxBitrate,ticks,currentMediaSource,audioStreamIndex,subtitleStreamIndex,liveStreamId).then(function(result){validatePlaybackInfoResult(result)&&(currentMediaSource=result.MediaSources[0],createStreamInfo(apiClient,currentItem.MediaType,currentItem,currentMediaSource,ticks).then(function(streamInfo){return streamInfo.fullscreen=currentPlayOptions.fullscreen,streamInfo.url?(getPlayerData(player).subtitleStreamIndex=subtitleStreamIndex,getPlayerData(player).audioStreamIndex=audioStreamIndex,getPlayerData(player).maxStreamingBitrate=maxBitrate,void changeStreamToUrl(apiClient,player,playSessionId,streamInfo)):(showPlaybackInfoErrorMessage("NoCompatibleStream"),void self.nextTrack())}))})})}function changeStreamToUrl(apiClient,player,playSessionId,streamInfo,newPositionTicks){clearProgressInterval(player),getPlayerData(player).isChangingStream=!0,"Video"===getPlayerData(player).MediaType?apiClient.stopActiveEncodings(playSessionId).then(function(){setSrcIntoPlayer(apiClient,player,streamInfo)}):setSrcIntoPlayer(apiClient,player,streamInfo)}function setSrcIntoPlayer(apiClient,player,streamInfo){player.play(streamInfo).then(function(){getPlayerData(player).isChangingStream=!1,getPlayerData(player).streamInfo=streamInfo,startProgressInterval(player),sendProgressUpdate(player)})}function getPlayerData(player){if(!player)throw new Error("player cannot be null");if(!player.name)throw new Error("player name cannot be null");var state=playerStates[player.name];return state||(playerStates[player.name]={},state=playerStates[player.name]),player}function getCurrentTicks(player){var playerTime=Math.floor(1e4*(player||currentPlayer).currentTime());return playerTime+=getPlayerData(player).streamInfo.transcodingOffsetTicks||0}function getNowPlayingItemForReporting(player,item,mediaSource){var nowPlayingItem=Object.assign({},item);return mediaSource&&(nowPlayingItem.RunTimeTicks=mediaSource.RunTimeTicks),nowPlayingItem.RunTimeTicks=nowPlayingItem.RunTimeTicks||1e4*player.duration(),nowPlayingItem}function translateItemsForPlayback(items,options){var promise,firstItem=items[0],serverId=firstItem.ServerId;return"Program"===firstItem.Type?promise=getItemsForPlayback(serverId,{Ids:firstItem.ChannelId}):"Playlist"===firstItem.Type?promise=getItemsForPlayback(serverId,{ParentId:firstItem.Id}):"MusicArtist"===firstItem.Type?promise=getItemsForPlayback(serverId,{ArtistIds:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio"}):"MusicGenre"===firstItem.Type?promise=getItemsForPlayback(serverId,{Genres:firstItem.Name,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio"}):firstItem.IsFolder?promise=getItemsForPlayback(serverId,{ParentId:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Audio,Video"}):"Episode"===firstItem.Type&&1===items.length&&getPlayer(firstItem,options).supportsProgress!==!1&&(promise=new Promise(function(resolve,reject){var apiClient=connectionManager.getApiClient(firstItem.ServerId);apiClient.getCurrentUser().then(function(user){return user.Configuration.EnableNextEpisodeAutoPlay&&firstItem.SeriesId?void apiClient.getEpisodes(firstItem.SeriesId,{IsVirtualUnaired:!1,IsMissing:!1,UserId:apiClient.getCurrentUserId(),Fields:"MediaSources,Chapters"}).then(function(episodesResult){var foundItem=!1;episodesResult.Items=episodesResult.Items.filter(function(e){return!!foundItem||e.Id===firstItem.Id&&(foundItem=!0,!0)}),episodesResult.TotalRecordCount=episodesResult.Items.length,resolve(episodesResult)},reject):void resolve(null)})})),promise?promise.then(function(result){return result?result.Items:items}):Promise.resolve(items)}function enableIntros(item){return"Video"===item.MediaType&&("TvChannel"!==item.Type&&("InProgress"!==item.Status&&isServerItem(item)))}function playWithIntros(items,options,user){var firstItem=items[0];"Video"===firstItem.MediaType;var afterPlayInternal=function(){for(var i=0,length=items.length;i=interceptors.length)return void resolve();var interceptor=interceptors[index];interceptor.intercept(options).then(function(){runNextPrePlay(interceptors,index+1,options,resolve,reject)},reject)}function playAfterBitrateDetect(connectionManager,maxBitrate,item,playOptions,onPlaybackStartedFn){var promise,startPosition=playOptions.startPositionTicks,player=getPlayer(item,playOptions),activePlayer=currentPlayer;return activePlayer?(playNextAfterEnded=!1,promise=onPlaybackChanging(activePlayer,player,item)):promise=Promise.resolve(),isServerItem(item)&&"Game"!==item.MediaType?Promise.all([promise,player.getDeviceProfile(item)]).then(function(responses){var deviceProfile=responses[1],apiClient=connectionManager.getApiClient(item.ServerId);return getPlaybackMediaSource(apiClient,deviceProfile,maxBitrate,item,startPosition).then(function(mediaSource){return createStreamInfo(apiClient,item.MediaType,item,mediaSource,startPosition).then(function(streamInfo){return streamInfo.fullscreen=playOptions.fullscreen,getPlayerData(player).isChangingStream=!1,getPlayerData(player).maxStreamingBitrate=maxBitrate,player.play(streamInfo).then(function(){loading.hide(),onPlaybackStartedFn(),onPlaybackStarted(player,playOptions,streamInfo,mediaSource)})})})}):promise.then(function(){var streamInfo=createStreamInfoFromUrlItem(item);return streamInfo.fullscreen=playOptions.fullscreen,getPlayerData(player).isChangingStream=!1,player.play(streamInfo).then(function(){loading.hide(),onPlaybackStartedFn(),onPlaybackStarted(player,playOptions,streamInfo)})})}function createStreamInfoFromUrlItem(item){return{url:item.Url||item.Path,playMethod:"DirectPlay",item:item,textTracks:[],mediaType:item.MediaType}}function backdropImageUrl(apiClient,item,options){return options=options||{},options.type=options.type||"Backdrop",options.maxWidth||options.width||options.maxHeight||options.height||(options.quality=100),item.BackdropImageTags&&item.BackdropImageTags.length?(options.tag=item.BackdropImageTags[0],apiClient.getScaledImageUrl(item.Id,options)):item.ParentBackdropImageTags&&item.ParentBackdropImageTags.length?(options.tag=item.ParentBackdropImageTags[0],apiClient.getScaledImageUrl(item.ParentBackdropItemId,options)):null}function getMimeType(type,container){if(container=(container||"").toLowerCase(),"audio"===type){if("opus"===container)return"audio/ogg";if("webma"===container)return"audio/webm";if("m4a"===container)return"audio/mp4"}else if("video"===type){if("mkv"===container)return"video/x-matroska";if("m4v"===container)return"video/mp4";if("mov"===container)return"video/quicktime";if("mpg"===container)return"video/mpeg";if("flv"===container)return"video/x-flv"}return type+"/"+container}function createStreamInfo(apiClient,type,item,mediaSource,startPosition){var mediaUrl,contentType,directOptions,transcodingOffsetTicks=0,playerStartPositionTicks=startPosition,liveStreamId=mediaSource.LiveStreamId,playMethod="Transcode",mediaSourceContainer=(mediaSource.Container||"").toLowerCase();if("Video"===type)contentType=getMimeType("video",mediaSourceContainer),mediaSource.enableDirectPlay?(mediaUrl=mediaSource.Path,playMethod="DirectPlay"):mediaSource.SupportsDirectStream?(directOptions={Static:!0,mediaSourceId:mediaSource.Id,deviceId:apiClient.deviceId(),api_key:apiClient.accessToken()},mediaSource.ETag&&(directOptions.Tag=mediaSource.ETag),mediaSource.LiveStreamId&&(directOptions.LiveStreamId=mediaSource.LiveStreamId),mediaUrl=apiClient.getUrl("Videos/"+item.Id+"/stream."+mediaSourceContainer,directOptions),playMethod="DirectStream"):mediaSource.SupportsTranscoding&&(mediaUrl=apiClient.getUrl(mediaSource.TranscodingUrl),"hls"===mediaSource.TranscodingSubProtocol?contentType="application/x-mpegURL":(playerStartPositionTicks=null,contentType=getMimeType("video",mediaSource.TranscodingContainer),mediaUrl.toLowerCase().indexOf("copytimestamps=true")===-1&&(transcodingOffsetTicks=startPosition||0)));else if("Audio"===type)if(contentType=getMimeType("audio",mediaSourceContainer),mediaSource.enableDirectPlay)mediaUrl=mediaSource.Path,playMethod="DirectPlay";else{var isDirectStream=mediaSource.SupportsDirectStream;isDirectStream?(directOptions={Static:!0,mediaSourceId:mediaSource.Id,deviceId:apiClient.deviceId(),api_key:apiClient.accessToken()},mediaSource.ETag&&(directOptions.Tag=mediaSource.ETag),mediaSource.LiveStreamId&&(directOptions.LiveStreamId=mediaSource.LiveStreamId),mediaUrl=apiClient.getUrl("Audio/"+item.Id+"/stream."+mediaSourceContainer,directOptions),playMethod="DirectStream"):mediaSource.SupportsTranscoding&&(mediaUrl=apiClient.getUrl(mediaSource.TranscodingUrl),"hls"===mediaSource.TranscodingSubProtocol?contentType="application/x-mpegURL":(transcodingOffsetTicks=startPosition||0,playerStartPositionTicks=null,contentType=getMimeType("audio",mediaSource.TranscodingContainer)))}else"Game"===type&&(mediaUrl=mediaSource.Path,playMethod="DirectPlay");!mediaUrl&&mediaSource.SupportsDirectPlay&&(mediaUrl=mediaSource.Path);var resultInfo={url:mediaUrl,mimeType:contentType,transcodingOffsetTicks:transcodingOffsetTicks,playMethod:playMethod,playerStartPositionTicks:playerStartPositionTicks,item:item,mediaSource:mediaSource,textTracks:getTextTracks(apiClient,mediaSource),tracks:getTextTracks(apiClient,mediaSource),mediaType:type,liveStreamId:liveStreamId,playSessionId:getParam("playSessionId",mediaUrl),title:item.Name},backdropUrl=backdropImageUrl(apiClient,item,{});return backdropUrl&&(resultInfo.backdropUrl=backdropUrl),Promise.resolve(resultInfo)}function getParam(name,url){name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regexS="[\\?&]"+name+"=([^&#]*)",regex=new RegExp(regexS,"i"),results=regex.exec(url);return null==results?"":decodeURIComponent(results[1].replace(/\+/g," "))}function getTextTracks(apiClient,mediaSource){for(var subtitleStreams=mediaSource.MediaStreams.filter(function(s){return"Subtitle"===s.Type}),textStreams=subtitleStreams.filter(function(s){return"External"===s.DeliveryMethod}),tracks=[],i=0,length=textStreams.length;i=playlistLength&&(newIndex=0);break;default:newIndex=self.getCurrentPlaylistIndex(player)+1}if(newIndex<0||newIndex>=playlistLength)return null;var item=playlist[newIndex];return item?{item:item,index:newIndex}:null}function queue(options,mode,player){if(player=player||currentPlayer,!player)return self.play(options);if(!enableLocalPlaylistManagement(player))return"next"===mode?player.queueNext(item):player.queue(item);if(options.items)return translateItemsForPlayback(options.items,options).then(function(items){queueAll(items,mode)});if(!options.serverId)throw new Error("serverId required!");return getItemsForPlayback(options.serverId,{Ids:options.ids.join(",")}).then(function(result){return translateItemsForPlayback(result.Items,options).then(function(items){queueAll(items,mode)})})}function queueAll(items,mode){for(var i=0,length=items.length;iintervalTime&&sendProgressUpdate(player)},500)}function sendProgressUpdate(player){player.lastProgressReport=(new Date).getTime(),self.getPlayerState(player).then(function(state){var currentItem=getPlayerData(player).streamInfo.item;reportPlayback(state,currentItem.ServerId,"reportPlaybackProgress")})}function reportPlayback(state,serverId,method){if(serverId){var info={QueueableMediaTypes:state.NowPlayingItem.MediaType,ItemId:state.NowPlayingItem.Id};for(var i in state.PlayState)info[i]=state.PlayState[i];var apiClient=connectionManager.getApiClient(serverId);apiClient[method](info)}}function clearProgressInterval(player){getPlayerData(player).currentProgressInterval&&(clearTimeout(getPlayerData(player).currentProgressInterval),getPlayerData(player).currentProgressInterval=null)}var currentPlayer,currentTargetInfo,lastLocalPlayer,currentPlaylistIndex,currentPlaylistItemId,currentPlayOptions,self=this,players=[],currentPairingId=null,repeatMode="RepeatNone",playlist=[],playNextAfterEnded=!0,playerStates={};self.currentItem=function(player){var data=getPlayerData(player);return data.streamInfo?data.streamInfo.item:null},self.currentMediaSource=function(player){var data=getPlayerData(player);return data.streamInfo?data.streamInfo.mediaSource:null},self.beginPlayerUpdates=function(player){player.beginPlayerUpdates&&player.beginPlayerUpdates()},self.endPlayerUpdates=function(player){player.endPlayerUpdates&&player.endPlayerUpdates()},self.getPlayerInfo=function(){var player=currentPlayer;if(!player)return null;var target=currentTargetInfo||{};return{name:player.name,isLocalPlayer:player.isLocalPlayer,id:target.id,deviceName:target.deviceName,playableMediaTypes:target.playableMediaTypes,supportedCommands:target.supportedCommands}},self.setActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name){if(currentPlayer&¤tPlayer.isLocalPlayer)return;return void setCurrentPlayerInternal(null,null)}if("string"==typeof player&&(player=players.filter(function(p){return p.name===player})[0]),!player)throw new Error("null player");setCurrentPlayerInternal(player,targetInfo)},self.trySetActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name)return void(currentPlayer&¤tPlayer.isLocalPlayer);if("string"==typeof player&&(player=players.filter(function(p){return p.name===player})[0]),!player)throw new Error("null player");if(currentPairingId!==targetInfo.id){currentPairingId=targetInfo.id;var promise=player.tryPair?player.tryPair(targetInfo):Promise.resolve();promise.then(function(){setCurrentPlayerInternal(player,targetInfo)},function(){currentPairingId===targetInfo.id&&(currentPairingId=null)})}},self.trySetActiveDeviceName=function(name){function normalizeName(t){return t.toLowerCase().replace(" ","")}name=normalizeName(name),self.getTargets().then(function(result){var target=result.filter(function(p){return normalizeName(p.name)===name})[0];target&&self.trySetActivePlayer(target.playerName,target)})},self.setDefaultPlayerActive=function(){self.setActivePlayer("localplayer")},self.removeActivePlayer=function(name){var playerInfo=self.getPlayerInfo();playerInfo&&playerInfo.name===name&&self.setDefaultPlayerActive()},self.removeActiveTarget=function(id){var playerInfo=self.getPlayerInfo();playerInfo&&playerInfo.id===id&&self.setDefaultPlayerActive()},self.disconnectFromPlayer=function(){var playerInfo=self.getPlayerInfo();playerInfo&&(playerInfo.supportedCommands.indexOf("EndSession")!==-1?require(["dialog"],function(dialog){var menuItems=[];menuItems.push({ +name:globalize.translate("ButtonYes"),id:"yes"}),menuItems.push({name:globalize.translate("ButtonNo"),id:"no"}),dialog({buttons:menuItems,text:globalize.translate("ConfirmEndPlayerSession")}).then(function(id){switch(id){case"yes":self.getCurrentPlayer().endSession(),self.setDefaultPlayerActive();break;case"no":self.setDefaultPlayerActive()}})}):self.setDefaultPlayerActive())},self.getTargets=function(){var promises=players.filter(function(p){return!displayPlayerInLocalGroup(p)}).map(getPlayerTargets);return Promise.all(promises).then(function(responses){var targets=[];targets.push({name:globalize.translate("sharedcomponents#HeaderMyDevice"),id:"localplayer",playerName:"localplayer",playableMediaTypes:["Audio","Video","Game"],isLocalPlayer:!0,supportedCommands:getSupportedCommands({isLocalPlayer:!0})});for(var i=0;idatetime.parseISO8601Date(item.EndDate).getTime()||(new Date).getTime()ticks})[0];nextChapter?self.seek(nextChapter.StartPositionTicks,player):self.nextTrack(player)},self.previousChapter=function(player){player=player||currentPlayer;var item=self.currentItem(player),ticks=getCurrentTicks(player);ticks-=1e8,0===self.getCurrentPlaylistIndex(player)&&(ticks=Math.max(ticks,0));var previousChapters=(item.Chapters||[]).filter(function(i){return i.StartPositionTicks<=ticks});previousChapters.length?self.seek(previousChapters[previousChapters.length-1].StartPositionTicks,player):self.previousTrack(player)},self.fastForward=function(player){if(player=player||currentPlayer,null!=player.fastForward)return void player.fastForward(userSettings.skipForwardLength());var ticks=getCurrentTicks(player);ticks+=1e4*userSettings.skipForwardLength();var runTimeTicks=self.duration(player)||0;ticks0||canPlayerSeek(player)),item&&(state.NowPlayingItem=getNowPlayingItemForReporting(player,item,mediaSource)),state.MediaSource=mediaSource,Promise.resolve(state)},self.currentTime=function(player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.currentTime():getCurrentTicks(player)},self.duration=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.duration();var streamInfo=getPlayerData(player).streamInfo;if(streamInfo&&streamInfo.mediaSource&&streamInfo.mediaSource.RunTimeTicks)return streamInfo.mediaSource.RunTimeTicks;var playerDuration=player.duration();return playerDuration&&(playerDuration*=1e4),playerDuration};var currentId=0;self.getSubtitleUrl=function(textStream,serverId){var apiClient=connectionManager.getApiClient(serverId),textStreamUrl=textStream.IsExternalUrl?textStream.DeliveryUrl:apiClient.getUrl(textStream.DeliveryUrl);return textStreamUrl},self.setCurrentPlaylistItem=function(playlistItemId,player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.setCurrentPlaylistItem(playlistItemId);for(var newItem,newItemIndex,i=0,length=playlist.length;i=playlist.length)throw new Error("newIndex out of bounds");moveInArray(playlist,oldIndex,newIndex),events.trigger(player,"playlistitemmove",[{playlistItemId:playlistItemId,newIndex:newIndex}])}},self.getCurrentPlaylistIndex=function(i,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getCurrentPlaylistIndex():findPlaylistIndex(currentPlaylistItemId,playlist)},self.getCurrentPlaylistItemId=function(i,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getCurrentPlaylistItemId():currentPlaylistItemId},self.setRepeatMode=function(value,player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.setRepeatMode(value):(repeatMode=value,void events.trigger(player,"repeatmodechange"))},self.getRepeatMode=function(player){return player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player)?player.getRepeatMode():repeatMode},self.nextTrack=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.nextTrack();var newItemInfo=getNextItemInfo(player);if(newItemInfo){console.log("playing next track");var playOptions=Object.assign({},currentPlayOptions,{startPositionTicks:0});playInternal(newItemInfo.item,playOptions,function(){setPlaylistState(newItemInfo.item.PlaylistItemId,newItemInfo.index)})}},self.previousTrack=function(player){if(player=player||currentPlayer,player&&!enableLocalPlaylistManagement(player))return player.previousTrack();var newIndex=self.getCurrentPlaylistIndex(player)-1;if(newIndex>=0){var newItem=playlist[newIndex];if(newItem){var playOptions=Object.assign({},currentPlayOptions,{startPositionTicks:0});playInternal(newItem,playOptions,function(){setPlaylistState(newItem.PlaylistItemId,newIndex)})}}},self.queue=function(options,player){queue(options,"",player)},self.queueNext=function(options,player){queue(options,"next",player)},events.on(pluginManager,"registered",function(e,plugin){"mediaplayer"===plugin.type&&initMediaPlayer(plugin)}),pluginManager.ofType("mediaplayer").map(initMediaPlayer),window.addEventListener("beforeunload",function(e){var player=currentPlayer;player&&getPlayerData(player).currentProgressInterval&&(playNextAfterEnded=!1,onPlaybackStopped.call(player))}),events.on(serverNotifications,"ServerShuttingDown",function(e,apiClient,data){self.setDefaultPlayerActive()}),events.on(serverNotifications,"ServerRestarting",function(e,apiClient,data){self.setDefaultPlayerActive()})}return new PlaybackManager}); \ No newline at end of file diff --git a/dashboard-ui/components/apphost.js b/dashboard-ui/components/apphost.js index d759ef0d98..64f84f22d3 100644 --- a/dashboard-ui/components/apphost.js +++ b/dashboard-ui/components/apphost.js @@ -1 +1 @@ -define(["appStorage","browser"],function(appStorage,browser){"use strict";function getDeviceProfile(){return null}function getCapabilities(){var caps={PlayableMediaTypes:["Audio","Video"],SupportsPersistentIdentifier:!1,DeviceProfile:getDeviceProfile()};return caps}function generateDeviceId(){return new Promise(function(resolve,reject){require(["cryptojs-sha1"],function(){var keys=[];keys.push(navigator.userAgent),keys.push((new Date).getTime()),resolve(CryptoJS.SHA1(keys.join("|")).toString())})})}function getDeviceId(){var key="_deviceId2",deviceId=appStorage.getItem(key);return deviceId?Promise.resolve(deviceId):generateDeviceId().then(function(deviceId){return appStorage.setItem(key,deviceId),deviceId})}function getDeviceName(){var deviceName;return deviceName=browser.tizen?"Samsung Smart TV":browser.web0S?"LG Smart TV":browser.operaTv?"Opera TV":browser.xboxOne?"Xbox One":browser.ps4?"Sony PS4":browser.chrome?"Chrome":browser.edge?"Edge":browser.firefox?"Firefox":browser.msie?"Internet Explorer":"Web Browser",browser.version&&(deviceName+=" "+browser.version),browser.ipad?deviceName+=" Ipad":browser.iphone?deviceName+=" Iphone":browser.android&&(deviceName+=" Android"),deviceName}function supportsVoiceInput(){return!browser.tv&&(window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.oSpeechRecognition||window.msSpeechRecognition)}function supportsFullscreen(){if(browser.tv)return!1;var element=document.documentElement;return element.requestFullscreen||element.mozRequestFullScreen||element.webkitRequestFullscreen||element.msRequestFullscreen}function getSyncProfile(){return new Promise(function(resolve,reject){require(["browserdeviceprofile","appSettings"],function(profileBuilder,appSettings){var profile=profileBuilder();profile.MaxStaticMusicBitrate=appSettings.maxStaticMusicBitrate(),resolve(profile)})})}function supportsHtmlMediaAutoplay(){if(browser.edgeUwp||browser.tv||browser.ps4||browser.xboxOne)return!0;if(browser.mobile)return!1;var savedResult=appStorage.getItem(htmlMediaAutoplayAppStorageKey);return"true"===savedResult||"false"!==savedResult&&null}var htmlMediaAutoplayAppStorageKey="supportshtmlmediaautoplay0",supportedFeatures=function(){var features=["filedownload","sharing","externalpremium"];return browser.operaTv||browser.tizen||browser.web0s?features.push("exit"):features.push("exitmenu"),browser.operaTv||features.push("externallinks"),supportsVoiceInput()&&features.push("voiceinput"),supportsHtmlMediaAutoplay()&&(features.push("htmlaudioautoplay"),features.push("htmlvideoautoplay")),window.SyncRegistered,supportsFullscreen()&&features.push("fullscreenchange"),(browser.chrome||browser.edge&&!browser.slow)&&features.push("imageanalysis"),Dashboard.isConnectMode()&&features.push("multiserver"),(browser.tv||browser.xboxOne||browser.ps4||browser.mobile)&&features.push("physicalvolumecontrol"),browser.tv||browser.xboxOne||browser.ps4||features.push("remotecontrol"),features}();supportedFeatures.indexOf("htmlvideoautoplay")===-1&&supportsHtmlMediaAutoplay()!==!1&&require(["autoPlayDetect"],function(autoPlayDetect){autoPlayDetect.supportsHtmlMediaAutoplay().then(function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"true"),supportedFeatures.push("htmlvideoautoplay"),supportedFeatures.push("htmlaudioautoplay")},function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"false")})});var appInfo,version=window.dashboardVersion||"3.0";return{getWindowState:function(){return document.windowState||"Normal"},setWindowState:function(state){alert("setWindowState is not supported and should not be called")},exit:function(){if(browser.tizen)try{tizen.application.getCurrentApplication().exit()}catch(err){console.log("error closing application: "+err)}else window.close()},supports:function(command){return supportedFeatures.indexOf(command.toLowerCase())!=-1},appInfo:function(){return appInfo?Promise.resolve(appInfo):getDeviceId().then(function(deviceId){return appInfo={deviceId:deviceId,deviceName:getDeviceName(),appName:"Emby Mobile",appVersion:version}})},capabilities:getCapabilities,preferVisualCards:browser.android||browser.chrome,moreIcon:browser.safari||browser.edge?"dots-horiz":"dots-vert",getSyncProfile:getSyncProfile}}); \ No newline at end of file +define(["appStorage","browser"],function(appStorage,browser){"use strict";function getDeviceProfile(){return null}function getCapabilities(){var caps={PlayableMediaTypes:["Audio","Video"],SupportsPersistentIdentifier:!1,DeviceProfile:getDeviceProfile()};return caps}function generateDeviceId(){return new Promise(function(resolve,reject){require(["cryptojs-sha1"],function(){var keys=[];keys.push(navigator.userAgent),keys.push((new Date).getTime()),resolve(CryptoJS.SHA1(keys.join("|")).toString())})})}function getDeviceId(){var key="_deviceId2",deviceId=appStorage.getItem(key);return deviceId?Promise.resolve(deviceId):generateDeviceId().then(function(deviceId){return appStorage.setItem(key,deviceId),deviceId})}function getDeviceName(){var deviceName;return deviceName=browser.tizen?"Samsung Smart TV":browser.web0S?"LG Smart TV":browser.operaTv?"Opera TV":browser.xboxOne?"Xbox One":browser.ps4?"Sony PS4":browser.chrome?"Chrome":browser.edge?"Edge":browser.firefox?"Firefox":browser.msie?"Internet Explorer":"Web Browser",browser.version&&(deviceName+=" "+browser.version),browser.ipad?deviceName+=" Ipad":browser.iphone?deviceName+=" Iphone":browser.android&&(deviceName+=" Android"),deviceName}function supportsVoiceInput(){return!browser.tv&&(window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.oSpeechRecognition||window.msSpeechRecognition)}function supportsFullscreen(){if(browser.tv)return!1;var element=document.documentElement;return element.requestFullscreen||element.mozRequestFullScreen||element.webkitRequestFullscreen||element.msRequestFullscreen}function getSyncProfile(){return new Promise(function(resolve,reject){require(["browserdeviceprofile","appSettings"],function(profileBuilder,appSettings){var profile=profileBuilder();profile.MaxStaticMusicBitrate=appSettings.maxStaticMusicBitrate(),resolve(profile)})})}function supportsHtmlMediaAutoplay(){if(browser.edgeUwp||browser.tv||browser.ps4||browser.xboxOne)return!0;if(browser.mobile)return!1;var savedResult=appStorage.getItem(htmlMediaAutoplayAppStorageKey);return"true"===savedResult||"false"!==savedResult&&null}var htmlMediaAutoplayAppStorageKey="supportshtmlmediaautoplay0",supportedFeatures=function(){var features=["sharing","externalpremium"];return browser.edgeUwp||browser.tv||browser.xboxOne||browser.ps4||features.push("filedownload"),browser.operaTv||browser.tizen||browser.web0s?features.push("exit"):features.push("exitmenu"),browser.operaTv||features.push("externallinks"),supportsVoiceInput()&&features.push("voiceinput"),supportsHtmlMediaAutoplay()&&(features.push("htmlaudioautoplay"),features.push("htmlvideoautoplay")),window.SyncRegistered,supportsFullscreen()&&features.push("fullscreenchange"),(browser.chrome||browser.edge&&!browser.slow)&&features.push("imageanalysis"),Dashboard.isConnectMode()&&features.push("multiserver"),(browser.tv||browser.xboxOne||browser.ps4||browser.mobile)&&features.push("physicalvolumecontrol"),browser.tv||browser.xboxOne||browser.ps4||features.push("remotecontrol"),features}();supportedFeatures.indexOf("htmlvideoautoplay")===-1&&supportsHtmlMediaAutoplay()!==!1&&require(["autoPlayDetect"],function(autoPlayDetect){autoPlayDetect.supportsHtmlMediaAutoplay().then(function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"true"),supportedFeatures.push("htmlvideoautoplay"),supportedFeatures.push("htmlaudioautoplay")},function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"false")})});var appInfo,version=window.dashboardVersion||"3.0";return{getWindowState:function(){return document.windowState||"Normal"},setWindowState:function(state){alert("setWindowState is not supported and should not be called")},exit:function(){if(browser.tizen)try{tizen.application.getCurrentApplication().exit()}catch(err){console.log("error closing application: "+err)}else window.close()},supports:function(command){return supportedFeatures.indexOf(command.toLowerCase())!=-1},appInfo:function(){return appInfo?Promise.resolve(appInfo):getDeviceId().then(function(deviceId){return appInfo={deviceId:deviceId,deviceName:getDeviceName(),appName:"Emby Mobile",appVersion:version}})},capabilities:getCapabilities,preferVisualCards:browser.android||browser.chrome,moreIcon:browser.safari||browser.edge?"dots-horiz":"dots-vert",getSyncProfile:getSyncProfile}}); \ No newline at end of file diff --git a/dashboard-ui/dashboard/devicesupload.js b/dashboard-ui/dashboard/devicesupload.js index 4980fc3b50..80c918be9c 100644 --- a/dashboard-ui/dashboard/devicesupload.js +++ b/dashboard-ui/dashboard/devicesupload.js @@ -1 +1 @@ -define(["jQuery","fnchecked"],function($){"use strict";function load(page,config){$("#txtUploadPath",page).val(config.CameraUploadPath||""),$("#chkSubfolder",page).checked(config.EnableCameraUploadSubfolders)}function loadData(page){Dashboard.showLoadingMsg(),ApiClient.getNamedConfiguration("devices").then(function(config){load(page,config),Dashboard.hideLoadingMsg()})}function save(page){ApiClient.getNamedConfiguration("devices").then(function(config){config.CameraUploadPath=$("#txtUploadPath",page).val(),config.EnableCameraUploadSubfolders=$("#chkSubfolder",page).checked(),ApiClient.updateNamedConfiguration("devices",config).then(Dashboard.processServerConfigurationUpdateResult)})}function onSubmit(){var form=this,page=$(form).parents(".page");return save(page),!1}function getTabs(){return[{href:"syncactivity.html",name:Globalize.translate("TabSyncJobs")},{href:"devicesupload.html",name:Globalize.translate("TabCameraUpload")},{href:"appservices.html?context=sync",name:Globalize.translate("TabServices")},{href:"syncsettings.html",name:Globalize.translate("TabSettings")}]}$(document).on("pageinit","#devicesUploadPage",function(){var page=this;$("#btnSelectUploadPath",page).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&$("#txtUploadPath",page).val(path),picker.close()},header:Globalize.translate("HeaderSelectUploadPath")})})}),$(".devicesUploadForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#devicesUploadPage",function(){LibraryMenu.setTabs("syncadmin",1,getTabs);var page=this;loadData(page)})}); \ No newline at end of file +define(["jQuery","fnchecked"],function($){"use strict";function load(page,config){$("#txtUploadPath",page).val(config.CameraUploadPath||""),$("#chkSubfolder",page).checked(config.EnableCameraUploadSubfolders)}function loadData(page){Dashboard.showLoadingMsg(),ApiClient.getNamedConfiguration("devices").then(function(config){load(page,config),Dashboard.hideLoadingMsg()})}function save(page){ApiClient.getNamedConfiguration("devices").then(function(config){config.CameraUploadPath=$("#txtUploadPath",page).val(),config.EnableCameraUploadSubfolders=$("#chkSubfolder",page).checked(),ApiClient.updateNamedConfiguration("devices",config).then(Dashboard.processServerConfigurationUpdateResult)})}function onSubmit(){var form=this,page=$(form).parents(".page");return save(page),!1}function getTabs(){return[{href:"devices.html",name:Globalize.translate("TabDevices")},{href:"devicesupload.html",name:Globalize.translate("TabCameraUpload")}]}$(document).on("pageinit","#devicesUploadPage",function(){var page=this;$("#btnSelectUploadPath",page).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&$("#txtUploadPath",page).val(path),picker.close()},header:Globalize.translate("HeaderSelectUploadPath")})})}),$(".devicesUploadForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#devicesUploadPage",function(){LibraryMenu.setTabs("devices",1,getTabs);var page=this;loadData(page)})}); \ No newline at end of file diff --git a/dashboard-ui/device.html b/dashboard-ui/device.html index 9b3acd848a..613ca7d4ee 100644 --- a/dashboard-ui/device.html +++ b/dashboard-ui/device.html @@ -1,4 +1,4 @@ -
+
diff --git a/dashboard-ui/devices.html b/dashboard-ui/devices.html index 89c8fc5a63..b58638b430 100644 --- a/dashboard-ui/devices.html +++ b/dashboard-ui/devices.html @@ -1,4 +1,4 @@ -
+
diff --git a/dashboard-ui/scripts/device.js b/dashboard-ui/scripts/device.js index d53bb52291..7b8d16ed54 100644 --- a/dashboard-ui/scripts/device.js +++ b/dashboard-ui/scripts/device.js @@ -1 +1 @@ -define(["jQuery"],function($){"use strict";function load(page,device,capabilities){capabilities.SupportsContentUploading?$("#fldCameraUploadPath",page).removeClass("hide"):$("#fldCameraUploadPath",page).addClass("hide"),$("#txtCustomName",page).val(device.CustomName||""),$("#txtUploadPath",page).val(device.CameraUploadPath||""),$(".reportedName",page).html(device.ReportedName||"")}function loadData(page){Dashboard.showLoadingMsg();var id=getParameterByName("id"),promise1=ApiClient.getJSON(ApiClient.getUrl("Devices/Info",{Id:id})),promise2=ApiClient.getJSON(ApiClient.getUrl("Devices/Capabilities",{Id:id}));Promise.all([promise1,promise2]).then(function(responses){load(page,responses[0],responses[1]),Dashboard.hideLoadingMsg()})}function save(page){var id=getParameterByName("id");ApiClient.ajax({url:ApiClient.getUrl("Devices/Options",{Id:id}),type:"POST",data:JSON.stringify({CustomName:$("#txtCustomName",page).val(),CameraUploadPath:$("#txtUploadPath",page).val()}),contentType:"application/json"}).then(Dashboard.processServerConfigurationUpdateResult)}function onSubmit(){var form=this,page=$(form).parents(".page");return save(page),!1}$(document).on("pageinit","#devicePage",function(){var page=this;$("#btnSelectUploadPath",page).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&$("#txtUploadPath",page).val(path),picker.close()},header:Globalize.translate("HeaderSelectUploadPath")})})}),$(".deviceForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#devicePage",function(){var page=this;loadData(page)})}); \ No newline at end of file +define(["jQuery"],function($){"use strict";function load(page,device,capabilities){capabilities.SupportsContentUploading?$("#fldCameraUploadPath",page).removeClass("hide"):$("#fldCameraUploadPath",page).addClass("hide"),$("#txtCustomName",page).val(device.CustomName||""),$("#txtUploadPath",page).val(device.CameraUploadPath||""),$(".reportedName",page).html(device.ReportedName||"")}function loadData(page){Dashboard.showLoadingMsg();var id=getParameterByName("id"),promise1=ApiClient.getJSON(ApiClient.getUrl("Devices/Info",{Id:id})),promise2=ApiClient.getJSON(ApiClient.getUrl("Devices/Capabilities",{Id:id}));Promise.all([promise1,promise2]).then(function(responses){load(page,responses[0],responses[1]),Dashboard.hideLoadingMsg()})}function save(page){var id=getParameterByName("id");ApiClient.ajax({url:ApiClient.getUrl("Devices/Options",{Id:id}),type:"POST",data:JSON.stringify({CustomName:$("#txtCustomName",page).val(),CameraUploadPath:$("#txtUploadPath",page).val()}),contentType:"application/json"}).then(Dashboard.processServerConfigurationUpdateResult)}function onSubmit(){var form=this,page=$(form).parents(".page");return save(page),!1}function getTabs(){return[{href:"devices.html",name:Globalize.translate("TabDevices")},{href:"devicesupload.html",name:Globalize.translate("TabCameraUpload")}]}$(document).on("pageinit","#devicePage",function(){var page=this;$("#btnSelectUploadPath",page).on("click.selectDirectory",function(){require(["directorybrowser"],function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&$("#txtUploadPath",page).val(path),picker.close()},header:Globalize.translate("HeaderSelectUploadPath")})})}),$(".deviceForm").off("submit",onSubmit).on("submit",onSubmit)}).on("pageshow","#devicePage",function(){LibraryMenu.setTabs("devices",0,getTabs);var page=this;loadData(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/devices.js b/dashboard-ui/scripts/devices.js index 7dafef7422..cf779ae7a6 100644 --- a/dashboard-ui/scripts/devices.js +++ b/dashboard-ui/scripts/devices.js @@ -1 +1 @@ -define(["jQuery","listViewStyle"],function($){"use strict";function deleteDevice(page,id){var msg=Globalize.translate("DeleteDeviceConfirmation");require(["confirm"],function(confirm){confirm(msg,Globalize.translate("HeaderDeleteDevice")).then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Devices",{Id:id})}).then(function(){loadData(page)})})})}function load(page,devices){var html="";devices.length&&(html+='
'),html+=devices.map(function(d){var deviceHtml="";return deviceHtml+='
',deviceHtml+='tablet_android',deviceHtml+=d.AppName&&d.LastUserName?'"}).join(""),devices.length&&(html+="
");var elem=$(".devicesList",page).html(html).trigger("create");$(".btnDeleteDevice",elem).on("click",function(){deleteDevice(page,this.getAttribute("data-id"))})}function loadData(page){Dashboard.showLoadingMsg(),ApiClient.getJSON(ApiClient.getUrl("Devices",{SupportsPersistentIdentifier:!0})).then(function(result){load(page,result.Items),Dashboard.hideLoadingMsg()})}$(document).on("pageshow","#devicesPage",function(){var page=this;loadData(page)})}); \ No newline at end of file +define(["jQuery","listViewStyle"],function($){"use strict";function deleteDevice(page,id){var msg=Globalize.translate("DeleteDeviceConfirmation");require(["confirm"],function(confirm){confirm(msg,Globalize.translate("HeaderDeleteDevice")).then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Devices",{Id:id})}).then(function(){loadData(page)})})})}function load(page,devices){var html="";devices.length&&(html+='
'),html+=devices.map(function(d){var deviceHtml="";return deviceHtml+='
',deviceHtml+='tablet_android',deviceHtml+=d.AppName&&d.LastUserName?'"}).join(""),devices.length&&(html+="
");var elem=$(".devicesList",page).html(html).trigger("create");$(".btnDeleteDevice",elem).on("click",function(){deleteDevice(page,this.getAttribute("data-id"))})}function loadData(page){Dashboard.showLoadingMsg(),ApiClient.getJSON(ApiClient.getUrl("Devices",{SupportsPersistentIdentifier:!0})).then(function(result){load(page,result.Items),Dashboard.hideLoadingMsg()})}function getTabs(){return[{href:"devices.html",name:Globalize.translate("TabDevices")},{href:"devicesupload.html",name:Globalize.translate("TabCameraUpload")}]}$(document).on("pageshow","#devicesPage",function(){LibraryMenu.setTabs("devices",0,getTabs);var page=this;loadData(page)})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 20d585e9d6..79080551ae 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -1,2 +1,2 @@ -function getWindowLocationSearch(win){"use strict";var search=(win||window).location.search;if(!search){var index=window.location.href.indexOf("?");index!=-1&&(search=window.location.href.substring(index))}return search||""}function getParameterByName(name,url){"use strict";name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regexS="[\\?&]"+name+"=([^&#]*)",regex=new RegExp(regexS,"i"),results=regex.exec(url||getWindowLocationSearch());return null==results?"":decodeURIComponent(results[1].replace(/\+/g," "))}function pageClassOn(eventName,className,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.classList.contains(className)&&fn.call(target,e)})}function pageIdOn(eventName,id,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.id==id&&fn.call(target,e)})}var Dashboard={isConnectMode:function(){if(AppInfo.isNativeApp)return!0;var url=window.location.href.toLowerCase();return url.indexOf("mediabrowser.tv")!=-1||url.indexOf("emby.media")!=-1},isRunningInCordova:function(){return"cordova"==window.appMode},onRequestFail:function(e,data){if(401==data.status&&"ParentalControl"==data.errorCode){var currentView=ViewManager.currentView();currentView&&!currentView.classList.contains(".standalonePage")&&Dashboard.alert({message:Globalize.translate("MessageLoggedOutParentalControl"),callback:function(){Dashboard.logout(!1)}})}},getCurrentUser:function(){return window.ApiClient.getCurrentUser()},serverAddress:function(){if(Dashboard.isConnectMode()){var apiClient=window.ApiClient;return apiClient?apiClient.serverAddress():null}var urlLower=window.location.href.toLowerCase(),index=urlLower.lastIndexOf("/web");if(index!=-1)return urlLower.substring(0,index);var loc=window.location,address=loc.protocol+"//"+loc.hostname;return loc.port&&(address+=":"+loc.port),address},getCurrentUserId:function(){var apiClient=window.ApiClient;return apiClient?apiClient.getCurrentUserId():null},onServerChanged:function(userId,accessToken,apiClient){apiClient=apiClient||window.ApiClient,window.ApiClient=apiClient},logout:function(logoutWithServer){function onLogoutDone(){var loginPage;Dashboard.isConnectMode()?(loginPage="connectlogin.html",window.ApiClient=null):loginPage="login.html",Dashboard.navigate(loginPage)}logoutWithServer===!1?onLogoutDone():ConnectionManager.logout().then(onLogoutDone)},getConfigurationPageUrl:function(name){return"configurationpage?name="+encodeURIComponent(name)},navigate:function(url,preserveQueryString){if(!url)throw new Error("url cannot be null or empty");var queryString=getWindowLocationSearch();return preserveQueryString&&queryString&&(url+=queryString),Emby.Page.show(url)},showLoadingMsg:function(){Dashboard.loadingVisible=!0,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},hideLoadingMsg:function(){Dashboard.loadingVisible=!1,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},processPluginConfigurationUpdateResult:function(){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processServerConfigurationUpdateResult:function(result){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processErrorResponse:function(response){Dashboard.hideLoadingMsg();var status=""+response.status;response.statusText&&(status=response.statusText),Dashboard.alert({title:status,message:response.headers?response.headers.get("X-Application-Error-Code"):null})},alert:function(options){return"string"==typeof options?void require(["toast"],function(toast){toast({text:options})}):void require(["alert"],function(alert){alert({title:options.title||Globalize.translate("HeaderAlert"),text:options.message}).then(options.callback||function(){})})},restartServer:function(){var apiClient=window.ApiClient;apiClient&&(Dashboard.suppressAjaxErrors=!0,Dashboard.showLoadingMsg(),apiClient.restartServer().then(function(){setTimeout(function(){Dashboard.reloadPageWhenServerAvailable()},250)},function(){Dashboard.suppressAjaxErrors=!1}))},reloadPageWhenServerAvailable:function(retryCount){var apiClient=window.ApiClient;apiClient&&apiClient.getJSON(apiClient.getUrl("System/Info")).then(function(info){info.HasPendingRestart?Dashboard.retryReload(retryCount):window.location.reload(!0)},function(){Dashboard.retryReload(retryCount)})},retryReload:function(retryCount){setTimeout(function(){retryCount=retryCount||0,retryCount++,retryCount<10?Dashboard.reloadPageWhenServerAvailable(retryCount):Dashboard.suppressAjaxErrors=!1},500)},showUserFlyout:function(){Dashboard.navigate("mypreferencesmenu.html")},getPluginSecurityInfo:function(){var apiClient=window.ApiClient;if(!apiClient)return Promise.reject();var cachedInfo=Dashboard.pluginSecurityInfo;return cachedInfo?Promise.resolve(cachedInfo):apiClient.ajax({type:"GET",url:apiClient.getUrl("Plugins/SecurityInfo"),dataType:"json",error:function(){}}).then(function(result){return Dashboard.pluginSecurityInfo=result,result})},resetPluginSecurityInfo:function(){Dashboard.pluginSecurityInfo=null},ensureHeader:function(page){page.classList.contains("standalonePage")&&!page.classList.contains("noHeaderPage")&&Dashboard.renderHeader(page)},renderHeader:function(page){var header=page.querySelector(".header");if(!header){var headerHtml="";headerHtml+='",page.insertAdjacentHTML("afterbegin",headerHtml)}},getToolsLinkHtml:function(item){var menuHtml="",pageIds=item.pageIds?item.pageIds.join(","):"";return pageIds=pageIds?' data-pageids="'+pageIds+'"':"",menuHtml+='",menuHtml+='',menuHtml+=item.name,menuHtml+="",menuHtml+=""},getToolsMenuHtml:function(page){var i,length,item,items=Dashboard.getToolsMenuLinks(page),menuHtml="";for(menuHtml+='
',i=0,length=items.length;i
"),item.href?menuHtml+=Dashboard.getToolsLinkHtml(item):(menuHtml+='
',menuHtml+=item.name,menuHtml+="
");return menuHtml+="
"},getToolsMenuLinks:function(){return[{name:Globalize.translate("TabServer")},{name:Globalize.translate("TabDashboard"),href:"dashboard.html",pageIds:["dashboardPage"],icon:"dashboard"},{name:Globalize.translate("TabSettings"),href:"dashboardgeneral.html",pageIds:["dashboardGeneralPage"],icon:"settings"},{name:Globalize.translate("TabDevices"),href:"devices.html",pageIds:["devicesPage","devicePage"],icon:"tablet"},{name:Globalize.translate("TabUsers"),href:"userprofiles.html",pageIds:["userProfilesPage","newUserPage","editUserPage","userLibraryAccessPage","userParentalControlPage","userPasswordPage"],icon:"people"},{name:"Emby Premiere",href:"supporterkey.html",pageIds:["supporterKeyPage"],icon:"star"},{divider:!0,name:Globalize.translate("TabLibrary"),href:"library.html",pageIds:["mediaLibraryPage","librarySettingsPage","libraryDisplayPage","metadataImagesConfigurationPage","metadataNfoPage"],icon:"folder",color:"#38c"},{name:Globalize.translate("TabSubtitles"),href:"metadatasubtitles.html",pageIds:["metadataSubtitlesPage"],icon:"closed_caption"},{name:Globalize.translate("TabPlayback"),icon:"play_circle_filled",color:"#E5342E",href:"cinemamodeconfiguration.html",pageIds:["cinemaModeConfigurationPage","playbackConfigurationPage","streamingSettingsPage"]},{name:Globalize.translate("TabSync"),icon:"sync",href:"syncactivity.html",pageIds:["syncActivityPage","syncJobPage","devicesUploadPage","syncSettingsPage"],color:"#009688"},{name:Globalize.translate("TabTranscoding"),icon:"transform",href:"encodingsettings.html",pageIds:["encodingSettingsPage"]},{divider:!0,name:Globalize.translate("TabExtras")},{name:Globalize.translate("TabAutoOrganize"),color:"#01C0DD",href:"autoorganizelog.html",pageIds:["libraryFileOrganizerPage","libraryFileOrganizerSmartMatchPage","libraryFileOrganizerLogPage"],icon:"folder"},{name:Globalize.translate("DLNA"),href:"dlnasettings.html",pageIds:["dlnaSettingsPage","dlnaProfilesPage","dlnaProfilePage"],icon:"settings"},{name:Globalize.translate("TabLiveTV"),href:"livetvstatus.html",pageIds:["liveTvStatusPage","liveTvSettingsPage","liveTvTunerProviderHdHomerunPage","liveTvTunerProviderM3UPage","liveTvTunerProviderSatPage"],icon:"dvr"},{name:Globalize.translate("TabNotifications"),icon:"notifications",color:"brown",href:"notificationsettings.html",pageIds:["notificationSettingsPage","notificationSettingPage"]},{name:Globalize.translate("TabPlugins"),icon:"add_shopping_cart",color:"#9D22B1",href:"plugins.html",pageIds:["pluginsPage","pluginCatalogPage"]},{divider:!0,name:Globalize.translate("TabExpert")},{name:Globalize.translate("TabAdvanced"),icon:"settings",href:"dashboardhosting.html",color:"#F16834",pageIds:["dashboardHostingPage","serverSecurityPage"]},{name:Globalize.translate("TabLogs"),href:"log.html",pageIds:["logPage"],icon:"folder_open"},{name:Globalize.translate("TabScheduledTasks"),href:"scheduledtasks.html",pageIds:["scheduledTasksPage","scheduledTaskPage"],icon:"schedule"},{name:Globalize.translate("MetadataManager"),href:"edititemmetadata.html",pageIds:[],icon:"mode_edit"},{name:Globalize.translate("ButtonReports"),href:"reports.html",pageIds:[],icon:"insert_chart"}]},getSupportedRemoteCommands:function(){return["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"]},capabilities:function(){var caps={PlayableMediaTypes:["Audio","Video"],SupportedCommands:Dashboard.getSupportedRemoteCommands(),SupportsPersistentIdentifier:Dashboard.isRunningInCordova(),SupportsMediaControl:!0,SupportedLiveMediaTypes:["Audio","Video"]};return Dashboard.isRunningInCordova()&&!browserInfo.safari&&(caps.SupportsSync=!0,caps.SupportsContentUploading=!0),caps},normalizeImageOptions:function(options){AppInfo.hasLowImageBandwidth&&(options.enableImageEnhancers=!1);var setQuality;if(options.maxWidth&&(setQuality=!0),options.width&&(setQuality=!0),options.maxHeight&&(setQuality=!0),options.height&&(setQuality=!0),setQuality){var quality=90,isBackdrop="backdrop"==(options.type||"").toLowerCase();isBackdrop&&(quality-=10),browserInfo.slow&&(quality-=40),AppInfo.hasLowImageBandwidth&&!isBackdrop&&(quality-=10),options.quality=quality}}},AppInfo={};!function(){"use strict";function setAppInfo(){var isCordova=Dashboard.isRunningInCordova();AppInfo.enableHomeTabs=!0,AppInfo.enableAutoSave=browserInfo.touch,AppInfo.enableAppStorePolicy=isCordova;var isIOS=browserInfo.ipad||browserInfo.iphone,isAndroid=browserInfo.android;isIOS&&(AppInfo.hasLowImageBandwidth=!0),isCordova?(AppInfo.isNativeApp=!0,AppInfo.enableHomeTabs=!1,isAndroid&&(AppInfo.supportsExternalPlayers=!0)):AppInfo.enableSupporterMembership=!0,AppInfo.supportsFileInput=!(AppInfo.isNativeApp&&isAndroid),isCordova&&isIOS?AppInfo.moreIcon="more-horiz":AppInfo.moreIcon="more-vert",AppInfo.supportsUserDisplayLanguageSetting=Dashboard.isConnectMode()}function initializeApiClient(apiClient){AppInfo.enableAppStorePolicy&&(apiClient.getAvailablePlugins=function(){return Promise.resolve([])},apiClient.getInstalledPlugins=function(){return Promise.resolve([])}),apiClient.normalizeImageOptions=Dashboard.normalizeImageOptions,Events.off(apiClient,"requestfail",Dashboard.onRequestFail),Events.on(apiClient,"requestfail",Dashboard.onRequestFail)}function onApiClientCreated(e,newApiClient){initializeApiClient(newApiClient),window.$&&($.ajax=newApiClient.ajax)}function defineConnectionManager(connectionManager){window.ConnectionManager=connectionManager,define("connectionManager",[],function(){return connectionManager})}function bindConnectionManagerEvents(connectionManager,events,userSettings){window.Events=events,events.on(ConnectionManager,"apiclientcreated",onApiClientCreated),connectionManager.currentApiClient=function(){if(!localApiClient){var server=connectionManager.getLastUsedServer();server&&(localApiClient=connectionManager.getApiClient(server.Id))}return localApiClient},connectionManager.onLocalUserSignedIn=function(user){return localApiClient=connectionManager.getApiClient(user.ServerId),window.ApiClient=localApiClient,userSettings.setUserInfo(user.Id,localApiClient)},events.on(connectionManager,"localusersignedout",function(){userSettings.setUserInfo(null,null)})}function createConnectionManager(){return new Promise(function(resolve,reject){require(["connectionManagerFactory","apphost","credentialprovider","events","userSettings"],function(connectionManagerExports,apphost,credentialProvider,events,userSettings){window.MediaBrowser=Object.assign(window.MediaBrowser||{},connectionManagerExports);var credentialProviderInstance=new credentialProvider,promises=[apphost.getSyncProfile(),apphost.appInfo()];Promise.all(promises).then(function(responses){var deviceProfile=responses[0],appInfo=responses[1],capabilities=Dashboard.capabilities();capabilities.DeviceProfile=deviceProfile;var connectionManager=new MediaBrowser.ConnectionManager(credentialProviderInstance,appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,capabilities,window.devicePixelRatio);return defineConnectionManager(connectionManager),bindConnectionManagerEvents(connectionManager,events,userSettings),Dashboard.isConnectMode()?void resolve():(console.log("loading ApiClient singleton"),getRequirePromise(["apiclient"]).then(function(apiClientFactory){console.log("creating ApiClient singleton");var apiClient=new apiClientFactory(Dashboard.serverAddress(),appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,window.devicePixelRatio);apiClient.enableAutomaticNetworking=!1,connectionManager.addApiClient(apiClient),require(["css!"+apiClient.getUrl("Branding/Css")]),window.ApiClient=apiClient,localApiClient=apiClient,console.log("loaded ApiClient singleton"),resolve()}))})})})}function setDocumentClasses(browser){var elem=document.documentElement;AppInfo.enableSupporterMembership||elem.classList.add("supporterMembershipDisabled")}function loadTheme(){var name=getParameterByName("theme");if(name)return void require(["themes/"+name+"/theme"]);if(!AppInfo.isNativeApp){var date=new Date,month=date.getMonth(),day=date.getDate();return 9==month&&day>=30?void require(["themes/halloween/theme"]):void 0}}function returnFirstDependency(obj){return obj}function getBowerPath(){return"bower_components"}function getLayoutManager(layoutManager){return layoutManager.init(),layoutManager}function getAppStorage(basePath){try{return localStorage.setItem("_test","0"),localStorage.removeItem("_test"),basePath+"/appstorage-localstorage"}catch(e){return basePath+"/appstorage-memory"}}function createWindowHeadroom(){var headroom=new Headroom([],{tolerance:{down:0,up:0},classes:{}});return headroom.init(),headroom}function createMainContentHammer(Hammer){var hammer=new Hammer(document.querySelector(".skinBody"),null);return hammer}function createSharedAppFooter(appFooter){var footer=new appFooter({});return footer}function initRequire(){var urlArgs="v="+(window.dashboardVersion||(new Date).getDate()),bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents",paths={velocity:bowerPath+"/velocity/velocity.min",vibrant:bowerPath+"/vibrant/dist/vibrant",ironCardList:"components/ironcardlist/ironcardlist",scrollThreshold:"components/scrollthreshold",playlisteditor:"components/playlisteditor/playlisteditor",medialibrarycreator:"components/medialibrarycreator/medialibrarycreator",medialibraryeditor:"components/medialibraryeditor/medialibraryeditor",howler:bowerPath+"/howlerjs/howler.min",sortable:bowerPath+"/Sortable/Sortable.min",isMobile:bowerPath+"/isMobile/isMobile.min",headroom:bowerPath+"/headroomjs/dist/headroom",masonry:bowerPath+"/masonry/dist/masonry.pkgd.min",humanedate:"components/humanedate",libraryBrowser:"scripts/librarybrowser",chromecasthelpers:"components/chromecasthelpers",events:apiClientBowerPath+"/events",credentialprovider:apiClientBowerPath+"/credentials",apiclient:apiClientBowerPath+"/apiclient",connectionManagerFactory:bowerPath+"/emby-apiclient/connectionmanager",visibleinviewport:embyWebComponentsBowerPath+"/visibleinviewport",browserdeviceprofile:embyWebComponentsBowerPath+"/browserdeviceprofile",browser:embyWebComponentsBowerPath+"/browser",inputManager:embyWebComponentsBowerPath+"/inputmanager",qualityoptions:embyWebComponentsBowerPath+"/qualityoptions",hammer:bowerPath+"/hammerjs/hammer.min",pageJs:embyWebComponentsBowerPath+"/pagejs/page",focusManager:embyWebComponentsBowerPath+"/focusmanager",datetime:embyWebComponentsBowerPath+"/datetime",globalize:embyWebComponentsBowerPath+"/globalize",itemHelper:embyWebComponentsBowerPath+"/itemhelper",itemShortcuts:embyWebComponentsBowerPath+"/shortcuts",serverNotifications:embyWebComponentsBowerPath+"/servernotifications",playbackManager:embyWebComponentsBowerPath+"/playback/playbackmanager",autoPlayDetect:embyWebComponentsBowerPath+"/playback/autoplaydetect",nowPlayingHelper:embyWebComponentsBowerPath+"/playback/nowplayinghelper",pluginManager:embyWebComponentsBowerPath+"/pluginmanager",packageManager:embyWebComponentsBowerPath+"/packagemanager",webAnimations:bowerPath+"/web-animations-js/web-animations-next-lite.min"};paths.hlsjs=bowerPath+"/hlsjs/dist/hls.min",define("webActionSheet",[embyWebComponentsBowerPath+"/actionsheet/actionsheet"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.sharingMenu="cordova/sharingwidget":define("sharingMenu",[embyWebComponentsBowerPath+"/sharing/sharingmenu"],returnFirstDependency),paths.wakeonlan=apiClientBowerPath+"/wakeonlan",define("libjass",[bowerPath+"/libjass/libjass.min","css!"+bowerPath+"/libjass/libjass"],returnFirstDependency),window.IntersectionObserver?define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-intersectionobserver"],returnFirstDependency):define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-scroll"],returnFirstDependency),define("imageLoader",[embyWebComponentsBowerPath+"/images/imagehelper"],returnFirstDependency),define("appfooter",["components/appfooter/appfooter"],returnFirstDependency),define("dockedtabs",["components/dockedtabs/dockedtabs"],returnFirstDependency),define("directorybrowser",["components/directorybrowser/directorybrowser"],returnFirstDependency),define("metadataEditor",[embyWebComponentsBowerPath+"/metadataeditor/metadataeditor"],returnFirstDependency),define("personEditor",[embyWebComponentsBowerPath+"/metadataeditor/personeditor"],returnFirstDependency),define("playerSelectionMenu",[embyWebComponentsBowerPath+"/playback/playerselection"],returnFirstDependency),define("playerSettingsMenu",[embyWebComponentsBowerPath+"/playback/playersettingsmenu"],returnFirstDependency),define("libraryMenu",["scripts/librarymenu"],returnFirstDependency),define("emby-collapse",[embyWebComponentsBowerPath+"/emby-collapse/emby-collapse"],returnFirstDependency),define("emby-button",[embyWebComponentsBowerPath+"/emby-button/emby-button"],returnFirstDependency),define("emby-itemscontainer",[embyWebComponentsBowerPath+"/emby-itemscontainer/emby-itemscontainer"],returnFirstDependency),define("emby-tabs",[embyWebComponentsBowerPath+"/emby-tabs/emby-tabs"],returnFirstDependency),define("itemHoverMenu",[embyWebComponentsBowerPath+"/itemhovermenu/itemhovermenu"],returnFirstDependency),define("multiSelect",[embyWebComponentsBowerPath+"/multiselect/multiselect"],returnFirstDependency),define("alphaPicker",[embyWebComponentsBowerPath+"/alphapicker/alphapicker"],returnFirstDependency),define("paper-icon-button-light",[embyWebComponentsBowerPath+"/emby-button/paper-icon-button-light"]),define("connectHelper",[embyWebComponentsBowerPath+"/emby-connect/connecthelper"],returnFirstDependency),define("emby-input",[embyWebComponentsBowerPath+"/emby-input/emby-input"],returnFirstDependency),define("emby-select",[embyWebComponentsBowerPath+"/emby-select/emby-select"],returnFirstDependency),define("emby-slider",[embyWebComponentsBowerPath+"/emby-slider/emby-slider"],returnFirstDependency),define("emby-checkbox",[embyWebComponentsBowerPath+"/emby-checkbox/emby-checkbox"],returnFirstDependency),define("emby-toggle",[embyWebComponentsBowerPath+"/emby-toggle/emby-toggle"],returnFirstDependency),define("emby-radio",[embyWebComponentsBowerPath+"/emby-radio/emby-radio"],returnFirstDependency),define("emby-textarea",[embyWebComponentsBowerPath+"/emby-textarea/emby-textarea"],returnFirstDependency),define("collectionEditor",[embyWebComponentsBowerPath+"/collectioneditor/collectioneditor"],returnFirstDependency),define("playlistEditor",[embyWebComponentsBowerPath+"/playlisteditor/playlisteditor"],returnFirstDependency),define("recordingCreator",[embyWebComponentsBowerPath+"/recordingcreator/recordingcreator"],returnFirstDependency),define("recordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/recordingeditor"],returnFirstDependency),define("seriesRecordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/seriesrecordingeditor"],returnFirstDependency),define("recordingFields",[embyWebComponentsBowerPath+"/recordingcreator/recordingfields"],returnFirstDependency),define("recordingHelper",[embyWebComponentsBowerPath+"/recordingcreator/recordinghelper"],returnFirstDependency),define("subtitleEditor",[embyWebComponentsBowerPath+"/subtitleeditor/subtitleeditor"],returnFirstDependency),define("itemIdentifier",[embyWebComponentsBowerPath+"/itemidentifier/itemidentifier"],returnFirstDependency),define("mediaInfo",[embyWebComponentsBowerPath+"/mediainfo/mediainfo"],returnFirstDependency),define("itemContextMenu",[embyWebComponentsBowerPath+"/itemcontextmenu"],returnFirstDependency),define("imageEditor",[embyWebComponentsBowerPath+"/imageeditor/imageeditor"],returnFirstDependency),define("dom",[embyWebComponentsBowerPath+"/dom"],returnFirstDependency),define("fullscreen-doubleclick",[embyWebComponentsBowerPath+"/fullscreen/fullscreen-doubleclick"],returnFirstDependency),define("fullscreenManager",[embyWebComponentsBowerPath+"/fullscreen/fullscreenmanager","events"],returnFirstDependency),define("layoutManager",[embyWebComponentsBowerPath+"/layoutmanager"],getLayoutManager),define("playMenu",[embyWebComponentsBowerPath+"/playmenu"],returnFirstDependency),define("refreshDialog",[embyWebComponentsBowerPath+"/refreshdialog/refreshdialog"],returnFirstDependency),define("backdrop",[embyWebComponentsBowerPath+"/backdrop/backdrop"],returnFirstDependency),define("fetchHelper",[embyWebComponentsBowerPath+"/fetchhelper"],returnFirstDependency),define("roundCardStyle",["cardStyle","css!"+embyWebComponentsBowerPath+"/cardbuilder/roundcard"],returnFirstDependency),define("cardStyle",["css!"+embyWebComponentsBowerPath+"/cardbuilder/card"],returnFirstDependency),define("cardBuilder",[embyWebComponentsBowerPath+"/cardbuilder/cardbuilder"],returnFirstDependency),define("peoplecardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/peoplecardbuilder"],returnFirstDependency),define("chaptercardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/chaptercardbuilder"],returnFirstDependency),define("mouseManager",[embyWebComponentsBowerPath+"/input/mouse"],returnFirstDependency),define("deleteHelper",[embyWebComponentsBowerPath+"/deletehelper"],returnFirstDependency),define("tvguide",[embyWebComponentsBowerPath+"/guide/guide"],returnFirstDependency),define("programStyles",["css!"+embyWebComponentsBowerPath+"/guide/programs"],returnFirstDependency),define("guide-settings-dialog",[embyWebComponentsBowerPath+"/guide/guide-settings"],returnFirstDependency),define("syncDialog",[embyWebComponentsBowerPath+"/sync/sync"],returnFirstDependency),define("syncToggle",[embyWebComponentsBowerPath+"/sync/synctoggle"],returnFirstDependency),define("syncJobEditor",[embyWebComponentsBowerPath+"/sync/syncjobeditor"],returnFirstDependency),define("syncJobList",[embyWebComponentsBowerPath+"/sync/syncjoblist"],returnFirstDependency),define("voiceDialog",[embyWebComponentsBowerPath+"/voice/voicedialog"],returnFirstDependency),define("voiceReceiver",[embyWebComponentsBowerPath+"/voice/voicereceiver"],returnFirstDependency),define("voiceProcessor",[embyWebComponentsBowerPath+"/voice/voiceprocessor"],returnFirstDependency),define("viewManager",[embyWebComponentsBowerPath+"/viewmanager/viewmanager"],function(viewManager){return window.ViewManager=viewManager,viewManager.dispatchPageEvents(!0),viewManager}),Dashboard.isRunningInCordova()&&window.MainActivity?define("shell",["cordova/shell"],returnFirstDependency):define("shell",[embyWebComponentsBowerPath+"/shell"],returnFirstDependency),define("sharingmanager",[embyWebComponentsBowerPath+"/sharing/sharingmanager"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.apphost="cordova/apphost":paths.apphost="components/apphost",Dashboard.isRunningInCordova()&&window.MainActivity?(paths.appStorage="cordova/appstorage",paths.filesystem="cordova/filesystem"):(paths.appStorage=getAppStorage(apiClientBowerPath),paths.filesystem=embyWebComponentsBowerPath+"/filesystem");var sha1Path=bowerPath+"/cryptojslib/components/sha1-min",md5Path=bowerPath+"/cryptojslib/components/md5-min",shim={};shim[sha1Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},shim[md5Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},requirejs.config({waitSeconds:0,map:{"*":{css:bowerPath+"/emby-webcomponents/require/requirecss",html:bowerPath+"/emby-webcomponents/require/requirehtml",text:bowerPath+"/emby-webcomponents/require/requiretext"}},urlArgs:urlArgs,paths:paths,shim:shim}),define("cryptojs-sha1",[sha1Path]),define("cryptojs-md5",[md5Path]),define("jstree",[bowerPath+"/jstree/dist/jstree","css!thirdparty/jstree/themes/default/style.min.css"]),define("dashboardcss",["css!css/dashboard"]),define("jqmtable",["thirdparty/jquerymobile-1.4.5/jqm.table","css!thirdparty/jquerymobile-1.4.5/jqm.table.css"]),define("jqmwidget",["thirdparty/jquerymobile-1.4.5/jqm.widget"]),define("jqmslider",["thirdparty/jquerymobile-1.4.5/jqm.slider","css!thirdparty/jquerymobile-1.4.5/jqm.slider.css"]),define("jqmpopup",["thirdparty/jquerymobile-1.4.5/jqm.popup","css!thirdparty/jquerymobile-1.4.5/jqm.popup.css"]),define("jqmlistview",["css!thirdparty/jquerymobile-1.4.5/jqm.listview.css"]),define("jqmpanel",["thirdparty/jquerymobile-1.4.5/jqm.panel","css!thirdparty/jquerymobile-1.4.5/jqm.panel.css"]),define("slideshow",[embyWebComponentsBowerPath+"/slideshow/slideshow"],returnFirstDependency),define("fetch",[bowerPath+"/fetch/fetch"]),define("raf",[embyWebComponentsBowerPath+"/polyfills/raf"]),define("functionbind",[embyWebComponentsBowerPath+"/polyfills/bind"]),define("arraypolyfills",[embyWebComponentsBowerPath+"/polyfills/array"]),define("objectassign",[embyWebComponentsBowerPath+"/polyfills/objectassign"]),define("clearButtonStyle",["css!"+embyWebComponentsBowerPath+"/clearbutton"]),define("userdataButtons",[embyWebComponentsBowerPath+"/userdatabuttons/userdatabuttons"],returnFirstDependency),define("listView",[embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("listViewStyle",["css!"+embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("formDialogStyle",["css!"+embyWebComponentsBowerPath+"/formdialog"],returnFirstDependency),define("indicators",[embyWebComponentsBowerPath+"/indicators/indicators"],returnFirstDependency),define("registrationServices",[embyWebComponentsBowerPath+"/registrationservices/registrationservices"],returnFirstDependency),Dashboard.isRunningInCordova()?(define("iapManager",["cordova/iap"],returnFirstDependency),define("fileupload",["cordova/fileupload"],returnFirstDependency)):(define("iapManager",["components/iap"],returnFirstDependency),define("fileupload",[apiClientBowerPath+"/fileupload"],returnFirstDependency)),define("connectionmanager",[apiClientBowerPath+"/connectionmanager"]),define("cameraRoll",[apiClientBowerPath+"/cameraroll"],returnFirstDependency),define("contentuploader",[apiClientBowerPath+"/sync/contentuploader"]),define("serversync",[apiClientBowerPath+"/sync/serversync"]),define("multiserversync",[apiClientBowerPath+"/sync/multiserversync"]),define("offlineusersync",[apiClientBowerPath+"/sync/offlineusersync"]),define("mediasync",[apiClientBowerPath+"/sync/mediasync"]),define("swiper",[bowerPath+"/Swiper/dist/js/swiper.min","css!"+bowerPath+"/Swiper/dist/css/swiper.min"],returnFirstDependency),define("scroller",[embyWebComponentsBowerPath+"/scroller/smoothscroller"],returnFirstDependency),define("toast",[embyWebComponentsBowerPath+"/toast/toast"],returnFirstDependency),define("scrollHelper",[embyWebComponentsBowerPath+"/scrollhelper"],returnFirstDependency),define("appSettings",[embyWebComponentsBowerPath+"/appsettings"],updateAppSettings),define("userSettings",[embyWebComponentsBowerPath+"/usersettings/usersettings"],returnFirstDependency),define("userSettingsBuilder",[embyWebComponentsBowerPath+"/usersettings/usersettingsbuilder"],returnFirstDependency),define("material-icons",["css!"+embyWebComponentsBowerPath+"/fonts/material-icons/style"]),define("robotoFont",["css!"+embyWebComponentsBowerPath+"/fonts/roboto/style"]),define("scrollStyles",["css!"+embyWebComponentsBowerPath+"/scrollstyles"]),define("navdrawer",["components/navdrawer/navdrawer"],returnFirstDependency),define("viewcontainer",["components/viewcontainer-lite","css!"+embyWebComponentsBowerPath+"/viewmanager/viewcontainer-lite"],returnFirstDependency),define("queryString",[bowerPath+"/query-string/index"],function(){return queryString}),define("jQuery",[bowerPath+"/jquery/dist/jquery.slim.min"],function(){return window.ApiClient&&(jQuery.ajax=ApiClient.ajax),jQuery}),define("fnchecked",["legacy/fnchecked"]),define("dialogHelper",[embyWebComponentsBowerPath+"/dialoghelper/dialoghelper"],function(dialoghelper){return dialoghelper.setOnOpen(onDialogOpen),dialoghelper}),define("inputmanager",["inputManager"],returnFirstDependency),define("historyManager",["embyRouter"],returnFirstDependency),define("headroom-window",["headroom"],createWindowHeadroom),define("hammer-main",["hammer"],createMainContentHammer),define("appfooter-shared",["appfooter"],createSharedAppFooter),define("skinManager",[],function(){return{loadUserSkin:function(){Emby.Page.show("/home.html")}}}),define("connectionManager",[],function(){return ConnectionManager}),define("apiClientResolver",[],function(){return function(){return window.ApiClient}}),define("embyRouter",[embyWebComponentsBowerPath+"/router"],function(embyRouter){function showItem(item,serverId,options){if("string"==typeof item)require(["connectionManager"],function(connectionManager){var apiClient=connectionManager.currentApiClient();apiClient.getItem(apiClient.getCurrentUserId(),item).then(function(item){embyRouter.showItem(item,options)})});else{2==arguments.length&&(options=arguments[1]);var context=options?options.context:null;Emby.Page.show("/"+LibraryBrowser.getHref(item,context),{item:item})}}return embyRouter.showLocalLogin=function(apiClient,serverId,manualLogin){Dashboard.navigate("login.html?serverid="+serverId)},embyRouter.showVideoOsd=function(){return Dashboard.navigate("videoosd.html")},embyRouter.showSelectServer=function(){Dashboard.navigate("selectserver.html")},embyRouter.showWelcome=function(){Dashboard.isConnectMode()?Dashboard.navigate("connectlogin.html?mode=welcome"):Dashboard.navigate("login.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.showGuide=function(){Dashboard.navigate("livetv.html?tab=1"); +function getWindowLocationSearch(win){"use strict";var search=(win||window).location.search;if(!search){var index=window.location.href.indexOf("?");index!=-1&&(search=window.location.href.substring(index))}return search||""}function getParameterByName(name,url){"use strict";name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regexS="[\\?&]"+name+"=([^&#]*)",regex=new RegExp(regexS,"i"),results=regex.exec(url||getWindowLocationSearch());return null==results?"":decodeURIComponent(results[1].replace(/\+/g," "))}function pageClassOn(eventName,className,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.classList.contains(className)&&fn.call(target,e)})}function pageIdOn(eventName,id,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.id==id&&fn.call(target,e)})}var Dashboard={isConnectMode:function(){if(AppInfo.isNativeApp)return!0;var url=window.location.href.toLowerCase();return url.indexOf("mediabrowser.tv")!=-1||url.indexOf("emby.media")!=-1},isRunningInCordova:function(){return"cordova"==window.appMode},onRequestFail:function(e,data){if(401==data.status&&"ParentalControl"==data.errorCode){var currentView=ViewManager.currentView();currentView&&!currentView.classList.contains(".standalonePage")&&Dashboard.alert({message:Globalize.translate("MessageLoggedOutParentalControl"),callback:function(){Dashboard.logout(!1)}})}},getCurrentUser:function(){return window.ApiClient.getCurrentUser()},serverAddress:function(){if(Dashboard.isConnectMode()){var apiClient=window.ApiClient;return apiClient?apiClient.serverAddress():null}var urlLower=window.location.href.toLowerCase(),index=urlLower.lastIndexOf("/web");if(index!=-1)return urlLower.substring(0,index);var loc=window.location,address=loc.protocol+"//"+loc.hostname;return loc.port&&(address+=":"+loc.port),address},getCurrentUserId:function(){var apiClient=window.ApiClient;return apiClient?apiClient.getCurrentUserId():null},onServerChanged:function(userId,accessToken,apiClient){apiClient=apiClient||window.ApiClient,window.ApiClient=apiClient},logout:function(logoutWithServer){function onLogoutDone(){var loginPage;Dashboard.isConnectMode()?(loginPage="connectlogin.html",window.ApiClient=null):loginPage="login.html",Dashboard.navigate(loginPage)}logoutWithServer===!1?onLogoutDone():ConnectionManager.logout().then(onLogoutDone)},getConfigurationPageUrl:function(name){return"configurationpage?name="+encodeURIComponent(name)},navigate:function(url,preserveQueryString){if(!url)throw new Error("url cannot be null or empty");var queryString=getWindowLocationSearch();return preserveQueryString&&queryString&&(url+=queryString),Emby.Page.show(url)},showLoadingMsg:function(){Dashboard.loadingVisible=!0,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},hideLoadingMsg:function(){Dashboard.loadingVisible=!1,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},processPluginConfigurationUpdateResult:function(){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processServerConfigurationUpdateResult:function(result){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processErrorResponse:function(response){Dashboard.hideLoadingMsg();var status=""+response.status;response.statusText&&(status=response.statusText),Dashboard.alert({title:status,message:response.headers?response.headers.get("X-Application-Error-Code"):null})},alert:function(options){return"string"==typeof options?void require(["toast"],function(toast){toast({text:options})}):void require(["alert"],function(alert){alert({title:options.title||Globalize.translate("HeaderAlert"),text:options.message}).then(options.callback||function(){})})},restartServer:function(){var apiClient=window.ApiClient;apiClient&&(Dashboard.suppressAjaxErrors=!0,Dashboard.showLoadingMsg(),apiClient.restartServer().then(function(){setTimeout(function(){Dashboard.reloadPageWhenServerAvailable()},250)},function(){Dashboard.suppressAjaxErrors=!1}))},reloadPageWhenServerAvailable:function(retryCount){var apiClient=window.ApiClient;apiClient&&apiClient.getJSON(apiClient.getUrl("System/Info")).then(function(info){info.HasPendingRestart?Dashboard.retryReload(retryCount):window.location.reload(!0)},function(){Dashboard.retryReload(retryCount)})},retryReload:function(retryCount){setTimeout(function(){retryCount=retryCount||0,retryCount++,retryCount<10?Dashboard.reloadPageWhenServerAvailable(retryCount):Dashboard.suppressAjaxErrors=!1},500)},showUserFlyout:function(){Dashboard.navigate("mypreferencesmenu.html")},getPluginSecurityInfo:function(){var apiClient=window.ApiClient;if(!apiClient)return Promise.reject();var cachedInfo=Dashboard.pluginSecurityInfo;return cachedInfo?Promise.resolve(cachedInfo):apiClient.ajax({type:"GET",url:apiClient.getUrl("Plugins/SecurityInfo"),dataType:"json",error:function(){}}).then(function(result){return Dashboard.pluginSecurityInfo=result,result})},resetPluginSecurityInfo:function(){Dashboard.pluginSecurityInfo=null},ensureHeader:function(page){page.classList.contains("standalonePage")&&!page.classList.contains("noHeaderPage")&&Dashboard.renderHeader(page)},renderHeader:function(page){var header=page.querySelector(".header");if(!header){var headerHtml="";headerHtml+='",page.insertAdjacentHTML("afterbegin",headerHtml)}},getToolsLinkHtml:function(item){var menuHtml="",pageIds=item.pageIds?item.pageIds.join(","):"";return pageIds=pageIds?' data-pageids="'+pageIds+'"':"",menuHtml+='",menuHtml+='',menuHtml+=item.name,menuHtml+="",menuHtml+=""},getToolsMenuHtml:function(page){var i,length,item,items=Dashboard.getToolsMenuLinks(page),menuHtml="";for(menuHtml+='
',i=0,length=items.length;i
"),item.href?menuHtml+=Dashboard.getToolsLinkHtml(item):(menuHtml+='
',menuHtml+=item.name,menuHtml+="
");return menuHtml+="
"},getToolsMenuLinks:function(){return[{name:Globalize.translate("TabServer")},{name:Globalize.translate("TabDashboard"),href:"dashboard.html",pageIds:["dashboardPage"],icon:"dashboard"},{name:Globalize.translate("TabSettings"),href:"dashboardgeneral.html",pageIds:["dashboardGeneralPage"],icon:"settings"},{name:Globalize.translate("TabDevices"),href:"devices.html",pageIds:["devicesPage","devicePage","devicesUploadPage"],icon:"tablet"},{name:Globalize.translate("TabUsers"),href:"userprofiles.html",pageIds:["userProfilesPage","newUserPage","editUserPage","userLibraryAccessPage","userParentalControlPage","userPasswordPage"],icon:"people"},{name:"Emby Premiere",href:"supporterkey.html",pageIds:["supporterKeyPage"],icon:"star"},{divider:!0,name:Globalize.translate("TabLibrary"),href:"library.html",pageIds:["mediaLibraryPage","librarySettingsPage","libraryDisplayPage","metadataImagesConfigurationPage","metadataNfoPage"],icon:"folder",color:"#38c"},{name:Globalize.translate("TabSubtitles"),href:"metadatasubtitles.html",pageIds:["metadataSubtitlesPage"],icon:"closed_caption"},{name:Globalize.translate("TabPlayback"),icon:"play_circle_filled",color:"#E5342E",href:"cinemamodeconfiguration.html",pageIds:["cinemaModeConfigurationPage","playbackConfigurationPage","streamingSettingsPage"]},{name:Globalize.translate("TabSync"),icon:"sync",href:"syncactivity.html",pageIds:["syncActivityPage","syncJobPage","syncSettingsPage"],color:"#009688"},{name:Globalize.translate("TabTranscoding"),icon:"transform",href:"encodingsettings.html",pageIds:["encodingSettingsPage"]},{divider:!0,name:Globalize.translate("TabExtras")},{name:Globalize.translate("TabAutoOrganize"),color:"#01C0DD",href:"autoorganizelog.html",pageIds:["libraryFileOrganizerPage","libraryFileOrganizerSmartMatchPage","libraryFileOrganizerLogPage"],icon:"folder"},{name:Globalize.translate("DLNA"),href:"dlnasettings.html",pageIds:["dlnaSettingsPage","dlnaProfilesPage","dlnaProfilePage"],icon:"settings"},{name:Globalize.translate("TabLiveTV"),href:"livetvstatus.html",pageIds:["liveTvStatusPage","liveTvSettingsPage","liveTvTunerProviderHdHomerunPage","liveTvTunerProviderM3UPage","liveTvTunerProviderSatPage"],icon:"dvr"},{name:Globalize.translate("TabNotifications"),icon:"notifications",color:"brown",href:"notificationsettings.html",pageIds:["notificationSettingsPage","notificationSettingPage"]},{name:Globalize.translate("TabPlugins"),icon:"add_shopping_cart",color:"#9D22B1",href:"plugins.html",pageIds:["pluginsPage","pluginCatalogPage"]},{divider:!0,name:Globalize.translate("TabExpert")},{name:Globalize.translate("TabAdvanced"),icon:"settings",href:"dashboardhosting.html",color:"#F16834",pageIds:["dashboardHostingPage","serverSecurityPage"]},{name:Globalize.translate("TabLogs"),href:"log.html",pageIds:["logPage"],icon:"folder_open"},{name:Globalize.translate("TabScheduledTasks"),href:"scheduledtasks.html",pageIds:["scheduledTasksPage","scheduledTaskPage"],icon:"schedule"},{name:Globalize.translate("MetadataManager"),href:"edititemmetadata.html",pageIds:[],icon:"mode_edit"},{name:Globalize.translate("ButtonReports"),href:"reports.html",pageIds:[],icon:"insert_chart"}]},getSupportedRemoteCommands:function(){return["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"]},capabilities:function(){var caps={PlayableMediaTypes:["Audio","Video"],SupportedCommands:Dashboard.getSupportedRemoteCommands(),SupportsPersistentIdentifier:Dashboard.isRunningInCordova(),SupportsMediaControl:!0,SupportedLiveMediaTypes:["Audio","Video"]};return Dashboard.isRunningInCordova()&&!browserInfo.safari&&(caps.SupportsSync=!0,caps.SupportsContentUploading=!0),caps},normalizeImageOptions:function(options){AppInfo.hasLowImageBandwidth&&(options.enableImageEnhancers=!1);var setQuality;if(options.maxWidth&&(setQuality=!0),options.width&&(setQuality=!0),options.maxHeight&&(setQuality=!0),options.height&&(setQuality=!0),setQuality){var quality=90,isBackdrop="backdrop"==(options.type||"").toLowerCase();isBackdrop&&(quality-=10),browserInfo.slow&&(quality-=40),AppInfo.hasLowImageBandwidth&&!isBackdrop&&(quality-=10),options.quality=quality}}},AppInfo={};!function(){"use strict";function setAppInfo(){var isCordova=Dashboard.isRunningInCordova();AppInfo.enableHomeTabs=!0,AppInfo.enableAutoSave=browserInfo.touch,AppInfo.enableAppStorePolicy=isCordova;var isIOS=browserInfo.ipad||browserInfo.iphone,isAndroid=browserInfo.android;isIOS&&(AppInfo.hasLowImageBandwidth=!0),isCordova?(AppInfo.isNativeApp=!0,AppInfo.enableHomeTabs=!1,isAndroid&&(AppInfo.supportsExternalPlayers=!0)):AppInfo.enableSupporterMembership=!0,AppInfo.supportsFileInput=!(AppInfo.isNativeApp&&isAndroid),isCordova&&isIOS?AppInfo.moreIcon="more-horiz":AppInfo.moreIcon="more-vert",AppInfo.supportsUserDisplayLanguageSetting=Dashboard.isConnectMode()}function initializeApiClient(apiClient){AppInfo.enableAppStorePolicy&&(apiClient.getAvailablePlugins=function(){return Promise.resolve([])},apiClient.getInstalledPlugins=function(){return Promise.resolve([])}),apiClient.normalizeImageOptions=Dashboard.normalizeImageOptions,Events.off(apiClient,"requestfail",Dashboard.onRequestFail),Events.on(apiClient,"requestfail",Dashboard.onRequestFail)}function onApiClientCreated(e,newApiClient){initializeApiClient(newApiClient),window.$&&($.ajax=newApiClient.ajax)}function defineConnectionManager(connectionManager){window.ConnectionManager=connectionManager,define("connectionManager",[],function(){return connectionManager})}function bindConnectionManagerEvents(connectionManager,events,userSettings){window.Events=events,events.on(ConnectionManager,"apiclientcreated",onApiClientCreated),connectionManager.currentApiClient=function(){if(!localApiClient){var server=connectionManager.getLastUsedServer();server&&(localApiClient=connectionManager.getApiClient(server.Id))}return localApiClient},connectionManager.onLocalUserSignedIn=function(user){return localApiClient=connectionManager.getApiClient(user.ServerId),window.ApiClient=localApiClient,userSettings.setUserInfo(user.Id,localApiClient)},events.on(connectionManager,"localusersignedout",function(){userSettings.setUserInfo(null,null)})}function createConnectionManager(){return new Promise(function(resolve,reject){require(["connectionManagerFactory","apphost","credentialprovider","events","userSettings"],function(connectionManagerExports,apphost,credentialProvider,events,userSettings){window.MediaBrowser=Object.assign(window.MediaBrowser||{},connectionManagerExports);var credentialProviderInstance=new credentialProvider,promises=[apphost.getSyncProfile(),apphost.appInfo()];Promise.all(promises).then(function(responses){var deviceProfile=responses[0],appInfo=responses[1],capabilities=Dashboard.capabilities();capabilities.DeviceProfile=deviceProfile;var connectionManager=new MediaBrowser.ConnectionManager(credentialProviderInstance,appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,capabilities,window.devicePixelRatio);return defineConnectionManager(connectionManager),bindConnectionManagerEvents(connectionManager,events,userSettings),Dashboard.isConnectMode()?void resolve():(console.log("loading ApiClient singleton"),getRequirePromise(["apiclient"]).then(function(apiClientFactory){console.log("creating ApiClient singleton");var apiClient=new apiClientFactory(Dashboard.serverAddress(),appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,window.devicePixelRatio);apiClient.enableAutomaticNetworking=!1,connectionManager.addApiClient(apiClient),require(["css!"+apiClient.getUrl("Branding/Css")]),window.ApiClient=apiClient,localApiClient=apiClient,console.log("loaded ApiClient singleton"),resolve()}))})})})}function setDocumentClasses(browser){var elem=document.documentElement;AppInfo.enableSupporterMembership||elem.classList.add("supporterMembershipDisabled")}function loadTheme(){var name=getParameterByName("theme");if(name)return void require(["themes/"+name+"/theme"]);if(!AppInfo.isNativeApp){var date=new Date,month=date.getMonth(),day=date.getDate();return 9==month&&day>=30?void require(["themes/halloween/theme"]):void 0}}function returnFirstDependency(obj){return obj}function getBowerPath(){return"bower_components"}function getLayoutManager(layoutManager){return layoutManager.init(),layoutManager}function getAppStorage(basePath){try{return localStorage.setItem("_test","0"),localStorage.removeItem("_test"),basePath+"/appstorage-localstorage"}catch(e){return basePath+"/appstorage-memory"}}function createWindowHeadroom(){var headroom=new Headroom([],{tolerance:{down:0,up:0},classes:{}});return headroom.init(),headroom}function createMainContentHammer(Hammer){var hammer=new Hammer(document.querySelector(".skinBody"),null);return hammer}function createSharedAppFooter(appFooter){var footer=new appFooter({});return footer}function initRequire(){var urlArgs="v="+(window.dashboardVersion||(new Date).getDate()),bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents",paths={velocity:bowerPath+"/velocity/velocity.min",vibrant:bowerPath+"/vibrant/dist/vibrant",ironCardList:"components/ironcardlist/ironcardlist",scrollThreshold:"components/scrollthreshold",playlisteditor:"components/playlisteditor/playlisteditor",medialibrarycreator:"components/medialibrarycreator/medialibrarycreator",medialibraryeditor:"components/medialibraryeditor/medialibraryeditor",howler:bowerPath+"/howlerjs/howler.min",sortable:bowerPath+"/Sortable/Sortable.min",isMobile:bowerPath+"/isMobile/isMobile.min",headroom:bowerPath+"/headroomjs/dist/headroom",masonry:bowerPath+"/masonry/dist/masonry.pkgd.min",humanedate:"components/humanedate",libraryBrowser:"scripts/librarybrowser",chromecasthelpers:"components/chromecasthelpers",events:apiClientBowerPath+"/events",credentialprovider:apiClientBowerPath+"/credentials",apiclient:apiClientBowerPath+"/apiclient",connectionManagerFactory:bowerPath+"/emby-apiclient/connectionmanager",visibleinviewport:embyWebComponentsBowerPath+"/visibleinviewport",browserdeviceprofile:embyWebComponentsBowerPath+"/browserdeviceprofile",browser:embyWebComponentsBowerPath+"/browser",inputManager:embyWebComponentsBowerPath+"/inputmanager",qualityoptions:embyWebComponentsBowerPath+"/qualityoptions",hammer:bowerPath+"/hammerjs/hammer.min",pageJs:embyWebComponentsBowerPath+"/pagejs/page",focusManager:embyWebComponentsBowerPath+"/focusmanager",datetime:embyWebComponentsBowerPath+"/datetime",globalize:embyWebComponentsBowerPath+"/globalize",itemHelper:embyWebComponentsBowerPath+"/itemhelper",itemShortcuts:embyWebComponentsBowerPath+"/shortcuts",serverNotifications:embyWebComponentsBowerPath+"/servernotifications",playbackManager:embyWebComponentsBowerPath+"/playback/playbackmanager",autoPlayDetect:embyWebComponentsBowerPath+"/playback/autoplaydetect",nowPlayingHelper:embyWebComponentsBowerPath+"/playback/nowplayinghelper",pluginManager:embyWebComponentsBowerPath+"/pluginmanager",packageManager:embyWebComponentsBowerPath+"/packagemanager",webAnimations:bowerPath+"/web-animations-js/web-animations-next-lite.min"};paths.hlsjs=bowerPath+"/hlsjs/dist/hls.min",define("webActionSheet",[embyWebComponentsBowerPath+"/actionsheet/actionsheet"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.sharingMenu="cordova/sharingwidget":define("sharingMenu",[embyWebComponentsBowerPath+"/sharing/sharingmenu"],returnFirstDependency),paths.wakeonlan=apiClientBowerPath+"/wakeonlan",define("libjass",[bowerPath+"/libjass/libjass.min","css!"+bowerPath+"/libjass/libjass"],returnFirstDependency),window.IntersectionObserver?define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-intersectionobserver"],returnFirstDependency):define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-scroll"],returnFirstDependency),define("imageLoader",[embyWebComponentsBowerPath+"/images/imagehelper"],returnFirstDependency),define("appfooter",["components/appfooter/appfooter"],returnFirstDependency),define("dockedtabs",["components/dockedtabs/dockedtabs"],returnFirstDependency),define("directorybrowser",["components/directorybrowser/directorybrowser"],returnFirstDependency),define("metadataEditor",[embyWebComponentsBowerPath+"/metadataeditor/metadataeditor"],returnFirstDependency),define("personEditor",[embyWebComponentsBowerPath+"/metadataeditor/personeditor"],returnFirstDependency),define("playerSelectionMenu",[embyWebComponentsBowerPath+"/playback/playerselection"],returnFirstDependency),define("playerSettingsMenu",[embyWebComponentsBowerPath+"/playback/playersettingsmenu"],returnFirstDependency),define("libraryMenu",["scripts/librarymenu"],returnFirstDependency),define("emby-collapse",[embyWebComponentsBowerPath+"/emby-collapse/emby-collapse"],returnFirstDependency),define("emby-button",[embyWebComponentsBowerPath+"/emby-button/emby-button"],returnFirstDependency),define("emby-itemscontainer",[embyWebComponentsBowerPath+"/emby-itemscontainer/emby-itemscontainer"],returnFirstDependency),define("emby-tabs",[embyWebComponentsBowerPath+"/emby-tabs/emby-tabs"],returnFirstDependency),define("itemHoverMenu",[embyWebComponentsBowerPath+"/itemhovermenu/itemhovermenu"],returnFirstDependency),define("multiSelect",[embyWebComponentsBowerPath+"/multiselect/multiselect"],returnFirstDependency),define("alphaPicker",[embyWebComponentsBowerPath+"/alphapicker/alphapicker"],returnFirstDependency),define("paper-icon-button-light",[embyWebComponentsBowerPath+"/emby-button/paper-icon-button-light"]),define("connectHelper",[embyWebComponentsBowerPath+"/emby-connect/connecthelper"],returnFirstDependency),define("emby-input",[embyWebComponentsBowerPath+"/emby-input/emby-input"],returnFirstDependency),define("emby-select",[embyWebComponentsBowerPath+"/emby-select/emby-select"],returnFirstDependency),define("emby-slider",[embyWebComponentsBowerPath+"/emby-slider/emby-slider"],returnFirstDependency),define("emby-checkbox",[embyWebComponentsBowerPath+"/emby-checkbox/emby-checkbox"],returnFirstDependency),define("emby-toggle",[embyWebComponentsBowerPath+"/emby-toggle/emby-toggle"],returnFirstDependency),define("emby-radio",[embyWebComponentsBowerPath+"/emby-radio/emby-radio"],returnFirstDependency),define("emby-textarea",[embyWebComponentsBowerPath+"/emby-textarea/emby-textarea"],returnFirstDependency),define("collectionEditor",[embyWebComponentsBowerPath+"/collectioneditor/collectioneditor"],returnFirstDependency),define("playlistEditor",[embyWebComponentsBowerPath+"/playlisteditor/playlisteditor"],returnFirstDependency),define("recordingCreator",[embyWebComponentsBowerPath+"/recordingcreator/recordingcreator"],returnFirstDependency),define("recordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/recordingeditor"],returnFirstDependency),define("seriesRecordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/seriesrecordingeditor"],returnFirstDependency),define("recordingFields",[embyWebComponentsBowerPath+"/recordingcreator/recordingfields"],returnFirstDependency),define("recordingHelper",[embyWebComponentsBowerPath+"/recordingcreator/recordinghelper"],returnFirstDependency),define("subtitleEditor",[embyWebComponentsBowerPath+"/subtitleeditor/subtitleeditor"],returnFirstDependency),define("itemIdentifier",[embyWebComponentsBowerPath+"/itemidentifier/itemidentifier"],returnFirstDependency),define("mediaInfo",[embyWebComponentsBowerPath+"/mediainfo/mediainfo"],returnFirstDependency),define("itemContextMenu",[embyWebComponentsBowerPath+"/itemcontextmenu"],returnFirstDependency),define("imageEditor",[embyWebComponentsBowerPath+"/imageeditor/imageeditor"],returnFirstDependency),define("dom",[embyWebComponentsBowerPath+"/dom"],returnFirstDependency),define("fullscreen-doubleclick",[embyWebComponentsBowerPath+"/fullscreen/fullscreen-doubleclick"],returnFirstDependency),define("fullscreenManager",[embyWebComponentsBowerPath+"/fullscreen/fullscreenmanager","events"],returnFirstDependency),define("layoutManager",[embyWebComponentsBowerPath+"/layoutmanager"],getLayoutManager),define("playMenu",[embyWebComponentsBowerPath+"/playmenu"],returnFirstDependency),define("refreshDialog",[embyWebComponentsBowerPath+"/refreshdialog/refreshdialog"],returnFirstDependency),define("backdrop",[embyWebComponentsBowerPath+"/backdrop/backdrop"],returnFirstDependency),define("fetchHelper",[embyWebComponentsBowerPath+"/fetchhelper"],returnFirstDependency),define("roundCardStyle",["cardStyle","css!"+embyWebComponentsBowerPath+"/cardbuilder/roundcard"],returnFirstDependency),define("cardStyle",["css!"+embyWebComponentsBowerPath+"/cardbuilder/card"],returnFirstDependency),define("cardBuilder",[embyWebComponentsBowerPath+"/cardbuilder/cardbuilder"],returnFirstDependency),define("peoplecardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/peoplecardbuilder"],returnFirstDependency),define("chaptercardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/chaptercardbuilder"],returnFirstDependency),define("mouseManager",[embyWebComponentsBowerPath+"/input/mouse"],returnFirstDependency),define("deleteHelper",[embyWebComponentsBowerPath+"/deletehelper"],returnFirstDependency),define("tvguide",[embyWebComponentsBowerPath+"/guide/guide"],returnFirstDependency),define("programStyles",["css!"+embyWebComponentsBowerPath+"/guide/programs"],returnFirstDependency),define("guide-settings-dialog",[embyWebComponentsBowerPath+"/guide/guide-settings"],returnFirstDependency),define("syncDialog",[embyWebComponentsBowerPath+"/sync/sync"],returnFirstDependency),define("syncToggle",[embyWebComponentsBowerPath+"/sync/synctoggle"],returnFirstDependency),define("syncJobEditor",[embyWebComponentsBowerPath+"/sync/syncjobeditor"],returnFirstDependency),define("syncJobList",[embyWebComponentsBowerPath+"/sync/syncjoblist"],returnFirstDependency),define("voiceDialog",[embyWebComponentsBowerPath+"/voice/voicedialog"],returnFirstDependency),define("voiceReceiver",[embyWebComponentsBowerPath+"/voice/voicereceiver"],returnFirstDependency),define("voiceProcessor",[embyWebComponentsBowerPath+"/voice/voiceprocessor"],returnFirstDependency),define("viewManager",[embyWebComponentsBowerPath+"/viewmanager/viewmanager"],function(viewManager){return window.ViewManager=viewManager,viewManager.dispatchPageEvents(!0),viewManager}),Dashboard.isRunningInCordova()&&window.MainActivity?define("shell",["cordova/shell"],returnFirstDependency):define("shell",[embyWebComponentsBowerPath+"/shell"],returnFirstDependency),define("sharingmanager",[embyWebComponentsBowerPath+"/sharing/sharingmanager"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.apphost="cordova/apphost":paths.apphost="components/apphost",Dashboard.isRunningInCordova()&&window.MainActivity?(paths.appStorage="cordova/appstorage",paths.filesystem="cordova/filesystem"):(paths.appStorage=getAppStorage(apiClientBowerPath),paths.filesystem=embyWebComponentsBowerPath+"/filesystem");var sha1Path=bowerPath+"/cryptojslib/components/sha1-min",md5Path=bowerPath+"/cryptojslib/components/md5-min",shim={};shim[sha1Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},shim[md5Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},requirejs.config({waitSeconds:0,map:{"*":{css:bowerPath+"/emby-webcomponents/require/requirecss",html:bowerPath+"/emby-webcomponents/require/requirehtml",text:bowerPath+"/emby-webcomponents/require/requiretext"}},urlArgs:urlArgs,paths:paths,shim:shim}),define("cryptojs-sha1",[sha1Path]),define("cryptojs-md5",[md5Path]),define("jstree",[bowerPath+"/jstree/dist/jstree","css!thirdparty/jstree/themes/default/style.min.css"]),define("dashboardcss",["css!css/dashboard"]),define("jqmtable",["thirdparty/jquerymobile-1.4.5/jqm.table","css!thirdparty/jquerymobile-1.4.5/jqm.table.css"]),define("jqmwidget",["thirdparty/jquerymobile-1.4.5/jqm.widget"]),define("jqmslider",["thirdparty/jquerymobile-1.4.5/jqm.slider","css!thirdparty/jquerymobile-1.4.5/jqm.slider.css"]),define("jqmpopup",["thirdparty/jquerymobile-1.4.5/jqm.popup","css!thirdparty/jquerymobile-1.4.5/jqm.popup.css"]),define("jqmlistview",["css!thirdparty/jquerymobile-1.4.5/jqm.listview.css"]),define("jqmpanel",["thirdparty/jquerymobile-1.4.5/jqm.panel","css!thirdparty/jquerymobile-1.4.5/jqm.panel.css"]),define("slideshow",[embyWebComponentsBowerPath+"/slideshow/slideshow"],returnFirstDependency),define("fetch",[bowerPath+"/fetch/fetch"]),define("raf",[embyWebComponentsBowerPath+"/polyfills/raf"]),define("functionbind",[embyWebComponentsBowerPath+"/polyfills/bind"]),define("arraypolyfills",[embyWebComponentsBowerPath+"/polyfills/array"]),define("objectassign",[embyWebComponentsBowerPath+"/polyfills/objectassign"]),define("clearButtonStyle",["css!"+embyWebComponentsBowerPath+"/clearbutton"]),define("userdataButtons",[embyWebComponentsBowerPath+"/userdatabuttons/userdatabuttons"],returnFirstDependency),define("listView",[embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("listViewStyle",["css!"+embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("formDialogStyle",["css!"+embyWebComponentsBowerPath+"/formdialog"],returnFirstDependency),define("indicators",[embyWebComponentsBowerPath+"/indicators/indicators"],returnFirstDependency),define("registrationServices",[embyWebComponentsBowerPath+"/registrationservices/registrationservices"],returnFirstDependency),Dashboard.isRunningInCordova()?(define("iapManager",["cordova/iap"],returnFirstDependency),define("fileupload",["cordova/fileupload"],returnFirstDependency)):(define("iapManager",["components/iap"],returnFirstDependency),define("fileupload",[apiClientBowerPath+"/fileupload"],returnFirstDependency)),define("connectionmanager",[apiClientBowerPath+"/connectionmanager"]),define("cameraRoll",[apiClientBowerPath+"/cameraroll"],returnFirstDependency),define("contentuploader",[apiClientBowerPath+"/sync/contentuploader"]),define("serversync",[apiClientBowerPath+"/sync/serversync"]),define("multiserversync",[apiClientBowerPath+"/sync/multiserversync"]),define("offlineusersync",[apiClientBowerPath+"/sync/offlineusersync"]),define("mediasync",[apiClientBowerPath+"/sync/mediasync"]),define("swiper",[bowerPath+"/Swiper/dist/js/swiper.min","css!"+bowerPath+"/Swiper/dist/css/swiper.min"],returnFirstDependency),define("scroller",[embyWebComponentsBowerPath+"/scroller/smoothscroller"],returnFirstDependency),define("toast",[embyWebComponentsBowerPath+"/toast/toast"],returnFirstDependency),define("scrollHelper",[embyWebComponentsBowerPath+"/scrollhelper"],returnFirstDependency),define("appSettings",[embyWebComponentsBowerPath+"/appsettings"],updateAppSettings),define("userSettings",[embyWebComponentsBowerPath+"/usersettings/usersettings"],returnFirstDependency),define("userSettingsBuilder",[embyWebComponentsBowerPath+"/usersettings/usersettingsbuilder"],returnFirstDependency),define("material-icons",["css!"+embyWebComponentsBowerPath+"/fonts/material-icons/style"]),define("robotoFont",["css!"+embyWebComponentsBowerPath+"/fonts/roboto/style"]),define("scrollStyles",["css!"+embyWebComponentsBowerPath+"/scrollstyles"]),define("navdrawer",["components/navdrawer/navdrawer"],returnFirstDependency),define("viewcontainer",["components/viewcontainer-lite","css!"+embyWebComponentsBowerPath+"/viewmanager/viewcontainer-lite"],returnFirstDependency),define("queryString",[bowerPath+"/query-string/index"],function(){return queryString}),define("jQuery",[bowerPath+"/jquery/dist/jquery.slim.min"],function(){return window.ApiClient&&(jQuery.ajax=ApiClient.ajax),jQuery}),define("fnchecked",["legacy/fnchecked"]),define("dialogHelper",[embyWebComponentsBowerPath+"/dialoghelper/dialoghelper"],function(dialoghelper){return dialoghelper.setOnOpen(onDialogOpen),dialoghelper}),define("inputmanager",["inputManager"],returnFirstDependency),define("historyManager",["embyRouter"],returnFirstDependency),define("headroom-window",["headroom"],createWindowHeadroom),define("hammer-main",["hammer"],createMainContentHammer),define("appfooter-shared",["appfooter"],createSharedAppFooter),define("skinManager",[],function(){return{loadUserSkin:function(){Emby.Page.show("/home.html")}}}),define("connectionManager",[],function(){return ConnectionManager}),define("apiClientResolver",[],function(){return function(){return window.ApiClient}}),define("embyRouter",[embyWebComponentsBowerPath+"/router"],function(embyRouter){function showItem(item,serverId,options){if("string"==typeof item)require(["connectionManager"],function(connectionManager){var apiClient=connectionManager.currentApiClient();apiClient.getItem(apiClient.getCurrentUserId(),item).then(function(item){embyRouter.showItem(item,options)})});else{2==arguments.length&&(options=arguments[1]);var context=options?options.context:null;Emby.Page.show("/"+LibraryBrowser.getHref(item,context),{item:item})}}return embyRouter.showLocalLogin=function(apiClient,serverId,manualLogin){Dashboard.navigate("login.html?serverid="+serverId)},embyRouter.showVideoOsd=function(){return Dashboard.navigate("videoosd.html")},embyRouter.showSelectServer=function(){Dashboard.navigate("selectserver.html")},embyRouter.showWelcome=function(){Dashboard.isConnectMode()?Dashboard.navigate("connectlogin.html?mode=welcome"):Dashboard.navigate("login.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.showGuide=function(){Dashboard.navigate("livetv.html?tab=1"); },embyRouter.goHome=function(){Dashboard.navigate("home.html")},embyRouter.showSearch=function(){Dashboard.navigate("search.html")},embyRouter.showLiveTV=function(){Dashboard.navigate("livetv.html")},embyRouter.showRecordedTV=function(){Dashboard.navigate("livetv.html?tab=3")},embyRouter.showFavorites=function(){Dashboard.navigate("favorites.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.setTitle=function(){},embyRouter.showItem=showItem,embyRouter})}function updateAppSettings(appSettings){return appSettings.enableExternalPlayers=function(val){return null!=val&&appSettings.set("externalplayers",val.toString()),"true"===appSettings.get("externalplayers")},appSettings}function onDialogOpen(dlg){dlg.classList.contains("background-theme-a")||dlg.classList.contains("actionSheet")||(dlg.classList.add("background-theme-b"),dlg.classList.add("ui-body-b"))}function initRequireWithBrowser(browser){var bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents";Dashboard.isRunningInCordova()&&browser.safari?define("actionsheet",["cordova/actionsheet"],returnFirstDependency):define("actionsheet",["webActionSheet"],returnFirstDependency),"registerElement"in document?define("registerElement",[]):browser.msie?define("registerElement",[bowerPath+"/webcomponentsjs/webcomponents-lite.min.js"]):define("registerElement",[bowerPath+"/document-register-element/build/document-register-element"]),window.chrome&&window.chrome.sockets?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.android?define("serverdiscovery",["cordova/serverdiscovery"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.safari?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.safari?define("imageFetcher",["cordova/imagestore"],returnFirstDependency):define("imageFetcher",[embyWebComponentsBowerPath+"/images/basicimagefetcher"],returnFirstDependency);var preferNativeAlerts=browser.tv;preferNativeAlerts&&window.alert?define("alert",[embyWebComponentsBowerPath+"/alert/nativealert"],returnFirstDependency):define("alert",[embyWebComponentsBowerPath+"/alert/alert"],returnFirstDependency),define("dialog",[embyWebComponentsBowerPath+"/dialog/dialog"],returnFirstDependency),preferNativeAlerts&&window.confirm?define("confirm",[embyWebComponentsBowerPath+"/confirm/nativeconfirm"],returnFirstDependency):define("confirm",[embyWebComponentsBowerPath+"/confirm/confirm"],returnFirstDependency);var preferNativePrompt=preferNativeAlerts||browser.xboxOne;preferNativePrompt&&window.confirm?define("prompt",[embyWebComponentsBowerPath+"/prompt/nativeprompt"],returnFirstDependency):define("prompt",[embyWebComponentsBowerPath+"/prompt/prompt"],returnFirstDependency),browser.tizen||browser.operaTv?define("loading",[embyWebComponentsBowerPath+"/loading/loading-legacy"],returnFirstDependency):define("loading",[embyWebComponentsBowerPath+"/loading/loading-lite"],returnFirstDependency),define("multi-download",[embyWebComponentsBowerPath+"/multidownload"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("fileDownloader",["cordova/filedownloader"],returnFirstDependency),define("localassetmanager",["cordova/localassetmanager"],returnFirstDependency)):(define("fileDownloader",[embyWebComponentsBowerPath+"/filedownloader"],returnFirstDependency),define("localassetmanager",[apiClientBowerPath+"/localassetmanager"],returnFirstDependency)),define("screenLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",["cordova/wakelock"],returnFirstDependency),define("networkLock",["cordova/networklock"],returnFirstDependency)):(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),define("networkLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency))}function init(){Dashboard.isRunningInCordova()&&browserInfo.android&&define("nativedirectorychooser",["cordova/nativedirectorychooser"]),Dashboard.isRunningInCordova()&&browserInfo.android?define("localsync",["cordova/localsync"],returnFirstDependency):define("localsync",["scripts/localsync"],returnFirstDependency),define("livetvcss",["css!css/livetv.css"]),define("detailtablecss",["css!css/detailtable.css"]),define("autoorganizetablecss",["css!css/autoorganizetable.css"]),define("buttonenabled",["legacy/buttonenabled"]),initAfterDependencies()}function getRequirePromise(deps){return new Promise(function(resolve,reject){require(deps,resolve)})}function initAfterDependencies(){var list=[];window.fetch||list.push("fetch"),"function"!=typeof Object.assign&&list.push("objectassign"),Array.prototype.filter||list.push("arraypolyfills"),Function.prototype.bind||list.push("functionbind"),window.requestAnimationFrame||list.push("raf"),require(list,function(){createConnectionManager().then(function(){console.log("initAfterDependencies promises resolved"),require(["globalize"],function(globalize){window.Globalize=globalize,Promise.all([loadCoreDictionary(globalize),loadSharedComponentsDictionary(globalize)]).then(onGlobalizeInit)})})})}function loadSharedComponentsDictionary(globalize){var baseUrl="bower_components/emby-webcomponents/strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sk","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});globalize.loadStrings({name:"sharedcomponents",translations:translations})}function loadCoreDictionary(globalize){var baseUrl="strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});return globalize.defaultModule("core"),globalize.loadStrings({name:"core",translations:translations})}function onGlobalizeInit(){document.title=Globalize.translateDocument(document.title,"core"),require(["apphost"],function(appHost){loadPlugins([],appHost,browserInfo).then(onAppReady)})}function defineRoute(newRoute,dictionary){var baseRoute=Emby.Page.baseUrl(),path=newRoute.path;path=path.replace(baseRoute,""),console.log("Defining route: "+path),newRoute.dictionary=newRoute.dictionary||dictionary||"core",Emby.Page.addRoute(path,newRoute)}function defineCoreRoutes(){console.log("Defining core routes"),defineRoute({path:"/addplugin.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"scripts/addpluginpage"}),defineRoute({path:"/appservices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizelog.html",dependencies:["scripts/taskbutton","autoorganizetablecss"],controller:"dashboard/autoorganizelog",roles:"admin"}),defineRoute({path:"/autoorganizesmart.html",dependencies:["emby-button"],controller:"dashboard/autoorganizesmart",autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizetv.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-select","emby-collapse"],controller:"dashboard/autoorganizetv",autoFocus:!1,roles:"admin"}),defineRoute({path:"/channelitems.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/channels.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/channels"}),defineRoute({path:"/channelsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/cinemamodeconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/connectlogin.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/connectlogin"}),defineRoute({path:"/dashboard.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardgeneral.html",controller:"dashboard/dashboardgeneral",autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardhosting.html",dependencies:["emby-input","emby-button"],autoFocus:!1,roles:"admin",controller:"dashboard/dashboardhosting"}),defineRoute({path:"/device.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devicesupload.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofile.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaserversettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnasettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/edititemmetadata.html",dependencies:[],controller:"scripts/edititemmetadata",autoFocus:!1}),defineRoute({path:"/encodingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/favorites.html",dependencies:[],autoFocus:!1,controller:"scripts/favorites"}),defineRoute({path:"/forgotpassword.html",dependencies:["emby-input","emby-button"],anonymous:!0,startup:!0,controller:"scripts/forgotpassword"}),defineRoute({path:"/forgotpasswordpin.html",dependencies:["emby-input","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/forgotpasswordpin"}),defineRoute({path:"/gamegenres.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/games.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesrecommended.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamestudios.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesystems.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/home.html",dependencies:[],autoFocus:!1,controller:"scripts/indexpage",transition:"fade",type:"home"}),defineRoute({path:"/index.html",dependencies:[],autoFocus:!1,isDefaultRoute:!0}),defineRoute({path:"/itemdetails.html",dependencies:["emby-button","scripts/livetvcomponents","paper-icon-button-light","emby-itemscontainer"],controller:"scripts/itemdetailpage",autoFocus:!1,transition:"fade"}),defineRoute({path:"/itemlist.html",dependencies:[],autoFocus:!1,controller:"scripts/itemlistpage",transition:"fade"}),defineRoute({path:"/kids.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/library.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/librarydisplay.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"dashboard/librarydisplay"}),defineRoute({path:"/librarysettings.html",dependencies:["emby-collapse","emby-input","emby-button","emby-select"],autoFocus:!1,roles:"admin",controller:"dashboard/librarysettings"}),defineRoute({path:"/livetv.html",dependencies:["emby-button","livetvcss"],controller:"scripts/livetvsuggested",autoFocus:!1,transition:"fade"}),defineRoute({path:"/livetvguideprovider.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvitems.html",dependencies:[],autoFocus:!1,controller:"scripts/livetvitems"}),defineRoute({path:"/livetvseriestimer.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-collapse","scripts/livetvcomponents","scripts/livetvseriestimer","livetvcss"],autoFocus:!1,controller:"scripts/livetvseriestimer"}),defineRoute({path:"/livetvsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/livetvstatus.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-hdhomerun.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-m3u.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-satip.html",dependencies:["emby-input"],autoFocus:!1,roles:"admin",controller:"dashboard/livetvtunerprovider-satip"}),defineRoute({path:"/log.html",dependencies:["emby-checkbox"],roles:"admin",controller:"dashboard/logpage"}),defineRoute({path:"/login.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/loginpage"}),defineRoute({path:"/metadataadvanced.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadataimages.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatanfo.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatasubtitles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/movies.html",dependencies:["emby-button"],autoFocus:!1,controller:"scripts/moviesrecommended",transition:"fade"}),defineRoute({path:"/music.html",dependencies:[],controller:"scripts/musicrecommended",autoFocus:!1,transition:"fade"}),defineRoute({path:"/mypreferencesdisplay.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencesdisplay"}),defineRoute({path:"/mypreferenceshome.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceshome"}),defineRoute({path:"/mypreferenceslanguages.html",dependencies:["emby-button","emby-checkbox","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceslanguages"}),defineRoute({path:"/mypreferencesmenu.html",dependencies:["emby-button"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencescommon"}),defineRoute({path:"/myprofile.html",dependencies:["emby-button","emby-collapse","emby-checkbox","emby-input"],autoFocus:!1,transition:"fade",controller:"scripts/myprofile"}),defineRoute({path:"/mysync.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/mysync"}),defineRoute({path:"/camerauploadsettings.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/camerauploadsettings"}),defineRoute({path:"/mysyncjob.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/syncjob"}),defineRoute({path:"/mysyncsettings.html",dependencies:["emby-checkbox","emby-input","emby-button","paper-icon-button-light"],autoFocus:!1,transition:"fade",controller:"scripts/mysyncsettings"}),defineRoute({path:"/notificationlist.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/notificationsetting.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/notificationsettings.html",controller:"scripts/notificationsettings",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/nowplaying.html",dependencies:["paper-icon-button-light","emby-slider","emby-button","emby-input","emby-itemscontainer"],controller:"scripts/nowplayingpage",autoFocus:!1,transition:"fade",fullscreen:!0,supportsThemeMedia:!0}),defineRoute({path:"/photos.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/playbackconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/playlists.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/playlists"}),defineRoute({path:"/plugincatalog.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/plugins.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/reports.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/scheduledtask.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/scheduledtasks.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/search.html",dependencies:[],controller:"scripts/searchpage"}),defineRoute({path:"/secondaryitems.html",dependencies:[],autoFocus:!1,controller:"scripts/secondaryitems"}),defineRoute({path:"/selectserver.html",dependencies:["listViewStyle","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/selectserver"}),defineRoute({path:"/serversecurity.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/shared.html",dependencies:[],autoFocus:!1,anonymous:!0}),defineRoute({path:"/streamingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/support.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/supporterkey.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/syncactivity.html",dependencies:[],autoFocus:!1,controller:"scripts/syncactivity"}),defineRoute({path:"/syncsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/tv.html",dependencies:["paper-icon-button-light","emby-button"],autoFocus:!1,controller:"scripts/tvrecommended",transition:"fade"}),defineRoute({path:"/useredit.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userlibraryaccess.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/usernew.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userparentalcontrol.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userpassword.html",dependencies:["emby-input","emby-button","emby-checkbox"],autoFocus:!1,controller:"scripts/userpasswordpage"}),defineRoute({path:"/userprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/wizardagreement.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardcomponents.html",dependencies:["dashboardcss","emby-button","emby-input","emby-select"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardcomponents"}),defineRoute({path:"/wizardfinish.html",dependencies:["emby-button","dashboardcss"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardfinishpage"}),defineRoute({path:"/wizardlibrary.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvguide.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvtuner.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardsettings.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardstart.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizarduser.html",dependencies:["dashboardcss","emby-input"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/videoosd.html",dependencies:[],transition:"fade",controller:"scripts/videoosd",autoFocus:!1,type:"video-osd",supportsThemeMedia:!0,fullscreen:!0}),defineRoute({path:"/configurationpage",dependencies:["jQuery"],autoFocus:!1,enableCache:!1,enableContentQueryString:!0,roles:"admin"}),defineRoute({path:"/",isDefaultRoute:!0,autoFocus:!1,dependencies:[]})}function loadPlugins(externalPlugins,appHost,browser,shell){console.log("Loading installed plugins");var list=["bower_components/emby-webcomponents/playback/playbackvalidation"];Dashboard.isRunningInCordova()&&browser.android?(document.createElement("audio").canPlayType("audio/flac").replace(/no/,"")&&document.createElement("audio").canPlayType('audio/ogg; codecs="opus"').replace(/no/,"")||(window.VlcAudio=!0),list.push("cordova/vlcplayer")):Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/audioplayer"),list.push("bower_components/emby-webcomponents/htmlaudioplayer/plugin"),Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/chromecast"),Dashboard.isRunningInCordova()&&browser.android&&list.push("cordova/externalplayer"),list.push("bower_components/emby-webcomponents/htmlvideoplayer/plugin"),appHost.supports("remotecontrol")&&(list.push("bower_components/emby-webcomponents/sessionplayer"),browser.chrome&&list.push("bower_components/emby-webcomponents/chromecastplayer")),list.push("bower_components/emby-webcomponents/youtubeplayer/plugin");for(var i=0,length=externalPlugins.length;i Date: Thu, 2 Feb 2017 11:06:46 -0500 Subject: [PATCH 15/19] add ios fullscreen hack --- .../bower_components/emby-webcomponents/alphapicker/style.css | 2 +- .../emby-webcomponents/fullscreen/fullscreenmanager.js | 2 +- .../registrationservices/registrationservices.js | 2 +- dashboard-ui/components/apphost.js | 2 +- dashboard-ui/scripts/itemdetailpage.js | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/alphapicker/style.css b/dashboard-ui/bower_components/emby-webcomponents/alphapicker/style.css index 9a94bc5516..07aee4540e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/alphapicker/style.css +++ b/dashboard-ui/bower_components/emby-webcomponents/alphapicker/style.css @@ -1 +1 @@ -.alphaPicker,.alphaPickerRow{-webkit-box-direction:normal}.alphaPicker{text-align:center;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;flex-direction:column}.alphaPickerRow{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-orient:horizontal;-webkit-flex-direction:row;flex-direction:row}.alphaPicker-vertical .alphaPickerRow{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}.alphaPickerButton{background:0 0;border:0!important;cursor:pointer;outline:0!important;color:inherit;vertical-align:middle;font-family:inherit;font-size:inherit;min-width:initial;margin:0;padding:.1em .4em;width:auto;-webkit-border-radius:.1em;border-radius:.1em;font-weight:400;opacity:.6}.alphaPicker-vertical .alphaPickerButton{padding:.2em .4em}.alphaPickerButtonIcon{width:3.3vh;height:3.3vh;font-size:3.3vh}.alphaPickerButton-selected{color:#000;background-color:#bbb;opacity:1}.layout-tv .alphaPickerButton:focus{background-color:#52B54B;opacity:1;color:#fff} \ No newline at end of file +.alphaPicker,.alphaPickerRow{-webkit-box-direction:normal}.alphaPicker{text-align:center;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;flex-direction:column}.alphaPickerRow{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-orient:horizontal;-webkit-flex-direction:row;flex-direction:row}.alphaPicker-vertical .alphaPickerRow{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}.alphaPickerButton{background:0 0;border:0!important;cursor:pointer;outline:0!important;color:inherit;vertical-align:middle;font-family:inherit;font-size:inherit;min-width:initial;margin:0;padding:.1em .4em;width:auto;-webkit-border-radius:.1em;border-radius:.1em;font-weight:400;opacity:.6;-webkit-flex-shrink:0;flex-shrink:0;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}.alphaPicker-vertical .alphaPickerButton{padding:.2em .4em}.alphaPickerButtonIcon{width:3.3vh;height:3.3vh;font-size:3.3vh}.alphaPickerButton-selected{color:#000;background-color:#bbb;opacity:1}.layout-tv .alphaPickerButton:focus{background-color:#52B54B;opacity:1;color:#fff} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreenmanager.js b/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreenmanager.js index cce49b06c5..78ab06d37a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreenmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreenmanager.js @@ -1 +1 @@ -define(["events","dom"],function(events,dom){"use strict";function fullscreenManager(){}function onFullScreenChange(){events.trigger(manager,"fullscreenchange")}fullscreenManager.prototype.requestFullscreen=function(element){element=element||document.documentElement,element.requestFullscreen?element.requestFullscreen():element.mozRequestFullScreen?element.mozRequestFullScreen():element.webkitRequestFullscreen?element.webkitRequestFullscreen():element.msRequestFullscreen&&element.msRequestFullscreen()},fullscreenManager.prototype.exitFullscreen=function(){document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.webkitCancelFullscreen?document.webkitCancelFullscreen():document.msExitFullscreen&&document.msExitFullscreen()},fullscreenManager.prototype.isFullScreen=function(){return!!(document.fullscreen||document.mozFullScreen||document.webkitIsFullScreen||document.msFullscreenElement)};var manager=new fullscreenManager;return dom.addEventListener(document,"fullscreenchange",onFullScreenChange,{passive:!0}),dom.addEventListener(document,"webkitfullscreenchange",onFullScreenChange,{passive:!0}),dom.addEventListener(document,"mozfullscreenchange",onFullScreenChange,{passive:!0}),manager}); \ No newline at end of file +define(["events","dom"],function(events,dom){"use strict";function fullscreenManager(){}function onFullScreenChange(){events.trigger(manager,"fullscreenchange")}fullscreenManager.prototype.requestFullscreen=function(element){return element=element||document.documentElement,element.requestFullscreen?void element.requestFullscreen():element.mozRequestFullScreen?void element.mozRequestFullScreen():element.webkitRequestFullscreen?void element.webkitRequestFullscreen():element.msRequestFullscreen?void element.msRequestFullscreen():("VIDEO"!==element.tagName&&(element=document.querySelector("video")||element),void(element.webkitEnterFullscreen&&element.webkitEnterFullscreen()))},fullscreenManager.prototype.exitFullscreen=function(){document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.webkitCancelFullscreen?document.webkitCancelFullscreen():document.msExitFullscreen&&document.msExitFullscreen()},fullscreenManager.prototype.isFullScreen=function(){return!!(document.fullscreen||document.mozFullScreen||document.webkitIsFullScreen||document.msFullscreenElement)};var manager=new fullscreenManager;return dom.addEventListener(document,"fullscreenchange",onFullScreenChange,{passive:!0}),dom.addEventListener(document,"webkitfullscreenchange",onFullScreenChange,{passive:!0}),dom.addEventListener(document,"mozfullscreenchange",onFullScreenChange,{passive:!0}),manager}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/registrationservices/registrationservices.js b/dashboard-ui/bower_components/emby-webcomponents/registrationservices/registrationservices.js index 21669b65fe..af5920a419 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/registrationservices/registrationservices.js +++ b/dashboard-ui/bower_components/emby-webcomponents/registrationservices/registrationservices.js @@ -1 +1 @@ -define(["appSettings","loading","apphost","iapManager","events","shell","globalize","dialogHelper","connectionManager","layoutManager","emby-button"],function(appSettings,loading,appHost,iapManager,events,shell,globalize,dialogHelper,connectionManager,layoutManager){"use strict";function alertText(options){return new Promise(function(resolve,reject){require(["alert"],function(alert){alert(options).then(resolve,reject)})})}function showInAppPurchaseInfo(subscriptionOptions,unlockableProductInfo,dialogOptions){return new Promise(function(resolve,reject){require(["listViewStyle","formDialogStyle"],function(){showInAppPurchaseElement(subscriptionOptions,unlockableProductInfo,dialogOptions,resolve,reject),currentDisplayingResolve=resolve})})}function showPeriodicMessage(feature,settingsKey){return new Promise(function(resolve,reject){require(["listViewStyle","emby-button","formDialogStyle"],function(){var dlg=dialogHelper.createDialog({size:layoutManager.tv?"fullscreen":"fullscreen-border",removeOnClose:!0,scrollY:!1});dlg.classList.add("formDialog");var html="";html+='
',html+='',html+='

Emby Premiere',html+="

",html+="
",html+='
',html+='
',html+="

"+globalize.translate("sharedcomponents#HeaderDiscoverEmbyPremiere")+"

",html+="

"+globalize.translate("sharedcomponents#MessageDidYouKnowCinemaMode")+"

",html+="

"+globalize.translate("sharedcomponents#MessageDidYouKnowCinemaMode2")+"

",html+='

'+globalize.translate("sharedcomponents#HeaderBenefitsEmbyPremiere")+"

",html+='
',html+=getSubscriptionBenefits().map(getSubscriptionBenefitHtml).join(""),html+="
",html+="
",html+='
',html+='";var seconds=16;html+='
'+globalize.translate("sharedcomponents#ContinueInSecondsValue",seconds)+"
",html+='",html+="
",html+="
",html+="
",dlg.innerHTML=html;var i,length,isRejected=!0,timeTextInterval=setInterval(function(){seconds-=1,seconds<=0?(dlg.querySelector(".continueTimeText").classList.add("hide"),dlg.querySelector(".btnContinue").classList.remove("hide")):dlg.querySelector(".continueTimeText").innerHTML=globalize.translate("sharedcomponents#ContinueInSecondsValue",seconds)},1e3),btnPurchases=dlg.querySelectorAll(".buttonPremiereInfo");for(i=0,length=btnPurchases.length;iintervalMs?connectionManager.currentApiClient().getPluginSecurityInfo().then(function(regInfo){return regInfo.IsMBSupporter?(appSettings.set(settingsKey,(new Date).getTime()),Promise.resolve()):showPeriodicMessage(feature,settingsKey)},function(){return showPeriodicMessage(feature,settingsKey)}):Promise.resolve():(appSettings.set(settingsKey,(new Date).getTime()-intervalMs/2),Promise.resolve())}function validateFeature(feature,options){return options=options||{},console.log("validateFeature: "+feature),iapManager.isUnlockedByDefault(feature,options).then(function(){return showPeriodicMessageIfNeeded(feature)},function(){var unlockableFeatureCacheKey="featurepurchased-"+feature;if("1"===appSettings.get(unlockableFeatureCacheKey))return showPeriodicMessageIfNeeded(feature);var unlockableProduct=iapManager.getProductInfo(feature);if(unlockableProduct){var unlockableCacheKey="productpurchased-"+unlockableProduct.id;if(unlockableProduct.owned)return appSettings.set(unlockableFeatureCacheKey,"1"),appSettings.set(unlockableCacheKey,"1"),showPeriodicMessageIfNeeded(feature);if("1"===appSettings.get(unlockableCacheKey))return showPeriodicMessageIfNeeded(feature)}var unlockableProductInfo=unlockableProduct?{enableAppUnlock:!0,id:unlockableProduct.id,price:unlockableProduct.price,feature:feature}:null;return iapManager.getSubscriptionOptions().then(function(subscriptionOptions){return subscriptionOptions.filter(function(p){return p.owned}).length>0?Promise.resolve():connectionManager.getRegistrationInfo(iapManager.getAdminFeatureName(feature),connectionManager.currentApiClient()).catch(function(){var dialogOptions={title:globalize.translate("sharedcomponents#HeaderUnlockFeature"),feature:feature};return options.showDialog===!1?Promise.reject():showInAppPurchaseInfo(subscriptionOptions,unlockableProductInfo,dialogOptions)})})})}function cancelInAppPurchase(){var elem=document.querySelector(".inAppPurchaseOverlay");elem&&dialogHelper.close(elem)}function clearCurrentDisplayingInfo(){currentDisplayingProductInfos=[],currentDisplayingResolve=null}function showExternalPremiereInfo(){shell.openUrl("https://emby.media/premiere")}function centerFocus(elem,horiz,on){require(["scrollHelper"],function(scrollHelper){var fn=on?"on":"off";scrollHelper.centerFocus[fn](elem,horiz)})}function showInAppPurchaseElement(subscriptionOptions,unlockableProductInfo,dialogOptions,resolve,reject){function onCloseButtonClick(){rejected=!0,dialogHelper.close(dlg)}cancelInAppPurchase(),currentDisplayingProductInfos=subscriptionOptions.slice(0),unlockableProductInfo&¤tDisplayingProductInfos.push(unlockableProductInfo);var dlg=dialogHelper.createDialog({size:layoutManager.tv?"fullscreen":"fullscreen-border",removeOnClose:!0,scrollY:!1});dlg.classList.add("formDialog");var html="";html+='
',html+='',html+='

',html+=dialogOptions.title||"",html+="

",html+="
",html+='
',html+='
',html+='
',html+='

',html+=unlockableProductInfo?globalize.translate("sharedcomponents#MessageUnlockAppWithPurchaseOrSupporter"):globalize.translate("sharedcomponents#MessageUnlockAppWithSupporter"),html+="

",html+='

',html+=globalize.translate("sharedcomponents#MessageToValidateSupporter"),html+="

";var i,length,hasProduct=!1;for(i=0,length=subscriptionOptions.length;i",html+='",html+="

";if(unlockableProductInfo){hasProduct=!0;var unlockText=globalize.translate("sharedcomponents#ButtonUnlockWithPurchase");unlockableProductInfo.price&&(unlockText=globalize.translate("sharedcomponents#ButtonUnlockPrice",unlockableProductInfo.price)),html+="

",html+='",html+="

"}html+="

",html+='",html+="

",subscriptionOptions.length&&(html+='

'+globalize.translate("sharedcomponents#HeaderBenefitsEmbyPremiere")+"

",html+='
',html+=getSubscriptionBenefits().map(getSubscriptionBenefitHtml).join(""),html+="
"),"playback"===dialogOptions.feature&&(html+="

",html+='",html+="

"),html+="",html+="
",html+="
",dlg.innerHTML=html,document.body.appendChild(dlg);var btnPurchases=dlg.querySelectorAll(".btnPurchase");for(i=0,length=btnPurchases.length;i'):html+='
',html+=''+item.icon+"",html+='
',html+='

',html+=item.name,html+="

",html+='
',html+=item.text,html+="
",html+="
",html+=enableLink?"":"
"}function onPurchaseButtonClick(){var featureId=this.getAttribute("data-featureid");"true"===this.getAttribute("data-email")?getUserEmail().then(function(email){iapManager.beginPurchase(featureId,email)}):iapManager.beginPurchase(featureId)}function restorePurchase(unlockableProductInfo){var dlg=dialogHelper.createDialog({size:layoutManager.tv?"fullscreen":"fullscreen-border",removeOnClose:!0,scrollY:!1});dlg.classList.add("formDialog");var html="";html+='
',html+='',html+='

',html+=iapManager.getRestoreButtonText(),html+="

",html+="
",html+='
',html+='
',html+='

',html+=globalize.translate("sharedcomponents#HowDidYouPay"),html+="

",html+="

",html+='",html+="

",unlockableProductInfo&&(html+="

",html+='",html+="

"),html+="
",html+="
",dlg.innerHTML=html,document.body.appendChild(dlg),loading.hide(),layoutManager.tv&¢erFocus(dlg.querySelector(".formDialogContent"),!1,!0),dlg.querySelector(".btnCloseDialog").addEventListener("click",function(){dialogHelper.close(dlg)}),dlg.querySelector(".btnRestoreSub").addEventListener("click",function(){dialogHelper.close(dlg),alertText({text:globalize.translate("sharedcomponents#MessageToValidateSupporter"),title:"Emby Premiere"})});var btnRestoreUnlock=dlg.querySelector(".btnRestoreUnlock");btnRestoreUnlock&&btnRestoreUnlock.addEventListener("click",function(){dialogHelper.close(dlg),iapManager.restorePurchase()}),dialogHelper.open(dlg).then(function(){layoutManager.tv&¢erFocus(dlg.querySelector(".formDialogContent"),!1,!1)})}function getUserEmail(){if(connectionManager.isLoggedIntoConnect()){var connectUser=connectionManager.connectUser();if(connectUser&&connectUser.Email)return Promise.resolve(connectUser.Email)}return new Promise(function(resolve,reject){require(["prompt"],function(prompt){prompt({label:globalize.translate("sharedcomponents#LabelEmailAddress")}).then(resolve,reject)})})}function onProductUpdated(e,product){if(product.owned){var resolve=currentDisplayingResolve;resolve&¤tDisplayingProductInfos.filter(function(p){return product.id===p.id}).length&&(cancelInAppPurchase(),resolve())}}function showPremiereInfo(){return appHost.supports("externalpremium")?(showExternalPremiereInfo(),Promise.resolve()):iapManager.getSubscriptionOptions().then(function(subscriptionOptions){var dialogOptions={title:"Emby Premiere",feature:"sync"};return showInAppPurchaseInfo(subscriptionOptions,null,dialogOptions)})}var currentDisplayingProductInfos=[],currentDisplayingResolve=null;return events.on(iapManager,"productupdated",onProductUpdated),{validateFeature:validateFeature,showPremiereInfo:showPremiereInfo}}); \ No newline at end of file +define(["appSettings","loading","apphost","iapManager","events","shell","globalize","dialogHelper","connectionManager","layoutManager","emby-button"],function(appSettings,loading,appHost,iapManager,events,shell,globalize,dialogHelper,connectionManager,layoutManager){"use strict";function alertText(options){return new Promise(function(resolve,reject){require(["alert"],function(alert){alert(options).then(resolve,reject)})})}function showInAppPurchaseInfo(subscriptionOptions,unlockableProductInfo,dialogOptions){return new Promise(function(resolve,reject){require(["listViewStyle","formDialogStyle"],function(){showInAppPurchaseElement(subscriptionOptions,unlockableProductInfo,dialogOptions,resolve,reject),currentDisplayingResolve=resolve})})}function showPeriodicMessage(feature,settingsKey){return new Promise(function(resolve,reject){require(["listViewStyle","emby-button","formDialogStyle"],function(){var dlg=dialogHelper.createDialog({size:layoutManager.tv?"fullscreen":"fullscreen-border",removeOnClose:!0,scrollY:!1});dlg.classList.add("formDialog");var html="";html+='
',html+='',html+='

Emby Premiere',html+="

",html+="
",html+='
',html+='
',html+="

"+globalize.translate("sharedcomponents#HeaderDiscoverEmbyPremiere")+"

",html+="

"+globalize.translate("sharedcomponents#MessageDidYouKnowCinemaMode")+"

",html+="

"+globalize.translate("sharedcomponents#MessageDidYouKnowCinemaMode2")+"

",html+='

'+globalize.translate("sharedcomponents#HeaderBenefitsEmbyPremiere")+"

",html+='
',html+=getSubscriptionBenefits().map(getSubscriptionBenefitHtml).join(""),html+="
",html+="
",html+='
',html+='";var seconds=16;html+='
'+globalize.translate("sharedcomponents#ContinueInSecondsValue",seconds)+"
",html+='",html+="
",html+="
",html+="
",dlg.innerHTML=html;var i,length,isRejected=!0,timeTextInterval=setInterval(function(){seconds-=1,seconds<=0?(dlg.querySelector(".continueTimeText").classList.add("hide"),dlg.querySelector(".btnContinue").classList.remove("hide")):dlg.querySelector(".continueTimeText").innerHTML=globalize.translate("sharedcomponents#ContinueInSecondsValue",seconds)},1e3),btnPurchases=dlg.querySelectorAll(".buttonPremiereInfo");for(i=0,length=btnPurchases.length;iintervalMs?connectionManager.currentApiClient().getPluginSecurityInfo().then(function(regInfo){return regInfo.IsMBSupporter?(appSettings.set(settingsKey,(new Date).getTime()),Promise.resolve()):showPeriodicMessage(feature,settingsKey)},function(){return showPeriodicMessage(feature,settingsKey)}):Promise.resolve():(appSettings.set(settingsKey,(new Date).getTime()),Promise.resolve())}function validateFeature(feature,options){return options=options||{},console.log("validateFeature: "+feature),iapManager.isUnlockedByDefault(feature,options).then(function(){return showPeriodicMessageIfNeeded(feature)},function(){var unlockableFeatureCacheKey="featurepurchased-"+feature;if("1"===appSettings.get(unlockableFeatureCacheKey))return showPeriodicMessageIfNeeded(feature);var unlockableProduct=iapManager.getProductInfo(feature);if(unlockableProduct){var unlockableCacheKey="productpurchased-"+unlockableProduct.id;if(unlockableProduct.owned)return appSettings.set(unlockableFeatureCacheKey,"1"),appSettings.set(unlockableCacheKey,"1"),showPeriodicMessageIfNeeded(feature);if("1"===appSettings.get(unlockableCacheKey))return showPeriodicMessageIfNeeded(feature)}var unlockableProductInfo=unlockableProduct?{enableAppUnlock:!0,id:unlockableProduct.id,price:unlockableProduct.price,feature:feature}:null;return iapManager.getSubscriptionOptions().then(function(subscriptionOptions){return subscriptionOptions.filter(function(p){return p.owned}).length>0?Promise.resolve():connectionManager.getRegistrationInfo(iapManager.getAdminFeatureName(feature),connectionManager.currentApiClient()).catch(function(){var dialogOptions={title:globalize.translate("sharedcomponents#HeaderUnlockFeature"),feature:feature};return options.showDialog===!1?Promise.reject():showInAppPurchaseInfo(subscriptionOptions,unlockableProductInfo,dialogOptions)})})})}function cancelInAppPurchase(){var elem=document.querySelector(".inAppPurchaseOverlay");elem&&dialogHelper.close(elem)}function clearCurrentDisplayingInfo(){currentDisplayingProductInfos=[],currentDisplayingResolve=null}function showExternalPremiereInfo(){shell.openUrl("https://emby.media/premiere")}function centerFocus(elem,horiz,on){require(["scrollHelper"],function(scrollHelper){var fn=on?"on":"off";scrollHelper.centerFocus[fn](elem,horiz)})}function showInAppPurchaseElement(subscriptionOptions,unlockableProductInfo,dialogOptions,resolve,reject){function onCloseButtonClick(){rejected=!0,dialogHelper.close(dlg)}cancelInAppPurchase(),currentDisplayingProductInfos=subscriptionOptions.slice(0),unlockableProductInfo&¤tDisplayingProductInfos.push(unlockableProductInfo);var dlg=dialogHelper.createDialog({size:layoutManager.tv?"fullscreen":"fullscreen-border",removeOnClose:!0,scrollY:!1});dlg.classList.add("formDialog");var html="";html+='
',html+='',html+='

',html+=dialogOptions.title||"",html+="

",html+="
",html+='
',html+='
',html+='
',html+='

',html+=unlockableProductInfo?globalize.translate("sharedcomponents#MessageUnlockAppWithPurchaseOrSupporter"):globalize.translate("sharedcomponents#MessageUnlockAppWithSupporter"),html+="

",html+='

',html+=globalize.translate("sharedcomponents#MessageToValidateSupporter"),html+="

";var i,length,hasProduct=!1;for(i=0,length=subscriptionOptions.length;i",html+='",html+="

";if(unlockableProductInfo){hasProduct=!0;var unlockText=globalize.translate("sharedcomponents#ButtonUnlockWithPurchase");unlockableProductInfo.price&&(unlockText=globalize.translate("sharedcomponents#ButtonUnlockPrice",unlockableProductInfo.price)),html+="

",html+='",html+="

"}html+="

",html+='",html+="

",subscriptionOptions.length&&(html+='

'+globalize.translate("sharedcomponents#HeaderBenefitsEmbyPremiere")+"

",html+='
',html+=getSubscriptionBenefits().map(getSubscriptionBenefitHtml).join(""),html+="
"),"playback"===dialogOptions.feature&&(html+="

",html+='",html+="

"),html+="",html+="
",html+="
",dlg.innerHTML=html,document.body.appendChild(dlg);var btnPurchases=dlg.querySelectorAll(".btnPurchase");for(i=0,length=btnPurchases.length;i'):html+='
',html+=''+item.icon+"",html+='
',html+='

',html+=item.name,html+="

",html+='
',html+=item.text,html+="
",html+="
",html+=enableLink?"":"
"}function onPurchaseButtonClick(){var featureId=this.getAttribute("data-featureid");"true"===this.getAttribute("data-email")?getUserEmail().then(function(email){iapManager.beginPurchase(featureId,email)}):iapManager.beginPurchase(featureId)}function restorePurchase(unlockableProductInfo){var dlg=dialogHelper.createDialog({size:layoutManager.tv?"fullscreen":"fullscreen-border",removeOnClose:!0,scrollY:!1});dlg.classList.add("formDialog");var html="";html+='
',html+='',html+='

',html+=iapManager.getRestoreButtonText(),html+="

",html+="
",html+='
',html+='
',html+='

',html+=globalize.translate("sharedcomponents#HowDidYouPay"),html+="

",html+="

",html+='",html+="

",unlockableProductInfo&&(html+="

",html+='",html+="

"),html+="
",html+="
",dlg.innerHTML=html,document.body.appendChild(dlg),loading.hide(),layoutManager.tv&¢erFocus(dlg.querySelector(".formDialogContent"),!1,!0),dlg.querySelector(".btnCloseDialog").addEventListener("click",function(){dialogHelper.close(dlg)}),dlg.querySelector(".btnRestoreSub").addEventListener("click",function(){dialogHelper.close(dlg),alertText({text:globalize.translate("sharedcomponents#MessageToValidateSupporter"),title:"Emby Premiere"})});var btnRestoreUnlock=dlg.querySelector(".btnRestoreUnlock");btnRestoreUnlock&&btnRestoreUnlock.addEventListener("click",function(){dialogHelper.close(dlg),iapManager.restorePurchase()}),dialogHelper.open(dlg).then(function(){layoutManager.tv&¢erFocus(dlg.querySelector(".formDialogContent"),!1,!1)})}function getUserEmail(){if(connectionManager.isLoggedIntoConnect()){var connectUser=connectionManager.connectUser();if(connectUser&&connectUser.Email)return Promise.resolve(connectUser.Email)}return new Promise(function(resolve,reject){require(["prompt"],function(prompt){prompt({label:globalize.translate("sharedcomponents#LabelEmailAddress")}).then(resolve,reject)})})}function onProductUpdated(e,product){if(product.owned){var resolve=currentDisplayingResolve;resolve&¤tDisplayingProductInfos.filter(function(p){return product.id===p.id}).length&&(cancelInAppPurchase(),resolve())}}function showPremiereInfo(){return appHost.supports("externalpremium")?(showExternalPremiereInfo(),Promise.resolve()):iapManager.getSubscriptionOptions().then(function(subscriptionOptions){var dialogOptions={title:"Emby Premiere",feature:"sync"};return showInAppPurchaseInfo(subscriptionOptions,null,dialogOptions)})}var currentDisplayingProductInfos=[],currentDisplayingResolve=null;return events.on(iapManager,"productupdated",onProductUpdated),{validateFeature:validateFeature,showPremiereInfo:showPremiereInfo}}); \ No newline at end of file diff --git a/dashboard-ui/components/apphost.js b/dashboard-ui/components/apphost.js index 64f84f22d3..626554b3b4 100644 --- a/dashboard-ui/components/apphost.js +++ b/dashboard-ui/components/apphost.js @@ -1 +1 @@ -define(["appStorage","browser"],function(appStorage,browser){"use strict";function getDeviceProfile(){return null}function getCapabilities(){var caps={PlayableMediaTypes:["Audio","Video"],SupportsPersistentIdentifier:!1,DeviceProfile:getDeviceProfile()};return caps}function generateDeviceId(){return new Promise(function(resolve,reject){require(["cryptojs-sha1"],function(){var keys=[];keys.push(navigator.userAgent),keys.push((new Date).getTime()),resolve(CryptoJS.SHA1(keys.join("|")).toString())})})}function getDeviceId(){var key="_deviceId2",deviceId=appStorage.getItem(key);return deviceId?Promise.resolve(deviceId):generateDeviceId().then(function(deviceId){return appStorage.setItem(key,deviceId),deviceId})}function getDeviceName(){var deviceName;return deviceName=browser.tizen?"Samsung Smart TV":browser.web0S?"LG Smart TV":browser.operaTv?"Opera TV":browser.xboxOne?"Xbox One":browser.ps4?"Sony PS4":browser.chrome?"Chrome":browser.edge?"Edge":browser.firefox?"Firefox":browser.msie?"Internet Explorer":"Web Browser",browser.version&&(deviceName+=" "+browser.version),browser.ipad?deviceName+=" Ipad":browser.iphone?deviceName+=" Iphone":browser.android&&(deviceName+=" Android"),deviceName}function supportsVoiceInput(){return!browser.tv&&(window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.oSpeechRecognition||window.msSpeechRecognition)}function supportsFullscreen(){if(browser.tv)return!1;var element=document.documentElement;return element.requestFullscreen||element.mozRequestFullScreen||element.webkitRequestFullscreen||element.msRequestFullscreen}function getSyncProfile(){return new Promise(function(resolve,reject){require(["browserdeviceprofile","appSettings"],function(profileBuilder,appSettings){var profile=profileBuilder();profile.MaxStaticMusicBitrate=appSettings.maxStaticMusicBitrate(),resolve(profile)})})}function supportsHtmlMediaAutoplay(){if(browser.edgeUwp||browser.tv||browser.ps4||browser.xboxOne)return!0;if(browser.mobile)return!1;var savedResult=appStorage.getItem(htmlMediaAutoplayAppStorageKey);return"true"===savedResult||"false"!==savedResult&&null}var htmlMediaAutoplayAppStorageKey="supportshtmlmediaautoplay0",supportedFeatures=function(){var features=["sharing","externalpremium"];return browser.edgeUwp||browser.tv||browser.xboxOne||browser.ps4||features.push("filedownload"),browser.operaTv||browser.tizen||browser.web0s?features.push("exit"):features.push("exitmenu"),browser.operaTv||features.push("externallinks"),supportsVoiceInput()&&features.push("voiceinput"),supportsHtmlMediaAutoplay()&&(features.push("htmlaudioautoplay"),features.push("htmlvideoautoplay")),window.SyncRegistered,supportsFullscreen()&&features.push("fullscreenchange"),(browser.chrome||browser.edge&&!browser.slow)&&features.push("imageanalysis"),Dashboard.isConnectMode()&&features.push("multiserver"),(browser.tv||browser.xboxOne||browser.ps4||browser.mobile)&&features.push("physicalvolumecontrol"),browser.tv||browser.xboxOne||browser.ps4||features.push("remotecontrol"),features}();supportedFeatures.indexOf("htmlvideoautoplay")===-1&&supportsHtmlMediaAutoplay()!==!1&&require(["autoPlayDetect"],function(autoPlayDetect){autoPlayDetect.supportsHtmlMediaAutoplay().then(function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"true"),supportedFeatures.push("htmlvideoautoplay"),supportedFeatures.push("htmlaudioautoplay")},function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"false")})});var appInfo,version=window.dashboardVersion||"3.0";return{getWindowState:function(){return document.windowState||"Normal"},setWindowState:function(state){alert("setWindowState is not supported and should not be called")},exit:function(){if(browser.tizen)try{tizen.application.getCurrentApplication().exit()}catch(err){console.log("error closing application: "+err)}else window.close()},supports:function(command){return supportedFeatures.indexOf(command.toLowerCase())!=-1},appInfo:function(){return appInfo?Promise.resolve(appInfo):getDeviceId().then(function(deviceId){return appInfo={deviceId:deviceId,deviceName:getDeviceName(),appName:"Emby Mobile",appVersion:version}})},capabilities:getCapabilities,preferVisualCards:browser.android||browser.chrome,moreIcon:browser.safari||browser.edge?"dots-horiz":"dots-vert",getSyncProfile:getSyncProfile}}); \ No newline at end of file +define(["appStorage","browser"],function(appStorage,browser){"use strict";function getDeviceProfile(){return null}function getCapabilities(){var caps={PlayableMediaTypes:["Audio","Video"],SupportsPersistentIdentifier:!1,DeviceProfile:getDeviceProfile()};return caps}function generateDeviceId(){return new Promise(function(resolve,reject){require(["cryptojs-sha1"],function(){var keys=[];keys.push(navigator.userAgent),keys.push((new Date).getTime()),resolve(CryptoJS.SHA1(keys.join("|")).toString())})})}function getDeviceId(){var key="_deviceId2",deviceId=appStorage.getItem(key);return deviceId?Promise.resolve(deviceId):generateDeviceId().then(function(deviceId){return appStorage.setItem(key,deviceId),deviceId})}function getDeviceName(){var deviceName;return deviceName=browser.tizen?"Samsung Smart TV":browser.web0S?"LG Smart TV":browser.operaTv?"Opera TV":browser.xboxOne?"Xbox One":browser.ps4?"Sony PS4":browser.chrome?"Chrome":browser.edge?"Edge":browser.firefox?"Firefox":browser.msie?"Internet Explorer":"Web Browser",browser.version&&(deviceName+=" "+browser.version),browser.ipad?deviceName+=" Ipad":browser.iphone?deviceName+=" Iphone":browser.android&&(deviceName+=" Android"),deviceName}function supportsVoiceInput(){return!browser.tv&&(window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.oSpeechRecognition||window.msSpeechRecognition)}function supportsFullscreen(){if(browser.tv)return!1;var element=document.documentElement;return!!(element.requestFullscreen||element.mozRequestFullScreen||element.webkitRequestFullscreen||element.msRequestFullscreen)||!!document.createElement("video").webkitEnterFullscreen}function getSyncProfile(){return new Promise(function(resolve,reject){require(["browserdeviceprofile","appSettings"],function(profileBuilder,appSettings){var profile=profileBuilder();profile.MaxStaticMusicBitrate=appSettings.maxStaticMusicBitrate(),resolve(profile)})})}function supportsHtmlMediaAutoplay(){if(browser.edgeUwp||browser.tv||browser.ps4||browser.xboxOne)return!0;if(browser.mobile)return!1;var savedResult=appStorage.getItem(htmlMediaAutoplayAppStorageKey);return"true"===savedResult||"false"!==savedResult&&null}var htmlMediaAutoplayAppStorageKey="supportshtmlmediaautoplay0",supportedFeatures=function(){var features=["sharing","externalpremium"];return browser.edgeUwp||browser.tv||browser.xboxOne||browser.ps4||features.push("filedownload"),browser.operaTv||browser.tizen||browser.web0s?features.push("exit"):features.push("exitmenu"),browser.operaTv||features.push("externallinks"),supportsVoiceInput()&&features.push("voiceinput"),supportsHtmlMediaAutoplay()&&(features.push("htmlaudioautoplay"),features.push("htmlvideoautoplay")),window.SyncRegistered,supportsFullscreen()&&features.push("fullscreenchange"),(browser.chrome||browser.edge&&!browser.slow)&&features.push("imageanalysis"),Dashboard.isConnectMode()&&features.push("multiserver"),(browser.tv||browser.xboxOne||browser.ps4||browser.mobile)&&features.push("physicalvolumecontrol"),browser.tv||browser.xboxOne||browser.ps4||features.push("remotecontrol"),features}();supportedFeatures.indexOf("htmlvideoautoplay")===-1&&supportsHtmlMediaAutoplay()!==!1&&require(["autoPlayDetect"],function(autoPlayDetect){autoPlayDetect.supportsHtmlMediaAutoplay().then(function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"true"),supportedFeatures.push("htmlvideoautoplay"),supportedFeatures.push("htmlaudioautoplay")},function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"false")})});var appInfo,version=window.dashboardVersion||"3.0";return{getWindowState:function(){return document.windowState||"Normal"},setWindowState:function(state){alert("setWindowState is not supported and should not be called")},exit:function(){if(browser.tizen)try{tizen.application.getCurrentApplication().exit()}catch(err){console.log("error closing application: "+err)}else window.close()},supports:function(command){return supportedFeatures.indexOf(command.toLowerCase())!=-1},appInfo:function(){return appInfo?Promise.resolve(appInfo):getDeviceId().then(function(deviceId){return appInfo={deviceId:deviceId,deviceName:getDeviceName(),appName:"Emby Mobile",appVersion:version}})},capabilities:getCapabilities,preferVisualCards:browser.android||browser.chrome,moreIcon:browser.safari||browser.edge?"dots-horiz":"dots-vert",getSyncProfile:getSyncProfile}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index 43e123ea81..3b51c57e22 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -1,2 +1,2 @@ -define(["layoutManager","cardBuilder","datetime","mediaInfo","backdrop","listView","itemContextMenu","itemHelper","userdataButtons","dom","indicators","apphost","imageLoader","libraryMenu","globalize","browser","events","scrollHelper","playbackManager","scrollStyles","emby-itemscontainer","emby-checkbox"],function(layoutManager,cardBuilder,datetime,mediaInfo,backdrop,listView,itemContextMenu,itemHelper,userdataButtons,dom,indicators,appHost,imageLoader,libraryMenu,globalize,browser,events,scrollHelper,playbackManager){"use strict";function getPromise(params){var id=params.id;if(id)return ApiClient.getItem(Dashboard.getCurrentUserId(),id);if(params.seriesTimerId)return ApiClient.getLiveTvSeriesTimer(params.seriesTimerId);var name=params.genre;if(name)return ApiClient.getGenre(name,Dashboard.getCurrentUserId());if(name=params.musicgenre)return ApiClient.getMusicGenre(name,Dashboard.getCurrentUserId());if(name=params.gamegenre)return ApiClient.getGameGenre(name,Dashboard.getCurrentUserId());if(name=params.musicartist)return ApiClient.getArtist(name,Dashboard.getCurrentUserId());throw new Error("Invalid request")}function reload(page,params){Dashboard.showLoadingMsg(),getPromise(params).then(function(item){reloadFromItem(page,params,item)})}function hideAll(page,className,show){var i,length,elems=page.querySelectorAll("."+className);for(i=0,length=elems.length;i"}function renderSeriesTimerSchedule(page,seriesTimerId){ApiClient.getLiveTvTimers({UserId:ApiClient.getCurrentUserId(),ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb",SortBy:"StartDate",EnableTotalRecordCount:!1,EnableUserData:!1,SeriesTimerId:seriesTimerId,Fields:"ChannelInfo"}).then(function(result){result.Items.length&&result.Items[0].SeriesTimerId!=seriesTimerId&&(result.Items=[]);var html=getProgramScheduleHtml(result.Items),scheduleTab=page.querySelector(".seriesTimerSchedule");scheduleTab.innerHTML=html,imageLoader.lazyChildren(scheduleTab)})}function renderSeriesTimerEditor(page,item,user){if("SeriesTimer"===item.Type){if(!user.Policy.EnableLiveTvManagement)return page.querySelector(".seriesTimerScheduleSection").classList.add("hide"),void page.querySelector(".btnCancelSeriesTimer").classList.add("hide");require(["seriesRecordingEditor"],function(seriesRecordingEditor){seriesRecordingEditor.embed(item,ApiClient.serverId(),{context:page.querySelector(".seriesRecordingEditor")})}),page.querySelector(".seriesTimerScheduleSection").classList.remove("hide"),page.querySelector(".btnCancelSeriesTimer").classList.remove("hide"),renderSeriesTimerSchedule(page,item.Id)}}function reloadPlayButtons(page,item){var canPlay=!1;if("Program"==item.Type){var now=new Date;now>=datetime.parseISO8601Date(item.StartDate,!0)&&now0)}else hideAll(page,"btnPlay"),hideAll(page,"btnResume"),hideAll(page,"btnInstantMix"),hideAll(page,"btnShuffle");return canPlay}function reloadFromItem(page,params,item){currentItem=item;var context=params.context;LibraryBrowser.renderName(item,page.querySelector(".itemName"),!1,context),LibraryBrowser.renderParentName(item,page.querySelector(".parentName"),context),libraryMenu.setTitle(""),Dashboard.getCurrentUser().then(function(user){window.scrollTo(0,0),renderSeriesTimerEditor(page,item,user),renderImage(page,item,user),renderLogo(page,item,ApiClient),setInitialCollapsibleState(page,item,context,user),renderDetails(page,item,context),dom.getWindowSize().innerWidth>=800?backdrop.setBackdrops([item]):backdrop.clear(),LibraryBrowser.renderDetailPageBackdrop(page,item,imageLoader),libraryMenu.setTransparentMenu(!0);var canPlay=reloadPlayButtons(page,item),hasAnyButton=canPlay;(item.LocalTrailerCount||item.RemoteTrailers&&item.RemoteTrailers.length)&&"Full"==item.PlayAccess?(hideAll(page,"btnPlayTrailer",!0),hasAnyButton=!0):hideAll(page,"btnPlayTrailer"),item.CanDelete&&!item.IsFolder?(hideAll(page,"btnDeleteItem",!0),hasAnyButton=!0):hideAll(page,"btnDeleteItem"),renderSyncLocalContainer(page,params,user,item),hasAnyButton||"Program"!==item.Type?hideAll(page,"mainDetailButtons",!0):hideAll(page,"mainDetailButtons"),showRecordingFields(page,item,user);var groupedVersions=(item.MediaSources||[]).filter(function(g){return"Grouping"==g.Type});user.Policy.IsAdministrator&&groupedVersions.length?page.querySelector(".splitVersionContainer").classList.remove("hide"):page.querySelector(".splitVersionContainer").classList.add("hide"),itemContextMenu.getCommands(getContextMenuOptions(item)).then(function(commands){commands.length?hideAll(page,"btnMoreCommands",!0):hideAll(page,"btnMoreCommands")});var itemBirthday=page.querySelector("#itemBirthday");if("Person"==item.Type&&item.PremiereDate)try{var birthday=datetime.parseISO8601Date(item.PremiereDate,!0).toDateString();itemBirthday.classList.remove("hide"),itemBirthday.innerHTML=globalize.translate("BirthDateValue").replace("{0}",birthday)}catch(err){itemBirthday.classList.add("hide")}else itemBirthday.classList.add("hide");var itemDeathDate=page.querySelector("#itemDeathDate");if("Person"==item.Type&&item.EndDate)try{var deathday=datetime.parseISO8601Date(item.EndDate,!0).toDateString();itemDeathDate.classList.remove("hide"),itemDeathDate.innerHTML=globalize.translate("DeathDateValue").replace("{0}",deathday)}catch(err){itemDeathDate.classList.add("hide")}var itemBirthLocation=page.querySelector("#itemBirthLocation");if("Person"==item.Type&&item.ProductionLocations&&item.ProductionLocations.length){var gmap=''+item.ProductionLocations[0]+"";itemBirthLocation.classList.remove("hide"),itemBirthLocation.innerHTML=globalize.translate("BirthPlaceValue").replace("{0}",gmap)}else itemBirthLocation.classList.add("hide")}),setPeopleHeader(page,item),page.dispatchEvent(new CustomEvent("displayingitem",{detail:{item:item,context:context},bubbles:!0})),Dashboard.hideLoadingMsg()}function logoImageUrl(item,apiClient,options){return options=options||{},options.type="Logo",item.ImageTags&&item.ImageTags.Logo?(options.tag=item.ImageTags.Logo,apiClient.getScaledImageUrl(item.Id,options)):item.ParentLogoImageTag?(options.tag=item.ParentLogoImageTag,apiClient.getScaledImageUrl(item.ParentLogoItemId,options)):null}function renderLogo(page,item,apiClient){var url=logoImageUrl(item,apiClient,{maxWidth:300}),detailLogo=page.querySelector(".detailLogo");url?(detailLogo.classList.remove("hide"),detailLogo.classList.add("lazy"),detailLogo.setAttribute("data-src",url),imageLoader.lazyImage(detailLogo)):detailLogo.classList.add("hide")}function showRecordingFields(page,item,user){if(!currentRecordingFields){var recordingFieldsElement=page.querySelector(".recordingFields");"Program"==item.Type&&user.Policy.EnableLiveTvManagement?require(["recordingFields"],function(recordingFields){currentRecordingFields=new recordingFields({parent:recordingFieldsElement,programId:item.Id,serverId:item.ServerId}),recordingFieldsElement.classList.remove("hide")}):(recordingFieldsElement.classList.add("hide"),recordingFieldsElement.innerHTML="")}}function renderLinks(linksElem,item){var links=[];if(item.HomePageUrl&&links.push(''+globalize.translate("ButtonWebsite")+""),item.ExternalUrls)for(var i=0,length=item.ExternalUrls.length;i'+url.Name+"")}if(links.length){var html=links.join('');linksElem.innerHTML=html,linksElem.classList.remove("hide")}else linksElem.classList.add("hide")}function renderImage(page,item,user){var container=page.querySelector(".detailImageContainer");LibraryBrowser.renderDetailImage(container,item,user.Policy.IsAdministrator&&"Photo"!=item.MediaType,null,imageLoader,indicators)}function refreshDetailImageUserData(elem,item){var detailImageProgressContainer=elem.querySelector(".detailImageProgressContainer");detailImageProgressContainer.innerHTML=indicators.getProgressBarHtml(item)}function refreshImage(page,item,user){refreshDetailImageUserData(page.querySelector(".detailImageContainer"),item)}function setPeopleHeader(page,item){"Audio"==item.MediaType||"MusicAlbum"==item.Type||"Book"==item.MediaType||"Photo"==item.MediaType?page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderPeople"):page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderCastAndCrew")}function renderNextUp(page,item,user){var section=page.querySelector(".nextUpSection");return"Series"!=item.Type?void section.classList.add("hide"):void ApiClient.getNextUpEpisodes({SeriesId:item.Id,UserId:user.Id}).then(function(result){result.Items.length?section.classList.remove("hide"):section.classList.add("hide");var html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(!1),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,overlayText:!0,lazy:!0,overlayPlayButton:!0}),itemsContainer=section.querySelector(".nextUpItems");itemsContainer.innerHTML=html,imageLoader.lazyChildren(itemsContainer)})}function setInitialCollapsibleState(page,item,context,user){page.querySelector(".collectionItems").innerHTML="","TvChannel"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderChannelGuide(page,item,user)):"Playlist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderPlaylistItems(page,item,user)):"Studio"==item.Type||"Person"==item.Type||"Genre"==item.Type||"MusicGenre"==item.Type||"GameGenre"==item.Type||"MusicArtist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderItemsByName(page,item,user)):item.IsFolder||"Episode"==item.Type?("BoxSet"==item.Type&&page.querySelector("#childrenCollapsible").classList.add("hide"),renderChildren(page,item)):page.querySelector("#childrenCollapsible").classList.add("hide"),"Series"==item.Type&&renderSeriesSchedule(page,item,user),"Series"==item.Type?renderNextUp(page,item,user):page.querySelector(".nextUpSection").classList.add("hide"),item.MediaSources&&item.MediaSources.length&&renderMediaSources(page,user,item),renderScenes(page,item),item.SpecialFeatureCount&&0!=item.SpecialFeatureCount&&"Series"!=item.Type?(page.querySelector("#specialsCollapsible").classList.remove("hide"),renderSpecials(page,item,user,6)):page.querySelector("#specialsCollapsible").classList.add("hide"),item.People&&item.People.length?(page.querySelector("#castCollapsible").classList.remove("hide"),renderCast(page,item,context,enableScrollX()?null:12)):page.querySelector("#castCollapsible").classList.add("hide"),item.PartCount&&item.PartCount>1?(page.querySelector("#additionalPartsCollapsible").classList.remove("hide"),renderAdditionalParts(page,item,user)):page.querySelector("#additionalPartsCollapsible").classList.add("hide"),page.querySelector("#themeSongsCollapsible").classList.add("hide"),page.querySelector("#themeVideosCollapsible").classList.add("hide"),"MusicAlbum"==item.Type?renderMusicVideos(page,item,user):page.querySelector("#musicVideosCollapsible").classList.add("hide"),renderThemeMedia(page,item,user),enableScrollX()?renderCriticReviews(page,item):renderCriticReviews(page,item,1)}function renderOverview(elems,item){for(var i=0,length=elems.length;i'+text+"
":'
'+text+"
"}).join("");return view.querySelector(".mediaInfoIcons").innerHTML=html,html}function renderPhotoInfo(page,item){var html="",attributes=[];if(item.CameraMake&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraMake"),item.CameraMake)),item.CameraModel&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraModel"),item.CameraModel)),item.Altitude&&attributes.push(createAttribute(globalize.translate("MediaInfoAltitude"),item.Altitude.toFixed(1))),item.Aperture&&attributes.push(createAttribute(globalize.translate("MediaInfoAperture"),"F"+item.Aperture.toFixed(1))),item.ExposureTime){var val=1/item.ExposureTime;attributes.push(createAttribute(globalize.translate("MediaInfoExposureTime"),"1/"+val+" s"))}item.FocalLength&&attributes.push(createAttribute(globalize.translate("MediaInfoFocalLength"),item.FocalLength.toFixed(1)+" mm")),item.ImageOrientation,item.IsoSpeedRating&&attributes.push(createAttribute(globalize.translate("MediaInfoIsoSpeedRating"),item.IsoSpeedRating)),item.Latitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLatitude"),item.Latitude.toFixed(1))),item.Longitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLongitude"),item.Longitude.toFixed(1))),item.ShutterSpeed&&attributes.push(createAttribute(globalize.translate("MediaInfoShutterSpeed"),item.ShutterSpeed)),item.Software&&attributes.push(createAttribute(globalize.translate("MediaInfoSoftware"),item.Software)),html+=attributes.join("
"),page.querySelector(".photoInfoContent").innerHTML=html}function getArtistLinksHtml(artists,context){for(var html=[],i=0,length=artists.length;i'+artist.Name+"")}return html=html.join(" / "),1==artists.length?globalize.translate("ValueArtist",html):artists.length>1?globalize.translate("ValueArtists",html):html}function enableScrollX(){return browserInfo.mobile&&screen.availWidth<=1e3}function getPortraitShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowPortrait":"portrait"}function getSquareShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowSquare":"square"}function getThumbShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowBackdrop":"backdrop"}function renderMoreFromItems(page,item){var moreFromSection=page.querySelector("#moreFromSection");if(moreFromSection)return"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length?void ApiClient.getItems(Dashboard.getCurrentUserId(),{IncludeItemTypes:"MusicAlbum",ArtistIds:item.AlbumArtists[0].Id,Recursive:!0,ExcludeItemIds:item.Id}).then(function(result){if(!result.Items.length)return void moreFromSection.classList.add("hide");moreFromSection.classList.remove("hide"),moreFromSection.querySelector(".moreFromHeader").innerHTML=globalize.translate("MoreFromValue",item.AlbumArtists[0].Name);var html="";html+=enableScrollX()?'
':'
';var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!supportsImageAnalysis,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
";var similarContent=page.querySelector("#moreFromItems");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)}):void moreFromSection.classList.add("hide")}function renderSimilarItems(page,item,context){var similarCollapsible=page.querySelector("#similarCollapsible");if(similarCollapsible){if("Movie"!=item.Type&&"Trailer"!=item.Type&&"Series"!=item.Type&&"Program"!=item.Type&&"Recording"!=item.Type&&"Game"!=item.Type&&"MusicAlbum"!=item.Type&&"MusicArtist"!=item.Type&&"ChannelVideoItem"!=item.Type)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),options={userId:Dashboard.getCurrentUserId(),limit:"MusicAlbum"==item.Type||"MusicArtist"==item.Type?8:10,fields:"PrimaryImageAspectRatio,UserData,CanDelete"};"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length&&(options.ExcludeArtistIds=item.AlbumArtists[0].Id),enableScrollX()&&(options.limit=12),ApiClient.getSimilarItems(item.Id,options).then(function(result){if(!result.Items.length)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var html="";html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis&&("MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type);html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!cardLayout,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,context:context,lazy:!0,showDetailsMenu:!0,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:cardLayout,vibrant:cardLayout&&supportsImageAnalysis}),html+="
";var similarContent=similarCollapsible.querySelector(".similarContent");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)})}}function renderSeriesAirTime(page,item,isStatic){var seriesAirTime=page.querySelector("#seriesAirTime");if("Series"!=item.Type)return void seriesAirTime.classList.add("hide");var html="";if(item.AirDays&&item.AirDays.length&&(html+=7==item.AirDays.length?"daily":item.AirDays.map(function(a){return a+"s"}).join(",")),item.AirTime&&(html+=" at "+item.AirTime),item.Studios.length)if(isStatic)html+=" on "+item.Studios[0].Name;else{var context=inferContext(item),href=LibraryBrowser.getHref(item.Studios[0],context);html+=' on '+item.Studios[0].Name+""}html?(html=("Ended"==item.Status?"Aired ":"Airs ")+html,seriesAirTime.innerHTML=html,seriesAirTime.classList.remove("hide")):seriesAirTime.classList.add("hide")}function renderTags(page,item){var itemTags=page.querySelector(".itemTags");if(item.Tags&&item.Tags.length){for(var html="",i=0,length=item.Tags.length;i'+item.Tags[i]+"
";itemTags.innerHTML=html,itemTags.classList.remove("hide")}else itemTags.classList.add("hide")}function getEpisodesFunction(seriesId,query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getEpisodes(seriesId,query)}}function getAlbumSongsFunction(query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getItems(Dashboard.getCurrentUserId(),query)}}function renderChildren(page,item){_childrenItemsFunction=null;var fields="ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete",query={ParentId:item.Id,Fields:fields};"BoxSet"!==item.Type&&(query.SortBy="SortName");var promise,userId=Dashboard.getCurrentUserId();"Series"==item.Type?promise=ApiClient.getSeasons(item.Id,{userId:userId,Fields:fields}):"Season"==item.Type?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields})):"Episode"==item.Type&&item.SeriesId&&item.SeasonId?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields})):"MusicAlbum"==item.Type&&(_childrenItemsFunction=getAlbumSongsFunction(query)),promise=promise||ApiClient.getItems(Dashboard.getCurrentUserId(),query),promise.then(function(result){var html="",scrollX=!1,isList=!1,scrollClass="hiddenScrollX",childrenItemsContainer=page.querySelector(".childrenItemsContainer");if("MusicAlbum"==item.Type)html=listView.getListViewHtml({items:result.Items,smallIcon:!0,showIndex:!0,index:"disc",showIndexNumber:!0,playFromHere:!0,action:"playallfromhere",image:!1,artist:"auto",containerAlbumArtist:item.AlbumArtist,addToListButton:!0}),isList=!0;else if("Series"==item.Type)scrollX=enableScrollX(),html=cardBuilder.getCardsHtml({items:result.Items,shape:getPortraitShape(),showTitle:!0,centerText:!0,lazy:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX});else if("Season"==item.Type||"Episode"==item.Type){if("Episode"===item.Type&&childrenItemsContainer.classList.add("darkScroller"),scrollX="Episode"==item.Type,browser.touch||(scrollClass="smoothScrollX"),1==result.Items.length&&"Episode"===item.Type)return;html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(scrollX),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,playFromHere:!0,overlayText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX,includeParentInfoInTitle:!1})}else"GameSystem"==item.Type&&(html=cardBuilder.getCardsHtml({items:result.Items,shape:"auto",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0}));if(page.querySelector("#childrenCollapsible").classList.remove("hide"),scrollX?(childrenItemsContainer.classList.add(scrollClass),childrenItemsContainer.classList.remove("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list")):(childrenItemsContainer.classList.remove("hiddenScrollX"),childrenItemsContainer.classList.remove("smoothScrollX"),isList?(childrenItemsContainer.classList.add("vertical-list"),childrenItemsContainer.classList.remove("vertical-wrap")):(childrenItemsContainer.classList.add("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list"))),childrenItemsContainer.innerHTML=html,imageLoader.lazyChildren(childrenItemsContainer),"BoxSet"==item.Type){var collectionItemTypes=[{name:globalize.translate("HeaderMovies"),type:"Movie"},{name:globalize.translate("HeaderSeries"),type:"Series"},{name:globalize.translate("HeaderAlbums"),type:"MusicAlbum"},{name:globalize.translate("HeaderGames"),type:"Game"},{name:globalize.translate("HeaderBooks"),type:"Book"}];renderCollectionItems(page,item,collectionItemTypes,result.Items)}else if("Episode"===item.Type){var card=childrenItemsContainer.querySelector('.card[data-id="'+item.Id+'"]');card&&scrollHelper.toStart(childrenItemsContainer,card.previousSibling||card,!0)}}),"Season"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderEpisodes"):"Episode"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("MoreFromValue",item.SeasonName):"Series"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderSeasons"):"MusicAlbum"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderTracks"):"GameSystem"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderGames"):page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderItems"),"MusicAlbum"==item.Type?page.querySelector(".childrenSectionHeader",page).classList.add("hide"):page.querySelector(".childrenSectionHeader",page).classList.remove("hide")}function renderItemsByName(page,item,user){require("scripts/itembynamedetailpage".split(","),function(){window.ItemsByName.renderItems(page,item)})}function renderPlaylistItems(page,item,user){require("scripts/playlistedit".split(","),function(){PlaylistViewer.render(page,item)})}function renderChannelGuide(page,item,user){require("scripts/livetvchannel,scripts/livetvcomponents,livetvcss".split(","),function(liveTvChannelPage){liveTvChannelPage.renderPrograms(page,item.Id)})}function renderSeriesSchedule(page,item,user){}function inferContext(item){return"Movie"==item.Type||"BoxSet"==item.Type?"movies":"Series"==item.Type||"Season"==item.Type||"Episode"==item.Type?"tvshows":"Game"==item.Type||"GameSystem"==item.Type?"games":"Game"==item.Type||"GameSystem"==item.Type?"games":"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"music":null}function renderStudios(elem,item,isStatic){var context=inferContext(item);if(item.Studios&&item.Studios.length&&"Series"!=item.Type,1)elem.classList.add("hide");else{for(var html="",i=0,length=item.Studios.length;i0&&(html+="  /  "),isStatic)html+=item.Studios[i].Name;else{item.Studios[i].Type="Studio";var href=LibraryBrowser.getHref(item.Studios[i],context);html+=''+item.Studios[i].Name+""}var translationKey=item.Studios.length>1?"ValueStudios":"ValueStudio";html=globalize.translate(translationKey,html),elem.innerHTML=html,elem.classList.remove("hide")}}function renderGenres(elem,item,limit,isStatic){for(var context=inferContext(item),html="",genres=item.Genres||[],i=0,length=genres.length;i=limit);i++){i>0&&(html+='');var param="Audio"==item.Type||"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"musicgenre":"genre";if("Game"==item.MediaType&&(param="gamegenre"),isStatic)html+=genres[i];else{var type;switch(context){case"tvshows":type="Series";break;case"games":type="Game";break;case"music":type="MusicAlbum";break;default:type="Movie"}var url="secondaryitems.html?type="+type+"&"+param+"="+ApiClient.encodeName(genres[i]);html+=''+genres[i]+""}}elem.innerHTML=html}function renderAwardSummary(elem,item){item.AwardSummary?(elem.classList.remove("hide"),elem.innerHTML=globalize.translate("ValueAwards",item.AwardSummary)):elem.classList.add("hide")}function renderCollectionItems(page,parentItem,types,items){page.querySelector(".collectionItems").innerHTML="";var i,length;for(i=0,length=types.length;i",html+="",html+='',html+="
",html+='
';var shape="MusicAlbum"==type.type?getSquareShape(!1):getPortraitShape(!1);html+=cardBuilder.getCardsHtml({items:items,shape:shape,showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayMoreButton:!0,showAddToCollection:!1,showRemoveFromCollection:!0,collectionId:parentItem.Id}),html+="
",html+="
";var collectionItems=page.querySelector(".collectionItems"); -collectionItems.insertAdjacentHTML("beforeend",html),imageLoader.lazyChildren(collectionItems),collectionItems.querySelector(".btnAddToCollection").addEventListener("click",function(){require(["alert"],function(alert){alert({text:globalize.translate("AddItemToCollectionHelp"),html:globalize.translate("AddItemToCollectionHelp")+'

'+globalize.translate("ButtonLearnMore")+""})})})}function renderUserDataIcons(page,item){for(var userDataIcons=page.querySelectorAll(".userDataIcons"),i=0,length=userDataIcons.length;i',html+='
',null!=review.Score||null!=review.Likes&&(html+=review.Likes?"
":"
"),html+='
',html+='

'+review.Caption+"

";var vals=[];if(review.ReviewerName&&vals.push(review.ReviewerName),review.Publisher&&vals.push(review.Publisher),html+='
'+vals.join(", ")+".",review.Date)try{var date=datetime.toLocaleDateString(datetime.parseISO8601Date(review.Date,!0));html+=''+date+""}catch(error){}html+="
",review.Url&&(html+='"),html+="
",html+="
",html+="
"}limit&&result.TotalRecordCount>limit&&(html+='

");var criticReviewsContent=page.querySelector("#criticReviewsContent");criticReviewsContent.innerHTML=html,enableScrollX()?criticReviewsContent.classList.add("hiddenScrollX"):criticReviewsContent.classList.remove("hiddenScrollX")}function renderThemeMedia(page,item){"SeriesTimer"!==item.Type&&"Timer"!==item.Type&&"Genre"!==item.Type&&"MusicGenre"!==item.Type&&"GameGenre"!==item.Type&&"Studio"!==item.Type&&"Person"!==item.Type&&ApiClient.getThemeMedia(Dashboard.getCurrentUserId(),item.Id,!0).then(function(result){var themeSongs=result.ThemeSongsResult.OwnerId==item.Id?result.ThemeSongsResult.Items:[],themeVideos=result.ThemeVideosResult.OwnerId==item.Id?result.ThemeVideosResult.Items:[];renderThemeSongs(page,themeSongs),renderThemeVideos(page,themeVideos)})}function renderThemeSongs(page,items){if(items.length){page.querySelector("#themeSongsCollapsible").classList.remove("hide");var html=listView.getListViewHtml({items:items});page.querySelector("#themeSongsContent").innerHTML=html}else page.querySelector("#themeSongsCollapsible").classList.add("hide")}function renderThemeVideos(page,items,user){if(items.length){page.querySelector("#themeVideosCollapsible").classList.remove("hide");var themeVideosContent=page.querySelector("#themeVideosContent");themeVideosContent.innerHTML=getVideosHtml(items,user),imageLoader.lazyChildren(themeVideosContent)}else page.querySelector("#themeVideosCollapsible").classList.add("hide")}function renderMusicVideos(page,item,user){ApiClient.getItems(user.Id,{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"MusicVideo",Recursive:!0,Fields:"DateCreated,CanDelete",Albums:item.Name}).then(function(result){if(result.Items.length){page.querySelector("#musicVideosCollapsible").classList.remove("hide");var musicVideosContent=page.querySelector(".musicVideosContent");musicVideosContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(musicVideosContent)}else page.querySelector("#musicVideosCollapsible").classList.add("hide")})}function renderAdditionalParts(page,item,user){ApiClient.getAdditionalVideoParts(user.Id,item.Id).then(function(result){if(result.Items.length){page.querySelector("#additionalPartsCollapsible").classList.remove("hide");var additionalPartsContent=page.querySelector("#additionalPartsContent");additionalPartsContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(additionalPartsContent)}else page.querySelector("#additionalPartsCollapsible").classList.add("hide")})}function renderScenes(page,item){var chapters=item.Chapters||[];if(chapters.length&&!chapters[0].ImageTag&&(chapters=[]),chapters.length){page.querySelector("#scenesCollapsible").classList.remove("hide");var scenesContent=page.querySelector("#scenesContent");enableScrollX()?scenesContent.classList.add("smoothScrollX"):scenesContent.classList.add("vertical-wrap"),require(["chaptercardbuilder"],function(chaptercardbuilder){chaptercardbuilder.buildChapterCards(item,chapters,{itemsContainer:scenesContent,coverImage:!0,width:400,backdropShape:getThumbShape(),squareShape:getSquareShape()})})}else page.querySelector("#scenesCollapsible").classList.add("hide")}function renderMediaSources(page,user,item){var html=item.MediaSources.map(function(v){return getMediaSourceHtml(user,item,v)}).join('
');item.MediaSources.length>1&&(html="
"+html);var mediaInfoContent=page.querySelector("#mediaInfoContent");mediaInfoContent.innerHTML=html}function getMediaSourceHtml(user,item,version){var html="";version.Name&&item.MediaSources.length>1&&(html+='
'+version.Name+"

");for(var i=0,length=version.MediaStreams.length;i';var displayType=globalize.translate("MediaInfoStreamType"+stream.Type);html+='

'+displayType+"

";var attributes=[];stream.Language&&"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoLanguage"),stream.Language)),stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoCodec"),stream.Codec.toUpperCase())),stream.CodecTag&&attributes.push(createAttribute(globalize.translate("MediaInfoCodecTag"),stream.CodecTag)),null!=stream.IsAVC&&attributes.push(createAttribute("AVC",stream.IsAVC?"Yes":"No")),stream.Profile&&attributes.push(createAttribute(globalize.translate("MediaInfoProfile"),stream.Profile)),stream.Level&&attributes.push(createAttribute(globalize.translate("MediaInfoLevel"),stream.Level)),(stream.Width||stream.Height)&&attributes.push(createAttribute(globalize.translate("MediaInfoResolution"),stream.Width+"x"+stream.Height)),stream.AspectRatio&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoAspectRatio"),stream.AspectRatio)),"Video"==stream.Type&&(null!=stream.IsAnamorphic&&attributes.push(createAttribute(globalize.translate("MediaInfoAnamorphic"),stream.IsAnamorphic?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoInterlaced"),stream.IsInterlaced?"Yes":"No"))),(stream.AverageFrameRate||stream.RealFrameRate)&&attributes.push(createAttribute(globalize.translate("MediaInfoFramerate"),stream.AverageFrameRate||stream.RealFrameRate)),stream.ChannelLayout&&attributes.push(createAttribute(globalize.translate("MediaInfoLayout"),stream.ChannelLayout)),stream.Channels&&attributes.push(createAttribute(globalize.translate("MediaInfoChannels"),stream.Channels+" ch")),stream.BitRate&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoBitrate"),parseInt(stream.BitRate/1e3)+" kbps")),stream.SampleRate&&attributes.push(createAttribute(globalize.translate("MediaInfoSampleRate"),stream.SampleRate+" Hz")),stream.BitDepth&&attributes.push(createAttribute(globalize.translate("MediaInfoBitDepth"),stream.BitDepth+" bit")),stream.PixelFormat&&attributes.push(createAttribute(globalize.translate("MediaInfoPixelFormat"),stream.PixelFormat)),stream.RefFrames&&attributes.push(createAttribute(globalize.translate("MediaInfoRefFrames"),stream.RefFrames)),stream.NalLengthSize&&attributes.push(createAttribute("NAL",stream.NalLengthSize)),"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoDefault"),stream.IsDefault?"Yes":"No")),"Subtitle"==stream.Type&&(attributes.push(createAttribute(globalize.translate("MediaInfoForced"),stream.IsForced?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoExternal"),stream.IsExternal?"Yes":"No"))),"Video"==stream.Type&&version.Timestamp&&attributes.push(createAttribute(globalize.translate("MediaInfoTimestamp"),version.Timestamp)),stream.DisplayTitle&&attributes.push(createAttribute("Title",stream.DisplayTitle)),html+=attributes.join("
"),html+="
"}}if(version.Container&&(html+='
'+globalize.translate("MediaInfoContainer")+''+version.Container+"
"),version.Formats&&version.Formats.length,version.Path&&"Http"!=version.Protocol&&user&&user.Policy.IsAdministrator&&(html+='
'+globalize.translate("MediaInfoPath")+''+version.Path+"
"),version.Size){var size=(version.Size/1048576).toFixed(0);html+='
'+globalize.translate("MediaInfoSize")+''+size+" MB
"}return html}function createAttribute(label,value){return''+label+''+value+""}function getVideosHtml(items,user,limit,moreButtonClass){var html=cardBuilder.getCardsHtml({items:items,shape:"auto",showTitle:!0,action:"play",overlayText:!0,showRuntime:!0});return limit&&items.length>limit&&(html+='

"),html}function renderSpecials(page,item,user,limit){ApiClient.getSpecialFeatures(user.Id,item.Id).then(function(specials){var specialsContent=page.querySelector("#specialsContent");specialsContent.innerHTML=getVideosHtml(specials,user,limit,"moreSpecials"),imageLoader.lazyChildren(specialsContent)})}function renderCast(page,item,context,limit,isStatic){var people=item.People||[],castContent=page.querySelector("#castContent");enableScrollX()?(castContent.classList.add("smoothScrollX"),limit=32):castContent.classList.add("vertical-wrap");var limitExceeded=limit&&people.length>limit;limitExceeded&&(people=people.slice(0),people.length=Math.min(limit,people.length)),require(["peoplecardbuilder"],function(peoplecardbuilder){peoplecardbuilder.buildPeopleCards(people,{itemsContainer:castContent,coverImage:!0,serverId:item.ServerId,width:160,shape:getPortraitShape()})});var morePeopleButton=page.querySelector(".morePeople");morePeopleButton&&(limitExceeded&&!enableScrollX()?morePeopleButton.classList.remove("hide"):morePeopleButton.classList.add("hide"))}function play(startPosition){playbackManager.play({items:[currentItem],startPositionTicks:startPosition})}function splitVersions(page,params){require(["confirm"],function(confirm){confirm("Are you sure you wish to split the media sources into separate items?","Split Media Apart").then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Videos/"+params.id+"/AlternateSources")}).then(function(){Dashboard.hideLoadingMsg(),reload(page,params)})})})}function playTrailer(page){playbackManager.playTrailers(currentItem)}function showPlayMenu(item,target){require(["playMenu"],function(playMenu){playMenu.show({item:item,positionTo:target})})}function playCurrentItem(button,mode){var item=currentItem;return"Program"===item.Type?void ApiClient.getLiveTvChannel(item.ChannelId,Dashboard.getCurrentUserId()).then(function(channel){playbackManager.play({items:[channel]})}):void("playmenu"===mode?showPlayMenu(item,button):playbackManager.play({items:[item],startPositionTicks:item.UserData&&"resume"===mode?item.UserData.PlaybackPositionTicks:0}))}function itemDetailPage(){var self=this;self.play=play,self.setInitialCollapsibleState=setInitialCollapsibleState,self.renderDetails=renderDetails,self.renderCriticReviews=renderCriticReviews,self.renderCast=renderCast,self.renderScenes=renderScenes,self.renderMediaSources=renderMediaSources}function onPlayClick(){var mode=this.getAttribute("data-mode");playCurrentItem(this,mode)}function onInstantMixClick(){playbackManager.instantMix(currentItem)}function onShuffleClick(){playbackManager.shuffle(currentItem)}function onDeleteClick(){require(["deleteHelper"],function(deleteHelper){deleteHelper.deleteItem({item:currentItem,navigate:!0})})}function onCancelSeriesTimerClick(){require(["recordingHelper"],function(recordingHelper){recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id,currentItem.ServerId).then(function(){Dashboard.navigate("livetv.html")})})}var currentItem,currentRecordingFields,_childrenItemsFunction=null;return window.ItemDetailPage=new itemDetailPage,function(view,params){function onPlayTrailerClick(){playTrailer(view)}function onMoreCommandsClick(){var button=this;itemContextMenu.show(getContextMenuOptions(currentItem,button)).then(function(result){result.deleted?Emby.Page.goHome():result.updated&&reload(view,params)})}function editImages(){return new Promise(function(resolve,reject){require(["imageEditor"],function(imageEditor){imageEditor.show({itemId:currentItem.Id,serverId:currentItem.ServerId}).then(resolve,reject)})})}function onWebSocketMessage(e,data){var msg=data;if("UserDataChanged"===msg.MessageType&¤tItem&&msg.Data.UserId==Dashboard.getCurrentUserId()){var key=currentItem.UserData.Key,userData=msg.Data.UserDataList.filter(function(u){return u.Key==key})[0];userData&&(currentItem.UserData=userData,reloadPlayButtons(view,currentItem),Dashboard.getCurrentUser().then(function(user){refreshImage(view,currentItem,user)}))}}var i,length,elems=view.querySelectorAll(".btnPlay");for(i=0,length=elems.length;i"}function renderSeriesTimerSchedule(page,seriesTimerId){ApiClient.getLiveTvTimers({UserId:ApiClient.getCurrentUserId(),ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb",SortBy:"StartDate",EnableTotalRecordCount:!1,EnableUserData:!1,SeriesTimerId:seriesTimerId,Fields:"ChannelInfo"}).then(function(result){result.Items.length&&result.Items[0].SeriesTimerId!=seriesTimerId&&(result.Items=[]);var html=getProgramScheduleHtml(result.Items),scheduleTab=page.querySelector(".seriesTimerSchedule");scheduleTab.innerHTML=html,imageLoader.lazyChildren(scheduleTab)})}function renderSeriesTimerEditor(page,item,user){if("SeriesTimer"===item.Type){if(!user.Policy.EnableLiveTvManagement)return page.querySelector(".seriesTimerScheduleSection").classList.add("hide"),void page.querySelector(".btnCancelSeriesTimer").classList.add("hide");require(["seriesRecordingEditor"],function(seriesRecordingEditor){seriesRecordingEditor.embed(item,ApiClient.serverId(),{context:page.querySelector(".seriesRecordingEditor")})}),page.querySelector(".seriesTimerScheduleSection").classList.remove("hide"),page.querySelector(".btnCancelSeriesTimer").classList.remove("hide"),renderSeriesTimerSchedule(page,item.Id)}}function reloadPlayButtons(page,item){var canPlay=!1;if("Program"==item.Type){var now=new Date;now>=datetime.parseISO8601Date(item.StartDate,!0)&&now0)}else hideAll(page,"btnPlay"),hideAll(page,"btnResume"),hideAll(page,"btnInstantMix"),hideAll(page,"btnShuffle");return canPlay}function reloadFromItem(page,params,item){currentItem=item;var context=params.context;LibraryBrowser.renderName(item,page.querySelector(".itemName"),!1,context),LibraryBrowser.renderParentName(item,page.querySelector(".parentName"),context),libraryMenu.setTitle(""),Dashboard.getCurrentUser().then(function(user){window.scrollTo(0,0),renderSeriesTimerEditor(page,item,user),renderImage(page,item,user),renderLogo(page,item,ApiClient),setInitialCollapsibleState(page,item,context,user),renderDetails(page,item,context),dom.getWindowSize().innerWidth>=800?backdrop.setBackdrops([item]):backdrop.clear(),LibraryBrowser.renderDetailPageBackdrop(page,item,imageLoader),libraryMenu.setTransparentMenu(!0);var canPlay=reloadPlayButtons(page,item),hasAnyButton=canPlay;(item.LocalTrailerCount||item.RemoteTrailers&&item.RemoteTrailers.length)&&"Full"==item.PlayAccess?(hideAll(page,"btnPlayTrailer",!0),hasAnyButton=!0):hideAll(page,"btnPlayTrailer"),item.CanDelete&&!item.IsFolder?(hideAll(page,"btnDeleteItem",!0),hasAnyButton=!0):hideAll(page,"btnDeleteItem"),renderSyncLocalContainer(page,params,user,item),hasAnyButton||"Program"!==item.Type?hideAll(page,"mainDetailButtons",!0):hideAll(page,"mainDetailButtons"),showRecordingFields(page,item,user);var groupedVersions=(item.MediaSources||[]).filter(function(g){return"Grouping"==g.Type});user.Policy.IsAdministrator&&groupedVersions.length?page.querySelector(".splitVersionContainer").classList.remove("hide"):page.querySelector(".splitVersionContainer").classList.add("hide"),itemContextMenu.getCommands(getContextMenuOptions(item)).then(function(commands){commands.length?hideAll(page,"btnMoreCommands",!0):hideAll(page,"btnMoreCommands")});var itemBirthday=page.querySelector("#itemBirthday");if("Person"==item.Type&&item.PremiereDate)try{var birthday=datetime.parseISO8601Date(item.PremiereDate,!0).toDateString();itemBirthday.classList.remove("hide"),itemBirthday.innerHTML=globalize.translate("BirthDateValue").replace("{0}",birthday)}catch(err){itemBirthday.classList.add("hide")}else itemBirthday.classList.add("hide");var itemDeathDate=page.querySelector("#itemDeathDate");if("Person"==item.Type&&item.EndDate)try{var deathday=datetime.parseISO8601Date(item.EndDate,!0).toDateString();itemDeathDate.classList.remove("hide"),itemDeathDate.innerHTML=globalize.translate("DeathDateValue").replace("{0}",deathday)}catch(err){itemDeathDate.classList.add("hide")}var itemBirthLocation=page.querySelector("#itemBirthLocation");if("Person"==item.Type&&item.ProductionLocations&&item.ProductionLocations.length){var gmap=''+item.ProductionLocations[0]+"";itemBirthLocation.classList.remove("hide"),itemBirthLocation.innerHTML=globalize.translate("BirthPlaceValue").replace("{0}",gmap)}else itemBirthLocation.classList.add("hide")}),setPeopleHeader(page,item),page.dispatchEvent(new CustomEvent("displayingitem",{detail:{item:item,context:context},bubbles:!0})),Dashboard.hideLoadingMsg()}function logoImageUrl(item,apiClient,options){return options=options||{},options.type="Logo",item.ImageTags&&item.ImageTags.Logo?(options.tag=item.ImageTags.Logo,apiClient.getScaledImageUrl(item.Id,options)):item.ParentLogoImageTag?(options.tag=item.ParentLogoImageTag,apiClient.getScaledImageUrl(item.ParentLogoItemId,options)):null}function renderLogo(page,item,apiClient){var url=logoImageUrl(item,apiClient,{maxWidth:300}),detailLogo=page.querySelector(".detailLogo");url?(detailLogo.classList.remove("hide"),detailLogo.classList.add("lazy"),detailLogo.setAttribute("data-src",url),imageLoader.lazyImage(detailLogo)):detailLogo.classList.add("hide")}function showRecordingFields(page,item,user){if(!currentRecordingFields){var recordingFieldsElement=page.querySelector(".recordingFields");"Program"==item.Type&&user.Policy.EnableLiveTvManagement?require(["recordingFields"],function(recordingFields){currentRecordingFields=new recordingFields({parent:recordingFieldsElement,programId:item.Id,serverId:item.ServerId}),recordingFieldsElement.classList.remove("hide")}):(recordingFieldsElement.classList.add("hide"),recordingFieldsElement.innerHTML="")}}function renderLinks(linksElem,item){var links=[];if(item.HomePageUrl&&links.push(''+globalize.translate("ButtonWebsite")+""),item.ExternalUrls)for(var i=0,length=item.ExternalUrls.length;i'+url.Name+"")}if(links.length){var html=links.join('');linksElem.innerHTML=html,linksElem.classList.remove("hide")}else linksElem.classList.add("hide")}function renderImage(page,item,user){var container=page.querySelector(".detailImageContainer");LibraryBrowser.renderDetailImage(container,item,user.Policy.IsAdministrator&&"Photo"!=item.MediaType,null,imageLoader,indicators)}function refreshDetailImageUserData(elem,item){var detailImageProgressContainer=elem.querySelector(".detailImageProgressContainer");detailImageProgressContainer.innerHTML=indicators.getProgressBarHtml(item)}function refreshImage(page,item,user){refreshDetailImageUserData(page.querySelector(".detailImageContainer"),item)}function setPeopleHeader(page,item){"Audio"==item.MediaType||"MusicAlbum"==item.Type||"Book"==item.MediaType||"Photo"==item.MediaType?page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderPeople"):page.querySelector("#peopleHeader").innerHTML=globalize.translate("HeaderCastAndCrew")}function renderNextUp(page,item,user){var section=page.querySelector(".nextUpSection");return"Series"!=item.Type?void section.classList.add("hide"):void ApiClient.getNextUpEpisodes({SeriesId:item.Id,UserId:user.Id}).then(function(result){result.Items.length?section.classList.remove("hide"):section.classList.add("hide");var html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(!1),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,overlayText:!0,lazy:!0,overlayPlayButton:!0}),itemsContainer=section.querySelector(".nextUpItems");itemsContainer.innerHTML=html,imageLoader.lazyChildren(itemsContainer)})}function setInitialCollapsibleState(page,item,context,user){page.querySelector(".collectionItems").innerHTML="","TvChannel"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderChannelGuide(page,item,user)):"Playlist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderPlaylistItems(page,item,user)):"Studio"==item.Type||"Person"==item.Type||"Genre"==item.Type||"MusicGenre"==item.Type||"GameGenre"==item.Type||"MusicArtist"==item.Type?(page.querySelector("#childrenCollapsible").classList.remove("hide"),renderItemsByName(page,item,user)):item.IsFolder||"Episode"==item.Type&&item.SeasonId&&item.SeriesId?("BoxSet"==item.Type&&page.querySelector("#childrenCollapsible").classList.add("hide"),renderChildren(page,item)):page.querySelector("#childrenCollapsible").classList.add("hide"),"Series"==item.Type&&renderSeriesSchedule(page,item,user),"Series"==item.Type?renderNextUp(page,item,user):page.querySelector(".nextUpSection").classList.add("hide"),item.MediaSources&&item.MediaSources.length&&renderMediaSources(page,user,item),renderScenes(page,item),item.SpecialFeatureCount&&0!=item.SpecialFeatureCount&&"Series"!=item.Type?(page.querySelector("#specialsCollapsible").classList.remove("hide"),renderSpecials(page,item,user,6)):page.querySelector("#specialsCollapsible").classList.add("hide"),item.People&&item.People.length?(page.querySelector("#castCollapsible").classList.remove("hide"),renderCast(page,item,context,enableScrollX()?null:12)):page.querySelector("#castCollapsible").classList.add("hide"),item.PartCount&&item.PartCount>1?(page.querySelector("#additionalPartsCollapsible").classList.remove("hide"),renderAdditionalParts(page,item,user)):page.querySelector("#additionalPartsCollapsible").classList.add("hide"),page.querySelector("#themeSongsCollapsible").classList.add("hide"),page.querySelector("#themeVideosCollapsible").classList.add("hide"),"MusicAlbum"==item.Type?renderMusicVideos(page,item,user):page.querySelector("#musicVideosCollapsible").classList.add("hide"),renderThemeMedia(page,item,user),enableScrollX()?renderCriticReviews(page,item):renderCriticReviews(page,item,1)}function renderOverview(elems,item){for(var i=0,length=elems.length;i'+text+"
":'
'+text+"
"}).join("");return view.querySelector(".mediaInfoIcons").innerHTML=html,html}function renderPhotoInfo(page,item){var html="",attributes=[];if(item.CameraMake&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraMake"),item.CameraMake)),item.CameraModel&&attributes.push(createAttribute(globalize.translate("MediaInfoCameraModel"),item.CameraModel)),item.Altitude&&attributes.push(createAttribute(globalize.translate("MediaInfoAltitude"),item.Altitude.toFixed(1))),item.Aperture&&attributes.push(createAttribute(globalize.translate("MediaInfoAperture"),"F"+item.Aperture.toFixed(1))),item.ExposureTime){var val=1/item.ExposureTime;attributes.push(createAttribute(globalize.translate("MediaInfoExposureTime"),"1/"+val+" s"))}item.FocalLength&&attributes.push(createAttribute(globalize.translate("MediaInfoFocalLength"),item.FocalLength.toFixed(1)+" mm")),item.ImageOrientation,item.IsoSpeedRating&&attributes.push(createAttribute(globalize.translate("MediaInfoIsoSpeedRating"),item.IsoSpeedRating)),item.Latitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLatitude"),item.Latitude.toFixed(1))),item.Longitude&&attributes.push(createAttribute(globalize.translate("MediaInfoLongitude"),item.Longitude.toFixed(1))),item.ShutterSpeed&&attributes.push(createAttribute(globalize.translate("MediaInfoShutterSpeed"),item.ShutterSpeed)),item.Software&&attributes.push(createAttribute(globalize.translate("MediaInfoSoftware"),item.Software)),html+=attributes.join("
"),page.querySelector(".photoInfoContent").innerHTML=html}function getArtistLinksHtml(artists,context){for(var html=[],i=0,length=artists.length;i'+artist.Name+"")}return html=html.join(" / "),1==artists.length?globalize.translate("ValueArtist",html):artists.length>1?globalize.translate("ValueArtists",html):html}function enableScrollX(){return browserInfo.mobile&&screen.availWidth<=1e3}function getPortraitShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowPortrait":"portrait"}function getSquareShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowSquare":"square"}function getThumbShape(scrollX){return null==scrollX&&(scrollX=enableScrollX()),scrollX?"overflowBackdrop":"backdrop"}function renderMoreFromItems(page,item){var moreFromSection=page.querySelector("#moreFromSection");if(moreFromSection)return"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length?void ApiClient.getItems(Dashboard.getCurrentUserId(),{IncludeItemTypes:"MusicAlbum",ArtistIds:item.AlbumArtists[0].Id,Recursive:!0,ExcludeItemIds:item.Id}).then(function(result){if(!result.Items.length)return void moreFromSection.classList.add("hide");moreFromSection.classList.remove("hide"),moreFromSection.querySelector(".moreFromHeader").innerHTML=globalize.translate("MoreFromValue",item.AlbumArtists[0].Name);var html="";html+=enableScrollX()?'
':'
';var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!supportsImageAnalysis,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
";var similarContent=page.querySelector("#moreFromItems");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)}):void moreFromSection.classList.add("hide")}function renderSimilarItems(page,item,context){var similarCollapsible=page.querySelector("#similarCollapsible");if(similarCollapsible){if("Movie"!=item.Type&&"Trailer"!=item.Type&&"Series"!=item.Type&&"Program"!=item.Type&&"Recording"!=item.Type&&"Game"!=item.Type&&"MusicAlbum"!=item.Type&&"MusicArtist"!=item.Type&&"ChannelVideoItem"!=item.Type)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var shape="MusicAlbum"==item.Type||"MusicArtist"==item.Type?getSquareShape():getPortraitShape(),options={userId:Dashboard.getCurrentUserId(),limit:"MusicAlbum"==item.Type||"MusicArtist"==item.Type?8:10,fields:"PrimaryImageAspectRatio,UserData,CanDelete"};"MusicAlbum"==item.Type&&item.AlbumArtists&&item.AlbumArtists.length&&(options.ExcludeArtistIds=item.AlbumArtists[0].Id),enableScrollX()&&(options.limit=12),ApiClient.getSimilarItems(item.Id,options).then(function(result){if(!result.Items.length)return void similarCollapsible.classList.add("hide");similarCollapsible.classList.remove("hide");var html="";html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis&&("MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type);html+=cardBuilder.getCardsHtml({items:result.Items,shape:shape,showParentTitle:"MusicAlbum"==item.Type,centerText:!cardLayout,showTitle:"MusicAlbum"==item.Type||"Game"==item.Type||"MusicArtist"==item.Type,context:context,lazy:!0,showDetailsMenu:!0,coverImage:"MusicAlbum"==item.Type||"MusicArtist"==item.Type,overlayPlayButton:!0,cardLayout:cardLayout,vibrant:cardLayout&&supportsImageAnalysis}),html+="
";var similarContent=similarCollapsible.querySelector(".similarContent");similarContent.innerHTML=html,imageLoader.lazyChildren(similarContent)})}}function renderSeriesAirTime(page,item,isStatic){var seriesAirTime=page.querySelector("#seriesAirTime");if("Series"!=item.Type)return void seriesAirTime.classList.add("hide");var html="";if(item.AirDays&&item.AirDays.length&&(html+=7==item.AirDays.length?"daily":item.AirDays.map(function(a){return a+"s"}).join(",")),item.AirTime&&(html+=" at "+item.AirTime),item.Studios.length)if(isStatic)html+=" on "+item.Studios[0].Name;else{var context=inferContext(item),href=LibraryBrowser.getHref(item.Studios[0],context);html+=' on '+item.Studios[0].Name+""}html?(html=("Ended"==item.Status?"Aired ":"Airs ")+html,seriesAirTime.innerHTML=html,seriesAirTime.classList.remove("hide")):seriesAirTime.classList.add("hide")}function renderTags(page,item){var itemTags=page.querySelector(".itemTags");if(item.Tags&&item.Tags.length){for(var html="",i=0,length=item.Tags.length;i'+item.Tags[i]+"
";itemTags.innerHTML=html,itemTags.classList.remove("hide")}else itemTags.classList.add("hide")}function getEpisodesFunction(seriesId,query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getEpisodes(seriesId,query)}}function getAlbumSongsFunction(query){return query=Object.assign({},query),function(index,limit,fields){return query.StartIndex=index,query.Limit=limit,query.Fields=fields,ApiClient.getItems(Dashboard.getCurrentUserId(),query)}}function renderChildren(page,item){_childrenItemsFunction=null;var fields="ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete",query={ParentId:item.Id,Fields:fields};"BoxSet"!==item.Type&&(query.SortBy="SortName");var promise,userId=Dashboard.getCurrentUserId();"Series"==item.Type?promise=ApiClient.getSeasons(item.Id,{userId:userId,Fields:fields}):"Season"==item.Type?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.Id,userId:userId,Fields:fields})):"Episode"==item.Type&&item.SeriesId&&item.SeasonId?(promise=ApiClient.getEpisodes(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields}),_childrenItemsFunction=getEpisodesFunction(item.SeriesId,{seasonId:item.SeasonId,userId:userId,Fields:fields})):"MusicAlbum"==item.Type&&(_childrenItemsFunction=getAlbumSongsFunction(query)),promise=promise||ApiClient.getItems(Dashboard.getCurrentUserId(),query),promise.then(function(result){var html="",scrollX=!1,isList=!1,scrollClass="hiddenScrollX",childrenItemsContainer=page.querySelector(".childrenItemsContainer");if("MusicAlbum"==item.Type)html=listView.getListViewHtml({items:result.Items,smallIcon:!0,showIndex:!0,index:"disc",showIndexNumber:!0,playFromHere:!0,action:"playallfromhere",image:!1,artist:"auto",containerAlbumArtist:item.AlbumArtist,addToListButton:!0}),isList=!0;else if("Series"==item.Type)scrollX=enableScrollX(),html=cardBuilder.getCardsHtml({items:result.Items,shape:getPortraitShape(),showTitle:!0,centerText:!0,lazy:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX});else if("Season"==item.Type||"Episode"==item.Type){if("Episode"===item.Type&&childrenItemsContainer.classList.add("darkScroller"),scrollX="Episode"==item.Type,browser.touch||(scrollClass="smoothScrollX"),1==result.Items.length&&"Episode"===item.Type)return;html=cardBuilder.getCardsHtml({items:result.Items,shape:getThumbShape(scrollX),showTitle:!0,displayAsSpecial:"Season"==item.Type&&item.IndexNumber,playFromHere:!0,overlayText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0,allowBottomPadding:!scrollX,includeParentInfoInTitle:!1})}else"GameSystem"==item.Type&&(html=cardBuilder.getCardsHtml({items:result.Items,shape:"auto",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0}));if(page.querySelector("#childrenCollapsible").classList.remove("hide"),scrollX?(childrenItemsContainer.classList.add(scrollClass),childrenItemsContainer.classList.remove("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list")):(childrenItemsContainer.classList.remove("hiddenScrollX"),childrenItemsContainer.classList.remove("smoothScrollX"),isList?(childrenItemsContainer.classList.add("vertical-list"),childrenItemsContainer.classList.remove("vertical-wrap")):(childrenItemsContainer.classList.add("vertical-wrap"),childrenItemsContainer.classList.remove("vertical-list"))),childrenItemsContainer.innerHTML=html,imageLoader.lazyChildren(childrenItemsContainer),"BoxSet"==item.Type){var collectionItemTypes=[{name:globalize.translate("HeaderMovies"),type:"Movie"},{name:globalize.translate("HeaderSeries"),type:"Series"},{name:globalize.translate("HeaderAlbums"),type:"MusicAlbum"},{name:globalize.translate("HeaderGames"),type:"Game"},{name:globalize.translate("HeaderBooks"),type:"Book"}];renderCollectionItems(page,item,collectionItemTypes,result.Items)}else if("Episode"===item.Type){var card=childrenItemsContainer.querySelector('.card[data-id="'+item.Id+'"]');card&&scrollHelper.toStart(childrenItemsContainer,card.previousSibling||card,!0)}}),"Season"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderEpisodes"):"Episode"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("MoreFromValue",item.SeasonName):"Series"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderSeasons"):"MusicAlbum"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderTracks"):"GameSystem"==item.Type?page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderGames"):page.querySelector("#childrenTitle").innerHTML=globalize.translate("HeaderItems"),"MusicAlbum"==item.Type?page.querySelector(".childrenSectionHeader",page).classList.add("hide"):page.querySelector(".childrenSectionHeader",page).classList.remove("hide")}function renderItemsByName(page,item,user){require("scripts/itembynamedetailpage".split(","),function(){window.ItemsByName.renderItems(page,item)})}function renderPlaylistItems(page,item,user){require("scripts/playlistedit".split(","),function(){PlaylistViewer.render(page,item)})}function renderChannelGuide(page,item,user){require("scripts/livetvchannel,scripts/livetvcomponents,livetvcss".split(","),function(liveTvChannelPage){liveTvChannelPage.renderPrograms(page,item.Id)})}function renderSeriesSchedule(page,item,user){}function inferContext(item){return"Movie"==item.Type||"BoxSet"==item.Type?"movies":"Series"==item.Type||"Season"==item.Type||"Episode"==item.Type?"tvshows":"Game"==item.Type||"GameSystem"==item.Type?"games":"Game"==item.Type||"GameSystem"==item.Type?"games":"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"music":null}function renderStudios(elem,item,isStatic){var context=inferContext(item);if(item.Studios&&item.Studios.length&&"Series"!=item.Type,1)elem.classList.add("hide");else{for(var html="",i=0,length=item.Studios.length;i0&&(html+="  /  "),isStatic)html+=item.Studios[i].Name;else{item.Studios[i].Type="Studio";var href=LibraryBrowser.getHref(item.Studios[i],context);html+=''+item.Studios[i].Name+""}var translationKey=item.Studios.length>1?"ValueStudios":"ValueStudio";html=globalize.translate(translationKey,html),elem.innerHTML=html,elem.classList.remove("hide")}}function renderGenres(elem,item,limit,isStatic){for(var context=inferContext(item),html="",genres=item.Genres||[],i=0,length=genres.length;i=limit);i++){i>0&&(html+='');var param="Audio"==item.Type||"MusicArtist"==item.Type||"MusicAlbum"==item.Type?"musicgenre":"genre";if("Game"==item.MediaType&&(param="gamegenre"),isStatic)html+=genres[i];else{var type;switch(context){case"tvshows":type="Series";break;case"games":type="Game";break;case"music":type="MusicAlbum";break;default:type="Movie"}var url="secondaryitems.html?type="+type+"&"+param+"="+ApiClient.encodeName(genres[i]);html+=''+genres[i]+""}}elem.innerHTML=html}function renderAwardSummary(elem,item){item.AwardSummary?(elem.classList.remove("hide"),elem.innerHTML=globalize.translate("ValueAwards",item.AwardSummary)):elem.classList.add("hide")}function renderCollectionItems(page,parentItem,types,items){page.querySelector(".collectionItems").innerHTML="";var i,length;for(i=0,length=types.length;i",html+="",html+='',html+="
",html+='
';var shape="MusicAlbum"==type.type?getSquareShape(!1):getPortraitShape(!1);html+=cardBuilder.getCardsHtml({items:items,shape:shape,showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayMoreButton:!0,showAddToCollection:!1,showRemoveFromCollection:!0,collectionId:parentItem.Id}),html+="
",html+="
"; +var collectionItems=page.querySelector(".collectionItems");collectionItems.insertAdjacentHTML("beforeend",html),imageLoader.lazyChildren(collectionItems),collectionItems.querySelector(".btnAddToCollection").addEventListener("click",function(){require(["alert"],function(alert){alert({text:globalize.translate("AddItemToCollectionHelp"),html:globalize.translate("AddItemToCollectionHelp")+'

'+globalize.translate("ButtonLearnMore")+""})})})}function renderUserDataIcons(page,item){for(var userDataIcons=page.querySelectorAll(".userDataIcons"),i=0,length=userDataIcons.length;i',html+='
',null!=review.Score||null!=review.Likes&&(html+=review.Likes?"
":"
"),html+='
',html+='

'+review.Caption+"

";var vals=[];if(review.ReviewerName&&vals.push(review.ReviewerName),review.Publisher&&vals.push(review.Publisher),html+='
'+vals.join(", ")+".",review.Date)try{var date=datetime.toLocaleDateString(datetime.parseISO8601Date(review.Date,!0));html+=''+date+""}catch(error){}html+="
",review.Url&&(html+='"),html+="
",html+="
",html+="
"}limit&&result.TotalRecordCount>limit&&(html+='

");var criticReviewsContent=page.querySelector("#criticReviewsContent");criticReviewsContent.innerHTML=html,enableScrollX()?criticReviewsContent.classList.add("hiddenScrollX"):criticReviewsContent.classList.remove("hiddenScrollX")}function renderThemeMedia(page,item){"SeriesTimer"!==item.Type&&"Timer"!==item.Type&&"Genre"!==item.Type&&"MusicGenre"!==item.Type&&"GameGenre"!==item.Type&&"Studio"!==item.Type&&"Person"!==item.Type&&ApiClient.getThemeMedia(Dashboard.getCurrentUserId(),item.Id,!0).then(function(result){var themeSongs=result.ThemeSongsResult.OwnerId==item.Id?result.ThemeSongsResult.Items:[],themeVideos=result.ThemeVideosResult.OwnerId==item.Id?result.ThemeVideosResult.Items:[];renderThemeSongs(page,themeSongs),renderThemeVideos(page,themeVideos)})}function renderThemeSongs(page,items){if(items.length){page.querySelector("#themeSongsCollapsible").classList.remove("hide");var html=listView.getListViewHtml({items:items});page.querySelector("#themeSongsContent").innerHTML=html}else page.querySelector("#themeSongsCollapsible").classList.add("hide")}function renderThemeVideos(page,items,user){if(items.length){page.querySelector("#themeVideosCollapsible").classList.remove("hide");var themeVideosContent=page.querySelector("#themeVideosContent");themeVideosContent.innerHTML=getVideosHtml(items,user),imageLoader.lazyChildren(themeVideosContent)}else page.querySelector("#themeVideosCollapsible").classList.add("hide")}function renderMusicVideos(page,item,user){ApiClient.getItems(user.Id,{SortBy:"SortName",SortOrder:"Ascending",IncludeItemTypes:"MusicVideo",Recursive:!0,Fields:"DateCreated,CanDelete",Albums:item.Name}).then(function(result){if(result.Items.length){page.querySelector("#musicVideosCollapsible").classList.remove("hide");var musicVideosContent=page.querySelector(".musicVideosContent");musicVideosContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(musicVideosContent)}else page.querySelector("#musicVideosCollapsible").classList.add("hide")})}function renderAdditionalParts(page,item,user){ApiClient.getAdditionalVideoParts(user.Id,item.Id).then(function(result){if(result.Items.length){page.querySelector("#additionalPartsCollapsible").classList.remove("hide");var additionalPartsContent=page.querySelector("#additionalPartsContent");additionalPartsContent.innerHTML=getVideosHtml(result.Items,user),imageLoader.lazyChildren(additionalPartsContent)}else page.querySelector("#additionalPartsCollapsible").classList.add("hide")})}function renderScenes(page,item){var chapters=item.Chapters||[];if(chapters.length&&!chapters[0].ImageTag&&(chapters=[]),chapters.length){page.querySelector("#scenesCollapsible").classList.remove("hide");var scenesContent=page.querySelector("#scenesContent");enableScrollX()?scenesContent.classList.add("smoothScrollX"):scenesContent.classList.add("vertical-wrap"),require(["chaptercardbuilder"],function(chaptercardbuilder){chaptercardbuilder.buildChapterCards(item,chapters,{itemsContainer:scenesContent,coverImage:!0,width:400,backdropShape:getThumbShape(),squareShape:getSquareShape()})})}else page.querySelector("#scenesCollapsible").classList.add("hide")}function renderMediaSources(page,user,item){var html=item.MediaSources.map(function(v){return getMediaSourceHtml(user,item,v)}).join('
');item.MediaSources.length>1&&(html="
"+html);var mediaInfoContent=page.querySelector("#mediaInfoContent");mediaInfoContent.innerHTML=html}function getMediaSourceHtml(user,item,version){var html="";version.Name&&item.MediaSources.length>1&&(html+='
'+version.Name+"

");for(var i=0,length=version.MediaStreams.length;i';var displayType=globalize.translate("MediaInfoStreamType"+stream.Type);html+='

'+displayType+"

";var attributes=[];stream.Language&&"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoLanguage"),stream.Language)),stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoCodec"),stream.Codec.toUpperCase())),stream.CodecTag&&attributes.push(createAttribute(globalize.translate("MediaInfoCodecTag"),stream.CodecTag)),null!=stream.IsAVC&&attributes.push(createAttribute("AVC",stream.IsAVC?"Yes":"No")),stream.Profile&&attributes.push(createAttribute(globalize.translate("MediaInfoProfile"),stream.Profile)),stream.Level&&attributes.push(createAttribute(globalize.translate("MediaInfoLevel"),stream.Level)),(stream.Width||stream.Height)&&attributes.push(createAttribute(globalize.translate("MediaInfoResolution"),stream.Width+"x"+stream.Height)),stream.AspectRatio&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoAspectRatio"),stream.AspectRatio)),"Video"==stream.Type&&(null!=stream.IsAnamorphic&&attributes.push(createAttribute(globalize.translate("MediaInfoAnamorphic"),stream.IsAnamorphic?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoInterlaced"),stream.IsInterlaced?"Yes":"No"))),(stream.AverageFrameRate||stream.RealFrameRate)&&attributes.push(createAttribute(globalize.translate("MediaInfoFramerate"),stream.AverageFrameRate||stream.RealFrameRate)),stream.ChannelLayout&&attributes.push(createAttribute(globalize.translate("MediaInfoLayout"),stream.ChannelLayout)),stream.Channels&&attributes.push(createAttribute(globalize.translate("MediaInfoChannels"),stream.Channels+" ch")),stream.BitRate&&"mjpeg"!=stream.Codec&&attributes.push(createAttribute(globalize.translate("MediaInfoBitrate"),parseInt(stream.BitRate/1e3)+" kbps")),stream.SampleRate&&attributes.push(createAttribute(globalize.translate("MediaInfoSampleRate"),stream.SampleRate+" Hz")),stream.BitDepth&&attributes.push(createAttribute(globalize.translate("MediaInfoBitDepth"),stream.BitDepth+" bit")),stream.PixelFormat&&attributes.push(createAttribute(globalize.translate("MediaInfoPixelFormat"),stream.PixelFormat)),stream.RefFrames&&attributes.push(createAttribute(globalize.translate("MediaInfoRefFrames"),stream.RefFrames)),stream.NalLengthSize&&attributes.push(createAttribute("NAL",stream.NalLengthSize)),"Video"!=stream.Type&&attributes.push(createAttribute(globalize.translate("MediaInfoDefault"),stream.IsDefault?"Yes":"No")),"Subtitle"==stream.Type&&(attributes.push(createAttribute(globalize.translate("MediaInfoForced"),stream.IsForced?"Yes":"No")),attributes.push(createAttribute(globalize.translate("MediaInfoExternal"),stream.IsExternal?"Yes":"No"))),"Video"==stream.Type&&version.Timestamp&&attributes.push(createAttribute(globalize.translate("MediaInfoTimestamp"),version.Timestamp)),stream.DisplayTitle&&attributes.push(createAttribute("Title",stream.DisplayTitle)),html+=attributes.join("
"),html+="
"}}if(version.Container&&(html+='
'+globalize.translate("MediaInfoContainer")+''+version.Container+"
"),version.Formats&&version.Formats.length,version.Path&&"Http"!=version.Protocol&&user&&user.Policy.IsAdministrator&&(html+='
'+globalize.translate("MediaInfoPath")+''+version.Path+"
"),version.Size){var size=(version.Size/1048576).toFixed(0);html+='
'+globalize.translate("MediaInfoSize")+''+size+" MB
"}return html}function createAttribute(label,value){return''+label+''+value+""}function getVideosHtml(items,user,limit,moreButtonClass){var html=cardBuilder.getCardsHtml({items:items,shape:"auto",showTitle:!0,action:"play",overlayText:!0,showRuntime:!0});return limit&&items.length>limit&&(html+='

"),html}function renderSpecials(page,item,user,limit){ApiClient.getSpecialFeatures(user.Id,item.Id).then(function(specials){var specialsContent=page.querySelector("#specialsContent");specialsContent.innerHTML=getVideosHtml(specials,user,limit,"moreSpecials"),imageLoader.lazyChildren(specialsContent)})}function renderCast(page,item,context,limit,isStatic){var people=item.People||[],castContent=page.querySelector("#castContent");enableScrollX()?(castContent.classList.add("smoothScrollX"),limit=32):castContent.classList.add("vertical-wrap");var limitExceeded=limit&&people.length>limit;limitExceeded&&(people=people.slice(0),people.length=Math.min(limit,people.length)),require(["peoplecardbuilder"],function(peoplecardbuilder){peoplecardbuilder.buildPeopleCards(people,{itemsContainer:castContent,coverImage:!0,serverId:item.ServerId,width:160,shape:getPortraitShape()})});var morePeopleButton=page.querySelector(".morePeople");morePeopleButton&&(limitExceeded&&!enableScrollX()?morePeopleButton.classList.remove("hide"):morePeopleButton.classList.add("hide"))}function play(startPosition){playbackManager.play({items:[currentItem],startPositionTicks:startPosition})}function splitVersions(page,params){require(["confirm"],function(confirm){confirm("Are you sure you wish to split the media sources into separate items?","Split Media Apart").then(function(){Dashboard.showLoadingMsg(),ApiClient.ajax({type:"DELETE",url:ApiClient.getUrl("Videos/"+params.id+"/AlternateSources")}).then(function(){Dashboard.hideLoadingMsg(),reload(page,params)})})})}function playTrailer(page){playbackManager.playTrailers(currentItem)}function showPlayMenu(item,target){require(["playMenu"],function(playMenu){playMenu.show({item:item,positionTo:target})})}function playCurrentItem(button,mode){var item=currentItem;return"Program"===item.Type?void ApiClient.getLiveTvChannel(item.ChannelId,Dashboard.getCurrentUserId()).then(function(channel){playbackManager.play({items:[channel]})}):void("playmenu"===mode?showPlayMenu(item,button):playbackManager.play({items:[item],startPositionTicks:item.UserData&&"resume"===mode?item.UserData.PlaybackPositionTicks:0}))}function itemDetailPage(){var self=this;self.play=play,self.setInitialCollapsibleState=setInitialCollapsibleState,self.renderDetails=renderDetails,self.renderCriticReviews=renderCriticReviews,self.renderCast=renderCast,self.renderScenes=renderScenes,self.renderMediaSources=renderMediaSources}function onPlayClick(){var mode=this.getAttribute("data-mode");playCurrentItem(this,mode)}function onInstantMixClick(){playbackManager.instantMix(currentItem)}function onShuffleClick(){playbackManager.shuffle(currentItem)}function onDeleteClick(){require(["deleteHelper"],function(deleteHelper){deleteHelper.deleteItem({item:currentItem,navigate:!0})})}function onCancelSeriesTimerClick(){require(["recordingHelper"],function(recordingHelper){recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id,currentItem.ServerId).then(function(){Dashboard.navigate("livetv.html")})})}var currentItem,currentRecordingFields,_childrenItemsFunction=null;return window.ItemDetailPage=new itemDetailPage,function(view,params){function onPlayTrailerClick(){playTrailer(view)}function onMoreCommandsClick(){var button=this;itemContextMenu.show(getContextMenuOptions(currentItem,button)).then(function(result){result.deleted?Emby.Page.goHome():result.updated&&reload(view,params)})}function editImages(){return new Promise(function(resolve,reject){require(["imageEditor"],function(imageEditor){imageEditor.show({itemId:currentItem.Id,serverId:currentItem.ServerId}).then(resolve,reject)})})}function onWebSocketMessage(e,data){var msg=data;if("UserDataChanged"===msg.MessageType&¤tItem&&msg.Data.UserId==Dashboard.getCurrentUserId()){var key=currentItem.UserData.Key,userData=msg.Data.UserDataList.filter(function(u){return u.Key==key})[0];userData&&(currentItem.UserData=userData,reloadPlayButtons(view,currentItem),Dashboard.getCurrentUser().then(function(user){refreshImage(view,currentItem,user)}))}}var i,length,elems=view.querySelectorAll(".btnPlay");for(i=0,length=elems.length;i Date: Fri, 3 Feb 2017 16:00:42 -0500 Subject: [PATCH 16/19] update card styles --- .../bower_components/emby-webcomponents/alphapicker/style.css | 2 +- .../bower_components/emby-webcomponents/appsettings.js | 2 +- .../bower_components/emby-webcomponents/cardbuilder/card.css | 2 +- .../emby-webcomponents/cardbuilder/cardbuilder.js | 4 ++-- .../bower_components/emby-webcomponents/flexstyles.css | 1 + .../bower_components/emby-webcomponents/scrollstyles.css | 2 +- .../emby-webcomponents/slideshow/slideshow.js | 2 +- .../bower_components/emby-webcomponents/slideshow/style.css | 2 +- .../bower_components/emby-webcomponents/sync/syncjoblist.js | 2 +- dashboard-ui/components/apphost.js | 2 +- dashboard-ui/css/site.css | 2 +- dashboard-ui/mysyncsettings.html | 2 +- 12 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/flexstyles.css diff --git a/dashboard-ui/bower_components/emby-webcomponents/alphapicker/style.css b/dashboard-ui/bower_components/emby-webcomponents/alphapicker/style.css index 07aee4540e..8e6e8441a7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/alphapicker/style.css +++ b/dashboard-ui/bower_components/emby-webcomponents/alphapicker/style.css @@ -1 +1 @@ -.alphaPicker,.alphaPickerRow{-webkit-box-direction:normal}.alphaPicker{text-align:center;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;flex-direction:column}.alphaPickerRow{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-orient:horizontal;-webkit-flex-direction:row;flex-direction:row}.alphaPicker-vertical .alphaPickerRow{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}.alphaPickerButton{background:0 0;border:0!important;cursor:pointer;outline:0!important;color:inherit;vertical-align:middle;font-family:inherit;font-size:inherit;min-width:initial;margin:0;padding:.1em .4em;width:auto;-webkit-border-radius:.1em;border-radius:.1em;font-weight:400;opacity:.6;-webkit-flex-shrink:0;flex-shrink:0;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}.alphaPicker-vertical .alphaPickerButton{padding:.2em .4em}.alphaPickerButtonIcon{width:3.3vh;height:3.3vh;font-size:3.3vh}.alphaPickerButton-selected{color:#000;background-color:#bbb;opacity:1}.layout-tv .alphaPickerButton:focus{background-color:#52B54B;opacity:1;color:#fff} \ No newline at end of file +.alphaPicker,.alphaPickerRow{-webkit-box-direction:normal}.alphaPicker{text-align:center;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;flex-direction:column;-webkit-align-self:center;align-self:center}.alphaPickerRow{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-orient:horizontal;-webkit-flex-direction:row;flex-direction:row}.alphaPicker-vertical{font-size:90%}.alphaPicker-vertical .alphaPickerRow{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}.alphaPickerButton{background:0 0;border:0!important;cursor:pointer;outline:0!important;color:inherit;vertical-align:middle;font-family:inherit;font-size:inherit;min-width:initial;margin:0;padding:.1em .4em;width:auto;-webkit-border-radius:.1em;border-radius:.1em;font-weight:400;opacity:.5;-webkit-flex-shrink:0;flex-shrink:0;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}.alphaPicker-vertical .alphaPickerButton{padding:0;width:1.5em}.alphaPickerButtonIcon{width:3.3vh;height:3.3vh;font-size:3.3vh}.alphaPickerButton-selected{opacity:1}.layout-tv .alphaPickerButton:focus{background-color:#52B54B;opacity:1;color:#fff} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/appsettings.js b/dashboard-ui/bower_components/emby-webcomponents/appsettings.js index 1e9383411d..1b1bcb7ab2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/appsettings.js +++ b/dashboard-ui/bower_components/emby-webcomponents/appsettings.js @@ -1 +1 @@ -define(["appStorage","events"],function(appStorage,events){"use strict";function getKey(name,userId){return userId&&(name=userId+"-"+name),name}function AppSettings(){var self=this;self.enableAutoLogin=function(val){return null!=val&&self.set("enableAutoLogin",val.toString()),"false"!==self.get("enableAutoLogin")},self.enableAutomaticBitrateDetection=function(val){return null!=val&&self.set("enableAutomaticBitrateDetection",val.toString()),"false"!==self.get("enableAutomaticBitrateDetection")},self.maxStreamingBitrate=function(val){return null!=val&&self.set("preferredVideoBitrate",val),parseInt(self.get("preferredVideoBitrate")||"0")||15e5},self.maxStaticMusicBitrate=function(val){void 0!==val&&self.set("maxStaticMusicBitrate",val);var defaultValue=384e3;return parseInt(self.get("maxStaticMusicBitrate")||defaultValue.toString())||defaultValue},self.maxChromecastBitrate=function(val){return null!=val&&self.set("chromecastBitrate1",val),val=self.get("chromecastBitrate1"),val?parseInt(val):null},self.syncOnlyOnWifi=function(val){return null!=val&&self.set("syncOnlyOnWifi",val.toString()),"false"!==self.get("syncOnlyOnWifi")},self.syncPath=function(val){return null!=val&&self.set("syncPath",val),self.get("syncPath")},self.cameraUploadServers=function(val){return null!=val&&self.set("cameraUploadServers",val.join(",")),val=self.get("cameraUploadServers"),val?val.split(","):[]},self.set=function(name,value,userId){var currentValue=self.get(name,userId);appStorage.setItem(getKey(name,userId),value),currentValue!==value&&events.trigger(self,"change",[name])},self.get=function(name,userId){return appStorage.getItem(getKey(name,userId))}}return new AppSettings}); \ No newline at end of file +define(["appStorage","events"],function(appStorage,events){"use strict";function getKey(name,userId){return userId&&(name=userId+"-"+name),name}function AppSettings(){var self=this;self.enableAutoLogin=function(val){return null!=val&&self.set("enableAutoLogin",val.toString()),"false"!==self.get("enableAutoLogin")},self.enableAutomaticBitrateDetection=function(val){return null!=val&&self.set("enableAutomaticBitrateDetection",val.toString()),"false"!==self.get("enableAutomaticBitrateDetection")},self.maxStreamingBitrate=function(val){return null!=val&&self.set("preferredVideoBitrate",val),parseInt(self.get("preferredVideoBitrate")||"0")||15e5},self.maxStaticMusicBitrate=function(val){void 0!==val&&self.set("maxStaticMusicBitrate",val);var defaultValue=32e4;return parseInt(self.get("maxStaticMusicBitrate")||defaultValue.toString())||defaultValue},self.maxChromecastBitrate=function(val){return null!=val&&self.set("chromecastBitrate1",val),val=self.get("chromecastBitrate1"),val?parseInt(val):null},self.syncOnlyOnWifi=function(val){return null!=val&&self.set("syncOnlyOnWifi",val.toString()),"false"!==self.get("syncOnlyOnWifi")},self.syncPath=function(val){return null!=val&&self.set("syncPath",val),self.get("syncPath")},self.cameraUploadServers=function(val){return null!=val&&self.set("cameraUploadServers",val.join(",")),val=self.get("cameraUploadServers"),val?val.split(","):[]},self.set=function(name,value,userId){var currentValue=self.get(name,userId);appStorage.setItem(getKey(name,userId),value),currentValue!==value&&events.trigger(self,"change",[name])},self.get=function(name,userId){return appStorage.getItem(getKey(name,userId))}}return new AppSettings}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css index 44230b821c..09fb1ad7e7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css @@ -1 +1 @@ -.card,.cardImageContainer-button,.textActionButton{cursor:pointer;outline:0!important}button::-moz-focus-inner{padding:0;border:0}button{-webkit-border-fit:border!important}.card{border:0;font-size:inherit!important;font-family:inherit!important;text-transform:none;background:0 0!important;margin:0;padding:0;display:block;color:inherit!important;contain:style;-webkit-flex-shrink:0;flex-shrink:0;font-weight:inherit!important}.itemsContainer,.vertical-list{display:-webkit-box;display:-webkit-flex}.itemsContainer{display:flex}.vertical-list{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.mediaSourceIndicator,.vertical-wrap{display:-webkit-box;display:-webkit-flex}.vertical-wrap{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap}.vertical-wrap.centered{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.vertical-wrap>.card{contain:layout style}.cardScalable{position:relative}.cardPadder-backdrop,.cardPadder-overflowBackdrop,.cardPadder-overflowSmallBackdrop,.cardPadder-smallBackdrop{padding-bottom:56.25%}.cardPadder-overflowSquare,.cardPadder-square{padding-bottom:100%}.cardPadder-overflowPortrait,.cardPadder-portrait{padding-bottom:150%}.cardPadder-banner{padding-bottom:18.5%}.cardBox{padding:0!important;margin:2px;-webkit-transition:none;-o-transition:none;transition:none;border:3px solid transparent;background-color:transparent}.cardBox-focustransform{will-change:transform}.cardBox-focustransform-transition{will-change:transform;-webkit-transition:-webkit-transform .2s ease-out;-o-transition:transform .2s ease-out;transition:transform .2s ease-out}.card-focusscale:focus>.cardBox-focustransform{-webkit-transform:scale(1.16,1.16);transform:scale(1.16,1.16)}.card:focus{position:relative!important;z-index:10!important;font-weight:inherit!important}.card:focus .cardBox{border-color:transparent}.cardBox-bottompadded{margin-bottom:1em}.btnCardOptions{position:absolute;bottom:.25em;right:0;margin:0!important;z-index:1}.mediaSourceIndicator{display:flex;position:absolute;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;top:.3em;left:.3em;text-align:center;vertical-align:middle;width:24px;height:24px;-webkit-border-radius:50%;border-radius:50%;color:#fff;background:#38c}.cardText,.innerCardFooter{overflow:hidden;text-align:left}.cardImageContainer{-webkit-background-size:contain;background-size:contain;background-repeat:no-repeat;background-position:center center;display:-webkit-flex;display:-webkit-box;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;-webkit-background-clip:content-box!important;background-clip:content-box!important;color:#fff;height:100%}.chapterCardImageContainer{background-color:#000;-webkit-border-radius:0;border-radius:0}.cardImageContainer-button{border:0;padding:0;background-color:transparent;-webkit-box-sizing:content-box;box-sizing:content-box}.forceRelative{position:relative}.cardContent,.cardImage{position:absolute;top:0;left:0;right:0;bottom:0}.cardContent{overflow:hidden;display:block;height:100%}.cardImage{-webkit-background-size:contain;background-size:contain;background-repeat:no-repeat;background-position:center bottom}.cardImage-img{max-height:100%;max-width:100%;min-height:70%;min-width:70%;margin:auto}.coveredImage-img{width:100%;height:100%}.coveredImage-noscale-img{max-height:none;max-width:none}.coveredImage{-webkit-background-size:100% 100%;background-size:100% 100%;background-position:center center}.coveredImage-noScale{-webkit-background-size:cover;background-size:cover}.cardFooter{padding:.5em .3em;position:relative}.visualCardBox-cardFooter,.visualCardBox-cardScalable{background-color:#222326}.visualCardBox-cardFooter{-webkit-border-bottom-left-radius:1px;border-bottom-left-radius:1px;-webkit-border-bottom-right-radius:1px;border-bottom-right-radius:1px}.innerCardFooter{background:rgba(0,0,0,.7);position:absolute;bottom:0;left:0;z-index:1;max-width:100%;color:#fff}.innerCardFooterClear{background-color:transparent}.fullInnerCardFooter{right:0}.cardText{padding:.35em .5em;white-space:nowrap;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:inherit}.cardDefaultText,.cardTextCentered{text-align:center}.singleCardText{padding:.5em}.cardText-secondary{opacity:.6}.cardText-rightmargin{margin-right:2em}.cardDefaultText{white-space:normal}.textActionButton{background:0 0;border:0!important;padding:0!important;color:inherit;vertical-align:middle;font-family:inherit;font-size:inherit}.textActionButton:hover{text-decoration:underline;opacity:1}.cardFooterLogo{margin-right:1em}.cardImageIcon{width:12vh;height:12vh;font-size:12vh;color:#fff}.cardIndicators{right:2.5%;top:2.5%;position:absolute;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.portraitCardIndicators{right:3%;top:2%}.backdropCardIndicators{right:1.5%;top:2.8%}.cardOverlayButton{color:#fff!important;background-color:rgba(0,0,0,.8)!important;-webkit-border-radius:500px;border-radius:500px;position:absolute;bottom:0;right:0;margin:0 .35em .5em 0;z-index:1;padding:6px}.cardOverlayButton:hover{background-color:rgba(0,0,0,.9)!important;-webkit-transition:background-color .5s ease-out;-o-transition:background-color .5s ease-out;transition:background-color .5s ease-out}.defaultCardColor1{background-color:#009688}.defaultCardColor2{background-color:#D32F2F}.defaultCardColor3{background-color:#0288D1}.defaultCardColor4{background-color:#388E3C}.defaultCardColor5{background-color:#F57F17}.backdropCard-scalable,.bannerCard-scalable{width:100%}.smallBackdropCard-scalable,.squareCard-scalable{width:50%}.portraitCard-scalable{width:33.333333333333333333333333333333%}.overflowPortraitCard-scalable{width:42%;max-width:200px}.overflowBackdropCard-scalable{width:72%;max-width:400px}.overflowSmallBackdropCard-scalable{width:60%}.overflowSquareCard-scalable{width:42%;max-width:200px}@media all and (min-width:400px){.backdropCard-scalable{width:50%}}@media all and (min-width:500px){.smallBackdropCard-scalable,.squareCard-scalable{width:33.333333333333333333333333333333%}}@media all and (min-width:540px){.overflowPortraitCard-scalable{width:30%}.overflowBackdropCard-scalable{width:64%}.overflowSquareCard-scalable{width:30%}.overflowSmallBackdropCard-scalable{width:40%}}@media all and (min-width:640px){.portraitCard-scalable{width:25%}.overflowBackdropCard-scalable{width:56%}.overflowSmallBackdropCard-scalable{width:40%}}@media all and (min-width:700px){.squareCard-scalable{width:25%}}@media all and (min-width:770px){.backdropCard-scalable{width:33.333333333333333333333333333333%}.overflowSmallBackdropCard-scalable{width:30%}}@media all and (min-width:800px){.bannerCard-scalable{width:50%}.portraitCard-scalable{width:20%}.smallBackdropCard-scalable{width:25%}}@media all and (min-width:900px){.squareCard-scalable{width:20%}}@media all and (min-width:1000px){.smallBackdropCard-scalable{width:20%}.overflowPortraitCard-scalable{width:22%}.overflowBackdropCard-scalable{width:40%}.overflowSmallBackdropCard-scalable{width:24%}.overflowSquareCard-scalable{width:22%}}@media all and (min-width:1200px){.backdropCard-scalable{width:25%}.squareCard-scalable{width:16.666666666666666666666666666667%}.bannerCard-scalable{width:33.333333333333333333333333333333%}.portraitCard-scalable,.smallBackdropCard-scalable{width:16.666666666666666666666666666667%}.overflowSmallBackdropCard-scalable{width:18%}}@media all and (min-width:1400px){.portraitCard-scalable,.smallBackdropCard-scalable,.squareCard-scalable{width:14.285714285714285714285714285714%}}@media all and (min-width:1600px){.portraitCard-scalable,.smallBackdropCard-scalable{width:12.5%}.backdropCard-scalable{width:20%}.squareCard-scalable{width:12.5%}}@media all and (min-width:1800px){.smallBackdropCard-scalable{width:10%}}@media all and (min-width:1920px){.squareCard-scalable{width:11.111111111111111111111111111111%}.smallBackdropCard-scalable{width:10%}}@media all and (min-width:2100px){.backdropCard-scalable{width:20%}.portraitCard-scalable{width:11.111111111111111111111111111111%}}@media all and (min-width:2200px){.bannerCard-scalable{width:25%}.portraitCard-scalable{width:10%}}@media all and (min-width:2500px){.backdropCard-scalable{width:16.666666666666666666666666666667%}}.layout-tv .backdropCard-scalable{width:25%}.layout-tv .portraitCard-scalable,.layout-tv .squareCard-scalable{width:16.66666666666666667%}@media all and (min-width:1600px){.layout-tv .backdropCard-scalable{width:25%}} \ No newline at end of file +.card,.card:focus{font-weight:inherit!important}.card,.cardImageContainer-button,.textActionButton{cursor:pointer;outline:0!important}button::-moz-focus-inner{padding:0;border:0}button{-webkit-border-fit:border!important}.card{border:0;font-size:inherit!important;font-family:inherit!important;text-transform:none;background:0 0!important;margin:0;padding:0;display:block;color:inherit!important;contain:style;-webkit-flex-shrink:0;flex-shrink:0}.itemsContainer,.vertical-list{display:-webkit-box;display:-webkit-flex}.itemsContainer{display:flex}.vertical-list{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.mediaSourceIndicator,.vertical-wrap{display:-webkit-box;display:-webkit-flex}.vertical-wrap{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap}.vertical-wrap.centered{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.vertical-wrap>.card{contain:layout style}.cardScalable{position:relative}.cardPadder-backdrop,.cardPadder-overflowBackdrop,.cardPadder-overflowSmallBackdrop,.cardPadder-smallBackdrop{padding-bottom:56.25%}.cardPadder-overflowSquare,.cardPadder-square{padding-bottom:100%}.cardPadder-overflowPortrait,.cardPadder-portrait{padding-bottom:150%}.cardPadder-banner{padding-bottom:18.5%}.cardBox{padding:0!important;margin:5px;-webkit-transition:none;-o-transition:none;transition:none;border:0 solid transparent;background-color:transparent}.cardBox-focustransform{will-change:transform}.cardBox-focustransform-transition{will-change:transform;-webkit-transition:-webkit-transform .2s ease-out;-o-transition:transform .2s ease-out;transition:transform .2s ease-out}.card-focusscale:focus>.cardBox-focustransform{-webkit-transform:scale(1.16,1.16);transform:scale(1.16,1.16)}.card:focus{position:relative!important;z-index:10!important}.card:focus .cardBox{margin:2px;border-width:3px;border-color:transparent}.cardBox-bottompadded{margin-bottom:1em}.btnCardOptions{position:absolute;bottom:.25em;right:0;margin:0!important;z-index:1}.mediaSourceIndicator{display:flex;position:absolute;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;top:.3em;left:.3em;text-align:center;vertical-align:middle;width:24px;height:24px;-webkit-border-radius:50%;border-radius:50%;color:#fff;background:#38c}.cardText,.innerCardFooter{overflow:hidden;text-align:left}.cardImageContainer{-webkit-background-size:contain;background-size:contain;background-repeat:no-repeat;background-position:center center;display:-webkit-flex;display:-webkit-box;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;-webkit-background-clip:content-box!important;background-clip:content-box!important;color:#fff;height:100%}.chapterCardImageContainer{background-color:#000;-webkit-border-radius:0;border-radius:0}.cardImageContainer-button{border:0;padding:0;background-color:transparent;-webkit-box-sizing:content-box;box-sizing:content-box}.forceRelative{position:relative}.cardContent,.cardImage{position:absolute;top:0;left:0;right:0;bottom:0}.cardContent{overflow:hidden;display:block;height:100%}.cardImage{-webkit-background-size:contain;background-size:contain;background-repeat:no-repeat;background-position:center bottom}.cardImage-img{max-height:100%;max-width:100%;min-height:70%;min-width:70%;margin:auto}.coveredImage-img{width:100%;height:100%}.coveredImage-noscale-img{max-height:none;max-width:none}.coveredImage{-webkit-background-size:100% 100%;background-size:100% 100%;background-position:center center}.coveredImage-noScale{-webkit-background-size:cover;background-size:cover}.cardFooter{padding:.5em .3em;position:relative}.visualCardBox{-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);background-color:#222326;-webkit-border-radius:2px;border-radius:2px}.innerCardFooter{background:rgba(0,0,0,.7);position:absolute;bottom:0;left:0;z-index:1;max-width:100%;color:#fff}.innerCardFooterClear{background-color:transparent}.fullInnerCardFooter{right:0}.cardText{padding:.3em .5em;white-space:nowrap;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:inherit}.cardDefaultText,.cardTextCentered{text-align:center}.singleCardText{padding:.5em}.cardText-secondary{opacity:.6}.cardText-rightmargin{margin-right:2em}.cardDefaultText{white-space:normal}.textActionButton{background:0 0;border:0!important;padding:0!important;color:inherit;vertical-align:middle;font-family:inherit;font-size:inherit}.textActionButton:hover{text-decoration:underline;opacity:1}.cardFooterLogo{margin-right:1em}.cardImageIcon{width:12vh;height:12vh;font-size:12vh;color:#fff}.cardIndicators{right:2.5%;top:2.5%;position:absolute;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.portraitCardIndicators{right:3%;top:2%}.backdropCardIndicators{right:1.5%;top:2.8%}.cardOverlayButton{color:#fff!important;background-color:rgba(0,0,0,.8)!important;-webkit-border-radius:500px;border-radius:500px;position:absolute;bottom:0;right:0;margin:0 .35em .5em 0;z-index:1;padding:6px}.cardOverlayButton:hover{background-color:rgba(0,0,0,.9)!important;-webkit-transition:background-color .5s ease-out;-o-transition:background-color .5s ease-out;transition:background-color .5s ease-out}.defaultCardColor1{background-color:#009688}.defaultCardColor2{background-color:#D32F2F}.defaultCardColor3{background-color:#0288D1}.defaultCardColor4{background-color:#388E3C}.defaultCardColor5{background-color:#F57F17}.backdropCard-scalable,.bannerCard-scalable{width:100%}.smallBackdropCard-scalable,.squareCard-scalable{width:50%}.portraitCard-scalable{width:33.333333333333333333333333333333%}.overflowPortraitCard-scalable{width:42%;max-width:200px}.overflowBackdropCard-scalable{width:72%;max-width:400px}.overflowSmallBackdropCard-scalable{width:60%}.overflowSquareCard-scalable{width:42%;max-width:200px}@media all and (min-width:400px){.backdropCard-scalable{width:50%}}@media all and (min-width:500px){.smallBackdropCard-scalable,.squareCard-scalable{width:33.333333333333333333333333333333%}}@media all and (min-width:540px){.overflowPortraitCard-scalable{width:30%}.overflowBackdropCard-scalable{width:64%}.overflowSquareCard-scalable{width:30%}.overflowSmallBackdropCard-scalable{width:40%}}@media all and (min-width:640px){.portraitCard-scalable{width:25%}.overflowBackdropCard-scalable{width:56%}.overflowSmallBackdropCard-scalable{width:40%}}@media all and (min-width:700px){.squareCard-scalable{width:25%}}@media all and (min-width:770px){.backdropCard-scalable{width:33.333333333333333333333333333333%}.overflowSmallBackdropCard-scalable{width:30%}}@media all and (min-width:800px){.bannerCard-scalable{width:50%}.portraitCard-scalable{width:20%}.smallBackdropCard-scalable{width:25%}}@media all and (min-width:900px){.squareCard-scalable{width:20%}}@media all and (min-width:1000px){.smallBackdropCard-scalable{width:20%}.overflowPortraitCard-scalable{width:22%}.overflowBackdropCard-scalable{width:40%}.overflowSmallBackdropCard-scalable{width:24%}.overflowSquareCard-scalable{width:22%}}@media all and (min-width:1200px){.backdropCard-scalable{width:25%}.squareCard-scalable{width:16.666666666666666666666666666667%}.bannerCard-scalable{width:33.333333333333333333333333333333%}.portraitCard-scalable,.smallBackdropCard-scalable{width:16.666666666666666666666666666667%}.overflowSmallBackdropCard-scalable{width:18%}}@media all and (min-width:1400px){.portraitCard-scalable,.smallBackdropCard-scalable,.squareCard-scalable{width:14.285714285714285714285714285714%}}@media all and (min-width:1600px){.portraitCard-scalable,.smallBackdropCard-scalable{width:12.5%}.backdropCard-scalable{width:20%}.squareCard-scalable{width:12.5%}}@media all and (min-width:1800px){.smallBackdropCard-scalable{width:10%}}@media all and (min-width:1920px){.squareCard-scalable{width:11.111111111111111111111111111111%}.smallBackdropCard-scalable{width:10%}}@media all and (min-width:2100px){.backdropCard-scalable{width:20%}.portraitCard-scalable{width:11.111111111111111111111111111111%}}@media all and (min-width:2200px){.bannerCard-scalable{width:25%}.portraitCard-scalable{width:10%}}@media all and (min-width:2500px){.backdropCard-scalable{width:16.666666666666666666666666666667%}}.layout-tv .backdropCard-scalable{width:25%}.layout-tv .portraitCard-scalable,.layout-tv .squareCard-scalable{width:16.66666666666666667%}@media all and (min-width:1600px){.layout-tv .backdropCard-scalable{width:25%}} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js index 0e8178fb36..5b81c45511 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js @@ -1,2 +1,2 @@ -define(["datetime","imageLoader","connectionManager","itemHelper","focusManager","indicators","globalize","layoutManager","apphost","dom","browser","emby-button","css!./card","paper-icon-button-light","clearButtonStyle"],function(datetime,imageLoader,connectionManager,itemHelper,focusManager,indicators,globalize,layoutManager,appHost,dom,browser){"use strict";function getCardsHtml(items,options){1===arguments.length&&(options=arguments[0],items=options.items);var html=buildCardsHtmlInternal(items,options);return html}function getPostersPerRow(shape,screenWidth){switch(shape){case"portrait":return screenWidth>=2200?10:screenWidth>=2100?9:screenWidth>=1600?8:screenWidth>=1400?7:screenWidth>=1200?6:screenWidth>=800?5:screenWidth>=640?4:3;case"square":return screenWidth>=2100?9:screenWidth>=1800?8:screenWidth>=1400?7:screenWidth>=1200?6:screenWidth>=900?5:screenWidth>=700?4:screenWidth>=500?3:2;case"banner":return screenWidth>=2200?4:screenWidth>=1200?3:screenWidth>=800?2:1;case"backdrop":return screenWidth>=2500?6:screenWidth>=1600?5:screenWidth>=1200?4:screenWidth>=770?3:screenWidth>=420?2:1;case"smallBackdrop":return screenWidth>=1440?8:screenWidth>=1100?6:screenWidth>=800?5:screenWidth>=600?4:screenWidth>=540?3:screenWidth>=420?2:1;case"overflowPortrait":return screenWidth>=1e3?100/22:screenWidth>=540?100/30:100/42;case"overflowSquare":return screenWidth>=1e3?100/22:screenWidth>=540?100/30:100/42;case"overflowBackdrop":return screenWidth>=1e3?2.5:screenWidth>=640?100/56:screenWidth>=540?1.5625:100/72;case"overflowSmallBackdrop":return screenWidth>=1200?100/18:screenWidth>=1e3?100/24:screenWidth>=770?100/30:screenWidth>=540?2.5:100/60;default:return 4}}function isResizable(windowWidth){var screen=window.screen;if(screen){var screenWidth=screen.availWidth;if(screenWidth-windowWidth>20)return!0}return!1}function getImageWidth(shape){var screenWidth=dom.getWindowSize().innerWidth;if(isResizable(screenWidth)){var roundScreenTo=100;screenWidth=Math.floor(screenWidth/roundScreenTo)*roundScreenTo}window.screen&&(screenWidth=Math.min(screenWidth,screen.availWidth||screenWidth));var imagesPerRow=getPostersPerRow(shape,screenWidth),shapeWidth=screenWidth/imagesPerRow;return Math.round(shapeWidth)}function setCardData(items,options){options.shape=options.shape||"auto";var primaryImageAspectRatio=imageLoader.getPrimaryImageAspectRatio(items),isThumbAspectRatio=primaryImageAspectRatio&&Math.abs(primaryImageAspectRatio-1.777777778)<.3,isSquareAspectRatio=primaryImageAspectRatio&&Math.abs(primaryImageAspectRatio-1)<.33||primaryImageAspectRatio&&Math.abs(primaryImageAspectRatio-1.3333334)<.01;"auto"!==options.shape&&"autohome"!==options.shape&&"autooverflow"!==options.shape&&"autoVertical"!==options.shape||(options.preferThumb===!0||isThumbAspectRatio?options.shape="autooverflow"===options.shape?"overflowBackdrop":"backdrop":isSquareAspectRatio?(options.coverImage=!0,options.shape="autooverflow"===options.shape?"overflowSquare":"square"):primaryImageAspectRatio&&primaryImageAspectRatio>1.9?(options.shape="banner",options.coverImage=!0):primaryImageAspectRatio&&Math.abs(primaryImageAspectRatio-.6666667)<.2?options.shape="autooverflow"===options.shape?"overflowPortrait":"portrait":options.shape=options.defaultShape||("autooverflow"===options.shape?"overflowSquare":"square")),"auto"===options.preferThumb&&(options.preferThumb="backdrop"===options.shape||"overflowBackdrop"===options.shape),options.uiAspect=getDesiredAspect(options.shape),options.primaryImageAspectRatio=primaryImageAspectRatio,!options.width&&options.widths&&(options.width=options.widths[options.shape]),options.rows&&"number"!=typeof options.rows&&(options.rows=options.rows[options.shape]),layoutManager.tv&&("backdrop"===options.shape?options.width=options.width||500:"portrait"===options.shape?options.width=options.width||243:"square"===options.shape?options.width=options.width||243:"banner"===options.shape&&(options.width=options.width||800)),options.width=options.width||getImageWidth(options.shape)}function buildCardsHtmlInternal(items,options){var isVertical;if("autoVertical"===options.shape&&(isVertical=!0),options.vibrant&&!appHost.supports("imageanalysis")&&(options.vibrant=!1),setCardData(items,options),"Genres"===options.indexBy)return buildCardsByGenreHtmlInternal(items,options);var className="card";options.shape&&(className+=" "+options.shape+"Card"),options.cardCssClass&&(className+=" "+options.cardCssClass);for(var currentIndexValue,hasOpenRow,hasOpenSection,apiClient,lastServerId,html="",itemsInRow=0,sectionTitleTagName=options.sectionTitleTagName||"div",i=0,length=items.length;i=.5?.5:0)+"+":null);newIndexValue!==currentIndexValue&&(hasOpenRow&&(html+="
",hasOpenRow=!1,itemsInRow=0),hasOpenSection&&(html+="
",isVertical&&(html+="
"),hasOpenSection=!1),html+=isVertical?'
':'
',html+="<"+sectionTitleTagName+' class="sectionTitle">'+newIndexValue+"",isVertical&&(html+='
'),currentIndexValue=newIndexValue,hasOpenSection=!0)}options.rows&&0===itemsInRow&&(hasOpenRow&&(html+="
",hasOpenRow=!1),html+='
',hasOpenRow=!0);var cardClass=className;html+=buildCard(i,item,apiClient,options,cardClass),itemsInRow++,options.rows&&itemsInRow>=options.rows&&(html+="
",hasOpenRow=!1,itemsInRow=0)}return hasOpenRow&&(html+="
"),hasOpenSection&&(html+="
",isVertical&&(html+="
")),html}function filterItemsByGenre(items,genre){var genreLower=genre.toLowerCase();return items.filter(function(currentItem){return currentItem.Genres.filter(function(g){return g.toLowerCase()===genreLower}).length>0})}function buildCardsByGenreHtmlInternal(items,options){var className="card";options.shape&&(className+=" "+options.shape+"Card");for(var itemsInRow,hasOpenRow,html="",loopItems=options.genres,onGenre=function(renderItem){var currentItemHtml="";options.rows&&0===itemsInRow&&(hasOpenRow&&(currentItemHtml+="
",hasOpenRow=!1),currentItemHtml+='
',hasOpenRow=!0);var cardClass=className;return currentItemHtml+=buildCard(i,renderItem,connectionManager.getApiClient(renderItem.ServerId||options.serverId),options,cardClass),itemsInRow++,options.rows&&itemsInRow>=options.rows&&(currentItemHtml+="
",hasOpenRow=!1,itemsInRow=0),currentItemHtml},i=0,length=loopItems.length;i',html+='
'+item.Name+"
";var showMoreButton=!1;renderItems.length>options.indexLimit&&(renderItems.length=Math.min(renderItems.length,options.indexLimit),showMoreButton=!0),itemsInRow=0,hasOpenRow=!1,html+=renderItems.map(onGenre).join(""),showMoreButton&&(html+='
',html+='",html+="
"),html+="
",html+=""}}return html}function getDesiredAspect(shape){if(shape){if(shape=shape.toLowerCase(),shape.indexOf("portrait")!==-1)return 2/3;if(shape.indexOf("backdrop")!==-1)return 16/9;if(shape.indexOf("square")!==-1)return 1;if(shape.indexOf("banner")!==-1)return 1e3/185}return null}function getCardImageUrl(item,apiClient,options){var imageItem=item.ProgramInfo||item;item=imageItem;var width=options.width,height=null,primaryImageAspectRatio=imageLoader.getPrimaryImageAspectRatio([item]),forceName=!1,imgUrl=null,coverImage=!1,uiAspect=null;return options.preferThumb&&item.ImageTags&&item.ImageTags.Thumb?imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Thumb",maxWidth:width,tag:item.ImageTags.Thumb}):options.preferBanner&&item.ImageTags&&item.ImageTags.Banner?imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Banner",maxWidth:width,tag:item.ImageTags.Banner}):options.preferThumb&&item.SeriesThumbImageTag&&options.inheritThumb!==!1?imgUrl=apiClient.getScaledImageUrl(item.SeriesId,{type:"Thumb",maxWidth:width,tag:item.SeriesThumbImageTag}):options.preferThumb&&item.ParentThumbItemId&&options.inheritThumb!==!1&&"Photo"!==item.MediaType?imgUrl=apiClient.getScaledImageUrl(item.ParentThumbItemId,{type:"Thumb",maxWidth:width,tag:item.ParentThumbImageTag}):options.preferThumb&&item.BackdropImageTags&&item.BackdropImageTags.length?(imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Backdrop",maxWidth:width,tag:item.BackdropImageTags[0]}),forceName=!0):item.ImageTags&&item.ImageTags.Primary?(height=width&&primaryImageAspectRatio?Math.round(width/primaryImageAspectRatio):null,imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Primary",maxHeight:height,maxWidth:width,tag:item.ImageTags.Primary}),options.preferThumb&&options.showTitle!==!1&&(forceName=!0),primaryImageAspectRatio&&(uiAspect=getDesiredAspect(options.shape),uiAspect&&(coverImage=Math.abs(primaryImageAspectRatio-uiAspect)<=.2))):item.PrimaryImageTag?(height=width&&primaryImageAspectRatio?Math.round(width/primaryImageAspectRatio):null,imgUrl=apiClient.getScaledImageUrl(item.PrimaryImageItemId||item.Id||item.ItemId,{type:"Primary",maxHeight:height,maxWidth:width,tag:item.PrimaryImageTag}),options.preferThumb&&options.showTitle!==!1&&(forceName=!0),primaryImageAspectRatio&&(uiAspect=getDesiredAspect(options.shape),uiAspect&&(coverImage=Math.abs(primaryImageAspectRatio-uiAspect)<=.2))):item.ParentPrimaryImageTag?imgUrl=apiClient.getScaledImageUrl(item.ParentPrimaryImageItemId,{type:"Primary",maxWidth:width,tag:item.ParentPrimaryImageTag}):item.AlbumId&&item.AlbumPrimaryImageTag?(width=primaryImageAspectRatio?Math.round(height*primaryImageAspectRatio):null,imgUrl=apiClient.getScaledImageUrl(item.AlbumId,{type:"Primary",maxHeight:height,maxWidth:width,tag:item.AlbumPrimaryImageTag}),primaryImageAspectRatio&&(uiAspect=getDesiredAspect(options.shape),uiAspect&&(coverImage=Math.abs(primaryImageAspectRatio-uiAspect)<=.2))):"Season"===item.Type&&item.ImageTags&&item.ImageTags.Thumb?imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Thumb",maxWidth:width,tag:item.ImageTags.Thumb}):item.BackdropImageTags&&item.BackdropImageTags.length?imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Backdrop",maxWidth:width,tag:item.BackdropImageTags[0]}):item.ImageTags&&item.ImageTags.Thumb?imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Thumb",maxWidth:width,tag:item.ImageTags.Thumb}):item.SeriesThumbImageTag&&options.inheritThumb!==!1?imgUrl=apiClient.getScaledImageUrl(item.SeriesId,{type:"Thumb",maxWidth:width,tag:item.SeriesThumbImageTag}):item.ParentThumbItemId&&options.inheritThumb!==!1&&(imgUrl=apiClient.getScaledImageUrl(item.ParentThumbItemId,{type:"Thumb",maxWidth:width,tag:item.ParentThumbImageTag})),{imgUrl:imgUrl,forceName:forceName,coverImage:coverImage}}function getRandomInt(min,max){return Math.floor(Math.random()*(max-min+1))+min}function getDefaultColorIndex(str){if(str){for(var charIndex=Math.floor(str.length/2),character=String(str.substr(charIndex,1).charCodeAt()),sum=0,i=0;i0&&isOuterFooter&&(currentCssClass+=" cardText-secondary"),addRightMargin&&(currentCssClass+=" cardText-rightmargin"),text&&(html+="
",html+=text,html+="
",valid++,maxLines&&valid>=maxLines))break}if(forceLines)for(length=Math.min(lines.length,maxLines||lines.length);valid ",valid++;return html}function isUsingLiveTvNaming(item){return"Program"===item.Type||"Timer"===item.Type||"Recording"===item.Type}function getCardFooterText(item,apiClient,options,showTitle,forceName,overlayText,imgUrl,footerClass,progressHtml,isOuterFooter,cardFooterId,vibrantSwatch){var html="",showOtherText=isOuterFooter?!overlayText:overlayText;if(isOuterFooter&&options.cardLayout&&!layoutManager.tv&&"none"!==options.cardFooterAside){var moreIcon="dots-horiz"===appHost.moreIcon?"":"";html+='"}var titleAdded,cssClass=options.centerText?"cardText cardTextCentered":"cardText",lines=[],parentTitleUnderneath="MusicAlbum"===item.Type||"Audio"===item.Type||"MusicVideo"===item.Type;if(showOtherText&&(options.showParentTitle||options.showParentTitleOrTitle)&&!parentTitleUnderneath)if(isOuterFooter&&"Episode"===item.Type&&item.SeriesName&&item.SeriesId)lines.push(getTextActionButton({Id:item.SeriesId,Name:item.SeriesName,Type:"Series",IsFolder:!0}));else if(isUsingLiveTvNaming(item))lines.push(item.Name),item.IsSeries||(titleAdded=!0);else{var parentTitle=item.SeriesName||item.Album||item.AlbumArtist||item.GameSystem||"";(parentTitle||showTitle)&&lines.push(parentTitle)}var showMediaTitle=showTitle&&!titleAdded||options.showParentTitleOrTitle&&!lines.length;if(showMediaTitle||titleAdded||!showTitle&&!forceName||(showMediaTitle=!0),showMediaTitle){var name="auto"!==options.showTitle||item.IsFolder||"Photo"!==item.MediaType?itemHelper.getDisplayName(item,{includeParentInfo:options.includeParentInfoInTitle}):"";lines.push(name)}if(showOtherText){if(options.showParentTitle&&parentTitleUnderneath&&(isOuterFooter&&item.AlbumArtists&&item.AlbumArtists.length?(item.AlbumArtists[0].Type="MusicArtist",item.AlbumArtists[0].IsFolder=!0,lines.push(getTextActionButton(item.AlbumArtists[0]))):lines.push(isUsingLiveTvNaming(item)?item.Name:item.SeriesName||item.Album||item.AlbumArtist||item.GameSystem||"")),options.showItemCounts){var itemCountHtml=getItemCountsHtml(options,item);lines.push(itemCountHtml)}if(options.textLines)for(var additionalLines=options.textLines(item),i=0,length=additionalLines.length;i"+html,html+=""}return html}function getTextActionButton(item,text){text||(text=itemHelper.getDisplayName(item));var html='"}function getItemCountsHtml(options,item){var childText,counts=[];if("Playlist"===item.Type){if(childText="",item.CumulativeRunTimeTicks){var minutes=item.CumulativeRunTimeTicks/6e8;minutes=minutes||1,childText+=globalize.translate("sharedcomponents#ValueMinutes",Math.round(minutes))}else childText+=globalize.translate("sharedcomponents#ValueMinutes",0);counts.push(childText)}else"Genre"===item.Type||"Studio"===item.Type?(item.MovieCount&&(childText=1===item.MovieCount?globalize.translate("sharedcomponents#ValueOneMovie"):globalize.translate("sharedcomponents#ValueMovieCount",item.MovieCount),counts.push(childText)),item.SeriesCount&&(childText=1===item.SeriesCount?globalize.translate("sharedcomponents#ValueOneSeries"):globalize.translate("sharedcomponents#ValueSeriesCount",item.SeriesCount),counts.push(childText)),item.EpisodeCount&&(childText=1===item.EpisodeCount?globalize.translate("sharedcomponents#ValueOneEpisode"):globalize.translate("sharedcomponents#ValueEpisodeCount",item.EpisodeCount),counts.push(childText)),item.GameCount&&(childText=1===item.GameCount?globalize.translate("sharedcomponents#ValueOneGame"):globalize.translate("sharedcomponents#ValueGameCount",item.GameCount),counts.push(childText))):"GameGenre"===item.Type?item.GameCount&&(childText=1===item.GameCount?globalize.translate("sharedcomponents#ValueOneGame"):globalize.translate("sharedcomponents#ValueGameCount",item.GameCount),counts.push(childText)):"MusicGenre"===item.Type||"MusicArtist"===options.context?(item.AlbumCount&&(childText=1===item.AlbumCount?globalize.translate("sharedcomponents#ValueOneAlbum"):globalize.translate("sharedcomponents#ValueAlbumCount",item.AlbumCount),counts.push(childText)),item.SongCount&&(childText=1===item.SongCount?globalize.translate("sharedcomponents#ValueOneSong"):globalize.translate("sharedcomponents#ValueSongCount",item.SongCount),counts.push(childText)),item.MusicVideoCount&&(childText=1===item.MusicVideoCount?globalize.translate("sharedcomponents#ValueOneMusicVideo"):globalize.translate("sharedcomponents#ValueMusicVideoCount",item.MusicVideoCount),counts.push(childText))):"Series"===item.Type&&(childText=1===item.RecursiveItemCount?globalize.translate("sharedcomponents#ValueOneEpisode"):globalize.translate("sharedcomponents#ValueEpisodeCount",item.RecursiveItemCount),counts.push(childText));return counts.join(", ")}function buildCard(index,item,apiClient,options,className){var action=options.action||"link",scalable=options.scalable!==!1;scalable&&(className+=" scalableCard "+options.shape+"Card-scalable");var imgInfo=getCardImageUrl(item,apiClient,options),imgUrl=imgInfo.imgUrl,forceName=imgInfo.forceName,showTitle="auto"===options.showTitle||(options.showTitle||"PhotoAlbum"===item.Type||"Folder"===item.Type),overlayText=options.overlayText;forceName&&!options.cardLayout&&null==overlayText&&(overlayText=!0);var cardImageContainerClass="cardImageContainer",coveredImage=options.coverImage||imgInfo.coverImage;coveredImage&&(cardImageContainerClass+=" coveredImage",("Photo"===item.MediaType||"PhotoAlbum"===item.Type||"Folder"===item.Type||item.ProgramInfo||"Program"===item.Type||"Recording"===item.Type)&&(cardImageContainerClass+=" coveredImage-noScale")),imgUrl||(cardImageContainerClass+=" "+getDefaultColorClass(item.Name));var separateCardBox=scalable,cardBoxClass=options.cardLayout?"cardBox visualCardBox":"cardBox";layoutManager.tv&&(cardBoxClass+=" cardBox-focustransform");var footerCssClass,progressHtml=indicators.getProgressBarHtml(item),innerCardFooter="",footerOverlayed=!1,cardFooterId="cardFooter"+uniqueFooterIndex;uniqueFooterIndex++,overlayText?(footerCssClass=progressHtml?"innerCardFooter fullInnerCardFooter":"innerCardFooter",innerCardFooter+=getCardFooterText(item,apiClient,options,showTitle,forceName,overlayText,imgUrl,footerCssClass,progressHtml,!1,cardFooterId),footerOverlayed=!0):progressHtml&&(innerCardFooter+='
',innerCardFooter+=progressHtml,innerCardFooter+="
",progressHtml="");var mediaSourceCount=item.MediaSourceCount||1;mediaSourceCount>1&&(innerCardFooter+='
'+mediaSourceCount+"
");var vibrantSwatch=options.vibrant&&imgUrl?imageLoader.getCachedVibrantInfo(imgUrl):null,outerCardFooter="";overlayText||footerOverlayed||(footerCssClass=options.cardLayout?"cardFooter visualCardBox-cardFooter":"cardFooter transparent",outerCardFooter=getCardFooterText(item,apiClient,options,showTitle,forceName,overlayText,imgUrl,footerCssClass,progressHtml,!0,cardFooterId,vibrantSwatch)),outerCardFooter&&!options.cardLayout&&options.allowBottomPadding!==!1&&(cardBoxClass+=" cardBox-bottompadded"),separateCardBox||(cardImageContainerClass+=" "+cardBoxClass);var overlayButtons="";if(!layoutManager.tv){var overlayPlayButton=options.overlayPlayButton;if(null!=overlayPlayButton||options.overlayMoreButton||options.cardLayout||(overlayPlayButton="Video"===item.MediaType),!overlayPlayButton||item.IsPlaceHolder||"Virtual"===item.LocationType&&item.MediaType&&"Program"!==item.Type||"Person"===item.Type||"Full"!==item.PlayAccess||(overlayButtons+=''),options.overlayMoreButton){var moreIcon="dots-horiz"===appHost.moreIcon?"":"";overlayButtons+='"}}options.showChildCountIndicator&&item.ChildCount&&(className+=" groupedCard");var cardImageContainerOpen,cardImageContainerClose="",cardBoxClose="",cardContentClose="",cardScalableClose="";if(separateCardBox){var cardContentOpen;layoutManager.tv?(cardContentOpen='
',cardContentClose="
"):(cardContentOpen='");var vibrantAttributes=options.vibrant&&imgUrl&&!vibrantSwatch?' data-vibrant="'+cardFooterId+'" data-swatch="db"':"";if(vibrantAttributes&&!browser.safari){cardImageContainerOpen='
';var imgClass="cardImage cardImage-img lazy";coveredImage&&(imgClass+=1===devicePixelRatio?" coveredImage-noscale-img":" coveredImage-img"),cardImageContainerOpen+=''}else cardImageContainerOpen=imgUrl?'
':'
';var cardScalableClass=options.cardLayout?"cardScalable visualCardBox-cardScalable":"cardScalable";cardImageContainerOpen='
'+cardContentOpen+cardImageContainerOpen,cardBoxClose="
",cardScalableClose="
",cardImageContainerClose="
"}else overlayButtons&&!separateCardBox?(cardImageContainerClass+=" cardImageContainerClass-button",cardImageContainerOpen=imgUrl?'",className+=" forceRelative"):(cardImageContainerOpen=imgUrl?'
':'
',cardImageContainerClose="
");var indicatorsHtml="";if(indicatorsHtml+=indicators.getSyncIndicator(item),indicatorsHtml+=indicators.getTimerIndicator(item),indicatorsHtml+=options.showGroupCount?indicators.getChildCountIndicatorHtml(item,{minCount:1}):indicators.getPlayedIndicatorHtml(item),indicatorsHtml&&(cardImageContainerOpen+='
'+indicatorsHtml+"
"),!imgUrl){var defaultName=isUsingLiveTvNaming(item)?item.Name:itemHelper.getDisplayName(item);cardImageContainerOpen+='
'+defaultName+"
"}var tagName=!layoutManager.tv&&scalable||overlayButtons?"div":"button",prefix=(item.SortName||item.Name||"")[0];prefix&&(prefix=prefix.toUpperCase());var timerAttributes="";item.TimerId&&(timerAttributes+=' data-timerid="'+item.TimerId+'"'),item.SeriesTimerId&&(timerAttributes+=' data-seriestimerid="'+item.SeriesTimerId+'"');var actionAttribute;"button"===tagName?(className+=" itemAction",actionAttribute=' data-action="'+action+'"'):actionAttribute="","MusicAlbum"!==item.Type&&"MusicArtist"!==item.Type&&"Audio"!==item.Type&&(className+=" card-withuserdata");var positionTicksData=item.UserData&&item.UserData.PlaybackPositionTicks?' data-positionticks="'+item.UserData.PlaybackPositionTicks+'"':"",collectionIdData=options.collectionId?' data-collectionid="'+options.collectionId+'"':"",playlistIdData=options.playlistId?' data-playlistid="'+options.playlistId+'"':"",mediaTypeData=item.MediaType?' data-mediatype="'+item.MediaType+'"':"",collectionTypeData=item.CollectionType?' data-collectiontype="'+item.CollectionType+'"':"",channelIdData=item.ChannelId?' data-channelid="'+item.ChannelId+'"':"",contextData=options.context?' data-context="'+options.context+'"':"";return"<"+tagName+' data-index="'+index+'"'+timerAttributes+actionAttribute+' data-isfolder="'+(item.IsFolder||!1)+'" data-serverid="'+(item.ServerId||options.serverId)+'" data-id="'+(item.Id||item.ItemId)+'" data-type="'+item.Type+'"'+mediaTypeData+collectionTypeData+channelIdData+positionTicksData+collectionIdData+playlistIdData+contextData+' data-prefix="'+prefix+'" class="'+className+'">'+cardImageContainerOpen+innerCardFooter+cardImageContainerClose+cardContentClose+overlayButtons+cardScalableClose+outerCardFooter+cardBoxClose+""}function buildCards(items,options){if(document.body.contains(options.itemsContainer)){if(options.parentContainer){if(!items.length)return void options.parentContainer.classList.add("hide");options.parentContainer.classList.remove("hide")}var html=buildCardsHtmlInternal(items,options);html?(options.itemsContainer.cardBuilderHtml!==html&&(options.itemsContainer.innerHTML=html,items.length<50?options.itemsContainer.cardBuilderHtml=html:options.itemsContainer.cardBuilderHtml=null),imageLoader.lazyChildren(options.itemsContainer)):(options.itemsContainer.innerHTML=html,options.itemsContainer.cardBuilderHtml=null),options.autoFocus&&focusManager.autoFocus(options.itemsContainer,!0),"Genres"===options.indexBy&&options.itemsContainer.addEventListener("click",onItemsContainerClick)}}function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}function onItemsContainerClick(e){var listItemsMoreButton=parentWithClass(e.target,"listItemsMoreButton");if(listItemsMoreButton){var value=listItemsMoreButton.getAttribute("data-indexvalue"),parentid=listItemsMoreButton.getAttribute("data-parentid");require(["embyRouter"],function(embyRouter){embyRouter.showGenre({ParentId:parentid,Id:value})})}}function ensureIndicators(card,indicatorsElem){if(indicatorsElem)return indicatorsElem;if(indicatorsElem=card.querySelector(".cardIndicators"),!indicatorsElem){var cardImageContainer=card.querySelector(".cardImageContainer");indicatorsElem=document.createElement("div"),indicatorsElem.classList.add("cardIndicators"),cardImageContainer.appendChild(indicatorsElem)}return indicatorsElem}function updateUserData(card,userData){var type=card.getAttribute("data-type"),enableCountIndicator="Series"===type||"BoxSet"===type||"Season"===type,indicatorsElem=null,playedIndicator=null,countIndicator=null,itemProgressBar=null;userData.Played?(playedIndicator=card.querySelector(".playedIndicator"),playedIndicator||(playedIndicator=document.createElement("div"),playedIndicator.classList.add("playedIndicator"),playedIndicator.classList.add("indicator"),indicatorsElem=ensureIndicators(card,indicatorsElem),indicatorsElem.appendChild(playedIndicator)),playedIndicator.innerHTML='check'):(playedIndicator=card.querySelector(".playedIndicator"),playedIndicator&&playedIndicator.parentNode.removeChild(playedIndicator)),userData.UnplayedItemCount?(countIndicator=card.querySelector(".countIndicator"),countIndicator||(countIndicator=document.createElement("div"),countIndicator.classList.add("countIndicator"),indicatorsElem=ensureIndicators(card,indicatorsElem),indicatorsElem.appendChild(countIndicator)),countIndicator.innerHTML=userData.UnplayedItemCount):enableCountIndicator&&(countIndicator=card.querySelector(".countIndicator"),countIndicator&&countIndicator.parentNode.removeChild(countIndicator));var progressHtml=indicators.getProgressBarHtml({Type:type,UserData:userData,MediaType:"Video"});if(progressHtml){if(itemProgressBar=card.querySelector(".itemProgressBar"),!itemProgressBar){itemProgressBar=document.createElement("div"),itemProgressBar.classList.add("itemProgressBar");var innerCardFooter=card.querySelector(".innerCardFooter");if(!innerCardFooter){innerCardFooter=document.createElement("div"),innerCardFooter.classList.add("innerCardFooter");var cardImageContainer=card.querySelector(".cardImageContainer");cardImageContainer.appendChild(innerCardFooter)}innerCardFooter.appendChild(itemProgressBar)}itemProgressBar.innerHTML=progressHtml}else itemProgressBar=card.querySelector(".itemProgressBar"),itemProgressBar&&itemProgressBar.parentNode.removeChild(itemProgressBar)}function onUserDataChanged(userData,scope){ -for(var cards=(scope||document.body).querySelectorAll('.card-withuserdata[data-id="'+userData.ItemId+'"]'),i=0,length=cards.length;i')}cell.setAttribute("data-timerid",newTimerId)}}function onTimerCancelled(id,itemsContainer){for(var cells=itemsContainer.querySelectorAll('.card[data-timerid="'+id+'"]'),i=0,length=cells.length;i=2200?10:screenWidth>=2100?9:screenWidth>=1600?8:screenWidth>=1400?7:screenWidth>=1200?6:screenWidth>=800?5:screenWidth>=640?4:3;case"square":return screenWidth>=2100?9:screenWidth>=1800?8:screenWidth>=1400?7:screenWidth>=1200?6:screenWidth>=900?5:screenWidth>=700?4:screenWidth>=500?3:2;case"banner":return screenWidth>=2200?4:screenWidth>=1200?3:screenWidth>=800?2:1;case"backdrop":return screenWidth>=2500?6:screenWidth>=1600?5:screenWidth>=1200?4:screenWidth>=770?3:screenWidth>=420?2:1;case"smallBackdrop":return screenWidth>=1440?8:screenWidth>=1100?6:screenWidth>=800?5:screenWidth>=600?4:screenWidth>=540?3:screenWidth>=420?2:1;case"overflowPortrait":return screenWidth>=1e3?100/22:screenWidth>=540?100/30:100/42;case"overflowSquare":return screenWidth>=1e3?100/22:screenWidth>=540?100/30:100/42;case"overflowBackdrop":return screenWidth>=1e3?2.5:screenWidth>=640?100/56:screenWidth>=540?1.5625:100/72;case"overflowSmallBackdrop":return screenWidth>=1200?100/18:screenWidth>=1e3?100/24:screenWidth>=770?100/30:screenWidth>=540?2.5:100/60;default:return 4}}function isResizable(windowWidth){var screen=window.screen;if(screen){var screenWidth=screen.availWidth;if(screenWidth-windowWidth>20)return!0}return!1}function getImageWidth(shape){var screenWidth=dom.getWindowSize().innerWidth;if(isResizable(screenWidth)){var roundScreenTo=100;screenWidth=Math.floor(screenWidth/roundScreenTo)*roundScreenTo}window.screen&&(screenWidth=Math.min(screenWidth,screen.availWidth||screenWidth));var imagesPerRow=getPostersPerRow(shape,screenWidth),shapeWidth=screenWidth/imagesPerRow;return Math.round(shapeWidth)}function setCardData(items,options){options.shape=options.shape||"auto";var primaryImageAspectRatio=imageLoader.getPrimaryImageAspectRatio(items),isThumbAspectRatio=primaryImageAspectRatio&&Math.abs(primaryImageAspectRatio-1.777777778)<.3,isSquareAspectRatio=primaryImageAspectRatio&&Math.abs(primaryImageAspectRatio-1)<.33||primaryImageAspectRatio&&Math.abs(primaryImageAspectRatio-1.3333334)<.01;"auto"!==options.shape&&"autohome"!==options.shape&&"autooverflow"!==options.shape&&"autoVertical"!==options.shape||(options.preferThumb===!0||isThumbAspectRatio?options.shape="autooverflow"===options.shape?"overflowBackdrop":"backdrop":isSquareAspectRatio?(options.coverImage=!0,options.shape="autooverflow"===options.shape?"overflowSquare":"square"):primaryImageAspectRatio&&primaryImageAspectRatio>1.9?(options.shape="banner",options.coverImage=!0):primaryImageAspectRatio&&Math.abs(primaryImageAspectRatio-.6666667)<.2?options.shape="autooverflow"===options.shape?"overflowPortrait":"portrait":options.shape=options.defaultShape||("autooverflow"===options.shape?"overflowSquare":"square")),"auto"===options.preferThumb&&(options.preferThumb="backdrop"===options.shape||"overflowBackdrop"===options.shape),options.uiAspect=getDesiredAspect(options.shape),options.primaryImageAspectRatio=primaryImageAspectRatio,!options.width&&options.widths&&(options.width=options.widths[options.shape]),options.rows&&"number"!=typeof options.rows&&(options.rows=options.rows[options.shape]),layoutManager.tv&&("backdrop"===options.shape?options.width=options.width||500:"portrait"===options.shape?options.width=options.width||256:"square"===options.shape?options.width=options.width||256:"banner"===options.shape&&(options.width=options.width||800)),options.width=options.width||getImageWidth(options.shape)}function buildCardsHtmlInternal(items,options){var isVertical;if("autoVertical"===options.shape&&(isVertical=!0),options.vibrant&&!appHost.supports("imageanalysis")&&(options.vibrant=!1),setCardData(items,options),"Genres"===options.indexBy)return buildCardsByGenreHtmlInternal(items,options);var className="card";options.shape&&(className+=" "+options.shape+"Card"),options.cardCssClass&&(className+=" "+options.cardCssClass);for(var currentIndexValue,hasOpenRow,hasOpenSection,apiClient,lastServerId,html="",itemsInRow=0,sectionTitleTagName=options.sectionTitleTagName||"div",i=0,length=items.length;i=.5?.5:0)+"+":null);newIndexValue!==currentIndexValue&&(hasOpenRow&&(html+="
",hasOpenRow=!1,itemsInRow=0),hasOpenSection&&(html+="
",isVertical&&(html+="
"),hasOpenSection=!1),html+=isVertical?'
':'
',html+="<"+sectionTitleTagName+' class="sectionTitle">'+newIndexValue+"",isVertical&&(html+='
'),currentIndexValue=newIndexValue,hasOpenSection=!0)}options.rows&&0===itemsInRow&&(hasOpenRow&&(html+="
",hasOpenRow=!1),html+='
',hasOpenRow=!0);var cardClass=className;html+=buildCard(i,item,apiClient,options,cardClass),itemsInRow++,options.rows&&itemsInRow>=options.rows&&(html+="
",hasOpenRow=!1,itemsInRow=0)}return hasOpenRow&&(html+="
"),hasOpenSection&&(html+="
",isVertical&&(html+="")),html}function filterItemsByGenre(items,genre){var genreLower=genre.toLowerCase();return items.filter(function(currentItem){return currentItem.Genres.filter(function(g){return g.toLowerCase()===genreLower}).length>0})}function buildCardsByGenreHtmlInternal(items,options){var className="card";options.shape&&(className+=" "+options.shape+"Card");for(var itemsInRow,hasOpenRow,html="",loopItems=options.genres,onGenre=function(renderItem){var currentItemHtml="";options.rows&&0===itemsInRow&&(hasOpenRow&&(currentItemHtml+="",hasOpenRow=!1),currentItemHtml+='
',hasOpenRow=!0);var cardClass=className;return currentItemHtml+=buildCard(i,renderItem,connectionManager.getApiClient(renderItem.ServerId||options.serverId),options,cardClass),itemsInRow++,options.rows&&itemsInRow>=options.rows&&(currentItemHtml+="
",hasOpenRow=!1,itemsInRow=0),currentItemHtml},i=0,length=loopItems.length;i',html+='
'+item.Name+"
";var showMoreButton=!1;renderItems.length>options.indexLimit&&(renderItems.length=Math.min(renderItems.length,options.indexLimit),showMoreButton=!0),itemsInRow=0,hasOpenRow=!1,html+=renderItems.map(onGenre).join(""),showMoreButton&&(html+='
',html+='",html+="
"),html+="",html+=""}}return html}function getDesiredAspect(shape){if(shape){if(shape=shape.toLowerCase(),shape.indexOf("portrait")!==-1)return 2/3;if(shape.indexOf("backdrop")!==-1)return 16/9;if(shape.indexOf("square")!==-1)return 1;if(shape.indexOf("banner")!==-1)return 1e3/185}return null}function getCardImageUrl(item,apiClient,options){var imageItem=item.ProgramInfo||item;item=imageItem;var width=options.width,height=null,primaryImageAspectRatio=imageLoader.getPrimaryImageAspectRatio([item]),forceName=!1,imgUrl=null,coverImage=!1,uiAspect=null;return options.preferThumb&&item.ImageTags&&item.ImageTags.Thumb?imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Thumb",maxWidth:width,tag:item.ImageTags.Thumb}):options.preferBanner&&item.ImageTags&&item.ImageTags.Banner?imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Banner",maxWidth:width,tag:item.ImageTags.Banner}):options.preferThumb&&item.SeriesThumbImageTag&&options.inheritThumb!==!1?imgUrl=apiClient.getScaledImageUrl(item.SeriesId,{type:"Thumb",maxWidth:width,tag:item.SeriesThumbImageTag}):options.preferThumb&&item.ParentThumbItemId&&options.inheritThumb!==!1&&"Photo"!==item.MediaType?imgUrl=apiClient.getScaledImageUrl(item.ParentThumbItemId,{type:"Thumb",maxWidth:width,tag:item.ParentThumbImageTag}):options.preferThumb&&item.BackdropImageTags&&item.BackdropImageTags.length?(imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Backdrop",maxWidth:width,tag:item.BackdropImageTags[0]}),forceName=!0):item.ImageTags&&item.ImageTags.Primary?(height=width&&primaryImageAspectRatio?Math.round(width/primaryImageAspectRatio):null,imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Primary",maxHeight:height,maxWidth:width,tag:item.ImageTags.Primary}),options.preferThumb&&options.showTitle!==!1&&(forceName=!0),primaryImageAspectRatio&&(uiAspect=getDesiredAspect(options.shape),uiAspect&&(coverImage=Math.abs(primaryImageAspectRatio-uiAspect)<=.2))):item.PrimaryImageTag?(height=width&&primaryImageAspectRatio?Math.round(width/primaryImageAspectRatio):null,imgUrl=apiClient.getScaledImageUrl(item.PrimaryImageItemId||item.Id||item.ItemId,{type:"Primary",maxHeight:height,maxWidth:width,tag:item.PrimaryImageTag}),options.preferThumb&&options.showTitle!==!1&&(forceName=!0),primaryImageAspectRatio&&(uiAspect=getDesiredAspect(options.shape),uiAspect&&(coverImage=Math.abs(primaryImageAspectRatio-uiAspect)<=.2))):item.ParentPrimaryImageTag?imgUrl=apiClient.getScaledImageUrl(item.ParentPrimaryImageItemId,{type:"Primary",maxWidth:width,tag:item.ParentPrimaryImageTag}):item.AlbumId&&item.AlbumPrimaryImageTag?(width=primaryImageAspectRatio?Math.round(height*primaryImageAspectRatio):null,imgUrl=apiClient.getScaledImageUrl(item.AlbumId,{type:"Primary",maxHeight:height,maxWidth:width,tag:item.AlbumPrimaryImageTag}),primaryImageAspectRatio&&(uiAspect=getDesiredAspect(options.shape),uiAspect&&(coverImage=Math.abs(primaryImageAspectRatio-uiAspect)<=.2))):"Season"===item.Type&&item.ImageTags&&item.ImageTags.Thumb?imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Thumb",maxWidth:width,tag:item.ImageTags.Thumb}):item.BackdropImageTags&&item.BackdropImageTags.length?imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Backdrop",maxWidth:width,tag:item.BackdropImageTags[0]}):item.ImageTags&&item.ImageTags.Thumb?imgUrl=apiClient.getScaledImageUrl(item.Id,{type:"Thumb",maxWidth:width,tag:item.ImageTags.Thumb}):item.SeriesThumbImageTag&&options.inheritThumb!==!1?imgUrl=apiClient.getScaledImageUrl(item.SeriesId,{type:"Thumb",maxWidth:width,tag:item.SeriesThumbImageTag}):item.ParentThumbItemId&&options.inheritThumb!==!1&&(imgUrl=apiClient.getScaledImageUrl(item.ParentThumbItemId,{type:"Thumb",maxWidth:width,tag:item.ParentThumbImageTag})),{imgUrl:imgUrl,forceName:forceName,coverImage:coverImage}}function getRandomInt(min,max){return Math.floor(Math.random()*(max-min+1))+min}function getDefaultColorIndex(str){if(str){for(var charIndex=Math.floor(str.length/2),character=String(str.substr(charIndex,1).charCodeAt()),sum=0,i=0;i0&&isOuterFooter&&(currentCssClass+=" cardText-secondary"),addRightMargin&&(currentCssClass+=" cardText-rightmargin"),text&&(html+="
",html+=text,html+="
",valid++,maxLines&&valid>=maxLines))break}if(forceLines)for(length=Math.min(lines.length,maxLines||lines.length);valid ",valid++;return html}function isUsingLiveTvNaming(item){return"Program"===item.Type||"Timer"===item.Type||"Recording"===item.Type}function getCardFooterText(item,apiClient,options,showTitle,forceName,overlayText,imgUrl,footerClass,progressHtml,isOuterFooter,cardFooterId,vibrantSwatch){var html="",showOtherText=isOuterFooter?!overlayText:overlayText;if(isOuterFooter&&options.cardLayout&&!layoutManager.tv&&"none"!==options.cardFooterAside){var moreIcon="dots-horiz"===appHost.moreIcon?"":"";html+='"}var titleAdded,cssClass=options.centerText?"cardText cardTextCentered":"cardText",lines=[],parentTitleUnderneath="MusicAlbum"===item.Type||"Audio"===item.Type||"MusicVideo"===item.Type;if(showOtherText&&(options.showParentTitle||options.showParentTitleOrTitle)&&!parentTitleUnderneath)if(isOuterFooter&&"Episode"===item.Type&&item.SeriesName&&item.SeriesId)lines.push(getTextActionButton({Id:item.SeriesId,Name:item.SeriesName,Type:"Series",IsFolder:!0}));else if(isUsingLiveTvNaming(item))lines.push(item.Name),item.IsSeries||(titleAdded=!0);else{var parentTitle=item.SeriesName||item.Album||item.AlbumArtist||item.GameSystem||"";(parentTitle||showTitle)&&lines.push(parentTitle)}var showMediaTitle=showTitle&&!titleAdded||options.showParentTitleOrTitle&&!lines.length;if(showMediaTitle||titleAdded||!showTitle&&!forceName||(showMediaTitle=!0),showMediaTitle){var name="auto"!==options.showTitle||item.IsFolder||"Photo"!==item.MediaType?itemHelper.getDisplayName(item,{includeParentInfo:options.includeParentInfoInTitle}):"";lines.push(name)}if(showOtherText){if(options.showParentTitle&&parentTitleUnderneath&&(isOuterFooter&&item.AlbumArtists&&item.AlbumArtists.length?(item.AlbumArtists[0].Type="MusicArtist",item.AlbumArtists[0].IsFolder=!0,lines.push(getTextActionButton(item.AlbumArtists[0]))):lines.push(isUsingLiveTvNaming(item)?item.Name:item.SeriesName||item.Album||item.AlbumArtist||item.GameSystem||"")),options.showItemCounts){var itemCountHtml=getItemCountsHtml(options,item);lines.push(itemCountHtml)}if(options.textLines)for(var additionalLines=options.textLines(item),i=0,length=additionalLines.length;i"+html,html+=""}return html}function getTextActionButton(item,text){text||(text=itemHelper.getDisplayName(item));var html='"}function getItemCountsHtml(options,item){var childText,counts=[];if("Playlist"===item.Type){if(childText="",item.CumulativeRunTimeTicks){var minutes=item.CumulativeRunTimeTicks/6e8;minutes=minutes||1,childText+=globalize.translate("sharedcomponents#ValueMinutes",Math.round(minutes))}else childText+=globalize.translate("sharedcomponents#ValueMinutes",0);counts.push(childText)}else"Genre"===item.Type||"Studio"===item.Type?(item.MovieCount&&(childText=1===item.MovieCount?globalize.translate("sharedcomponents#ValueOneMovie"):globalize.translate("sharedcomponents#ValueMovieCount",item.MovieCount),counts.push(childText)),item.SeriesCount&&(childText=1===item.SeriesCount?globalize.translate("sharedcomponents#ValueOneSeries"):globalize.translate("sharedcomponents#ValueSeriesCount",item.SeriesCount),counts.push(childText)),item.EpisodeCount&&(childText=1===item.EpisodeCount?globalize.translate("sharedcomponents#ValueOneEpisode"):globalize.translate("sharedcomponents#ValueEpisodeCount",item.EpisodeCount),counts.push(childText)),item.GameCount&&(childText=1===item.GameCount?globalize.translate("sharedcomponents#ValueOneGame"):globalize.translate("sharedcomponents#ValueGameCount",item.GameCount),counts.push(childText))):"GameGenre"===item.Type?item.GameCount&&(childText=1===item.GameCount?globalize.translate("sharedcomponents#ValueOneGame"):globalize.translate("sharedcomponents#ValueGameCount",item.GameCount),counts.push(childText)):"MusicGenre"===item.Type||"MusicArtist"===options.context?(item.AlbumCount&&(childText=1===item.AlbumCount?globalize.translate("sharedcomponents#ValueOneAlbum"):globalize.translate("sharedcomponents#ValueAlbumCount",item.AlbumCount),counts.push(childText)),item.SongCount&&(childText=1===item.SongCount?globalize.translate("sharedcomponents#ValueOneSong"):globalize.translate("sharedcomponents#ValueSongCount",item.SongCount),counts.push(childText)),item.MusicVideoCount&&(childText=1===item.MusicVideoCount?globalize.translate("sharedcomponents#ValueOneMusicVideo"):globalize.translate("sharedcomponents#ValueMusicVideoCount",item.MusicVideoCount),counts.push(childText))):"Series"===item.Type&&(childText=1===item.RecursiveItemCount?globalize.translate("sharedcomponents#ValueOneEpisode"):globalize.translate("sharedcomponents#ValueEpisodeCount",item.RecursiveItemCount),counts.push(childText));return counts.join(", ")}function buildCard(index,item,apiClient,options,className){var action=options.action||"link",scalable=options.scalable!==!1;scalable&&(className+=" scalableCard "+options.shape+"Card-scalable");var imgInfo=getCardImageUrl(item,apiClient,options),imgUrl=imgInfo.imgUrl,forceName=imgInfo.forceName,showTitle="auto"===options.showTitle||(options.showTitle||"PhotoAlbum"===item.Type||"Folder"===item.Type),overlayText=options.overlayText;forceName&&!options.cardLayout&&null==overlayText&&(overlayText=!0);var cardImageContainerClass="cardImageContainer",coveredImage=options.coverImage||imgInfo.coverImage;coveredImage&&(cardImageContainerClass+=" coveredImage",("Photo"===item.MediaType||"PhotoAlbum"===item.Type||"Folder"===item.Type||item.ProgramInfo||"Program"===item.Type||"Recording"===item.Type)&&(cardImageContainerClass+=" coveredImage-noScale")),imgUrl||(cardImageContainerClass+=" "+getDefaultColorClass(item.Name));var separateCardBox=scalable,cardBoxClass=options.cardLayout?"cardBox visualCardBox":"cardBox";layoutManager.tv&&(cardBoxClass+=" cardBox-focustransform");var footerCssClass,progressHtml=indicators.getProgressBarHtml(item),innerCardFooter="",footerOverlayed=!1,cardFooterId="cardFooter"+uniqueFooterIndex;uniqueFooterIndex++,overlayText?(footerCssClass=progressHtml?"innerCardFooter fullInnerCardFooter":"innerCardFooter",innerCardFooter+=getCardFooterText(item,apiClient,options,showTitle,forceName,overlayText,imgUrl,footerCssClass,progressHtml,!1,cardFooterId),footerOverlayed=!0):progressHtml&&(innerCardFooter+='
',innerCardFooter+=progressHtml,innerCardFooter+="
",progressHtml="");var mediaSourceCount=item.MediaSourceCount||1;mediaSourceCount>1&&(innerCardFooter+='
'+mediaSourceCount+"
");var vibrantSwatch=options.vibrant&&imgUrl?imageLoader.getCachedVibrantInfo(imgUrl):null,outerCardFooter="";overlayText||footerOverlayed||(footerCssClass=options.cardLayout?"cardFooter":"cardFooter transparent",outerCardFooter=getCardFooterText(item,apiClient,options,showTitle,forceName,overlayText,imgUrl,footerCssClass,progressHtml,!0,cardFooterId,vibrantSwatch)),outerCardFooter&&!options.cardLayout&&options.allowBottomPadding!==!1&&(cardBoxClass+=" cardBox-bottompadded"),separateCardBox||(cardImageContainerClass+=" "+cardBoxClass);var overlayButtons="";if(!layoutManager.tv){var overlayPlayButton=options.overlayPlayButton;if(null!=overlayPlayButton||options.overlayMoreButton||options.cardLayout||(overlayPlayButton="Video"===item.MediaType),!overlayPlayButton||item.IsPlaceHolder||"Virtual"===item.LocationType&&item.MediaType&&"Program"!==item.Type||"Person"===item.Type||"Full"!==item.PlayAccess||(overlayButtons+=''),options.overlayMoreButton){var moreIcon="dots-horiz"===appHost.moreIcon?"":"";overlayButtons+='"}}options.showChildCountIndicator&&item.ChildCount&&(className+=" groupedCard");var cardImageContainerOpen,cardImageContainerClose="",cardBoxClose="",cardContentClose="",cardScalableClose="";if(separateCardBox){var cardContentOpen;layoutManager.tv?(cardContentOpen='
',cardContentClose="
"):(cardContentOpen='");var vibrantAttributes=options.vibrant&&imgUrl&&!vibrantSwatch?' data-vibrant="'+cardFooterId+'" data-swatch="db"':"";if(vibrantAttributes&&!browser.safari){cardImageContainerOpen='
';var imgClass="cardImage cardImage-img lazy";coveredImage&&(imgClass+=1===devicePixelRatio?" coveredImage-noscale-img":" coveredImage-img"),cardImageContainerOpen+=''}else cardImageContainerOpen=imgUrl?'
':'
';var cardScalableClass="cardScalable";cardImageContainerOpen='
'+cardContentOpen+cardImageContainerOpen,cardBoxClose="
",cardScalableClose="
",cardImageContainerClose="
"}else overlayButtons&&!separateCardBox?(cardImageContainerClass+=" cardImageContainerClass-button",cardImageContainerOpen=imgUrl?'",className+=" forceRelative"):(cardImageContainerOpen=imgUrl?'
':'
',cardImageContainerClose="
");var indicatorsHtml="";if(indicatorsHtml+=indicators.getSyncIndicator(item),indicatorsHtml+=indicators.getTimerIndicator(item),indicatorsHtml+=options.showGroupCount?indicators.getChildCountIndicatorHtml(item,{minCount:1}):indicators.getPlayedIndicatorHtml(item),indicatorsHtml&&(cardImageContainerOpen+='
'+indicatorsHtml+"
"),!imgUrl){var defaultName=isUsingLiveTvNaming(item)?item.Name:itemHelper.getDisplayName(item);cardImageContainerOpen+='
'+defaultName+"
"}var tagName=!layoutManager.tv&&scalable||overlayButtons?"div":"button",prefix=(item.SortName||item.Name||"")[0];prefix&&(prefix=prefix.toUpperCase());var timerAttributes="";item.TimerId&&(timerAttributes+=' data-timerid="'+item.TimerId+'"'),item.SeriesTimerId&&(timerAttributes+=' data-seriestimerid="'+item.SeriesTimerId+'"');var actionAttribute;"button"===tagName?(className+=" itemAction",actionAttribute=' data-action="'+action+'"'):actionAttribute="","MusicAlbum"!==item.Type&&"MusicArtist"!==item.Type&&"Audio"!==item.Type&&(className+=" card-withuserdata");var positionTicksData=item.UserData&&item.UserData.PlaybackPositionTicks?' data-positionticks="'+item.UserData.PlaybackPositionTicks+'"':"",collectionIdData=options.collectionId?' data-collectionid="'+options.collectionId+'"':"",playlistIdData=options.playlistId?' data-playlistid="'+options.playlistId+'"':"",mediaTypeData=item.MediaType?' data-mediatype="'+item.MediaType+'"':"",collectionTypeData=item.CollectionType?' data-collectiontype="'+item.CollectionType+'"':"",channelIdData=item.ChannelId?' data-channelid="'+item.ChannelId+'"':"",contextData=options.context?' data-context="'+options.context+'"':"";return"<"+tagName+' data-index="'+index+'"'+timerAttributes+actionAttribute+' data-isfolder="'+(item.IsFolder||!1)+'" data-serverid="'+(item.ServerId||options.serverId)+'" data-id="'+(item.Id||item.ItemId)+'" data-type="'+item.Type+'"'+mediaTypeData+collectionTypeData+channelIdData+positionTicksData+collectionIdData+playlistIdData+contextData+' data-prefix="'+prefix+'" class="'+className+'">'+cardImageContainerOpen+innerCardFooter+cardImageContainerClose+cardContentClose+overlayButtons+cardScalableClose+outerCardFooter+cardBoxClose+""}function buildCards(items,options){if(document.body.contains(options.itemsContainer)){if(options.parentContainer){if(!items.length)return void options.parentContainer.classList.add("hide");options.parentContainer.classList.remove("hide")}var html=buildCardsHtmlInternal(items,options);html?(options.itemsContainer.cardBuilderHtml!==html&&(options.itemsContainer.innerHTML=html,items.length<50?options.itemsContainer.cardBuilderHtml=html:options.itemsContainer.cardBuilderHtml=null),imageLoader.lazyChildren(options.itemsContainer)):(options.itemsContainer.innerHTML=html,options.itemsContainer.cardBuilderHtml=null),options.autoFocus&&focusManager.autoFocus(options.itemsContainer,!0),"Genres"===options.indexBy&&options.itemsContainer.addEventListener("click",onItemsContainerClick)}}function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}function onItemsContainerClick(e){var listItemsMoreButton=parentWithClass(e.target,"listItemsMoreButton");if(listItemsMoreButton){var value=listItemsMoreButton.getAttribute("data-indexvalue"),parentid=listItemsMoreButton.getAttribute("data-parentid");require(["embyRouter"],function(embyRouter){embyRouter.showGenre({ParentId:parentid,Id:value})})}}function ensureIndicators(card,indicatorsElem){if(indicatorsElem)return indicatorsElem;if(indicatorsElem=card.querySelector(".cardIndicators"),!indicatorsElem){var cardImageContainer=card.querySelector(".cardImageContainer");indicatorsElem=document.createElement("div"),indicatorsElem.classList.add("cardIndicators"),cardImageContainer.appendChild(indicatorsElem)}return indicatorsElem}function updateUserData(card,userData){var type=card.getAttribute("data-type"),enableCountIndicator="Series"===type||"BoxSet"===type||"Season"===type,indicatorsElem=null,playedIndicator=null,countIndicator=null,itemProgressBar=null;userData.Played?(playedIndicator=card.querySelector(".playedIndicator"),playedIndicator||(playedIndicator=document.createElement("div"),playedIndicator.classList.add("playedIndicator"),playedIndicator.classList.add("indicator"),indicatorsElem=ensureIndicators(card,indicatorsElem),indicatorsElem.appendChild(playedIndicator)),playedIndicator.innerHTML='check'):(playedIndicator=card.querySelector(".playedIndicator"),playedIndicator&&playedIndicator.parentNode.removeChild(playedIndicator)),userData.UnplayedItemCount?(countIndicator=card.querySelector(".countIndicator"),countIndicator||(countIndicator=document.createElement("div"),countIndicator.classList.add("countIndicator"),indicatorsElem=ensureIndicators(card,indicatorsElem),indicatorsElem.appendChild(countIndicator)),countIndicator.innerHTML=userData.UnplayedItemCount):enableCountIndicator&&(countIndicator=card.querySelector(".countIndicator"),countIndicator&&countIndicator.parentNode.removeChild(countIndicator));var progressHtml=indicators.getProgressBarHtml({Type:type,UserData:userData,MediaType:"Video"});if(progressHtml){if(itemProgressBar=card.querySelector(".itemProgressBar"),!itemProgressBar){itemProgressBar=document.createElement("div"),itemProgressBar.classList.add("itemProgressBar");var innerCardFooter=card.querySelector(".innerCardFooter");if(!innerCardFooter){innerCardFooter=document.createElement("div"),innerCardFooter.classList.add("innerCardFooter");var cardImageContainer=card.querySelector(".cardImageContainer");cardImageContainer.appendChild(innerCardFooter)}innerCardFooter.appendChild(itemProgressBar)}itemProgressBar.innerHTML=progressHtml}else itemProgressBar=card.querySelector(".itemProgressBar"),itemProgressBar&&itemProgressBar.parentNode.removeChild(itemProgressBar)}function onUserDataChanged(userData,scope){for(var cards=(scope||document.body).querySelectorAll('.card-withuserdata[data-id="'+userData.ItemId+'"]'),i=0,length=cards.length;i')}cell.setAttribute("data-timerid",newTimerId)}}function onTimerCancelled(id,itemsContainer){for(var cells=itemsContainer.querySelectorAll('.card[data-timerid="'+id+'"]'),i=0,length=cells.length;i'+icon+""}return function(options){function createElements(options){dlg=dialogHelper.createDialog({exitAnimationDuration:options.interactive?400:800,size:"fullscreen",autoFocus:!1,scrollY:!1,exitAnimation:"fadeout",removeOnClose:!0}),dlg.classList.add("slideshowDialog");var html="";if(options.interactive){var actionButtonsOnTop=layoutManager.mobile;html+="
",html+='
',html+=getIcon("keyboard_arrow_left","btnSlideshowPrevious slideshowButton",!1),html+=getIcon("keyboard_arrow_right","btnSlideshowNext slideshowButton",!1),html+='
',actionButtonsOnTop&&(appHost.supports("filedownload")&&(html+=getIcon("file_download","btnDownload slideshowButton",!0)),appHost.supports("sharing")&&(html+=getIcon("share","btnShare slideshowButton",!0))),html+=getIcon("close","slideshowButton btnSlideshowExit",!1),html+="
",actionButtonsOnTop||(html+='
',html+=getIcon("pause","btnSlideshowPause slideshowButton",!0,!0),appHost.supports("filedownload")&&(html+=getIcon("file_download","btnDownload slideshowButton",!0)),appHost.supports("sharing")&&(html+=getIcon("share","btnShare slideshowButton",!0)),html+="
"),html+="
"}else html+='

';if(dlg.innerHTML=html,options.interactive){dlg.querySelector(".btnSlideshowExit").addEventListener("click",function(e){dialogHelper.close(dlg)}),dlg.querySelector(".btnSlideshowNext").addEventListener("click",nextImage),dlg.querySelector(".btnSlideshowPrevious").addEventListener("click",previousImage);var btnPause=dlg.querySelector(".btnSlideshowPause");btnPause&&btnPause.addEventListener("click",playPause);var btnDownload=dlg.querySelector(".btnDownload");btnDownload&&btnDownload.addEventListener("click",download);var btnShare=dlg.querySelector(".btnShare");btnShare&&btnShare.addEventListener("click",share)}dialogHelper.open(dlg).then(function(){stopInterval()}),inputmanager.on(window,onInputCommand),document.addEventListener("mousemove",onMouseMove),dlg.addEventListener("close",onDialogClosed),options.interactive&&loadSwiper(dlg)}function loadSwiper(dlg){currentOptions.slides?dlg.querySelector(".swiper-wrapper").innerHTML=currentOptions.slides.map(getSwiperSlideHtmlFromSlide).join(""):dlg.querySelector(".swiper-wrapper").innerHTML=currentOptions.items.map(getSwiperSlideHtmlFromItem).join(""),require(["swiper"],function(swiper){swiperInstance=new Swiper(dlg.querySelector(".slideshowSwiperContainer"),{direction:"horizontal",loop:options.loop!==!1,autoplay:options.interval||8e3,preloadImages:!1,lazyLoading:!0,lazyLoadingInPrevNext:!0,autoplayDisableOnInteraction:!1,initialSlide:options.startIndex||0,speed:240}),swiperInstance.on("onLazyImageLoad",onSlideChangeStart),swiperInstance.on("onLazyImageReady",onSlideChangeEnd),layoutManager.mobile?pause():play()})}function getSwiperSlideHtmlFromItem(item){return getSwiperSlideHtmlFromSlide({imageUrl:getImgUrl(item),originalImage:getImgUrl(item,!0),Id:item.Id,ServerId:item.ServerId})}function onSlideChangeStart(swiper,slide,image){}function onSlideChangeEnd(swiper,slide,image){}function getSwiperSlideHtmlFromSlide(item){var html="";return html+='
',html+='',(item.title||item.subtitle)&&(html+='
',html+='
',item.title&&(html+='
',html+=item.title,html+="
"),item.description&&(html+='
',html+=item.description,html+="
"),html+="
",html+="
"),html+="
"}function previousImage(){swiperInstance?swiperInstance.slidePrev():(stopInterval(),showNextImage(currentIndex-1))}function nextImage(){if(swiperInstance){if(options.loop===!1&&swiperInstance.activeIndex>=swiperInstance.slides.length-1)return void dialogHelper.close(dlg);swiperInstance.slideNext()}else stopInterval(),showNextImage(currentIndex+1)}function getCurrentImageInfo(){if(swiperInstance){var slide=document.querySelector(".swiper-slide-active");return slide?{url:slide.getAttribute("data-original"),itemId:slide.getAttribute("data-itemid"),serverId:slide.getAttribute("data-serverid")}:null}return null}function download(){var imageInfo=getCurrentImageInfo();require(["fileDownloader"],function(fileDownloader){fileDownloader.download([imageInfo])})}function share(){var imageInfo=getCurrentImageInfo();require(["sharingmanager"],function(sharingManager){sharingManager.showMenu(imageInfo)})}function play(){var btnSlideshowPause=dlg.querySelector(".btnSlideshowPause i");btnSlideshowPause&&(btnSlideshowPause.innerHTML="pause"),swiperInstance.startAutoplay()}function pause(){var btnSlideshowPause=dlg.querySelector(".btnSlideshowPause i");btnSlideshowPause&&(btnSlideshowPause.innerHTML="play_arrow"),swiperInstance.stopAutoplay()}function playPause(){var paused="pause"!==dlg.querySelector(".btnSlideshowPause i").innerHTML;paused?play():pause()}function onDialogClosed(){var swiper=swiperInstance;swiper&&(swiper.off("onLazyImageLoad"),swiper.off("onLazyImageReady"),swiper.destroy(!0,!0),swiperInstance=null),inputmanager.off(window,onInputCommand),document.removeEventListener("mousemove",onMouseMove)}function startInterval(options){currentOptions=options,stopInterval(),createElements(options),options.interactive||(currentIntervalMs=options.interval||8e3,showNextImage(options.startIndex||0,!0))}function isOsdOpen(){return _osdOpen}function getOsdBottom(){return dlg.querySelector(".slideshowBottomBar")}function showOsd(){var bottom=getOsdBottom();bottom&&(slideUpToShow(bottom),startHideTimer())}function hideOsd(){var bottom=getOsdBottom();bottom&&slideDownToHide(bottom)}function startHideTimer(){stopHideTimer(),hideTimeout=setTimeout(hideOsd,4e3)}function stopHideTimer(){hideTimeout&&(clearTimeout(hideTimeout),hideTimeout=null)}function slideUpToShow(elem){elem.classList.contains("hide")&&(_osdOpen=!0,elem.classList.remove("hide"),requestAnimationFrame(function(){var keyframes=[{transform:"translate3d(0,"+elem.offsetHeight+"px,0)",opacity:".3",offset:0},{transform:"translate3d(0,0,0)",opacity:"1",offset:1}],timing={duration:300,iterations:1,easing:"ease-out"};elem.animate(keyframes,timing).onfinish=function(){focusManager.focus(elem.querySelector(".btnSlideshowPause"))}}))}function slideDownToHide(elem){elem.classList.contains("hide")||requestAnimationFrame(function(){var keyframes=[{transform:"translate3d(0,0,0)",opacity:"1",offset:0},{transform:"translate3d(0,"+elem.offsetHeight+"px,0)",opacity:".3",offset:1}],timing={duration:300,iterations:1,easing:"ease-out"};elem.animate(keyframes,timing).onfinish=function(){elem.classList.add("hide"),_osdOpen=!1}})}function onMouseMove(e){var eventX=e.screenX||0,eventY=e.screenY||0,obj=lastMouseMoveData;return obj?void(Math.abs(eventX-obj.x)<10&&Math.abs(eventY-obj.y)<10||(obj.x=eventX,obj.y=eventY,showOsd())):void(lastMouseMoveData={x:eventX,y:eventY})}function onInputCommand(e){switch(e.detail.command){case"left":isOsdOpen()||(e.preventDefault(),e.stopPropagation(),previousImage());break;case"right":isOsdOpen()||(e.preventDefault(),e.stopPropagation(),nextImage());break;case"up":case"down":case"select":case"menu":case"info":case"play":case"playpause":case"pause":case"fastforward":case"rewind":case"next":case"previous":showOsd()}}function showNextImage(index,skipPreload){index=Math.max(0,index),index>=currentOptions.items.length&&(index=0),currentIndex=index;var options=currentOptions,items=options.items,item=items[index],imgUrl=getImgUrl(item),onSrcLoaded=function(){var cardImageContainer=dlg.querySelector(".slideshowImage"),newCardImageContainer=document.createElement("div");newCardImageContainer.className=cardImageContainer.className,options.cover&&newCardImageContainer.classList.add("slideshowImage-cover"),newCardImageContainer.style.backgroundImage="url('"+imgUrl+"')",newCardImageContainer.classList.add("hide"),cardImageContainer.parentNode.appendChild(newCardImageContainer),options.showTitle?dlg.querySelector(".slideshowImageText").innerHTML=item.Name:dlg.querySelector(".slideshowImageText").innerHTML="",newCardImageContainer.classList.remove("hide");var onAnimationFinished=function(){var parentNode=cardImageContainer.parentNode;parentNode&&parentNode.removeChild(cardImageContainer)};if(newCardImageContainer.animate&&!browser.noAnimation){var keyframes=[{opacity:"0",offset:0},{opacity:"1",offset:1}],timing={duration:1200,iterations:1};newCardImageContainer.animate(keyframes,timing).onfinish=onAnimationFinished}else onAnimationFinished();stopInterval(),currentTimeout=setTimeout(function(){showNextImage(index+1,!0)},currentIntervalMs)};if(skipPreload)onSrcLoaded();else{var img=new Image;img.onload=onSrcLoaded,img.src=imgUrl}}function stopInterval(){currentTimeout&&(clearTimeout(currentTimeout),currentTimeout=null)}var swiperInstance,dlg,currentTimeout,currentIntervalMs,currentOptions,currentIndex,hideTimeout,lastMouseMoveData,self=this,_osdOpen=!1;self.show=function(){startInterval(options)},self.hide=function(){var dialog=dlg;dialog&&dialogHelper.close(dialog)}}}); \ No newline at end of file +define(["dialogHelper","inputManager","connectionManager","layoutManager","focusManager","browser","apphost","loading","css!./style","material-icons","paper-icon-button-light"],function(dialogHelper,inputmanager,connectionManager,layoutManager,focusManager,browser,appHost,loading){"use strict";function getImageUrl(item,options,apiClient){return options=options||{},options.type=options.type||"Primary","string"==typeof item?apiClient.getScaledImageUrl(item,options):item.ImageTags&&item.ImageTags[options.type]?(options.tag=item.ImageTags[options.type],apiClient.getScaledImageUrl(item.Id,options)):"Primary"===options.type&&item.AlbumId&&item.AlbumPrimaryImageTag?(options.tag=item.AlbumPrimaryImageTag,apiClient.getScaledImageUrl(item.AlbumId,options)):null}function getBackdropImageUrl(item,options,apiClient){return options=options||{},options.type=options.type||"Backdrop",options.maxWidth||options.width||options.maxHeight||options.height||(options.quality=100),item.BackdropImageTags&&item.BackdropImageTags.length?(options.tag=item.BackdropImageTags[0],apiClient.getScaledImageUrl(item.Id,options)):null}function getImgUrl(item,original){var apiClient=connectionManager.getApiClient(item.ServerId),imageOptions={};return original||(imageOptions.maxWidth=screen.availWidth),item.BackdropImageTags&&item.BackdropImageTags.length?getBackdropImageUrl(item,imageOptions,apiClient):"Photo"===item.MediaType&&original?apiClient.getItemDownloadUrl(item.Id):(imageOptions.type="Primary",getImageUrl(item,imageOptions,apiClient))}function getIcon(icon,cssClass,canFocus,autoFocus){var tabIndex=canFocus?"":' tabindex="-1"';return autoFocus=autoFocus?" autofocus":"",'"}return function(options){function createElements(options){dlg=dialogHelper.createDialog({exitAnimationDuration:options.interactive?400:800,size:"fullscreen",autoFocus:!1,scrollY:!1,exitAnimation:"fadeout",removeOnClose:!0}),dlg.classList.add("slideshowDialog");var html="";if(options.interactive){var actionButtonsOnTop=layoutManager.mobile;html+="
",html+='
',html+=getIcon("keyboard_arrow_left","btnSlideshowPrevious slideshowButton",!1),html+=getIcon("keyboard_arrow_right","btnSlideshowNext slideshowButton",!1),html+='
',actionButtonsOnTop&&(appHost.supports("filedownload")&&(html+=getIcon("file_download","btnDownload slideshowButton",!0)),appHost.supports("sharing")&&(html+=getIcon("share","btnShare slideshowButton",!0))),html+=getIcon("close","slideshowButton btnSlideshowExit",!1),html+="
",actionButtonsOnTop||(html+='
',html+=getIcon("pause","btnSlideshowPause slideshowButton",!0,!0),appHost.supports("filedownload")&&(html+=getIcon("file_download","btnDownload slideshowButton",!0)),appHost.supports("sharing")&&(html+=getIcon("share","btnShare slideshowButton",!0)),html+="
"),html+="
"}else html+='

';if(dlg.innerHTML=html,options.interactive){dlg.querySelector(".btnSlideshowExit").addEventListener("click",function(e){dialogHelper.close(dlg)}),dlg.querySelector(".btnSlideshowNext").addEventListener("click",nextImage),dlg.querySelector(".btnSlideshowPrevious").addEventListener("click",previousImage);var btnPause=dlg.querySelector(".btnSlideshowPause");btnPause&&btnPause.addEventListener("click",playPause);var btnDownload=dlg.querySelector(".btnDownload");btnDownload&&btnDownload.addEventListener("click",download);var btnShare=dlg.querySelector(".btnShare");btnShare&&btnShare.addEventListener("click",share)}dialogHelper.open(dlg).then(function(){stopInterval()}),inputmanager.on(window,onInputCommand),document.addEventListener("mousemove",onMouseMove),dlg.addEventListener("close",onDialogClosed),options.interactive&&loadSwiper(dlg)}function loadSwiper(dlg){currentOptions.slides?dlg.querySelector(".swiper-wrapper").innerHTML=currentOptions.slides.map(getSwiperSlideHtmlFromSlide).join(""):dlg.querySelector(".swiper-wrapper").innerHTML=currentOptions.items.map(getSwiperSlideHtmlFromItem).join(""),require(["swiper"],function(swiper){swiperInstance=new Swiper(dlg.querySelector(".slideshowSwiperContainer"),{direction:"horizontal",loop:options.loop!==!1,autoplay:options.interval||8e3,preloadImages:!1,lazyLoading:!0,lazyLoadingInPrevNext:!0,autoplayDisableOnInteraction:!1,initialSlide:options.startIndex||0,speed:240}),swiperInstance.on("onLazyImageLoad",onSlideChangeStart),swiperInstance.on("onLazyImageReady",onSlideChangeEnd),layoutManager.mobile?pause():play()})}function getSwiperSlideHtmlFromItem(item){return getSwiperSlideHtmlFromSlide({imageUrl:getImgUrl(item),originalImage:getImgUrl(item,!0),Id:item.Id,ServerId:item.ServerId})}function onSlideChangeStart(swiper,slide,image){}function onSlideChangeEnd(swiper,slide,image){}function getSwiperSlideHtmlFromSlide(item){var html="";return html+='
',html+='',(item.title||item.subtitle)&&(html+='
',html+='
',item.title&&(html+='

',html+=item.title,html+="

"),item.description&&(html+='
',html+=item.description,html+="
"),html+="
",html+="
"),html+="
"}function previousImage(){swiperInstance?swiperInstance.slidePrev():(stopInterval(),showNextImage(currentIndex-1))}function nextImage(){if(swiperInstance){if(options.loop===!1&&swiperInstance.activeIndex>=swiperInstance.slides.length-1)return void dialogHelper.close(dlg);swiperInstance.slideNext()}else stopInterval(),showNextImage(currentIndex+1)}function getCurrentImageInfo(){if(swiperInstance){var slide=document.querySelector(".swiper-slide-active");return slide?{url:slide.getAttribute("data-original"),itemId:slide.getAttribute("data-itemid"),serverId:slide.getAttribute("data-serverid")}:null}return null}function download(){var imageInfo=getCurrentImageInfo();require(["fileDownloader"],function(fileDownloader){fileDownloader.download([imageInfo])})}function share(){var imageInfo=getCurrentImageInfo();require(["sharingmanager"],function(sharingManager){sharingManager.showMenu(imageInfo)})}function play(){var btnSlideshowPause=dlg.querySelector(".btnSlideshowPause i");btnSlideshowPause&&(btnSlideshowPause.innerHTML="pause"),swiperInstance.startAutoplay()}function pause(){var btnSlideshowPause=dlg.querySelector(".btnSlideshowPause i");btnSlideshowPause&&(btnSlideshowPause.innerHTML="play_arrow"),swiperInstance.stopAutoplay()}function playPause(){var paused="pause"!==dlg.querySelector(".btnSlideshowPause i").innerHTML;paused?play():pause()}function onDialogClosed(){var swiper=swiperInstance;swiper&&(swiper.off("onLazyImageLoad"),swiper.off("onLazyImageReady"),swiper.destroy(!0,!0),swiperInstance=null),inputmanager.off(window,onInputCommand),document.removeEventListener("mousemove",onMouseMove)}function startInterval(options){currentOptions=options,stopInterval(),createElements(options),options.interactive||(currentIntervalMs=options.interval||8e3,showNextImage(options.startIndex||0,!0))}function isOsdOpen(){return _osdOpen}function getOsdBottom(){return dlg.querySelector(".slideshowBottomBar")}function showOsd(){var bottom=getOsdBottom();bottom&&(slideUpToShow(bottom),startHideTimer())}function hideOsd(){var bottom=getOsdBottom();bottom&&slideDownToHide(bottom)}function startHideTimer(){stopHideTimer(),hideTimeout=setTimeout(hideOsd,4e3)}function stopHideTimer(){hideTimeout&&(clearTimeout(hideTimeout),hideTimeout=null)}function slideUpToShow(elem){elem.classList.contains("hide")&&(_osdOpen=!0,elem.classList.remove("hide"),requestAnimationFrame(function(){var keyframes=[{transform:"translate3d(0,"+elem.offsetHeight+"px,0)",opacity:".3",offset:0},{transform:"translate3d(0,0,0)",opacity:"1",offset:1}],timing={duration:300,iterations:1,easing:"ease-out"};elem.animate(keyframes,timing).onfinish=function(){focusManager.focus(elem.querySelector(".btnSlideshowPause"))}}))}function slideDownToHide(elem){elem.classList.contains("hide")||requestAnimationFrame(function(){var keyframes=[{transform:"translate3d(0,0,0)",opacity:"1",offset:0},{transform:"translate3d(0,"+elem.offsetHeight+"px,0)",opacity:".3",offset:1}],timing={duration:300,iterations:1,easing:"ease-out"};elem.animate(keyframes,timing).onfinish=function(){elem.classList.add("hide"),_osdOpen=!1}})}function onMouseMove(e){var eventX=e.screenX||0,eventY=e.screenY||0,obj=lastMouseMoveData;return obj?void(Math.abs(eventX-obj.x)<10&&Math.abs(eventY-obj.y)<10||(obj.x=eventX,obj.y=eventY,showOsd())):void(lastMouseMoveData={x:eventX,y:eventY})}function onInputCommand(e){switch(e.detail.command){case"left":isOsdOpen()||(e.preventDefault(),e.stopPropagation(),previousImage());break;case"right":isOsdOpen()||(e.preventDefault(),e.stopPropagation(),nextImage());break;case"up":case"down":case"select":case"menu":case"info":case"play":case"playpause":case"pause":case"fastforward":case"rewind":case"next":case"previous":showOsd()}}function showNextImage(index,skipPreload){index=Math.max(0,index),index>=currentOptions.items.length&&(index=0),currentIndex=index;var options=currentOptions,items=options.items,item=items[index],imgUrl=getImgUrl(item),onSrcLoaded=function(){var cardImageContainer=dlg.querySelector(".slideshowImage"),newCardImageContainer=document.createElement("div");newCardImageContainer.className=cardImageContainer.className,options.cover&&newCardImageContainer.classList.add("slideshowImage-cover"),newCardImageContainer.style.backgroundImage="url('"+imgUrl+"')",newCardImageContainer.classList.add("hide"),cardImageContainer.parentNode.appendChild(newCardImageContainer),options.showTitle?dlg.querySelector(".slideshowImageText").innerHTML=item.Name:dlg.querySelector(".slideshowImageText").innerHTML="",newCardImageContainer.classList.remove("hide");var onAnimationFinished=function(){var parentNode=cardImageContainer.parentNode;parentNode&&parentNode.removeChild(cardImageContainer)};if(newCardImageContainer.animate&&!browser.noAnimation){var keyframes=[{opacity:"0",offset:0},{opacity:"1",offset:1}],timing={duration:1200,iterations:1};newCardImageContainer.animate(keyframes,timing).onfinish=onAnimationFinished}else onAnimationFinished();stopInterval(),currentTimeout=setTimeout(function(){showNextImage(index+1,!0)},currentIntervalMs)};if(skipPreload)onSrcLoaded();else{var img=new Image;img.onload=onSrcLoaded,img.src=imgUrl}}function stopInterval(){currentTimeout&&(clearTimeout(currentTimeout),currentTimeout=null)}var swiperInstance,dlg,currentTimeout,currentIntervalMs,currentOptions,currentIndex,hideTimeout,lastMouseMoveData,self=this,_osdOpen=!1;self.show=function(){startInterval(options)},self.hide=function(){var dialog=dlg;dialog&&dialogHelper.close(dialog)}}}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/slideshow/style.css b/dashboard-ui/bower_components/emby-webcomponents/slideshow/style.css index dd473337f4..2149a418d6 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/slideshow/style.css +++ b/dashboard-ui/bower_components/emby-webcomponents/slideshow/style.css @@ -1 +1 @@ -.slideshowSwiperContainer,.swiper-slide,.swiper-wrapper{background:#000}.slideshowImage,.slideshowSwiperContainer{position:fixed;top:0;right:0;left:0;bottom:0;background-position:center center;-webkit-background-size:contain;background-size:contain;background-repeat:no-repeat;margin:0!important;color:#fff;line-height:normal}.slideshowImage-cover{-webkit-background-size:cover;background-size:cover}.slideshowImageText{position:fixed;bottom:.25em;right:.5em;color:#fff;z-index:1002;font-weight:400;text-shadow:3px 3px 0 #000,-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000}.swiper-slide-img{width:auto;height:auto;max-width:100%;max-height:100%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);position:absolute;left:50%;top:50%}.btnSlideshowNext,.btnSlideshowPrevious{top:45vh;z-index:1002;position:absolute}.slideshowButtonIcon{width:auto!important;height:auto!important;font-size:3.1em!important;color:#fff;opacity:.7;min-width:40px;min-height:40px}.btnSlideshowPrevious{left:.5vh}.btnSlideshowNext{right:.5vh}.topActionButtons{right:.5vh;top:.5vh;z-index:1002;position:absolute}.slideshowBottomBar,.slideshowTopBar{position:fixed;background-color:rgba(0,0,0,.7);color:#fff;padding:.5%;-webkit-box-orient:horizontal;-webkit-box-direction:normal;left:0;right:0}.slideshowBottomBar{bottom:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.slideshowTopBar{top:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;align-items:center;text-align:right;-webkit-box-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.mouseIdle .btnSlideshowExit,.mouseIdle .btnSlideshowNext,.mouseIdle .btnSlideshowPrevious{display:none}.slideshowExtraButtons{margin-left:auto;text-align:right}.slideText{position:absolute;left:0;right:0;bottom:10vh;text-align:center}.slideTextInner{margin:0 auto;max-width:60%;background:rgba(0,0,0,.8);display:inline-block;padding:.5em 1em;-webkit-border-radius:.25em;border-radius:.25em}.slideTitle{font-size:180%}.slideSubtitle{color:#ccc} \ No newline at end of file +.slideshowSwiperContainer,.swiper-slide,.swiper-wrapper{background:#000}.slideshowImage,.slideshowSwiperContainer{position:fixed;top:0;right:0;left:0;bottom:0;background-position:center center;-webkit-background-size:contain;background-size:contain;background-repeat:no-repeat;margin:0!important;color:#fff;line-height:normal}.slideshowImage-cover{-webkit-background-size:cover;background-size:cover}.slideshowImageText{position:fixed;bottom:.25em;right:.5em;color:#fff;z-index:1002;font-weight:400;text-shadow:3px 3px 0 #000,-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000}.swiper-slide-img{width:auto;height:auto;max-width:100%;max-height:100%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);position:absolute;left:50%;top:50%}.btnSlideshowNext,.btnSlideshowPrevious{top:45vh;z-index:1002;position:absolute}.slideshowButtonIcon{color:#fff;opacity:.7}.btnSlideshowPrevious{left:.5vh}.btnSlideshowNext{right:.5vh}.topActionButtons{right:.5vh;top:.5vh;z-index:1002;position:absolute}.slideshowBottomBar,.slideshowTopBar{position:fixed;background-color:rgba(0,0,0,.7);color:#fff;padding:.5%;-webkit-box-orient:horizontal;-webkit-box-direction:normal;left:0;right:0}.slideshowBottomBar{bottom:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.slideshowTopBar{top:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;align-items:center;text-align:right;-webkit-box-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.mouseIdle .btnSlideshowExit,.mouseIdle .btnSlideshowNext,.mouseIdle .btnSlideshowPrevious{display:none}.slideshowExtraButtons{margin-left:auto;text-align:right}.slideText{position:absolute;left:0;right:0;bottom:10vh;text-align:center}.slideTextInner{margin:0 auto;max-width:60%;background:rgba(0,0,0,.8);display:inline-block;padding:.5em 1em;-webkit-border-radius:.25em;border-radius:.25em}.slideTitle{margin:0 0 .25em}.slideSubtitle{color:#ccc} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/sync/syncjoblist.js b/dashboard-ui/bower_components/emby-webcomponents/sync/syncjoblist.js index eda53c6b39..6fef8b5521 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/sync/syncjoblist.js +++ b/dashboard-ui/bower_components/emby-webcomponents/sync/syncjoblist.js @@ -1 +1 @@ -define(["serverNotifications","events","loading","connectionManager","imageLoader","dom","globalize","registrationServices","layoutManager","listViewStyle"],function(serverNotifications,events,loading,connectionManager,imageLoader,dom,globalize,registrationServices,layoutManager){"use strict";function onSyncJobsUpdated(e,apiClient,data){var listInstance=this;renderList(listInstance,data,apiClient)}function refreshList(listInstance,jobs){for(var i=0,length=jobs.length;i';var imgUrl;job.PrimaryImageItemId&&(imgUrl=apiClient.getImageUrl(job.PrimaryImageItemId,{type:"Primary",width:80,tag:job.PrimaryImageTag,minScale:1.5})),imgUrl?(html+='
',html+="
"):html+='file_download';var textLines=[];job.ParentName&&textLines.push(job.ParentName),textLines.push(job.Name),1===job.ItemCount?textLines.push(globalize.translate("sharedcomponents#ValueOneItem")):textLines.push(globalize.translate("sharedcomponents#ItemCount",job.ItemCount)),html+='
';for(var i=0,length=textLines.length;i',html+=textLines[i],html+=""):(html+='
',html+=textLines[i],html+="
");return html+='
',html+=getProgressText(job),html+="
",html+="
",layoutManager.tv||(html+=''),html+=""}function renderList(listInstance,jobs,apiClient){if((new Date).getTime()-listInstance.lastDataLoad<6e4)return void refreshList(listInstance,jobs);listInstance.lastDataLoad=(new Date).getTime();for(var html="",lastTargetName="",isLocalSync=listInstance.options.isLocalSync,showTargetName=!isLocalSync,hasOpenSection=!1,i=0,length=jobs.length;i",html+="
",hasOpenSection=!1),lastTargetName=targetName,html+='
',html+="

"+targetName+"

",html+="
",html+='
',hasOpenSection=!0)}html+=getSyncJobHtml(listInstance,job,apiClient)}hasOpenSection&&(html+="
");var elem=listInstance.options.element.querySelector(".syncJobListContent");html||(html=isLocalSync?'
'+globalize.translate("sharedcomponents#MessageNoDownloadsFound")+"
":'
'+globalize.translate("sharedcomponents#MessageNoSyncJobsFound")+"
"),elem.innerHTML=html,imageLoader.lazyChildren(elem)}function fetchData(listInstance){listInstance.lastDataLoad=0,loading.show();var options={},apiClient=getApiClient(listInstance);return listInstance.options.userId&&(options.UserId=listInstance.options.userId),listInstance.options.isLocalSync?options.TargetId=apiClient.deviceId():options.ExcludeTargetIds=apiClient.deviceId(),apiClient.getJSON(apiClient.getUrl("Sync/Jobs",options)).then(function(response){renderList(listInstance,response.Items,apiClient),loading.hide()})}function startListening(listInstance){var startParams="0,1500",apiClient=getApiClient(listInstance);listInstance.options.userId&&(startParams+=","+listInstance.options.userId),listInstance.options.isLocalSync&&(startParams+=","+apiClient.deviceId()),apiClient.isWebSocketOpen()&&apiClient.sendWebSocketMessage("SyncJobsStart",startParams)}function stopListening(listInstance){var apiClient=getApiClient(listInstance);apiClient.isWebSocketOpen()&&apiClient.sendWebSocketMessage("SyncJobsStop","")}function getApiClient(listInstance){return connectionManager.getApiClient(listInstance.options.serverId)}function showJobMenu(listInstance,elem){var item=dom.parentWithClass(elem,"listItem"),jobId=item.getAttribute("data-id"),status=item.getAttribute("data-status"),menuItems=[];if("Cancelled"===status)menuItems.push({name:globalize.translate("sharedcomponents#Delete"),id:"delete"});else{var txt=listInstance.options.isLocalSync?globalize.translate("sharedcomponents#RemoveDownload"):globalize.translate("sharedcomponents#ButtonCancelSyncJob");menuItems.push({name:txt,id:"cancel"})}require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:elem,callback:function(id){switch(id){case"delete":cancelJob(listInstance,jobId);break;case"cancel":cancelJob(listInstance,jobId)}}})})}function onElementClick(e){var listInstance=this,btnJobMenu=dom.parentWithClass(e.target,"btnJobMenu");if(btnJobMenu)return void showJobMenu(this,btnJobMenu);var listItem=dom.parentWithClass(e.target,"listItem");if(listItem){var jobId=listItem.getAttribute("data-id");require(["syncJobEditor"],function(syncJobEditor){syncJobEditor.show({serverId:listInstance.options.serverId,jobId:jobId}).then(function(){fetchData(listInstance)})})}}function syncJobList(options){this.options=options;var onSyncJobsUpdatedHandler=onSyncJobsUpdated.bind(this);this.onSyncJobsUpdatedHandler=onSyncJobsUpdatedHandler,events.on(serverNotifications,"SyncJobs",onSyncJobsUpdatedHandler);var onClickHandler=onElementClick.bind(this);options.element.addEventListener("click",onClickHandler),this.onClickHandler=onClickHandler,options.element.innerHTML='
',fetchData(this),startListening(this),initSupporterInfo(options.element,getApiClient(this))}function showSupporterInfo(context){var html=''),html+=""}function renderList(listInstance,jobs,apiClient){if((new Date).getTime()-listInstance.lastDataLoad<6e4)return void refreshList(listInstance,jobs);listInstance.lastDataLoad=(new Date).getTime();for(var html="",lastTargetName="",isLocalSync=listInstance.options.isLocalSync,showTargetName=!isLocalSync,hasOpenSection=!1,i=0,length=jobs.length;i",html+="
",hasOpenSection=!1),lastTargetName=targetName,html+='
',html+="

"+targetName+"

",html+="
",html+='
',hasOpenSection=!0)}html+=getSyncJobHtml(listInstance,job,apiClient)}hasOpenSection&&(html+="
");var elem=listInstance.options.element.querySelector(".syncJobListContent");html||(html=isLocalSync?'
'+globalize.translate("sharedcomponents#MessageNoDownloadsFound")+"
":'
'+globalize.translate("sharedcomponents#MessageNoSyncJobsFound")+"
"),elem.innerHTML=html,imageLoader.lazyChildren(elem)}function fetchData(listInstance){listInstance.lastDataLoad=0,loading.show();var options={},apiClient=getApiClient(listInstance);return listInstance.options.userId&&(options.UserId=listInstance.options.userId),listInstance.options.isLocalSync?options.TargetId=apiClient.deviceId():options.ExcludeTargetIds=apiClient.deviceId(),apiClient.getJSON(apiClient.getUrl("Sync/Jobs",options)).then(function(response){renderList(listInstance,response.Items,apiClient),loading.hide()})}function startListening(listInstance){var startParams="0,1500",apiClient=getApiClient(listInstance);listInstance.options.userId&&(startParams+=","+listInstance.options.userId),listInstance.options.isLocalSync&&(startParams+=","+apiClient.deviceId()),apiClient.isWebSocketOpen()&&apiClient.sendWebSocketMessage("SyncJobsStart",startParams)}function stopListening(listInstance){var apiClient=getApiClient(listInstance);apiClient.isWebSocketOpen()&&apiClient.sendWebSocketMessage("SyncJobsStop","")}function getApiClient(listInstance){return connectionManager.getApiClient(listInstance.options.serverId)}function showJobMenu(listInstance,elem){var item=dom.parentWithClass(elem,"listItem"),jobId=item.getAttribute("data-id"),status=item.getAttribute("data-status"),menuItems=[];if("Cancelled"===status)menuItems.push({name:globalize.translate("sharedcomponents#Delete"),id:"delete"});else{var txt=listInstance.options.isLocalSync?globalize.translate("sharedcomponents#RemoveDownload"):globalize.translate("sharedcomponents#ButtonCancelSyncJob");menuItems.push({name:txt,id:"cancel"})}require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:elem,callback:function(id){switch(id){case"delete":cancelJob(listInstance,jobId);break;case"cancel":cancelJob(listInstance,jobId)}}})})}function onElementClick(e){var listInstance=this,btnJobMenu=dom.parentWithClass(e.target,"btnJobMenu");if(btnJobMenu)return void showJobMenu(this,btnJobMenu);var listItem=dom.parentWithClass(e.target,"listItem");if(listItem){var jobId=listItem.getAttribute("data-id");require(["syncJobEditor"],function(syncJobEditor){syncJobEditor.show({serverId:listInstance.options.serverId,jobId:jobId}).then(function(){fetchData(listInstance)})})}}function syncJobList(options){this.options=options;var onSyncJobsUpdatedHandler=onSyncJobsUpdated.bind(this);this.onSyncJobsUpdatedHandler=onSyncJobsUpdatedHandler,events.on(serverNotifications,"SyncJobs",onSyncJobsUpdatedHandler);var onClickHandler=onElementClick.bind(this);options.element.addEventListener("click",onClickHandler),this.onClickHandler=onClickHandler,options.element.innerHTML='
',fetchData(this),startListening(this),initSupporterInfo(options.element,getApiClient(this))}function showSupporterInfo(context){var html='",html+='",html+='",html+="
",html+="
",dlg.innerHTML=html;var chkMirror=dlg.querySelector(".chkMirror");chkMirror&&chkMirror.addEventListener("change",onMirrorChange);var destination="",btnRemoteControl=dlg.querySelector(".btnRemoteControl");btnRemoteControl&&btnRemoteControl.addEventListener("click",function(){destination="nowplaying.html",dialogHelper.close(dlg)}),dlg.querySelector(".btnDisconnect").addEventListener("click",function(){playbackManager.disconnectFromPlayer(),dialogHelper.close(dlg)}),dlg.querySelector(".btnCancel").addEventListener("click",function(){dialogHelper.close(dlg)}),dialogHelper.open(dlg).then(function(){destination&&embyRouter.show(destination)})}function onMirrorChange(){playbackManager.enableDisplayMirroring(this.checked)}var currentDisplayInfo;return document.addEventListener("viewbeforeshow",function(){currentDisplayInfo=null}),document.addEventListener("viewshow",function(e){var state=e.detail.state||{},item=state.item;if(item&&item.ServerId)return void mirrorIfEnabled({item:item})}),events.on(appSettings,"change",function(e,name){"displaymirror"===name&&mirrorIfEnabled()}),{show:showPlayerSelection}}); \ No newline at end of file +define(["appSettings","events","browser","loading","playbackManager","embyRouter","globalize","apphost"],function(appSettings,events,browser,loading,playbackManager,embyRouter,globalize,appHost){"use strict";function mirrorItem(info,player){var item=info.item;playbackManager.displayContent({ItemName:item.Name,ItemId:item.Id,ItemType:item.Type,Context:info.context},player)}function mirrorIfEnabled(info){if(info=info||currentDisplayInfo,info&&playbackManager.enableDisplayMirroring()){var player=playbackManager.getPlayerInfo();player&&(player.isLocalPlayer||player.supportedCommands.indexOf("DisplayContent")===-1||mirrorItem(info,player))}}function emptyCallback(){}function showPlayerSelection(button){var currentPlayerInfo=playbackManager.getPlayerInfo();if(currentPlayerInfo&&!currentPlayerInfo.isLocalPlayer)return void showActivePlayerMenu(currentPlayerInfo);var currentPlayerId=currentPlayerInfo?currentPlayerInfo.id:null;loading.show(),playbackManager.getTargets().then(function(targets){var menuItems=targets.map(function(t){var name=t.name;return t.appName&&t.appName!==t.name&&(name+=" - "+t.appName),{name:name,id:t.id,selected:currentPlayerId===t.id}});require(["actionsheet"],function(actionsheet){loading.hide();var menuOptions={title:globalize.translate("sharedcomponents#HeaderSelectPlayer"),items:menuItems,positionTo:button,resolveOnClick:!0};browser.chrome&&!appHost.supports("castmenuhashchange")&&(menuOptions.enableHistory=!1),actionsheet.show(menuOptions).then(function(id){var target=targets.filter(function(t){return t.id===id})[0];playbackManager.trySetActivePlayer(target.playerName,target),mirrorIfEnabled()},emptyCallback)})})}function showActivePlayerMenu(playerInfo){require(["dialogHelper","dialog","emby-checkbox","emby-button"],function(dialogHelper){showActivePlayerMenuInternal(dialogHelper,playerInfo)})}function showActivePlayerMenuInternal(dialogHelper,playerInfo){var html="",dialogOptions={removeOnClose:!0};dialogOptions.modal=!1,dialogOptions.entryAnimationDuration=160,dialogOptions.exitAnimationDuration=160,dialogOptions.autoFocus=!1;var dlg=dialogHelper.createDialog(dialogOptions);if(dlg.classList.add("promptDialog"),html+='
',html+='

',html+=playerInfo.deviceName||playerInfo.name,html+="

",html+="
",playerInfo.supportedCommands.indexOf("DisplayContent")!==-1){html+='"}html+="
",html+='
',html+='",html+='",html+='",html+="
",html+="
",dlg.innerHTML=html;var chkMirror=dlg.querySelector(".chkMirror");chkMirror&&chkMirror.addEventListener("change",onMirrorChange);var destination="",btnRemoteControl=dlg.querySelector(".btnRemoteControl");btnRemoteControl&&btnRemoteControl.addEventListener("click",function(){destination="nowplaying.html",dialogHelper.close(dlg)}),dlg.querySelector(".btnDisconnect").addEventListener("click",function(){playbackManager.disconnectFromPlayer(),dialogHelper.close(dlg)}),dlg.querySelector(".btnCancel").addEventListener("click",function(){dialogHelper.close(dlg)}),dialogHelper.open(dlg).then(function(){destination&&embyRouter.show(destination)},emptyCallback)}function onMirrorChange(){playbackManager.enableDisplayMirroring(this.checked)}var currentDisplayInfo;return document.addEventListener("viewbeforeshow",function(){currentDisplayInfo=null}),document.addEventListener("viewshow",function(e){var state=e.detail.state||{},item=state.item;if(item&&item.ServerId)return void mirrorIfEnabled({item:item})}),events.on(appSettings,"change",function(e,name){"displaymirror"===name&&mirrorIfEnabled()}),{show:showPlayerSelection}}); \ No newline at end of file diff --git a/dashboard-ui/components/channelmapper/channelmapper.js b/dashboard-ui/components/channelmapper/channelmapper.js index fa13c619ab..faf0d4022f 100644 --- a/dashboard-ui/components/channelmapper/channelmapper.js +++ b/dashboard-ui/components/channelmapper/channelmapper.js @@ -1 +1 @@ -define(["dialogHelper","loading","connectionManager","globalize","actionsheet","emby-input","paper-icon-button-light","emby-button","listViewStyle","material-icons","formDialogStyle"],function(dialogHelper,loading,connectionManager,globalize,actionsheet){"use strict";return function(options){function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}function mapChannel(button,tunerChannelNumber,providerChannelNumber){loading.show();var providerId=options.providerId,apiClient=connectionManager.getApiClient(options.serverId);apiClient.ajax({type:"POST",url:ApiClient.getUrl("LiveTv/ChannelMappings"),data:{providerId:providerId,tunerChannelNumber:tunerChannelNumber,providerChannelNumber:providerChannelNumber},dataType:"json"}).then(function(mapping){var listItem=parentWithClass(button,"listItem");button.setAttribute("data-providernumber",mapping.ProviderChannelNumber),listItem.querySelector(".secondary").innerHTML=getMappingSecondaryName(mapping,currentMappingOptions.ProviderName),loading.hide()})}function onChannelsElementClick(e){var btnMap=parentWithClass(e.target,"btnMap");if(btnMap){var tunerChannelNumber=btnMap.getAttribute("data-number"),providerChannelNumber=btnMap.getAttribute("data-providernumber"),menuItems=currentMappingOptions.ProviderChannels.map(function(m){return{name:m.Name,id:m.Id,selected:m.Id.toLowerCase()==providerChannelNumber.toLowerCase()}});actionsheet.show({positionTo:btnMap,items:menuItems}).then(function(newChannelNumber){mapChannel(btnMap,tunerChannelNumber,newChannelNumber)})}}function getChannelMappingOptions(serverId,providerId){var apiClient=connectionManager.getApiClient(serverId);return apiClient.getJSON(apiClient.getUrl("LiveTv/ChannelMappingOptions",{providerId:providerId}))}function getMappingSecondaryName(mapping,providerName){return(mapping.ProviderChannelNumber||"")+" "+(mapping.ProviderChannelName||"")+" - "+providerName}function getTunerChannelHtml(channel,providerName){var html="";return html+='
',html+='dvr',html+='
',html+='

',html+=channel.Name,html+="

",html+='
',(channel.ProviderChannelNumber||channel.ProviderChannelName)&&(html+=getMappingSecondaryName(channel,providerName)),html+="
",html+="
",html+='',html+="
"}function getEditorHtml(){var html="";return html+='
',html+='
',html+='
',html+="

"+globalize.translate("HeaderChannels")+"

",html+='
',html+="
",html+="
",html+="
",html+="
"}function initEditor(dlg,options){getChannelMappingOptions(options.serverId,options.providerId).then(function(result){currentMappingOptions=result;var channelsElement=dlg.querySelector(".channels");channelsElement.innerHTML=result.TunerChannels.map(function(channel){return getTunerChannelHtml(channel,result.ProviderName)}).join(""),channelsElement.addEventListener("click",onChannelsElementClick)})}var currentMappingOptions,self=this;self.show=function(){var dialogOptions={removeOnClose:!0};dialogOptions.size="small";var dlg=dialogHelper.createDialog(dialogOptions);dlg.classList.add("formDialog"),dlg.classList.add("ui-body-a"),dlg.classList.add("background-theme-a");var html="",title=globalize.translate("MapChannels");return html+='
',html+='',html+='

',html+=title,html+="

",html+="
",html+=getEditorHtml(),dlg.innerHTML=html,initEditor(dlg,options),dlg.querySelector(".btnCancel").addEventListener("click",function(){dialogHelper.close(dlg)}),new Promise(function(resolve,reject){dlg.addEventListener("close",resolve),dialogHelper.open(dlg)})}}}); \ No newline at end of file +define(["dialogHelper","loading","connectionManager","globalize","actionsheet","emby-input","paper-icon-button-light","emby-button","listViewStyle","material-icons","formDialogStyle"],function(dialogHelper,loading,connectionManager,globalize,actionsheet){"use strict";return function(options){function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}function mapChannel(button,tunerChannelId,providerChannelId){loading.show();var providerId=options.providerId,apiClient=connectionManager.getApiClient(options.serverId);apiClient.ajax({type:"POST",url:ApiClient.getUrl("LiveTv/ChannelMappings"),data:{providerId:providerId,tunerChannelId:tunerChannelId,providerChannelId:providerChannelId},dataType:"json"}).then(function(mapping){var listItem=parentWithClass(button,"listItem");button.setAttribute("data-providerid",mapping.ProviderChannelId),listItem.querySelector(".secondary").innerHTML=getMappingSecondaryName(mapping,currentMappingOptions.ProviderName),loading.hide()})}function onChannelsElementClick(e){var btnMap=parentWithClass(e.target,"btnMap");if(btnMap){var tunerChannelId=btnMap.getAttribute("data-id"),providerChannelId=btnMap.getAttribute("data-providerid"),menuItems=currentMappingOptions.ProviderChannels.map(function(m){return{name:m.Name,id:m.Id,selected:m.Id.toLowerCase()==providerChannelId.toLowerCase()}});actionsheet.show({positionTo:btnMap,items:menuItems}).then(function(newChannelId){mapChannel(btnMap,tunerChannelId,newChannelId)})}}function getChannelMappingOptions(serverId,providerId){var apiClient=connectionManager.getApiClient(serverId);return apiClient.getJSON(apiClient.getUrl("LiveTv/ChannelMappingOptions",{providerId:providerId}))}function getMappingSecondaryName(mapping,providerName){return(mapping.ProviderChannelName||"")+" - "+providerName}function getTunerChannelHtml(channel,providerName){var html="";return html+='
',html+='dvr',html+='
',html+='

',html+=channel.Name,html+="

",html+='
',channel.ProviderChannelName&&(html+=getMappingSecondaryName(channel,providerName)),html+="
",html+="
",html+='',html+="
"}function getEditorHtml(){var html="";return html+='
',html+='
',html+='
',html+="

"+globalize.translate("HeaderChannels")+"

",html+='
',html+="
",html+="
",html+="
",html+="
"}function initEditor(dlg,options){getChannelMappingOptions(options.serverId,options.providerId).then(function(result){currentMappingOptions=result;var channelsElement=dlg.querySelector(".channels");channelsElement.innerHTML=result.TunerChannels.map(function(channel){return getTunerChannelHtml(channel,result.ProviderName)}).join(""),channelsElement.addEventListener("click",onChannelsElementClick)})}var currentMappingOptions,self=this;self.show=function(){var dialogOptions={removeOnClose:!0};dialogOptions.size="small";var dlg=dialogHelper.createDialog(dialogOptions);dlg.classList.add("formDialog"),dlg.classList.add("ui-body-a"),dlg.classList.add("background-theme-a");var html="",title=globalize.translate("MapChannels");return html+='
',html+='',html+='

',html+=title,html+="

",html+="
",html+=getEditorHtml(),dlg.innerHTML=html,initEditor(dlg,options),dlg.querySelector(".btnCancel").addEventListener("click",function(){dialogHelper.close(dlg)}),new Promise(function(resolve,reject){dlg.addEventListener("close",resolve),dialogHelper.open(dlg)})}}}); \ No newline at end of file diff --git a/dashboard-ui/devices/ios/ios.css b/dashboard-ui/devices/ios/ios.css index 35c59fdcca..d108a075df 100644 --- a/dashboard-ui/devices/ios/ios.css +++ b/dashboard-ui/devices/ios/ios.css @@ -1 +1 @@ -body:not(.dashboardDocument) .mainDrawerButton{display:none!important}.pageWithAbsoluteTabs:not(.noSecondaryNavPage){padding-top:88px!important}.libraryPage:not(.noSecondaryNavPage){padding-top:85px!important}.backdropContainer{background-attachment:initial}.viewMenuBar{height:50px}.ui-body-b .libraryViewNav{-webkit-box-shadow:none;box-shadow:none}.emby-tab-button{font-weight:400;text-transform:none!important;border-color:transparent!important;border-width:0!important}.criticReviewPaperList{background-color:#262626}.settingsMenuHeader{display:none}.libraryMenuButtonText{font-weight:500!important}.btnNotificationsInner{font-weight:400}.cardImageContainer{-webkit-border-radius:4px;border-radius:4px}.sidebarLinkText{font-weight:400!important}.videoSubtitles{font-size:200%!important}.txtSearch{padding-bottom:.5em!important;text-indent:0!important}.searchInputContainer{margin-left:5%;margin-right:5%}.btnSync,.categorySyncButton{display:none!important}.dialog.background-theme-b{background:rgba(28,28,28,.84);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.cardOverlayButton{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)} \ No newline at end of file +body:not(.dashboardDocument) .mainDrawerButton{display:none!important}.pageWithAbsoluteTabs:not(.noSecondaryNavPage){padding-top:88px!important}.libraryPage:not(.noSecondaryNavPage){padding-top:85px!important}.backdropContainer{background-attachment:initial}.viewMenuBar{height:50px}.ui-body-b .libraryViewNav{-webkit-box-shadow:none;box-shadow:none}.emby-tab-button{text-transform:none!important;border-color:transparent!important;border-width:0!important}.settingsMenuHeader{display:none}.libraryMenuButtonText{font-weight:500!important}.txtSearch{padding-bottom:.5em!important;text-indent:0!important}.searchInputContainer{margin-left:5%;margin-right:5%}.btnSync,.categorySyncButton{display:none!important}.dialog.background-theme-b{background:rgba(28,28,28,.84);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)} \ No newline at end of file diff --git a/dashboard-ui/manifest.json b/dashboard-ui/manifest.json index 9b9d3f7228..9ee08b4afb 100644 --- a/dashboard-ui/manifest.json +++ b/dashboard-ui/manifest.json @@ -1,7 +1,7 @@ { "name": "Emby", "short_name": "Emby", - "start_url": "web/index.html", + "start_url": "/web/index.html", "description": "The open media solution.", "lang": "en-US", "related_applications": [ diff --git a/dashboard-ui/scripts/nowplayingbar.js b/dashboard-ui/scripts/nowplayingbar.js index be485aca3d..afcc9412e8 100644 --- a/dashboard-ui/scripts/nowplayingbar.js +++ b/dashboard-ui/scripts/nowplayingbar.js @@ -1 +1 @@ -define(["datetime","userdataButtons","itemHelper","events","browser","imageLoader","playbackManager","nowPlayingHelper","apphost","dom","connectionManager","paper-icon-button-light"],function(datetime,userdataButtons,itemHelper,events,browser,imageLoader,playbackManager,nowPlayingHelper,appHost,dom,connectionManager){"use strict";function getNowPlayingBarHtml(){var html="";return html+='
',html+='
',html+='
',html+='',html+="
",html+='
',html+='
',html+='
',html+="
",html+='
',html+='',html+='',html+='',html+='',html+='
',html+="
",html+='
',html+='',html+='
',html+='',html+="
",html+='',html+='
',html+="
",html+='',html+='',html+="
",html+="
",html+="
"}function onSlideDownComplete(){this.classList.add("hide")}function slideDown(elem){requestAnimationFrame(function(){void elem.offsetWidth,elem.classList.add("nowPlayingBar-hidden"),dom.addEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0})})}function slideUp(elem){elem.classList.remove("hide"),dom.removeEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0}),requestAnimationFrame(function(){void elem.offsetWidth,elem.classList.remove("nowPlayingBar-hidden")})}function onPlayPauseClick(){playbackManager.playPause(currentPlayer)}function bindEvents(elem){currentTimeElement=elem.querySelector(".nowPlayingBarCurrentTime"),nowPlayingImageElement=elem.querySelector(".nowPlayingImage"),nowPlayingTextElement=elem.querySelector(".nowPlayingBarText"),nowPlayingUserData=elem.querySelector(".nowPlayingBarUserDataButtons"),muteButton=elem.querySelector(".muteButton"),muteButton.addEventListener("click",function(){currentPlayer&&playbackManager.toggleMute(currentPlayer)}),elem.querySelector(".stopButton").addEventListener("click",function(){currentPlayer&&playbackManager.stop(currentPlayer)});var i,length;for(playPauseButtons=elem.querySelectorAll(".playPauseButton"),i=0,length=playPauseButtons.length;i';return html+=text,html+=""}function seriesImageUrl(item,options){if(!item)throw new Error("item cannot be null!");if("Episode"!==item.Type)return null;if(options=options||{},options.type=options.type||"Primary","Primary"===options.type&&item.SeriesPrimaryImageTag)return options.tag=item.SeriesPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if("Thumb"===options.type){if(item.SeriesThumbImageTag)return options.tag=item.SeriesThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if(item.ParentThumbImageTag)return options.tag=item.ParentThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId,options)}return null}function imageUrl(item,options){if(!item)throw new Error("item cannot be null!");return options=options||{},options.type=options.type||"Primary",item.ImageTags&&item.ImageTags[options.type]?(options.tag=item.ImageTags[options.type],connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId||item.Id,options)):item.AlbumId&&item.AlbumPrimaryImageTag?(options.tag=item.AlbumPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId,options)):null}function updateNowPlayingInfo(state){var nowPlayingItem=state.NowPlayingItem;nowPlayingTextElement.innerHTML=nowPlayingItem?nowPlayingHelper.getNowPlayingNames(nowPlayingItem).map(function(nowPlayingName){return nowPlayingName.item?"
"+getTextActionButton(nowPlayingName.item,nowPlayingName.text)+"
":"
"+nowPlayingName.text+"
"}).join(""):"";var imgHeight=70,url=nowPlayingItem?seriesImageUrl(nowPlayingItem,{height:imgHeight})||imageUrl(nowPlayingItem,{height:imgHeight}):null;url!==currentImgUrl&&(currentImgUrl=url,imageLoader.lazyImage(nowPlayingImageElement,url)),nowPlayingItem.Id?ApiClient.getItem(Dashboard.getCurrentUserId(),nowPlayingItem.Id).then(function(item){userdataButtons.fill({item:item,includePlayed:!1,element:nowPlayingUserData})}):userdataButtons.destroy({element:nowPlayingUserData})}function onPlaybackStart(e,state){console.log("nowplaying event: "+e.type);var player=this;onStateChanged.call(player,e,state)}function onRepeatModeChange(e){var player=this;updateRepeatModeDisplay(playbackManager.getRepeatMode(player))}function showNowPlayingBar(){getNowPlayingBar().then(slideUp)}function hideNowPlayingBar(){isEnabled=!1;var elem=document.getElementsByClassName("nowPlayingBar")[0];elem&&(document.body.classList.contains("hiddenNowPlayingBar")?(dom.removeEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0}),elem.classList.add("hide"),elem.classList.add("nowPlayingBar-hidden")):slideDown(elem))}function onPlaybackStopped(e,state){console.log("nowplaying event: "+e.type);var player=this;player.isLocalPlayer?"Audio"!==state.NextMediaType&&hideNowPlayingBar():state.NextMediaType||hideNowPlayingBar()}function onPlayPauseStateChanged(e){if(isEnabled){var player=this;updatePlayPauseState(player.paused())}}function onStateChanged(event,state){var player=this;return state.NowPlayingItem?player.isLocalPlayer&&state.NowPlayingItem&&"Video"==state.NowPlayingItem.MediaType?void hideNowPlayingBar():(isEnabled=!0,nowPlayingBarElement?void updatePlayerStateInternal(event,state):void getNowPlayingBar().then(function(){updatePlayerStateInternal(event,state)})):void hideNowPlayingBar()}function onTimeUpdate(e){if(isEnabled){var now=(new Date).getTime();if(!(now-lastUpdateTime<700)){lastUpdateTime=now;var player=this;currentRuntimeTicks=playbackManager.duration(player),updateTimeDisplay(playbackManager.currentTime(player),currentRuntimeTicks)}}}function releaseCurrentPlayer(){var player=currentPlayer;player&&(events.off(player,"playbackstart",onPlaybackStart),events.off(player,"statechange",onPlaybackStart),events.off(player,"repeatmodechange",onRepeatModeChange),events.off(player,"playbackstop",onPlaybackStopped),events.off(player,"volumechange",onVolumeChanged),events.off(player,"pause",onPlayPauseStateChanged),events.off(player,"playing",onPlayPauseStateChanged),events.off(player,"timeupdate",onTimeUpdate),currentPlayer=null,hideNowPlayingBar())}function onVolumeChanged(e){if(isEnabled){var player=this;updatePlayerVolumeState(player.isMuted(),player.getVolume())}}function bindToPlayer(player){player!==currentPlayer&&(releaseCurrentPlayer(),currentPlayer=player,player&&(playbackManager.getPlayerState(player).then(function(state){onStateChanged.call(player,{type:"init"},state)}),events.on(player,"playbackstart",onPlaybackStart),events.on(player,"statechange",onPlaybackStart),events.on(player,"repeatmodechange",onRepeatModeChange),events.on(player,"playbackstop",onPlaybackStopped),events.on(player,"volumechange",onVolumeChanged),events.on(player,"pause",onPlayPauseStateChanged),events.on(player,"playing",onPlayPauseStateChanged),events.on(player,"timeupdate",onTimeUpdate)))}var currentPlayer,currentTimeElement,nowPlayingImageElement,nowPlayingTextElement,nowPlayingUserData,muteButton,volumeSlider,volumeSliderContainer,playPauseButtons,positionSlider,toggleRepeatButton,toggleRepeatButtonIcon,isEnabled,nowPlayingBarElement,currentImgUrl,currentPlayerSupportedCommands=[],lastUpdateTime=0,lastPlayerState={},currentRuntimeTicks=0;events.on(playbackManager,"playerchange",function(){bindToPlayer(playbackManager.getCurrentPlayer())}),bindToPlayer(playbackManager.getCurrentPlayer())}); \ No newline at end of file +define(["datetime","userdataButtons","itemHelper","events","browser","imageLoader","playbackManager","nowPlayingHelper","apphost","dom","connectionManager","paper-icon-button-light"],function(datetime,userdataButtons,itemHelper,events,browser,imageLoader,playbackManager,nowPlayingHelper,appHost,dom,connectionManager){"use strict";function getNowPlayingBarHtml(){var html="";return html+='
',html+='
',html+='
',html+='',html+="
",html+='
',html+='
',html+='
',html+="
",html+='
',html+='',html+='',html+='',html+='',html+='
',html+="
",html+='
',html+='',html+='
',html+='',html+="
",html+='',html+='
',html+="
",html+='',html+='',html+="
",html+="
",html+="
"}function onSlideDownComplete(){this.classList.add("hide")}function slideDown(elem){void elem.offsetWidth,requestAnimationFrame(function(){elem.classList.add("nowPlayingBar-hidden"),dom.addEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0})})}function slideUp(elem){setTimeout(function(){dom.removeEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0}),elem.classList.remove("hide"),void elem.offsetWidth,requestAnimationFrame(function(){elem.classList.remove("nowPlayingBar-hidden")})},10)}function onPlayPauseClick(){playbackManager.playPause(currentPlayer)}function bindEvents(elem){currentTimeElement=elem.querySelector(".nowPlayingBarCurrentTime"),nowPlayingImageElement=elem.querySelector(".nowPlayingImage"),nowPlayingTextElement=elem.querySelector(".nowPlayingBarText"),nowPlayingUserData=elem.querySelector(".nowPlayingBarUserDataButtons"),muteButton=elem.querySelector(".muteButton"),muteButton.addEventListener("click",function(){currentPlayer&&playbackManager.toggleMute(currentPlayer)}),elem.querySelector(".stopButton").addEventListener("click",function(){currentPlayer&&playbackManager.stop(currentPlayer)});var i,length;for(playPauseButtons=elem.querySelectorAll(".playPauseButton"),i=0,length=playPauseButtons.length;i';return html+=text,html+=""}function seriesImageUrl(item,options){if(!item)throw new Error("item cannot be null!");if("Episode"!==item.Type)return null;if(options=options||{},options.type=options.type||"Primary","Primary"===options.type&&item.SeriesPrimaryImageTag)return options.tag=item.SeriesPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if("Thumb"===options.type){if(item.SeriesThumbImageTag)return options.tag=item.SeriesThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId,options);if(item.ParentThumbImageTag)return options.tag=item.ParentThumbImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId,options)}return null}function imageUrl(item,options){if(!item)throw new Error("item cannot be null!");return options=options||{},options.type=options.type||"Primary",item.ImageTags&&item.ImageTags[options.type]?(options.tag=item.ImageTags[options.type],connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId||item.Id,options)):item.AlbumId&&item.AlbumPrimaryImageTag?(options.tag=item.AlbumPrimaryImageTag,connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId,options)):null}function updateNowPlayingInfo(state){var nowPlayingItem=state.NowPlayingItem;nowPlayingTextElement.innerHTML=nowPlayingItem?nowPlayingHelper.getNowPlayingNames(nowPlayingItem).map(function(nowPlayingName){return nowPlayingName.item?"
"+getTextActionButton(nowPlayingName.item,nowPlayingName.text)+"
":"
"+nowPlayingName.text+"
"}).join(""):"";var imgHeight=70,url=nowPlayingItem?seriesImageUrl(nowPlayingItem,{height:imgHeight})||imageUrl(nowPlayingItem,{height:imgHeight}):null;url!==currentImgUrl&&(currentImgUrl=url,imageLoader.lazyImage(nowPlayingImageElement,url)),nowPlayingItem.Id?ApiClient.getItem(Dashboard.getCurrentUserId(),nowPlayingItem.Id).then(function(item){userdataButtons.fill({item:item,includePlayed:!1,element:nowPlayingUserData})}):userdataButtons.destroy({element:nowPlayingUserData})}function onPlaybackStart(e,state){console.log("nowplaying event: "+e.type);var player=this;onStateChanged.call(player,e,state)}function onRepeatModeChange(e){var player=this;updateRepeatModeDisplay(playbackManager.getRepeatMode(player))}function showNowPlayingBar(){getNowPlayingBar().then(slideUp)}function hideNowPlayingBar(){isEnabled=!1;var elem=document.getElementsByClassName("nowPlayingBar")[0];elem&&(document.body.classList.contains("hiddenNowPlayingBar")?(dom.removeEventListener(elem,dom.whichTransitionEvent(),onSlideDownComplete,{once:!0}),elem.classList.add("hide"),elem.classList.add("nowPlayingBar-hidden")):slideDown(elem))}function onPlaybackStopped(e,state){console.log("nowplaying event: "+e.type);var player=this;player.isLocalPlayer?"Audio"!==state.NextMediaType&&hideNowPlayingBar():state.NextMediaType||hideNowPlayingBar()}function onPlayPauseStateChanged(e){if(isEnabled){var player=this;updatePlayPauseState(player.paused())}}function onStateChanged(event,state){var player=this;return state.NowPlayingItem?player.isLocalPlayer&&state.NowPlayingItem&&"Video"==state.NowPlayingItem.MediaType?void hideNowPlayingBar():(isEnabled=!0,nowPlayingBarElement?void updatePlayerStateInternal(event,state):void getNowPlayingBar().then(function(){updatePlayerStateInternal(event,state)})):void hideNowPlayingBar()}function onTimeUpdate(e){if(isEnabled){var now=(new Date).getTime();if(!(now-lastUpdateTime<700)){lastUpdateTime=now;var player=this;currentRuntimeTicks=playbackManager.duration(player),updateTimeDisplay(playbackManager.currentTime(player),currentRuntimeTicks)}}}function releaseCurrentPlayer(){var player=currentPlayer;player&&(events.off(player,"playbackstart",onPlaybackStart),events.off(player,"statechange",onPlaybackStart),events.off(player,"repeatmodechange",onRepeatModeChange),events.off(player,"playbackstop",onPlaybackStopped),events.off(player,"volumechange",onVolumeChanged),events.off(player,"pause",onPlayPauseStateChanged),events.off(player,"playing",onPlayPauseStateChanged),events.off(player,"timeupdate",onTimeUpdate),currentPlayer=null,hideNowPlayingBar())}function onVolumeChanged(e){if(isEnabled){var player=this;updatePlayerVolumeState(player.isMuted(),player.getVolume())}}function bindToPlayer(player){player!==currentPlayer&&(releaseCurrentPlayer(),currentPlayer=player,player&&(playbackManager.getPlayerState(player).then(function(state){onStateChanged.call(player,{type:"init"},state)}),events.on(player,"playbackstart",onPlaybackStart),events.on(player,"statechange",onPlaybackStart),events.on(player,"repeatmodechange",onRepeatModeChange),events.on(player,"playbackstop",onPlaybackStopped),events.on(player,"volumechange",onVolumeChanged),events.on(player,"pause",onPlayPauseStateChanged),events.on(player,"playing",onPlayPauseStateChanged),events.on(player,"timeupdate",onTimeUpdate)))}var currentPlayer,currentTimeElement,nowPlayingImageElement,nowPlayingTextElement,nowPlayingUserData,muteButton,volumeSlider,volumeSliderContainer,playPauseButtons,positionSlider,toggleRepeatButton,toggleRepeatButtonIcon,isEnabled,nowPlayingBarElement,currentImgUrl,currentPlayerSupportedCommands=[],lastUpdateTime=0,lastPlayerState={},currentRuntimeTicks=0;events.on(playbackManager,"playerchange",function(){bindToPlayer(playbackManager.getCurrentPlayer())}),bindToPlayer(playbackManager.getCurrentPlayer())}); \ No newline at end of file diff --git a/dashboard-ui/scripts/selectserver.js b/dashboard-ui/scripts/selectserver.js index 2dbbdeec01..4ed939f5ec 100644 --- a/dashboard-ui/scripts/selectserver.js +++ b/dashboard-ui/scripts/selectserver.js @@ -1 +1 @@ -define(["appSettings","paper-icon-button-light"],function(appSettings){"use strict";function updatePageStyle(page){"1"==getParameterByName("showuser")?(page.classList.add("libraryPage"),page.classList.add("noSecondaryNavPage"),page.classList.remove("standalonePage")):(page.classList.add("standalonePage"),page.classList.remove("noSecondaryNavPage"),page.classList.remove("libraryPage"))}function showServerConnectionFailure(){alertText(Globalize.translate("MessageUnableToConnectToServer"),Globalize.translate("HeaderConnectionFailure"))}function getServerHtml(server){var html="";return html+='
',html+='',html+='",server.Id&&(html+='"),html+="
"}function renderServers(page,servers){servers.length?(page.querySelector(".noServersMessage").classList.add("hide"),page.querySelector(".serverList").classList.remove("hide")):(page.querySelector(".serverList").classList.add("hide"),page.querySelector(".noServersMessage").classList.remove("hide"));var html="";html+=servers.map(getServerHtml).join(""),page.querySelector(".serverList").innerHTML=html}function alertText(text,title){alertTextWithOptions({title:title,text:text})}function alertTextWithOptions(options){require(["alert"],function(alert){alert(options)})}function showGeneralError(){Dashboard.hideLoadingMsg(),alertText(Globalize.translate("DefaultErrorMessage"))}function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}return function(view,params){function connectToServer(page,server){Dashboard.showLoadingMsg(),ConnectionManager.connectToServer(server,{enableAutoLogin:appSettings.enableAutoLogin()}).then(function(result){Dashboard.hideLoadingMsg();var apiClient=result.ApiClient;switch(result.State){case MediaBrowser.ConnectionState.SignedIn:Dashboard.onServerChanged(apiClient.getCurrentUserId(),apiClient.accessToken(),apiClient),Dashboard.navigate("home.html");break;case MediaBrowser.ConnectionState.ServerSignIn:Dashboard.onServerChanged(null,null,apiClient),Dashboard.navigate("login.html?serverid="+result.Servers[0].Id);break;case MediaBrowser.ConnectionState.ServerUpdateNeeded:alertTextWithOptions({text:Globalize.translate("core#ServerUpdateNeeded","https://emby.media"),html:Globalize.translate("core#ServerUpdateNeeded",'https://emby.media')});break;default:showServerConnectionFailure()}})}function acceptInvitation(page,id){Dashboard.showLoadingMsg(),ConnectionManager.acceptServer(id).then(function(){Dashboard.hideLoadingMsg(),loadPage(page)},function(){showGeneralError()})}function deleteServer(page,serverId){Dashboard.showLoadingMsg(),ConnectionManager.deleteServer(serverId).then(function(){Dashboard.hideLoadingMsg(),loadPage(page)},function(){showGeneralError()})}function rejectInvitation(page,id){Dashboard.showLoadingMsg(),ConnectionManager.rejectServer(id).then(function(){Dashboard.hideLoadingMsg(),loadPage(page)},function(){showGeneralError()})}function showServerMenu(elem){var card=parentWithClass(elem,"serverItem"),page=parentWithClass(elem,"page"),serverId=card.getAttribute("data-id"),menuItems=[];menuItems.push({name:Globalize.translate("ButtonDelete"),id:"delete"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:elem,callback:function(id){switch(id){case"delete":deleteServer(page,serverId)}}})})}function showPendingInviteMenu(elem){var card=parentWithClass(elem,"inviteItem"),page=parentWithClass(elem,"page"),invitationId=card.getAttribute("data-id"),menuItems=[];menuItems.push({name:Globalize.translate("ButtonAccept"),id:"accept"}),menuItems.push({name:Globalize.translate("ButtonReject"),id:"reject"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:elem,callback:function(id){switch(id){case"accept":acceptInvitation(page,invitationId);break;case"reject":rejectInvitation(page,invitationId)}}})})}function getPendingInviteHtml(invite){var html="";return html+='
',html+='',html+='
',html+="
",html+=invite.Name,html+="
",html+="
",html+='",html+="
"}function renderInvitations(page,list){list.length?page.querySelector(".invitationSection").classList.remove("hide"):page.querySelector(".invitationSection").classList.add("hide");var html=list.map(getPendingInviteHtml).join("");page.querySelector(".invitationList").innerHTML=html}function loadInvitations(page){ConnectionManager.isLoggedIntoConnect()?ConnectionManager.getUserInvitations().then(function(list){renderInvitations(page,list)}):renderInvitations(page,[])}function loadPage(page){Dashboard.showLoadingMsg(),ConnectionManager.getAvailableServers().then(function(servers){servers=servers.slice(0),cachedServers=servers,renderServers(page,servers),Dashboard.hideLoadingMsg()}),loadInvitations(page),ConnectionManager.isLoggedIntoConnect()?page.querySelector(".connectLogin").classList.add("hide"):page.querySelector(".connectLogin").classList.remove("hide")}var cachedServers;view.querySelector(".invitationList").addEventListener("click",function(e){var btnInviteMenu=parentWithClass(e.target,"btnInviteMenu");btnInviteMenu&&showPendingInviteMenu(btnInviteMenu)}),view.querySelector(".serverList").addEventListener("click",function(e){var lnkServer=parentWithClass(e.target,"lnkServer");if(lnkServer){var item=parentWithClass(lnkServer,"serverItem"),id=item.getAttribute("data-id"),server=cachedServers.filter(function(s){return s.Id==id})[0];connectToServer(view,server)}var btnServerMenu=parentWithClass(e.target,"btnServerMenu");btnServerMenu&&showServerMenu(btnServerMenu)}),view.addEventListener("viewbeforeshow",function(){updatePageStyle(this)}),view.addEventListener("viewshow",function(){loadPage(this)})}}); \ No newline at end of file +define(["appSettings","paper-icon-button-light"],function(appSettings){"use strict";function updatePageStyle(page){"1"==getParameterByName("showuser")?(page.classList.add("libraryPage"),page.classList.add("noSecondaryNavPage"),page.classList.remove("standalonePage")):(page.classList.add("standalonePage"),page.classList.remove("noSecondaryNavPage"),page.classList.remove("libraryPage"))}function showServerConnectionFailure(){alertText(Globalize.translate("MessageUnableToConnectToServer"),Globalize.translate("HeaderConnectionFailure"))}function getServerHtml(server){var html="";return html+='
',html+='',html+='",server.Id&&(html+=''),html+="
"}function renderServers(page,servers){servers.length?(page.querySelector(".noServersMessage").classList.add("hide"),page.querySelector(".serverList").classList.remove("hide")):(page.querySelector(".serverList").classList.add("hide"),page.querySelector(".noServersMessage").classList.remove("hide"));var html="";html+=servers.map(getServerHtml).join(""),page.querySelector(".serverList").innerHTML=html}function alertText(text,title){alertTextWithOptions({title:title,text:text})}function alertTextWithOptions(options){require(["alert"],function(alert){alert(options)})}function showGeneralError(){Dashboard.hideLoadingMsg(),alertText(Globalize.translate("DefaultErrorMessage"))}function parentWithClass(elem,className){for(;!elem.classList||!elem.classList.contains(className);)if(elem=elem.parentNode,!elem)return null;return elem}return function(view,params){function connectToServer(page,server){Dashboard.showLoadingMsg(),ConnectionManager.connectToServer(server,{enableAutoLogin:appSettings.enableAutoLogin()}).then(function(result){Dashboard.hideLoadingMsg();var apiClient=result.ApiClient;switch(result.State){case MediaBrowser.ConnectionState.SignedIn:Dashboard.onServerChanged(apiClient.getCurrentUserId(),apiClient.accessToken(),apiClient),Dashboard.navigate("home.html");break;case MediaBrowser.ConnectionState.ServerSignIn:Dashboard.onServerChanged(null,null,apiClient),Dashboard.navigate("login.html?serverid="+result.Servers[0].Id);break;case MediaBrowser.ConnectionState.ServerUpdateNeeded:alertTextWithOptions({text:Globalize.translate("core#ServerUpdateNeeded","https://emby.media"),html:Globalize.translate("core#ServerUpdateNeeded",'https://emby.media')});break;default:showServerConnectionFailure()}})}function acceptInvitation(page,id){Dashboard.showLoadingMsg(),ConnectionManager.acceptServer(id).then(function(){Dashboard.hideLoadingMsg(),loadPage(page)},function(){showGeneralError()})}function deleteServer(page,serverId){Dashboard.showLoadingMsg(),ConnectionManager.deleteServer(serverId).then(function(){Dashboard.hideLoadingMsg(),loadPage(page)},function(){showGeneralError()})}function rejectInvitation(page,id){Dashboard.showLoadingMsg(),ConnectionManager.rejectServer(id).then(function(){Dashboard.hideLoadingMsg(),loadPage(page)},function(){showGeneralError()})}function showServerMenu(elem){var card=parentWithClass(elem,"serverItem"),page=parentWithClass(elem,"page"),serverId=card.getAttribute("data-id"),menuItems=[];menuItems.push({name:Globalize.translate("ButtonDelete"),id:"delete"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:elem,callback:function(id){switch(id){case"delete":deleteServer(page,serverId)}}})})}function showPendingInviteMenu(elem){var card=parentWithClass(elem,"inviteItem"),page=parentWithClass(elem,"page"),invitationId=card.getAttribute("data-id"),menuItems=[];menuItems.push({name:Globalize.translate("ButtonAccept"),id:"accept"}),menuItems.push({name:Globalize.translate("ButtonReject"),id:"reject"}),require(["actionsheet"],function(actionsheet){actionsheet.show({items:menuItems,positionTo:elem,callback:function(id){switch(id){case"accept":acceptInvitation(page,invitationId);break;case"reject":rejectInvitation(page,invitationId)}}})})}function getPendingInviteHtml(invite){var html="";return html+='
',html+='',html+='
',html+="
",html+=invite.Name,html+="
",html+="
",html+='",html+="
"}function renderInvitations(page,list){list.length?page.querySelector(".invitationSection").classList.remove("hide"):page.querySelector(".invitationSection").classList.add("hide");var html=list.map(getPendingInviteHtml).join("");page.querySelector(".invitationList").innerHTML=html}function loadInvitations(page){ConnectionManager.isLoggedIntoConnect()?ConnectionManager.getUserInvitations().then(function(list){renderInvitations(page,list)}):renderInvitations(page,[])}function loadPage(page){Dashboard.showLoadingMsg(),ConnectionManager.getAvailableServers().then(function(servers){servers=servers.slice(0),cachedServers=servers,renderServers(page,servers),Dashboard.hideLoadingMsg()}),loadInvitations(page),ConnectionManager.isLoggedIntoConnect()?page.querySelector(".connectLogin").classList.add("hide"):page.querySelector(".connectLogin").classList.remove("hide")}var cachedServers;view.querySelector(".invitationList").addEventListener("click",function(e){var btnInviteMenu=parentWithClass(e.target,"btnInviteMenu");btnInviteMenu&&showPendingInviteMenu(btnInviteMenu)}),view.querySelector(".serverList").addEventListener("click",function(e){var lnkServer=parentWithClass(e.target,"lnkServer");if(lnkServer){var item=parentWithClass(lnkServer,"serverItem"),id=item.getAttribute("data-id"),server=cachedServers.filter(function(s){return s.Id==id})[0];connectToServer(view,server)}var btnServerMenu=parentWithClass(e.target,"btnServerMenu");btnServerMenu&&showServerMenu(btnServerMenu)}),view.addEventListener("viewbeforeshow",function(){updatePageStyle(this)}),view.addEventListener("viewshow",function(){loadPage(this)})}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 79080551ae..9f7450c968 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -1,2 +1,2 @@ -function getWindowLocationSearch(win){"use strict";var search=(win||window).location.search;if(!search){var index=window.location.href.indexOf("?");index!=-1&&(search=window.location.href.substring(index))}return search||""}function getParameterByName(name,url){"use strict";name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regexS="[\\?&]"+name+"=([^&#]*)",regex=new RegExp(regexS,"i"),results=regex.exec(url||getWindowLocationSearch());return null==results?"":decodeURIComponent(results[1].replace(/\+/g," "))}function pageClassOn(eventName,className,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.classList.contains(className)&&fn.call(target,e)})}function pageIdOn(eventName,id,fn){"use strict";document.addEventListener(eventName,function(e){var target=e.target;target.id==id&&fn.call(target,e)})}var Dashboard={isConnectMode:function(){if(AppInfo.isNativeApp)return!0;var url=window.location.href.toLowerCase();return url.indexOf("mediabrowser.tv")!=-1||url.indexOf("emby.media")!=-1},isRunningInCordova:function(){return"cordova"==window.appMode},onRequestFail:function(e,data){if(401==data.status&&"ParentalControl"==data.errorCode){var currentView=ViewManager.currentView();currentView&&!currentView.classList.contains(".standalonePage")&&Dashboard.alert({message:Globalize.translate("MessageLoggedOutParentalControl"),callback:function(){Dashboard.logout(!1)}})}},getCurrentUser:function(){return window.ApiClient.getCurrentUser()},serverAddress:function(){if(Dashboard.isConnectMode()){var apiClient=window.ApiClient;return apiClient?apiClient.serverAddress():null}var urlLower=window.location.href.toLowerCase(),index=urlLower.lastIndexOf("/web");if(index!=-1)return urlLower.substring(0,index);var loc=window.location,address=loc.protocol+"//"+loc.hostname;return loc.port&&(address+=":"+loc.port),address},getCurrentUserId:function(){var apiClient=window.ApiClient;return apiClient?apiClient.getCurrentUserId():null},onServerChanged:function(userId,accessToken,apiClient){apiClient=apiClient||window.ApiClient,window.ApiClient=apiClient},logout:function(logoutWithServer){function onLogoutDone(){var loginPage;Dashboard.isConnectMode()?(loginPage="connectlogin.html",window.ApiClient=null):loginPage="login.html",Dashboard.navigate(loginPage)}logoutWithServer===!1?onLogoutDone():ConnectionManager.logout().then(onLogoutDone)},getConfigurationPageUrl:function(name){return"configurationpage?name="+encodeURIComponent(name)},navigate:function(url,preserveQueryString){if(!url)throw new Error("url cannot be null or empty");var queryString=getWindowLocationSearch();return preserveQueryString&&queryString&&(url+=queryString),Emby.Page.show(url)},showLoadingMsg:function(){Dashboard.loadingVisible=!0,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},hideLoadingMsg:function(){Dashboard.loadingVisible=!1,require(["loading"],function(loading){Dashboard.loadingVisible?loading.show():loading.hide()})},processPluginConfigurationUpdateResult:function(){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processServerConfigurationUpdateResult:function(result){Dashboard.hideLoadingMsg(),require(["toast"],function(toast){toast(Globalize.translate("MessageSettingsSaved"))})},processErrorResponse:function(response){Dashboard.hideLoadingMsg();var status=""+response.status;response.statusText&&(status=response.statusText),Dashboard.alert({title:status,message:response.headers?response.headers.get("X-Application-Error-Code"):null})},alert:function(options){return"string"==typeof options?void require(["toast"],function(toast){toast({text:options})}):void require(["alert"],function(alert){alert({title:options.title||Globalize.translate("HeaderAlert"),text:options.message}).then(options.callback||function(){})})},restartServer:function(){var apiClient=window.ApiClient;apiClient&&(Dashboard.suppressAjaxErrors=!0,Dashboard.showLoadingMsg(),apiClient.restartServer().then(function(){setTimeout(function(){Dashboard.reloadPageWhenServerAvailable()},250)},function(){Dashboard.suppressAjaxErrors=!1}))},reloadPageWhenServerAvailable:function(retryCount){var apiClient=window.ApiClient;apiClient&&apiClient.getJSON(apiClient.getUrl("System/Info")).then(function(info){info.HasPendingRestart?Dashboard.retryReload(retryCount):window.location.reload(!0)},function(){Dashboard.retryReload(retryCount)})},retryReload:function(retryCount){setTimeout(function(){retryCount=retryCount||0,retryCount++,retryCount<10?Dashboard.reloadPageWhenServerAvailable(retryCount):Dashboard.suppressAjaxErrors=!1},500)},showUserFlyout:function(){Dashboard.navigate("mypreferencesmenu.html")},getPluginSecurityInfo:function(){var apiClient=window.ApiClient;if(!apiClient)return Promise.reject();var cachedInfo=Dashboard.pluginSecurityInfo;return cachedInfo?Promise.resolve(cachedInfo):apiClient.ajax({type:"GET",url:apiClient.getUrl("Plugins/SecurityInfo"),dataType:"json",error:function(){}}).then(function(result){return Dashboard.pluginSecurityInfo=result,result})},resetPluginSecurityInfo:function(){Dashboard.pluginSecurityInfo=null},ensureHeader:function(page){page.classList.contains("standalonePage")&&!page.classList.contains("noHeaderPage")&&Dashboard.renderHeader(page)},renderHeader:function(page){var header=page.querySelector(".header");if(!header){var headerHtml="";headerHtml+='",page.insertAdjacentHTML("afterbegin",headerHtml)}},getToolsLinkHtml:function(item){var menuHtml="",pageIds=item.pageIds?item.pageIds.join(","):"";return pageIds=pageIds?' data-pageids="'+pageIds+'"':"",menuHtml+='",menuHtml+='',menuHtml+=item.name,menuHtml+="",menuHtml+=""},getToolsMenuHtml:function(page){var i,length,item,items=Dashboard.getToolsMenuLinks(page),menuHtml="";for(menuHtml+='
',i=0,length=items.length;i
"),item.href?menuHtml+=Dashboard.getToolsLinkHtml(item):(menuHtml+='
',menuHtml+=item.name,menuHtml+="
");return menuHtml+="
"},getToolsMenuLinks:function(){return[{name:Globalize.translate("TabServer")},{name:Globalize.translate("TabDashboard"),href:"dashboard.html",pageIds:["dashboardPage"],icon:"dashboard"},{name:Globalize.translate("TabSettings"),href:"dashboardgeneral.html",pageIds:["dashboardGeneralPage"],icon:"settings"},{name:Globalize.translate("TabDevices"),href:"devices.html",pageIds:["devicesPage","devicePage","devicesUploadPage"],icon:"tablet"},{name:Globalize.translate("TabUsers"),href:"userprofiles.html",pageIds:["userProfilesPage","newUserPage","editUserPage","userLibraryAccessPage","userParentalControlPage","userPasswordPage"],icon:"people"},{name:"Emby Premiere",href:"supporterkey.html",pageIds:["supporterKeyPage"],icon:"star"},{divider:!0,name:Globalize.translate("TabLibrary"),href:"library.html",pageIds:["mediaLibraryPage","librarySettingsPage","libraryDisplayPage","metadataImagesConfigurationPage","metadataNfoPage"],icon:"folder",color:"#38c"},{name:Globalize.translate("TabSubtitles"),href:"metadatasubtitles.html",pageIds:["metadataSubtitlesPage"],icon:"closed_caption"},{name:Globalize.translate("TabPlayback"),icon:"play_circle_filled",color:"#E5342E",href:"cinemamodeconfiguration.html",pageIds:["cinemaModeConfigurationPage","playbackConfigurationPage","streamingSettingsPage"]},{name:Globalize.translate("TabSync"),icon:"sync",href:"syncactivity.html",pageIds:["syncActivityPage","syncJobPage","syncSettingsPage"],color:"#009688"},{name:Globalize.translate("TabTranscoding"),icon:"transform",href:"encodingsettings.html",pageIds:["encodingSettingsPage"]},{divider:!0,name:Globalize.translate("TabExtras")},{name:Globalize.translate("TabAutoOrganize"),color:"#01C0DD",href:"autoorganizelog.html",pageIds:["libraryFileOrganizerPage","libraryFileOrganizerSmartMatchPage","libraryFileOrganizerLogPage"],icon:"folder"},{name:Globalize.translate("DLNA"),href:"dlnasettings.html",pageIds:["dlnaSettingsPage","dlnaProfilesPage","dlnaProfilePage"],icon:"settings"},{name:Globalize.translate("TabLiveTV"),href:"livetvstatus.html",pageIds:["liveTvStatusPage","liveTvSettingsPage","liveTvTunerProviderHdHomerunPage","liveTvTunerProviderM3UPage","liveTvTunerProviderSatPage"],icon:"dvr"},{name:Globalize.translate("TabNotifications"),icon:"notifications",color:"brown",href:"notificationsettings.html",pageIds:["notificationSettingsPage","notificationSettingPage"]},{name:Globalize.translate("TabPlugins"),icon:"add_shopping_cart",color:"#9D22B1",href:"plugins.html",pageIds:["pluginsPage","pluginCatalogPage"]},{divider:!0,name:Globalize.translate("TabExpert")},{name:Globalize.translate("TabAdvanced"),icon:"settings",href:"dashboardhosting.html",color:"#F16834",pageIds:["dashboardHostingPage","serverSecurityPage"]},{name:Globalize.translate("TabLogs"),href:"log.html",pageIds:["logPage"],icon:"folder_open"},{name:Globalize.translate("TabScheduledTasks"),href:"scheduledtasks.html",pageIds:["scheduledTasksPage","scheduledTaskPage"],icon:"schedule"},{name:Globalize.translate("MetadataManager"),href:"edititemmetadata.html",pageIds:[],icon:"mode_edit"},{name:Globalize.translate("ButtonReports"),href:"reports.html",pageIds:[],icon:"insert_chart"}]},getSupportedRemoteCommands:function(){return["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"]},capabilities:function(){var caps={PlayableMediaTypes:["Audio","Video"],SupportedCommands:Dashboard.getSupportedRemoteCommands(),SupportsPersistentIdentifier:Dashboard.isRunningInCordova(),SupportsMediaControl:!0,SupportedLiveMediaTypes:["Audio","Video"]};return Dashboard.isRunningInCordova()&&!browserInfo.safari&&(caps.SupportsSync=!0,caps.SupportsContentUploading=!0),caps},normalizeImageOptions:function(options){AppInfo.hasLowImageBandwidth&&(options.enableImageEnhancers=!1);var setQuality;if(options.maxWidth&&(setQuality=!0),options.width&&(setQuality=!0),options.maxHeight&&(setQuality=!0),options.height&&(setQuality=!0),setQuality){var quality=90,isBackdrop="backdrop"==(options.type||"").toLowerCase();isBackdrop&&(quality-=10),browserInfo.slow&&(quality-=40),AppInfo.hasLowImageBandwidth&&!isBackdrop&&(quality-=10),options.quality=quality}}},AppInfo={};!function(){"use strict";function setAppInfo(){var isCordova=Dashboard.isRunningInCordova();AppInfo.enableHomeTabs=!0,AppInfo.enableAutoSave=browserInfo.touch,AppInfo.enableAppStorePolicy=isCordova;var isIOS=browserInfo.ipad||browserInfo.iphone,isAndroid=browserInfo.android;isIOS&&(AppInfo.hasLowImageBandwidth=!0),isCordova?(AppInfo.isNativeApp=!0,AppInfo.enableHomeTabs=!1,isAndroid&&(AppInfo.supportsExternalPlayers=!0)):AppInfo.enableSupporterMembership=!0,AppInfo.supportsFileInput=!(AppInfo.isNativeApp&&isAndroid),isCordova&&isIOS?AppInfo.moreIcon="more-horiz":AppInfo.moreIcon="more-vert",AppInfo.supportsUserDisplayLanguageSetting=Dashboard.isConnectMode()}function initializeApiClient(apiClient){AppInfo.enableAppStorePolicy&&(apiClient.getAvailablePlugins=function(){return Promise.resolve([])},apiClient.getInstalledPlugins=function(){return Promise.resolve([])}),apiClient.normalizeImageOptions=Dashboard.normalizeImageOptions,Events.off(apiClient,"requestfail",Dashboard.onRequestFail),Events.on(apiClient,"requestfail",Dashboard.onRequestFail)}function onApiClientCreated(e,newApiClient){initializeApiClient(newApiClient),window.$&&($.ajax=newApiClient.ajax)}function defineConnectionManager(connectionManager){window.ConnectionManager=connectionManager,define("connectionManager",[],function(){return connectionManager})}function bindConnectionManagerEvents(connectionManager,events,userSettings){window.Events=events,events.on(ConnectionManager,"apiclientcreated",onApiClientCreated),connectionManager.currentApiClient=function(){if(!localApiClient){var server=connectionManager.getLastUsedServer();server&&(localApiClient=connectionManager.getApiClient(server.Id))}return localApiClient},connectionManager.onLocalUserSignedIn=function(user){return localApiClient=connectionManager.getApiClient(user.ServerId),window.ApiClient=localApiClient,userSettings.setUserInfo(user.Id,localApiClient)},events.on(connectionManager,"localusersignedout",function(){userSettings.setUserInfo(null,null)})}function createConnectionManager(){return new Promise(function(resolve,reject){require(["connectionManagerFactory","apphost","credentialprovider","events","userSettings"],function(connectionManagerExports,apphost,credentialProvider,events,userSettings){window.MediaBrowser=Object.assign(window.MediaBrowser||{},connectionManagerExports);var credentialProviderInstance=new credentialProvider,promises=[apphost.getSyncProfile(),apphost.appInfo()];Promise.all(promises).then(function(responses){var deviceProfile=responses[0],appInfo=responses[1],capabilities=Dashboard.capabilities();capabilities.DeviceProfile=deviceProfile;var connectionManager=new MediaBrowser.ConnectionManager(credentialProviderInstance,appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,capabilities,window.devicePixelRatio);return defineConnectionManager(connectionManager),bindConnectionManagerEvents(connectionManager,events,userSettings),Dashboard.isConnectMode()?void resolve():(console.log("loading ApiClient singleton"),getRequirePromise(["apiclient"]).then(function(apiClientFactory){console.log("creating ApiClient singleton");var apiClient=new apiClientFactory(Dashboard.serverAddress(),appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,window.devicePixelRatio);apiClient.enableAutomaticNetworking=!1,connectionManager.addApiClient(apiClient),require(["css!"+apiClient.getUrl("Branding/Css")]),window.ApiClient=apiClient,localApiClient=apiClient,console.log("loaded ApiClient singleton"),resolve()}))})})})}function setDocumentClasses(browser){var elem=document.documentElement;AppInfo.enableSupporterMembership||elem.classList.add("supporterMembershipDisabled")}function loadTheme(){var name=getParameterByName("theme");if(name)return void require(["themes/"+name+"/theme"]);if(!AppInfo.isNativeApp){var date=new Date,month=date.getMonth(),day=date.getDate();return 9==month&&day>=30?void require(["themes/halloween/theme"]):void 0}}function returnFirstDependency(obj){return obj}function getBowerPath(){return"bower_components"}function getLayoutManager(layoutManager){return layoutManager.init(),layoutManager}function getAppStorage(basePath){try{return localStorage.setItem("_test","0"),localStorage.removeItem("_test"),basePath+"/appstorage-localstorage"}catch(e){return basePath+"/appstorage-memory"}}function createWindowHeadroom(){var headroom=new Headroom([],{tolerance:{down:0,up:0},classes:{}});return headroom.init(),headroom}function createMainContentHammer(Hammer){var hammer=new Hammer(document.querySelector(".skinBody"),null);return hammer}function createSharedAppFooter(appFooter){var footer=new appFooter({});return footer}function initRequire(){var urlArgs="v="+(window.dashboardVersion||(new Date).getDate()),bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents",paths={velocity:bowerPath+"/velocity/velocity.min",vibrant:bowerPath+"/vibrant/dist/vibrant",ironCardList:"components/ironcardlist/ironcardlist",scrollThreshold:"components/scrollthreshold",playlisteditor:"components/playlisteditor/playlisteditor",medialibrarycreator:"components/medialibrarycreator/medialibrarycreator",medialibraryeditor:"components/medialibraryeditor/medialibraryeditor",howler:bowerPath+"/howlerjs/howler.min",sortable:bowerPath+"/Sortable/Sortable.min",isMobile:bowerPath+"/isMobile/isMobile.min",headroom:bowerPath+"/headroomjs/dist/headroom",masonry:bowerPath+"/masonry/dist/masonry.pkgd.min",humanedate:"components/humanedate",libraryBrowser:"scripts/librarybrowser",chromecasthelpers:"components/chromecasthelpers",events:apiClientBowerPath+"/events",credentialprovider:apiClientBowerPath+"/credentials",apiclient:apiClientBowerPath+"/apiclient",connectionManagerFactory:bowerPath+"/emby-apiclient/connectionmanager",visibleinviewport:embyWebComponentsBowerPath+"/visibleinviewport",browserdeviceprofile:embyWebComponentsBowerPath+"/browserdeviceprofile",browser:embyWebComponentsBowerPath+"/browser",inputManager:embyWebComponentsBowerPath+"/inputmanager",qualityoptions:embyWebComponentsBowerPath+"/qualityoptions",hammer:bowerPath+"/hammerjs/hammer.min",pageJs:embyWebComponentsBowerPath+"/pagejs/page",focusManager:embyWebComponentsBowerPath+"/focusmanager",datetime:embyWebComponentsBowerPath+"/datetime",globalize:embyWebComponentsBowerPath+"/globalize",itemHelper:embyWebComponentsBowerPath+"/itemhelper",itemShortcuts:embyWebComponentsBowerPath+"/shortcuts",serverNotifications:embyWebComponentsBowerPath+"/servernotifications",playbackManager:embyWebComponentsBowerPath+"/playback/playbackmanager",autoPlayDetect:embyWebComponentsBowerPath+"/playback/autoplaydetect",nowPlayingHelper:embyWebComponentsBowerPath+"/playback/nowplayinghelper",pluginManager:embyWebComponentsBowerPath+"/pluginmanager",packageManager:embyWebComponentsBowerPath+"/packagemanager",webAnimations:bowerPath+"/web-animations-js/web-animations-next-lite.min"};paths.hlsjs=bowerPath+"/hlsjs/dist/hls.min",define("webActionSheet",[embyWebComponentsBowerPath+"/actionsheet/actionsheet"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.sharingMenu="cordova/sharingwidget":define("sharingMenu",[embyWebComponentsBowerPath+"/sharing/sharingmenu"],returnFirstDependency),paths.wakeonlan=apiClientBowerPath+"/wakeonlan",define("libjass",[bowerPath+"/libjass/libjass.min","css!"+bowerPath+"/libjass/libjass"],returnFirstDependency),window.IntersectionObserver?define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-intersectionobserver"],returnFirstDependency):define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-scroll"],returnFirstDependency),define("imageLoader",[embyWebComponentsBowerPath+"/images/imagehelper"],returnFirstDependency),define("appfooter",["components/appfooter/appfooter"],returnFirstDependency),define("dockedtabs",["components/dockedtabs/dockedtabs"],returnFirstDependency),define("directorybrowser",["components/directorybrowser/directorybrowser"],returnFirstDependency),define("metadataEditor",[embyWebComponentsBowerPath+"/metadataeditor/metadataeditor"],returnFirstDependency),define("personEditor",[embyWebComponentsBowerPath+"/metadataeditor/personeditor"],returnFirstDependency),define("playerSelectionMenu",[embyWebComponentsBowerPath+"/playback/playerselection"],returnFirstDependency),define("playerSettingsMenu",[embyWebComponentsBowerPath+"/playback/playersettingsmenu"],returnFirstDependency),define("libraryMenu",["scripts/librarymenu"],returnFirstDependency),define("emby-collapse",[embyWebComponentsBowerPath+"/emby-collapse/emby-collapse"],returnFirstDependency),define("emby-button",[embyWebComponentsBowerPath+"/emby-button/emby-button"],returnFirstDependency),define("emby-itemscontainer",[embyWebComponentsBowerPath+"/emby-itemscontainer/emby-itemscontainer"],returnFirstDependency),define("emby-tabs",[embyWebComponentsBowerPath+"/emby-tabs/emby-tabs"],returnFirstDependency),define("itemHoverMenu",[embyWebComponentsBowerPath+"/itemhovermenu/itemhovermenu"],returnFirstDependency),define("multiSelect",[embyWebComponentsBowerPath+"/multiselect/multiselect"],returnFirstDependency),define("alphaPicker",[embyWebComponentsBowerPath+"/alphapicker/alphapicker"],returnFirstDependency),define("paper-icon-button-light",[embyWebComponentsBowerPath+"/emby-button/paper-icon-button-light"]),define("connectHelper",[embyWebComponentsBowerPath+"/emby-connect/connecthelper"],returnFirstDependency),define("emby-input",[embyWebComponentsBowerPath+"/emby-input/emby-input"],returnFirstDependency),define("emby-select",[embyWebComponentsBowerPath+"/emby-select/emby-select"],returnFirstDependency),define("emby-slider",[embyWebComponentsBowerPath+"/emby-slider/emby-slider"],returnFirstDependency),define("emby-checkbox",[embyWebComponentsBowerPath+"/emby-checkbox/emby-checkbox"],returnFirstDependency),define("emby-toggle",[embyWebComponentsBowerPath+"/emby-toggle/emby-toggle"],returnFirstDependency),define("emby-radio",[embyWebComponentsBowerPath+"/emby-radio/emby-radio"],returnFirstDependency),define("emby-textarea",[embyWebComponentsBowerPath+"/emby-textarea/emby-textarea"],returnFirstDependency),define("collectionEditor",[embyWebComponentsBowerPath+"/collectioneditor/collectioneditor"],returnFirstDependency),define("playlistEditor",[embyWebComponentsBowerPath+"/playlisteditor/playlisteditor"],returnFirstDependency),define("recordingCreator",[embyWebComponentsBowerPath+"/recordingcreator/recordingcreator"],returnFirstDependency),define("recordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/recordingeditor"],returnFirstDependency),define("seriesRecordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/seriesrecordingeditor"],returnFirstDependency),define("recordingFields",[embyWebComponentsBowerPath+"/recordingcreator/recordingfields"],returnFirstDependency),define("recordingHelper",[embyWebComponentsBowerPath+"/recordingcreator/recordinghelper"],returnFirstDependency),define("subtitleEditor",[embyWebComponentsBowerPath+"/subtitleeditor/subtitleeditor"],returnFirstDependency),define("itemIdentifier",[embyWebComponentsBowerPath+"/itemidentifier/itemidentifier"],returnFirstDependency),define("mediaInfo",[embyWebComponentsBowerPath+"/mediainfo/mediainfo"],returnFirstDependency),define("itemContextMenu",[embyWebComponentsBowerPath+"/itemcontextmenu"],returnFirstDependency),define("imageEditor",[embyWebComponentsBowerPath+"/imageeditor/imageeditor"],returnFirstDependency),define("dom",[embyWebComponentsBowerPath+"/dom"],returnFirstDependency),define("fullscreen-doubleclick",[embyWebComponentsBowerPath+"/fullscreen/fullscreen-doubleclick"],returnFirstDependency),define("fullscreenManager",[embyWebComponentsBowerPath+"/fullscreen/fullscreenmanager","events"],returnFirstDependency),define("layoutManager",[embyWebComponentsBowerPath+"/layoutmanager"],getLayoutManager),define("playMenu",[embyWebComponentsBowerPath+"/playmenu"],returnFirstDependency),define("refreshDialog",[embyWebComponentsBowerPath+"/refreshdialog/refreshdialog"],returnFirstDependency),define("backdrop",[embyWebComponentsBowerPath+"/backdrop/backdrop"],returnFirstDependency),define("fetchHelper",[embyWebComponentsBowerPath+"/fetchhelper"],returnFirstDependency),define("roundCardStyle",["cardStyle","css!"+embyWebComponentsBowerPath+"/cardbuilder/roundcard"],returnFirstDependency),define("cardStyle",["css!"+embyWebComponentsBowerPath+"/cardbuilder/card"],returnFirstDependency),define("cardBuilder",[embyWebComponentsBowerPath+"/cardbuilder/cardbuilder"],returnFirstDependency),define("peoplecardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/peoplecardbuilder"],returnFirstDependency),define("chaptercardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/chaptercardbuilder"],returnFirstDependency),define("mouseManager",[embyWebComponentsBowerPath+"/input/mouse"],returnFirstDependency),define("deleteHelper",[embyWebComponentsBowerPath+"/deletehelper"],returnFirstDependency),define("tvguide",[embyWebComponentsBowerPath+"/guide/guide"],returnFirstDependency),define("programStyles",["css!"+embyWebComponentsBowerPath+"/guide/programs"],returnFirstDependency),define("guide-settings-dialog",[embyWebComponentsBowerPath+"/guide/guide-settings"],returnFirstDependency),define("syncDialog",[embyWebComponentsBowerPath+"/sync/sync"],returnFirstDependency),define("syncToggle",[embyWebComponentsBowerPath+"/sync/synctoggle"],returnFirstDependency),define("syncJobEditor",[embyWebComponentsBowerPath+"/sync/syncjobeditor"],returnFirstDependency),define("syncJobList",[embyWebComponentsBowerPath+"/sync/syncjoblist"],returnFirstDependency),define("voiceDialog",[embyWebComponentsBowerPath+"/voice/voicedialog"],returnFirstDependency),define("voiceReceiver",[embyWebComponentsBowerPath+"/voice/voicereceiver"],returnFirstDependency),define("voiceProcessor",[embyWebComponentsBowerPath+"/voice/voiceprocessor"],returnFirstDependency),define("viewManager",[embyWebComponentsBowerPath+"/viewmanager/viewmanager"],function(viewManager){return window.ViewManager=viewManager,viewManager.dispatchPageEvents(!0),viewManager}),Dashboard.isRunningInCordova()&&window.MainActivity?define("shell",["cordova/shell"],returnFirstDependency):define("shell",[embyWebComponentsBowerPath+"/shell"],returnFirstDependency),define("sharingmanager",[embyWebComponentsBowerPath+"/sharing/sharingmanager"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.apphost="cordova/apphost":paths.apphost="components/apphost",Dashboard.isRunningInCordova()&&window.MainActivity?(paths.appStorage="cordova/appstorage",paths.filesystem="cordova/filesystem"):(paths.appStorage=getAppStorage(apiClientBowerPath),paths.filesystem=embyWebComponentsBowerPath+"/filesystem");var sha1Path=bowerPath+"/cryptojslib/components/sha1-min",md5Path=bowerPath+"/cryptojslib/components/md5-min",shim={};shim[sha1Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},shim[md5Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},requirejs.config({waitSeconds:0,map:{"*":{css:bowerPath+"/emby-webcomponents/require/requirecss",html:bowerPath+"/emby-webcomponents/require/requirehtml",text:bowerPath+"/emby-webcomponents/require/requiretext"}},urlArgs:urlArgs,paths:paths,shim:shim}),define("cryptojs-sha1",[sha1Path]),define("cryptojs-md5",[md5Path]),define("jstree",[bowerPath+"/jstree/dist/jstree","css!thirdparty/jstree/themes/default/style.min.css"]),define("dashboardcss",["css!css/dashboard"]),define("jqmtable",["thirdparty/jquerymobile-1.4.5/jqm.table","css!thirdparty/jquerymobile-1.4.5/jqm.table.css"]),define("jqmwidget",["thirdparty/jquerymobile-1.4.5/jqm.widget"]),define("jqmslider",["thirdparty/jquerymobile-1.4.5/jqm.slider","css!thirdparty/jquerymobile-1.4.5/jqm.slider.css"]),define("jqmpopup",["thirdparty/jquerymobile-1.4.5/jqm.popup","css!thirdparty/jquerymobile-1.4.5/jqm.popup.css"]),define("jqmlistview",["css!thirdparty/jquerymobile-1.4.5/jqm.listview.css"]),define("jqmpanel",["thirdparty/jquerymobile-1.4.5/jqm.panel","css!thirdparty/jquerymobile-1.4.5/jqm.panel.css"]),define("slideshow",[embyWebComponentsBowerPath+"/slideshow/slideshow"],returnFirstDependency),define("fetch",[bowerPath+"/fetch/fetch"]),define("raf",[embyWebComponentsBowerPath+"/polyfills/raf"]),define("functionbind",[embyWebComponentsBowerPath+"/polyfills/bind"]),define("arraypolyfills",[embyWebComponentsBowerPath+"/polyfills/array"]),define("objectassign",[embyWebComponentsBowerPath+"/polyfills/objectassign"]),define("clearButtonStyle",["css!"+embyWebComponentsBowerPath+"/clearbutton"]),define("userdataButtons",[embyWebComponentsBowerPath+"/userdatabuttons/userdatabuttons"],returnFirstDependency),define("listView",[embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("listViewStyle",["css!"+embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("formDialogStyle",["css!"+embyWebComponentsBowerPath+"/formdialog"],returnFirstDependency),define("indicators",[embyWebComponentsBowerPath+"/indicators/indicators"],returnFirstDependency),define("registrationServices",[embyWebComponentsBowerPath+"/registrationservices/registrationservices"],returnFirstDependency),Dashboard.isRunningInCordova()?(define("iapManager",["cordova/iap"],returnFirstDependency),define("fileupload",["cordova/fileupload"],returnFirstDependency)):(define("iapManager",["components/iap"],returnFirstDependency),define("fileupload",[apiClientBowerPath+"/fileupload"],returnFirstDependency)),define("connectionmanager",[apiClientBowerPath+"/connectionmanager"]),define("cameraRoll",[apiClientBowerPath+"/cameraroll"],returnFirstDependency),define("contentuploader",[apiClientBowerPath+"/sync/contentuploader"]),define("serversync",[apiClientBowerPath+"/sync/serversync"]),define("multiserversync",[apiClientBowerPath+"/sync/multiserversync"]),define("offlineusersync",[apiClientBowerPath+"/sync/offlineusersync"]),define("mediasync",[apiClientBowerPath+"/sync/mediasync"]),define("swiper",[bowerPath+"/Swiper/dist/js/swiper.min","css!"+bowerPath+"/Swiper/dist/css/swiper.min"],returnFirstDependency),define("scroller",[embyWebComponentsBowerPath+"/scroller/smoothscroller"],returnFirstDependency),define("toast",[embyWebComponentsBowerPath+"/toast/toast"],returnFirstDependency),define("scrollHelper",[embyWebComponentsBowerPath+"/scrollhelper"],returnFirstDependency),define("appSettings",[embyWebComponentsBowerPath+"/appsettings"],updateAppSettings),define("userSettings",[embyWebComponentsBowerPath+"/usersettings/usersettings"],returnFirstDependency),define("userSettingsBuilder",[embyWebComponentsBowerPath+"/usersettings/usersettingsbuilder"],returnFirstDependency),define("material-icons",["css!"+embyWebComponentsBowerPath+"/fonts/material-icons/style"]),define("robotoFont",["css!"+embyWebComponentsBowerPath+"/fonts/roboto/style"]),define("scrollStyles",["css!"+embyWebComponentsBowerPath+"/scrollstyles"]),define("navdrawer",["components/navdrawer/navdrawer"],returnFirstDependency),define("viewcontainer",["components/viewcontainer-lite","css!"+embyWebComponentsBowerPath+"/viewmanager/viewcontainer-lite"],returnFirstDependency),define("queryString",[bowerPath+"/query-string/index"],function(){return queryString}),define("jQuery",[bowerPath+"/jquery/dist/jquery.slim.min"],function(){return window.ApiClient&&(jQuery.ajax=ApiClient.ajax),jQuery}),define("fnchecked",["legacy/fnchecked"]),define("dialogHelper",[embyWebComponentsBowerPath+"/dialoghelper/dialoghelper"],function(dialoghelper){return dialoghelper.setOnOpen(onDialogOpen),dialoghelper}),define("inputmanager",["inputManager"],returnFirstDependency),define("historyManager",["embyRouter"],returnFirstDependency),define("headroom-window",["headroom"],createWindowHeadroom),define("hammer-main",["hammer"],createMainContentHammer),define("appfooter-shared",["appfooter"],createSharedAppFooter),define("skinManager",[],function(){return{loadUserSkin:function(){Emby.Page.show("/home.html")}}}),define("connectionManager",[],function(){return ConnectionManager}),define("apiClientResolver",[],function(){return function(){return window.ApiClient}}),define("embyRouter",[embyWebComponentsBowerPath+"/router"],function(embyRouter){function showItem(item,serverId,options){if("string"==typeof item)require(["connectionManager"],function(connectionManager){var apiClient=connectionManager.currentApiClient();apiClient.getItem(apiClient.getCurrentUserId(),item).then(function(item){embyRouter.showItem(item,options)})});else{2==arguments.length&&(options=arguments[1]);var context=options?options.context:null;Emby.Page.show("/"+LibraryBrowser.getHref(item,context),{item:item})}}return embyRouter.showLocalLogin=function(apiClient,serverId,manualLogin){Dashboard.navigate("login.html?serverid="+serverId)},embyRouter.showVideoOsd=function(){return Dashboard.navigate("videoosd.html")},embyRouter.showSelectServer=function(){Dashboard.navigate("selectserver.html")},embyRouter.showWelcome=function(){Dashboard.isConnectMode()?Dashboard.navigate("connectlogin.html?mode=welcome"):Dashboard.navigate("login.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.showGuide=function(){Dashboard.navigate("livetv.html?tab=1"); -},embyRouter.goHome=function(){Dashboard.navigate("home.html")},embyRouter.showSearch=function(){Dashboard.navigate("search.html")},embyRouter.showLiveTV=function(){Dashboard.navigate("livetv.html")},embyRouter.showRecordedTV=function(){Dashboard.navigate("livetv.html?tab=3")},embyRouter.showFavorites=function(){Dashboard.navigate("favorites.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.setTitle=function(){},embyRouter.showItem=showItem,embyRouter})}function updateAppSettings(appSettings){return appSettings.enableExternalPlayers=function(val){return null!=val&&appSettings.set("externalplayers",val.toString()),"true"===appSettings.get("externalplayers")},appSettings}function onDialogOpen(dlg){dlg.classList.contains("background-theme-a")||dlg.classList.contains("actionSheet")||(dlg.classList.add("background-theme-b"),dlg.classList.add("ui-body-b"))}function initRequireWithBrowser(browser){var bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents";Dashboard.isRunningInCordova()&&browser.safari?define("actionsheet",["cordova/actionsheet"],returnFirstDependency):define("actionsheet",["webActionSheet"],returnFirstDependency),"registerElement"in document?define("registerElement",[]):browser.msie?define("registerElement",[bowerPath+"/webcomponentsjs/webcomponents-lite.min.js"]):define("registerElement",[bowerPath+"/document-register-element/build/document-register-element"]),window.chrome&&window.chrome.sockets?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.android?define("serverdiscovery",["cordova/serverdiscovery"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.safari?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.safari?define("imageFetcher",["cordova/imagestore"],returnFirstDependency):define("imageFetcher",[embyWebComponentsBowerPath+"/images/basicimagefetcher"],returnFirstDependency);var preferNativeAlerts=browser.tv;preferNativeAlerts&&window.alert?define("alert",[embyWebComponentsBowerPath+"/alert/nativealert"],returnFirstDependency):define("alert",[embyWebComponentsBowerPath+"/alert/alert"],returnFirstDependency),define("dialog",[embyWebComponentsBowerPath+"/dialog/dialog"],returnFirstDependency),preferNativeAlerts&&window.confirm?define("confirm",[embyWebComponentsBowerPath+"/confirm/nativeconfirm"],returnFirstDependency):define("confirm",[embyWebComponentsBowerPath+"/confirm/confirm"],returnFirstDependency);var preferNativePrompt=preferNativeAlerts||browser.xboxOne;preferNativePrompt&&window.confirm?define("prompt",[embyWebComponentsBowerPath+"/prompt/nativeprompt"],returnFirstDependency):define("prompt",[embyWebComponentsBowerPath+"/prompt/prompt"],returnFirstDependency),browser.tizen||browser.operaTv?define("loading",[embyWebComponentsBowerPath+"/loading/loading-legacy"],returnFirstDependency):define("loading",[embyWebComponentsBowerPath+"/loading/loading-lite"],returnFirstDependency),define("multi-download",[embyWebComponentsBowerPath+"/multidownload"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("fileDownloader",["cordova/filedownloader"],returnFirstDependency),define("localassetmanager",["cordova/localassetmanager"],returnFirstDependency)):(define("fileDownloader",[embyWebComponentsBowerPath+"/filedownloader"],returnFirstDependency),define("localassetmanager",[apiClientBowerPath+"/localassetmanager"],returnFirstDependency)),define("screenLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",["cordova/wakelock"],returnFirstDependency),define("networkLock",["cordova/networklock"],returnFirstDependency)):(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),define("networkLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency))}function init(){Dashboard.isRunningInCordova()&&browserInfo.android&&define("nativedirectorychooser",["cordova/nativedirectorychooser"]),Dashboard.isRunningInCordova()&&browserInfo.android?define("localsync",["cordova/localsync"],returnFirstDependency):define("localsync",["scripts/localsync"],returnFirstDependency),define("livetvcss",["css!css/livetv.css"]),define("detailtablecss",["css!css/detailtable.css"]),define("autoorganizetablecss",["css!css/autoorganizetable.css"]),define("buttonenabled",["legacy/buttonenabled"]),initAfterDependencies()}function getRequirePromise(deps){return new Promise(function(resolve,reject){require(deps,resolve)})}function initAfterDependencies(){var list=[];window.fetch||list.push("fetch"),"function"!=typeof Object.assign&&list.push("objectassign"),Array.prototype.filter||list.push("arraypolyfills"),Function.prototype.bind||list.push("functionbind"),window.requestAnimationFrame||list.push("raf"),require(list,function(){createConnectionManager().then(function(){console.log("initAfterDependencies promises resolved"),require(["globalize"],function(globalize){window.Globalize=globalize,Promise.all([loadCoreDictionary(globalize),loadSharedComponentsDictionary(globalize)]).then(onGlobalizeInit)})})})}function loadSharedComponentsDictionary(globalize){var baseUrl="bower_components/emby-webcomponents/strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sk","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});globalize.loadStrings({name:"sharedcomponents",translations:translations})}function loadCoreDictionary(globalize){var baseUrl="strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});return globalize.defaultModule("core"),globalize.loadStrings({name:"core",translations:translations})}function onGlobalizeInit(){document.title=Globalize.translateDocument(document.title,"core"),require(["apphost"],function(appHost){loadPlugins([],appHost,browserInfo).then(onAppReady)})}function defineRoute(newRoute,dictionary){var baseRoute=Emby.Page.baseUrl(),path=newRoute.path;path=path.replace(baseRoute,""),console.log("Defining route: "+path),newRoute.dictionary=newRoute.dictionary||dictionary||"core",Emby.Page.addRoute(path,newRoute)}function defineCoreRoutes(){console.log("Defining core routes"),defineRoute({path:"/addplugin.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"scripts/addpluginpage"}),defineRoute({path:"/appservices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizelog.html",dependencies:["scripts/taskbutton","autoorganizetablecss"],controller:"dashboard/autoorganizelog",roles:"admin"}),defineRoute({path:"/autoorganizesmart.html",dependencies:["emby-button"],controller:"dashboard/autoorganizesmart",autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizetv.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-select","emby-collapse"],controller:"dashboard/autoorganizetv",autoFocus:!1,roles:"admin"}),defineRoute({path:"/channelitems.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/channels.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/channels"}),defineRoute({path:"/channelsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/cinemamodeconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/connectlogin.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/connectlogin"}),defineRoute({path:"/dashboard.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardgeneral.html",controller:"dashboard/dashboardgeneral",autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardhosting.html",dependencies:["emby-input","emby-button"],autoFocus:!1,roles:"admin",controller:"dashboard/dashboardhosting"}),defineRoute({path:"/device.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devicesupload.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofile.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaserversettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnasettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/edititemmetadata.html",dependencies:[],controller:"scripts/edititemmetadata",autoFocus:!1}),defineRoute({path:"/encodingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/favorites.html",dependencies:[],autoFocus:!1,controller:"scripts/favorites"}),defineRoute({path:"/forgotpassword.html",dependencies:["emby-input","emby-button"],anonymous:!0,startup:!0,controller:"scripts/forgotpassword"}),defineRoute({path:"/forgotpasswordpin.html",dependencies:["emby-input","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/forgotpasswordpin"}),defineRoute({path:"/gamegenres.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/games.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesrecommended.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamestudios.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesystems.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/home.html",dependencies:[],autoFocus:!1,controller:"scripts/indexpage",transition:"fade",type:"home"}),defineRoute({path:"/index.html",dependencies:[],autoFocus:!1,isDefaultRoute:!0}),defineRoute({path:"/itemdetails.html",dependencies:["emby-button","scripts/livetvcomponents","paper-icon-button-light","emby-itemscontainer"],controller:"scripts/itemdetailpage",autoFocus:!1,transition:"fade"}),defineRoute({path:"/itemlist.html",dependencies:[],autoFocus:!1,controller:"scripts/itemlistpage",transition:"fade"}),defineRoute({path:"/kids.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/library.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/librarydisplay.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"dashboard/librarydisplay"}),defineRoute({path:"/librarysettings.html",dependencies:["emby-collapse","emby-input","emby-button","emby-select"],autoFocus:!1,roles:"admin",controller:"dashboard/librarysettings"}),defineRoute({path:"/livetv.html",dependencies:["emby-button","livetvcss"],controller:"scripts/livetvsuggested",autoFocus:!1,transition:"fade"}),defineRoute({path:"/livetvguideprovider.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvitems.html",dependencies:[],autoFocus:!1,controller:"scripts/livetvitems"}),defineRoute({path:"/livetvseriestimer.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-collapse","scripts/livetvcomponents","scripts/livetvseriestimer","livetvcss"],autoFocus:!1,controller:"scripts/livetvseriestimer"}),defineRoute({path:"/livetvsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/livetvstatus.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-hdhomerun.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-m3u.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-satip.html",dependencies:["emby-input"],autoFocus:!1,roles:"admin",controller:"dashboard/livetvtunerprovider-satip"}),defineRoute({path:"/log.html",dependencies:["emby-checkbox"],roles:"admin",controller:"dashboard/logpage"}),defineRoute({path:"/login.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/loginpage"}),defineRoute({path:"/metadataadvanced.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadataimages.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatanfo.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatasubtitles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/movies.html",dependencies:["emby-button"],autoFocus:!1,controller:"scripts/moviesrecommended",transition:"fade"}),defineRoute({path:"/music.html",dependencies:[],controller:"scripts/musicrecommended",autoFocus:!1,transition:"fade"}),defineRoute({path:"/mypreferencesdisplay.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencesdisplay"}),defineRoute({path:"/mypreferenceshome.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceshome"}),defineRoute({path:"/mypreferenceslanguages.html",dependencies:["emby-button","emby-checkbox","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceslanguages"}),defineRoute({path:"/mypreferencesmenu.html",dependencies:["emby-button"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencescommon"}),defineRoute({path:"/myprofile.html",dependencies:["emby-button","emby-collapse","emby-checkbox","emby-input"],autoFocus:!1,transition:"fade",controller:"scripts/myprofile"}),defineRoute({path:"/mysync.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/mysync"}),defineRoute({path:"/camerauploadsettings.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/camerauploadsettings"}),defineRoute({path:"/mysyncjob.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/syncjob"}),defineRoute({path:"/mysyncsettings.html",dependencies:["emby-checkbox","emby-input","emby-button","paper-icon-button-light"],autoFocus:!1,transition:"fade",controller:"scripts/mysyncsettings"}),defineRoute({path:"/notificationlist.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/notificationsetting.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/notificationsettings.html",controller:"scripts/notificationsettings",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/nowplaying.html",dependencies:["paper-icon-button-light","emby-slider","emby-button","emby-input","emby-itemscontainer"],controller:"scripts/nowplayingpage",autoFocus:!1,transition:"fade",fullscreen:!0,supportsThemeMedia:!0}),defineRoute({path:"/photos.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/playbackconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/playlists.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/playlists"}),defineRoute({path:"/plugincatalog.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/plugins.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/reports.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/scheduledtask.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/scheduledtasks.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/search.html",dependencies:[],controller:"scripts/searchpage"}),defineRoute({path:"/secondaryitems.html",dependencies:[],autoFocus:!1,controller:"scripts/secondaryitems"}),defineRoute({path:"/selectserver.html",dependencies:["listViewStyle","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/selectserver"}),defineRoute({path:"/serversecurity.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/shared.html",dependencies:[],autoFocus:!1,anonymous:!0}),defineRoute({path:"/streamingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/support.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/supporterkey.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/syncactivity.html",dependencies:[],autoFocus:!1,controller:"scripts/syncactivity"}),defineRoute({path:"/syncsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/tv.html",dependencies:["paper-icon-button-light","emby-button"],autoFocus:!1,controller:"scripts/tvrecommended",transition:"fade"}),defineRoute({path:"/useredit.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userlibraryaccess.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/usernew.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userparentalcontrol.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userpassword.html",dependencies:["emby-input","emby-button","emby-checkbox"],autoFocus:!1,controller:"scripts/userpasswordpage"}),defineRoute({path:"/userprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/wizardagreement.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardcomponents.html",dependencies:["dashboardcss","emby-button","emby-input","emby-select"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardcomponents"}),defineRoute({path:"/wizardfinish.html",dependencies:["emby-button","dashboardcss"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardfinishpage"}),defineRoute({path:"/wizardlibrary.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvguide.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvtuner.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardsettings.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardstart.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizarduser.html",dependencies:["dashboardcss","emby-input"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/videoosd.html",dependencies:[],transition:"fade",controller:"scripts/videoosd",autoFocus:!1,type:"video-osd",supportsThemeMedia:!0,fullscreen:!0}),defineRoute({path:"/configurationpage",dependencies:["jQuery"],autoFocus:!1,enableCache:!1,enableContentQueryString:!0,roles:"admin"}),defineRoute({path:"/",isDefaultRoute:!0,autoFocus:!1,dependencies:[]})}function loadPlugins(externalPlugins,appHost,browser,shell){console.log("Loading installed plugins");var list=["bower_components/emby-webcomponents/playback/playbackvalidation"];Dashboard.isRunningInCordova()&&browser.android?(document.createElement("audio").canPlayType("audio/flac").replace(/no/,"")&&document.createElement("audio").canPlayType('audio/ogg; codecs="opus"').replace(/no/,"")||(window.VlcAudio=!0),list.push("cordova/vlcplayer")):Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/audioplayer"),list.push("bower_components/emby-webcomponents/htmlaudioplayer/plugin"),Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/chromecast"),Dashboard.isRunningInCordova()&&browser.android&&list.push("cordova/externalplayer"),list.push("bower_components/emby-webcomponents/htmlvideoplayer/plugin"),appHost.supports("remotecontrol")&&(list.push("bower_components/emby-webcomponents/sessionplayer"),browser.chrome&&list.push("bower_components/emby-webcomponents/chromecastplayer")),list.push("bower_components/emby-webcomponents/youtubeplayer/plugin");for(var i=0,length=externalPlugins.length;i",menuHtml+='',menuHtml+=item.name,menuHtml+="",menuHtml+=""},getToolsMenuHtml:function(page){var i,length,item,items=Dashboard.getToolsMenuLinks(page),menuHtml="";for(menuHtml+='
',i=0,length=items.length;i
"),item.href?menuHtml+=Dashboard.getToolsLinkHtml(item):(menuHtml+='
',menuHtml+=item.name,menuHtml+="
");return menuHtml+=""},getToolsMenuLinks:function(){return[{name:Globalize.translate("TabServer")},{name:Globalize.translate("TabDashboard"),href:"dashboard.html",pageIds:["dashboardPage"],icon:"dashboard"},{name:Globalize.translate("TabSettings"),href:"dashboardgeneral.html",pageIds:["dashboardGeneralPage"],icon:"settings"},{name:Globalize.translate("TabDevices"),href:"devices.html",pageIds:["devicesPage","devicePage","devicesUploadPage"],icon:"tablet"},{name:Globalize.translate("TabUsers"),href:"userprofiles.html",pageIds:["userProfilesPage","newUserPage","editUserPage","userLibraryAccessPage","userParentalControlPage","userPasswordPage"],icon:"people"},{name:"Emby Premiere",href:"supporterkey.html",pageIds:["supporterKeyPage"],icon:"star"},{divider:!0,name:Globalize.translate("TabLibrary"),href:"library.html",pageIds:["mediaLibraryPage","librarySettingsPage","libraryDisplayPage","metadataImagesConfigurationPage","metadataNfoPage"],icon:"folder",color:"#38c"},{name:Globalize.translate("TabSubtitles"),href:"metadatasubtitles.html",pageIds:["metadataSubtitlesPage"],icon:"closed_caption"},{name:Globalize.translate("TabPlayback"),icon:"play_circle_filled",color:"#E5342E",href:"cinemamodeconfiguration.html",pageIds:["cinemaModeConfigurationPage","playbackConfigurationPage","streamingSettingsPage"]},{name:Globalize.translate("TabSync"),icon:"sync",href:"syncactivity.html",pageIds:["syncActivityPage","syncJobPage","syncSettingsPage"],color:"#009688"},{name:Globalize.translate("TabTranscoding"),icon:"transform",href:"encodingsettings.html",pageIds:["encodingSettingsPage"]},{divider:!0,name:Globalize.translate("TabExtras")},{name:Globalize.translate("TabAutoOrganize"),color:"#01C0DD",href:"autoorganizelog.html",pageIds:["libraryFileOrganizerPage","libraryFileOrganizerSmartMatchPage","libraryFileOrganizerLogPage"],icon:"folder"},{name:Globalize.translate("DLNA"),href:"dlnasettings.html",pageIds:["dlnaSettingsPage","dlnaProfilesPage","dlnaProfilePage"],icon:"settings"},{name:Globalize.translate("TabLiveTV"),href:"livetvstatus.html",pageIds:["liveTvStatusPage","liveTvSettingsPage","liveTvTunerProviderHdHomerunPage","liveTvTunerProviderM3UPage","liveTvTunerProviderSatPage"],icon:"dvr"},{name:Globalize.translate("TabNotifications"),icon:"notifications",color:"brown",href:"notificationsettings.html",pageIds:["notificationSettingsPage","notificationSettingPage"]},{name:Globalize.translate("TabPlugins"),icon:"add_shopping_cart",color:"#9D22B1",href:"plugins.html",pageIds:["pluginsPage","pluginCatalogPage"]},{divider:!0,name:Globalize.translate("TabExpert")},{name:Globalize.translate("TabAdvanced"),icon:"settings",href:"dashboardhosting.html",color:"#F16834",pageIds:["dashboardHostingPage","serverSecurityPage"]},{name:Globalize.translate("TabLogs"),href:"log.html",pageIds:["logPage"],icon:"folder_open"},{name:Globalize.translate("TabScheduledTasks"),href:"scheduledtasks.html",pageIds:["scheduledTasksPage","scheduledTaskPage"],icon:"schedule"},{name:Globalize.translate("MetadataManager"),href:"edititemmetadata.html",pageIds:[],icon:"mode_edit"},{name:Globalize.translate("ButtonReports"),href:"reports.html",pageIds:[],icon:"insert_chart"}]},getSupportedRemoteCommands:function(){return["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode"]},capabilities:function(){var caps={PlayableMediaTypes:["Audio","Video"],SupportedCommands:Dashboard.getSupportedRemoteCommands(),SupportsPersistentIdentifier:Dashboard.isRunningInCordova(),SupportsMediaControl:!0,SupportedLiveMediaTypes:["Audio","Video"]};return Dashboard.isRunningInCordova()&&!browserInfo.safari&&(caps.SupportsSync=!0,caps.SupportsContentUploading=!0),caps},normalizeImageOptions:function(options){var setQuality;if(options.maxWidth&&(setQuality=!0),options.width&&(setQuality=!0),options.maxHeight&&(setQuality=!0),options.height&&(setQuality=!0),setQuality){var quality=90,isBackdrop="backdrop"==(options.type||"").toLowerCase();isBackdrop&&(quality-=10),browserInfo.slow&&(quality-=40),AppInfo.hasLowImageBandwidth&&!isBackdrop&&(quality-=10),options.quality=quality}}},AppInfo={};!function(){"use strict";function setAppInfo(){var isCordova=Dashboard.isRunningInCordova();AppInfo.enableHomeTabs=!0,AppInfo.enableAutoSave=browserInfo.touch,AppInfo.enableAppStorePolicy=isCordova,browserInfo.iOS&&(AppInfo.hasLowImageBandwidth=!0),isCordova?(AppInfo.isNativeApp=!0,AppInfo.enableHomeTabs=!1,browserInfo.android&&(AppInfo.supportsExternalPlayers=!0)):AppInfo.enableSupporterMembership=!0,AppInfo.supportsFileInput=!(AppInfo.isNativeApp&&browserInfo.android),AppInfo.supportsUserDisplayLanguageSetting=Dashboard.isConnectMode()}function initializeApiClient(apiClient){AppInfo.enableAppStorePolicy&&(apiClient.getAvailablePlugins=function(){return Promise.resolve([])},apiClient.getInstalledPlugins=function(){return Promise.resolve([])}),apiClient.normalizeImageOptions=Dashboard.normalizeImageOptions,Events.off(apiClient,"requestfail",Dashboard.onRequestFail),Events.on(apiClient,"requestfail",Dashboard.onRequestFail)}function onApiClientCreated(e,newApiClient){initializeApiClient(newApiClient),window.$&&($.ajax=newApiClient.ajax)}function defineConnectionManager(connectionManager){window.ConnectionManager=connectionManager,define("connectionManager",[],function(){return connectionManager})}function bindConnectionManagerEvents(connectionManager,events,userSettings){window.Events=events,events.on(ConnectionManager,"apiclientcreated",onApiClientCreated),connectionManager.currentApiClient=function(){if(!localApiClient){var server=connectionManager.getLastUsedServer();server&&(localApiClient=connectionManager.getApiClient(server.Id))}return localApiClient},connectionManager.onLocalUserSignedIn=function(user){return localApiClient=connectionManager.getApiClient(user.ServerId),window.ApiClient=localApiClient,userSettings.setUserInfo(user.Id,localApiClient)},events.on(connectionManager,"localusersignedout",function(){userSettings.setUserInfo(null,null)})}function createConnectionManager(){return new Promise(function(resolve,reject){require(["connectionManagerFactory","apphost","credentialprovider","events","userSettings"],function(connectionManagerExports,apphost,credentialProvider,events,userSettings){window.MediaBrowser=Object.assign(window.MediaBrowser||{},connectionManagerExports);var credentialProviderInstance=new credentialProvider,promises=[apphost.getSyncProfile(),apphost.appInfo()];Promise.all(promises).then(function(responses){var deviceProfile=responses[0],appInfo=responses[1],capabilities=Dashboard.capabilities();capabilities.DeviceProfile=deviceProfile;var connectionManager=new MediaBrowser.ConnectionManager(credentialProviderInstance,appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,capabilities,window.devicePixelRatio);return defineConnectionManager(connectionManager),bindConnectionManagerEvents(connectionManager,events,userSettings),Dashboard.isConnectMode()?void resolve():(console.log("loading ApiClient singleton"),getRequirePromise(["apiclient"]).then(function(apiClientFactory){console.log("creating ApiClient singleton");var apiClient=new apiClientFactory(Dashboard.serverAddress(),appInfo.appName,appInfo.appVersion,appInfo.deviceName,appInfo.deviceId,window.devicePixelRatio);apiClient.enableAutomaticNetworking=!1,connectionManager.addApiClient(apiClient),require(["css!"+apiClient.getUrl("Branding/Css")]),window.ApiClient=apiClient,localApiClient=apiClient,console.log("loaded ApiClient singleton"),resolve()}))})})})}function setDocumentClasses(browser){var elem=document.documentElement;AppInfo.enableSupporterMembership||elem.classList.add("supporterMembershipDisabled")}function loadTheme(){var name=getParameterByName("theme");if(name)return void require(["themes/"+name+"/theme"]);if(!AppInfo.isNativeApp){var date=new Date,month=date.getMonth(),day=date.getDate();return 9==month&&day>=30?void require(["themes/halloween/theme"]):void 0}}function returnFirstDependency(obj){return obj}function getBowerPath(){return"bower_components"}function getLayoutManager(layoutManager){return layoutManager.init(),layoutManager}function getAppStorage(basePath){try{return localStorage.setItem("_test","0"),localStorage.removeItem("_test"),basePath+"/appstorage-localstorage"}catch(e){return basePath+"/appstorage-memory"}}function createWindowHeadroom(){var headroom=new Headroom([],{tolerance:{down:0,up:0},classes:{}});return headroom.init(),headroom}function getCastSenderApiLoader(){var ccLoaded=!1;return{load:function(){return ccLoaded?Promise.resolve():new Promise(function(resolve,reject){var fileref=document.createElement("script");fileref.setAttribute("type","text/javascript"),fileref.onload=function(){ccLoaded=!0,resolve()},fileref.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"),document.querySelector("head").appendChild(fileref)})}}}function getDummyCastSenderApiLoader(){return{load:function(){return window.chrome=window.chrome||{},Promise.resolve()}}}function createMainContentHammer(Hammer){var hammer=new Hammer(document.querySelector(".skinBody"),null);return hammer}function createSharedAppFooter(appFooter){var footer=new appFooter({});return footer}function initRequire(){var urlArgs="v="+(window.dashboardVersion||(new Date).getDate()),bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents",paths={velocity:bowerPath+"/velocity/velocity.min",vibrant:bowerPath+"/vibrant/dist/vibrant",ironCardList:"components/ironcardlist/ironcardlist",scrollThreshold:"components/scrollthreshold",playlisteditor:"components/playlisteditor/playlisteditor",medialibrarycreator:"components/medialibrarycreator/medialibrarycreator",medialibraryeditor:"components/medialibraryeditor/medialibraryeditor",howler:bowerPath+"/howlerjs/howler.min",sortable:bowerPath+"/Sortable/Sortable.min",isMobile:bowerPath+"/isMobile/isMobile.min",headroom:bowerPath+"/headroomjs/dist/headroom",masonry:bowerPath+"/masonry/dist/masonry.pkgd.min",humanedate:"components/humanedate",libraryBrowser:"scripts/librarybrowser",chromecasthelpers:"components/chromecasthelpers",events:apiClientBowerPath+"/events",credentialprovider:apiClientBowerPath+"/credentials",apiclient:apiClientBowerPath+"/apiclient",connectionManagerFactory:bowerPath+"/emby-apiclient/connectionmanager",visibleinviewport:embyWebComponentsBowerPath+"/visibleinviewport",browserdeviceprofile:embyWebComponentsBowerPath+"/browserdeviceprofile",browser:embyWebComponentsBowerPath+"/browser",inputManager:embyWebComponentsBowerPath+"/inputmanager",qualityoptions:embyWebComponentsBowerPath+"/qualityoptions",hammer:bowerPath+"/hammerjs/hammer.min",pageJs:embyWebComponentsBowerPath+"/pagejs/page",focusManager:embyWebComponentsBowerPath+"/focusmanager",datetime:embyWebComponentsBowerPath+"/datetime",globalize:embyWebComponentsBowerPath+"/globalize",itemHelper:embyWebComponentsBowerPath+"/itemhelper",itemShortcuts:embyWebComponentsBowerPath+"/shortcuts",serverNotifications:embyWebComponentsBowerPath+"/servernotifications",playbackManager:embyWebComponentsBowerPath+"/playback/playbackmanager",autoPlayDetect:embyWebComponentsBowerPath+"/playback/autoplaydetect",nowPlayingHelper:embyWebComponentsBowerPath+"/playback/nowplayinghelper",pluginManager:embyWebComponentsBowerPath+"/pluginmanager",packageManager:embyWebComponentsBowerPath+"/packagemanager",webAnimations:bowerPath+"/web-animations-js/web-animations-next-lite.min"};paths.hlsjs=bowerPath+"/hlsjs/dist/hls.min",define("webActionSheet",[embyWebComponentsBowerPath+"/actionsheet/actionsheet"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.sharingMenu="cordova/sharingwidget":define("sharingMenu",[embyWebComponentsBowerPath+"/sharing/sharingmenu"],returnFirstDependency),paths.wakeonlan=apiClientBowerPath+"/wakeonlan",define("libjass",[bowerPath+"/libjass/libjass.min","css!"+bowerPath+"/libjass/libjass"],returnFirstDependency),window.IntersectionObserver?define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-intersectionobserver"],returnFirstDependency):define("lazyLoader",[embyWebComponentsBowerPath+"/lazyloader/lazyloader-scroll"],returnFirstDependency),define("imageLoader",[embyWebComponentsBowerPath+"/images/imagehelper"],returnFirstDependency),define("appfooter",["components/appfooter/appfooter"],returnFirstDependency),define("dockedtabs",["components/dockedtabs/dockedtabs"],returnFirstDependency),define("directorybrowser",["components/directorybrowser/directorybrowser"],returnFirstDependency),define("metadataEditor",[embyWebComponentsBowerPath+"/metadataeditor/metadataeditor"],returnFirstDependency),define("personEditor",[embyWebComponentsBowerPath+"/metadataeditor/personeditor"],returnFirstDependency),define("playerSelectionMenu",[embyWebComponentsBowerPath+"/playback/playerselection"],returnFirstDependency),define("playerSettingsMenu",[embyWebComponentsBowerPath+"/playback/playersettingsmenu"],returnFirstDependency),define("libraryMenu",["scripts/librarymenu"],returnFirstDependency),define("emby-collapse",[embyWebComponentsBowerPath+"/emby-collapse/emby-collapse"],returnFirstDependency),define("emby-button",[embyWebComponentsBowerPath+"/emby-button/emby-button"],returnFirstDependency),define("emby-itemscontainer",[embyWebComponentsBowerPath+"/emby-itemscontainer/emby-itemscontainer"],returnFirstDependency),define("emby-tabs",[embyWebComponentsBowerPath+"/emby-tabs/emby-tabs"],returnFirstDependency),define("itemHoverMenu",[embyWebComponentsBowerPath+"/itemhovermenu/itemhovermenu"],returnFirstDependency),define("multiSelect",[embyWebComponentsBowerPath+"/multiselect/multiselect"],returnFirstDependency),define("alphaPicker",[embyWebComponentsBowerPath+"/alphapicker/alphapicker"],returnFirstDependency),define("paper-icon-button-light",[embyWebComponentsBowerPath+"/emby-button/paper-icon-button-light"]),define("connectHelper",[embyWebComponentsBowerPath+"/emby-connect/connecthelper"],returnFirstDependency),define("emby-input",[embyWebComponentsBowerPath+"/emby-input/emby-input"],returnFirstDependency),define("emby-select",[embyWebComponentsBowerPath+"/emby-select/emby-select"],returnFirstDependency),define("emby-slider",[embyWebComponentsBowerPath+"/emby-slider/emby-slider"],returnFirstDependency),define("emby-checkbox",[embyWebComponentsBowerPath+"/emby-checkbox/emby-checkbox"],returnFirstDependency),define("emby-toggle",[embyWebComponentsBowerPath+"/emby-toggle/emby-toggle"],returnFirstDependency),define("emby-radio",[embyWebComponentsBowerPath+"/emby-radio/emby-radio"],returnFirstDependency),define("emby-textarea",[embyWebComponentsBowerPath+"/emby-textarea/emby-textarea"],returnFirstDependency),define("collectionEditor",[embyWebComponentsBowerPath+"/collectioneditor/collectioneditor"],returnFirstDependency),define("playlistEditor",[embyWebComponentsBowerPath+"/playlisteditor/playlisteditor"],returnFirstDependency),define("recordingCreator",[embyWebComponentsBowerPath+"/recordingcreator/recordingcreator"],returnFirstDependency),define("recordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/recordingeditor"],returnFirstDependency),define("seriesRecordingEditor",[embyWebComponentsBowerPath+"/recordingcreator/seriesrecordingeditor"],returnFirstDependency),define("recordingFields",[embyWebComponentsBowerPath+"/recordingcreator/recordingfields"],returnFirstDependency),define("recordingHelper",[embyWebComponentsBowerPath+"/recordingcreator/recordinghelper"],returnFirstDependency),define("subtitleEditor",[embyWebComponentsBowerPath+"/subtitleeditor/subtitleeditor"],returnFirstDependency),define("itemIdentifier",[embyWebComponentsBowerPath+"/itemidentifier/itemidentifier"],returnFirstDependency),define("mediaInfo",[embyWebComponentsBowerPath+"/mediainfo/mediainfo"],returnFirstDependency),define("itemContextMenu",[embyWebComponentsBowerPath+"/itemcontextmenu"],returnFirstDependency),define("imageEditor",[embyWebComponentsBowerPath+"/imageeditor/imageeditor"],returnFirstDependency),define("dom",[embyWebComponentsBowerPath+"/dom"],returnFirstDependency),define("fullscreen-doubleclick",[embyWebComponentsBowerPath+"/fullscreen/fullscreen-doubleclick"],returnFirstDependency),define("fullscreenManager",[embyWebComponentsBowerPath+"/fullscreen/fullscreenmanager","events"],returnFirstDependency),define("layoutManager",[embyWebComponentsBowerPath+"/layoutmanager"],getLayoutManager),define("playMenu",[embyWebComponentsBowerPath+"/playmenu"],returnFirstDependency),define("refreshDialog",[embyWebComponentsBowerPath+"/refreshdialog/refreshdialog"],returnFirstDependency),define("backdrop",[embyWebComponentsBowerPath+"/backdrop/backdrop"],returnFirstDependency),define("fetchHelper",[embyWebComponentsBowerPath+"/fetchhelper"],returnFirstDependency),define("roundCardStyle",["cardStyle","css!"+embyWebComponentsBowerPath+"/cardbuilder/roundcard"],returnFirstDependency),define("cardStyle",["css!"+embyWebComponentsBowerPath+"/cardbuilder/card"],returnFirstDependency),define("cardBuilder",[embyWebComponentsBowerPath+"/cardbuilder/cardbuilder"],returnFirstDependency),define("peoplecardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/peoplecardbuilder"],returnFirstDependency),define("chaptercardbuilder",[embyWebComponentsBowerPath+"/cardbuilder/chaptercardbuilder"],returnFirstDependency),define("mouseManager",[embyWebComponentsBowerPath+"/input/mouse"],returnFirstDependency),define("deleteHelper",[embyWebComponentsBowerPath+"/deletehelper"],returnFirstDependency),define("tvguide",[embyWebComponentsBowerPath+"/guide/guide"],returnFirstDependency),define("programStyles",["css!"+embyWebComponentsBowerPath+"/guide/programs"],returnFirstDependency),define("guide-settings-dialog",[embyWebComponentsBowerPath+"/guide/guide-settings"],returnFirstDependency),define("syncDialog",[embyWebComponentsBowerPath+"/sync/sync"],returnFirstDependency),define("syncToggle",[embyWebComponentsBowerPath+"/sync/synctoggle"],returnFirstDependency),define("syncJobEditor",[embyWebComponentsBowerPath+"/sync/syncjobeditor"],returnFirstDependency),define("syncJobList",[embyWebComponentsBowerPath+"/sync/syncjoblist"],returnFirstDependency),define("voiceDialog",[embyWebComponentsBowerPath+"/voice/voicedialog"],returnFirstDependency),define("voiceReceiver",[embyWebComponentsBowerPath+"/voice/voicereceiver"],returnFirstDependency),define("voiceProcessor",[embyWebComponentsBowerPath+"/voice/voiceprocessor"],returnFirstDependency),define("viewManager",[embyWebComponentsBowerPath+"/viewmanager/viewmanager"],function(viewManager){return window.ViewManager=viewManager,viewManager.dispatchPageEvents(!0),viewManager}),Dashboard.isRunningInCordova()&&window.MainActivity?define("shell",["cordova/shell"],returnFirstDependency):define("shell",[embyWebComponentsBowerPath+"/shell"],returnFirstDependency),define("sharingmanager",[embyWebComponentsBowerPath+"/sharing/sharingmanager"],returnFirstDependency),Dashboard.isRunningInCordova()?paths.apphost="cordova/apphost":paths.apphost="components/apphost",Dashboard.isRunningInCordova()&&window.MainActivity?(paths.appStorage="cordova/appstorage",paths.filesystem="cordova/filesystem"):(paths.appStorage=getAppStorage(apiClientBowerPath),paths.filesystem=embyWebComponentsBowerPath+"/filesystem");var sha1Path=bowerPath+"/cryptojslib/components/sha1-min",md5Path=bowerPath+"/cryptojslib/components/md5-min",shim={};shim[sha1Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},shim[md5Path]={deps:[bowerPath+"/cryptojslib/components/core-min"]},requirejs.config({waitSeconds:0,map:{"*":{css:bowerPath+"/emby-webcomponents/require/requirecss",html:bowerPath+"/emby-webcomponents/require/requirehtml",text:bowerPath+"/emby-webcomponents/require/requiretext"}},urlArgs:urlArgs,paths:paths,shim:shim}),define("cryptojs-sha1",[sha1Path]),define("cryptojs-md5",[md5Path]),define("jstree",[bowerPath+"/jstree/dist/jstree","css!thirdparty/jstree/themes/default/style.min.css"]),define("dashboardcss",["css!css/dashboard"]),define("jqmtable",["thirdparty/jquerymobile-1.4.5/jqm.table","css!thirdparty/jquerymobile-1.4.5/jqm.table.css"]),define("jqmwidget",["thirdparty/jquerymobile-1.4.5/jqm.widget"]),define("jqmslider",["thirdparty/jquerymobile-1.4.5/jqm.slider","css!thirdparty/jquerymobile-1.4.5/jqm.slider.css"]),define("jqmpopup",["thirdparty/jquerymobile-1.4.5/jqm.popup","css!thirdparty/jquerymobile-1.4.5/jqm.popup.css"]),define("jqmlistview",["css!thirdparty/jquerymobile-1.4.5/jqm.listview.css"]),define("jqmpanel",["thirdparty/jquerymobile-1.4.5/jqm.panel","css!thirdparty/jquerymobile-1.4.5/jqm.panel.css"]),define("slideshow",[embyWebComponentsBowerPath+"/slideshow/slideshow"],returnFirstDependency),define("fetch",[bowerPath+"/fetch/fetch"]),define("raf",[embyWebComponentsBowerPath+"/polyfills/raf"]),define("functionbind",[embyWebComponentsBowerPath+"/polyfills/bind"]),define("arraypolyfills",[embyWebComponentsBowerPath+"/polyfills/array"]),define("objectassign",[embyWebComponentsBowerPath+"/polyfills/objectassign"]),define("clearButtonStyle",["css!"+embyWebComponentsBowerPath+"/clearbutton"]),define("userdataButtons",[embyWebComponentsBowerPath+"/userdatabuttons/userdatabuttons"],returnFirstDependency),define("listView",[embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("listViewStyle",["css!"+embyWebComponentsBowerPath+"/listview/listview"],returnFirstDependency),define("formDialogStyle",["css!"+embyWebComponentsBowerPath+"/formdialog"],returnFirstDependency),define("indicators",[embyWebComponentsBowerPath+"/indicators/indicators"],returnFirstDependency),define("registrationServices",[embyWebComponentsBowerPath+"/registrationservices/registrationservices"],returnFirstDependency),Dashboard.isRunningInCordova()?(define("iapManager",["cordova/iap"],returnFirstDependency),define("fileupload",["cordova/fileupload"],returnFirstDependency)):(define("iapManager",["components/iap"],returnFirstDependency),define("fileupload",[apiClientBowerPath+"/fileupload"],returnFirstDependency)),define("connectionmanager",[apiClientBowerPath+"/connectionmanager"]),define("cameraRoll",[apiClientBowerPath+"/cameraroll"],returnFirstDependency),define("contentuploader",[apiClientBowerPath+"/sync/contentuploader"]),define("serversync",[apiClientBowerPath+"/sync/serversync"]),define("multiserversync",[apiClientBowerPath+"/sync/multiserversync"]),define("offlineusersync",[apiClientBowerPath+"/sync/offlineusersync"]),define("mediasync",[apiClientBowerPath+"/sync/mediasync"]),define("swiper",[bowerPath+"/Swiper/dist/js/swiper.min","css!"+bowerPath+"/Swiper/dist/css/swiper.min"],returnFirstDependency),define("scroller",[embyWebComponentsBowerPath+"/scroller/smoothscroller"],returnFirstDependency),define("toast",[embyWebComponentsBowerPath+"/toast/toast"],returnFirstDependency),define("scrollHelper",[embyWebComponentsBowerPath+"/scrollhelper"],returnFirstDependency),define("appSettings",[embyWebComponentsBowerPath+"/appsettings"],updateAppSettings),define("userSettings",[embyWebComponentsBowerPath+"/usersettings/usersettings"],returnFirstDependency),define("userSettingsBuilder",[embyWebComponentsBowerPath+"/usersettings/usersettingsbuilder"],returnFirstDependency),define("material-icons",["css!"+embyWebComponentsBowerPath+"/fonts/material-icons/style"]),define("robotoFont",["css!"+embyWebComponentsBowerPath+"/fonts/roboto/style"]),define("scrollStyles",["css!"+embyWebComponentsBowerPath+"/scrollstyles"]),define("navdrawer",["components/navdrawer/navdrawer"],returnFirstDependency),define("viewcontainer",["components/viewcontainer-lite","css!"+embyWebComponentsBowerPath+"/viewmanager/viewcontainer-lite"],returnFirstDependency),define("queryString",[bowerPath+"/query-string/index"],function(){return queryString}),define("jQuery",[bowerPath+"/jquery/dist/jquery.slim.min"],function(){return window.ApiClient&&(jQuery.ajax=ApiClient.ajax),jQuery}),define("fnchecked",["legacy/fnchecked"]),define("dialogHelper",[embyWebComponentsBowerPath+"/dialoghelper/dialoghelper"],function(dialoghelper){return dialoghelper.setOnOpen(onDialogOpen),dialoghelper}),define("inputmanager",["inputManager"],returnFirstDependency),define("historyManager",["embyRouter"],returnFirstDependency),define("headroom-window",["headroom"],createWindowHeadroom),define("hammer-main",["hammer"],createMainContentHammer),define("appfooter-shared",["appfooter"],createSharedAppFooter),define("skinManager",[],function(){return{loadUserSkin:function(){Emby.Page.show("/home.html")}}}),define("connectionManager",[],function(){return ConnectionManager}),define("apiClientResolver",[],function(){return function(){return window.ApiClient}}),define("embyRouter",[embyWebComponentsBowerPath+"/router"],function(embyRouter){function showItem(item,serverId,options){if("string"==typeof item)require(["connectionManager"],function(connectionManager){var apiClient=connectionManager.currentApiClient();apiClient.getItem(apiClient.getCurrentUserId(),item).then(function(item){embyRouter.showItem(item,options)})});else{2==arguments.length&&(options=arguments[1]);var context=options?options.context:null;Emby.Page.show("/"+LibraryBrowser.getHref(item,context),{item:item})}}return embyRouter.showLocalLogin=function(apiClient,serverId,manualLogin){Dashboard.navigate("login.html?serverid="+serverId)},embyRouter.showVideoOsd=function(){return Dashboard.navigate("videoosd.html")},embyRouter.showSelectServer=function(){ +Dashboard.navigate("selectserver.html")},embyRouter.showWelcome=function(){Dashboard.isConnectMode()?Dashboard.navigate("connectlogin.html?mode=welcome"):Dashboard.navigate("login.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.showGuide=function(){Dashboard.navigate("livetv.html?tab=1")},embyRouter.goHome=function(){Dashboard.navigate("home.html")},embyRouter.showSearch=function(){Dashboard.navigate("search.html")},embyRouter.showLiveTV=function(){Dashboard.navigate("livetv.html")},embyRouter.showRecordedTV=function(){Dashboard.navigate("livetv.html?tab=3")},embyRouter.showFavorites=function(){Dashboard.navigate("favorites.html")},embyRouter.showSettings=function(){Dashboard.navigate("mypreferencesmenu.html")},embyRouter.setTitle=function(){},embyRouter.showItem=showItem,embyRouter})}function updateAppSettings(appSettings){return appSettings.enableExternalPlayers=function(val){return null!=val&&appSettings.set("externalplayers",val.toString()),"true"===appSettings.get("externalplayers")},appSettings}function onDialogOpen(dlg){dlg.classList.contains("background-theme-a")||dlg.classList.contains("actionSheet")||(dlg.classList.add("background-theme-b"),dlg.classList.add("ui-body-b"))}function initRequireWithBrowser(browser){var bowerPath=getBowerPath(),apiClientBowerPath=bowerPath+"/emby-apiclient",embyWebComponentsBowerPath=bowerPath+"/emby-webcomponents";Dashboard.isRunningInCordova()&&browser.safari?define("actionsheet",["cordova/actionsheet"],returnFirstDependency):define("actionsheet",["webActionSheet"],returnFirstDependency),"registerElement"in document?define("registerElement",[]):browser.msie?define("registerElement",[bowerPath+"/webcomponentsjs/webcomponents-lite.min.js"]):define("registerElement",[bowerPath+"/document-register-element/build/document-register-element"]),window.chrome&&window.chrome.sockets?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.android?define("serverdiscovery",["cordova/serverdiscovery"],returnFirstDependency):Dashboard.isRunningInCordova()&&browser.safari?define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery-chrome"],returnFirstDependency):define("serverdiscovery",[apiClientBowerPath+"/serverdiscovery"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.safari?define("imageFetcher",["cordova/imagestore"],returnFirstDependency):define("imageFetcher",[embyWebComponentsBowerPath+"/images/basicimagefetcher"],returnFirstDependency);var preferNativeAlerts=browser.tv;preferNativeAlerts&&window.alert?define("alert",[embyWebComponentsBowerPath+"/alert/nativealert"],returnFirstDependency):define("alert",[embyWebComponentsBowerPath+"/alert/alert"],returnFirstDependency),define("dialog",[embyWebComponentsBowerPath+"/dialog/dialog"],returnFirstDependency),preferNativeAlerts&&window.confirm?define("confirm",[embyWebComponentsBowerPath+"/confirm/nativeconfirm"],returnFirstDependency):define("confirm",[embyWebComponentsBowerPath+"/confirm/confirm"],returnFirstDependency);var preferNativePrompt=preferNativeAlerts||browser.xboxOne;preferNativePrompt&&window.confirm?define("prompt",[embyWebComponentsBowerPath+"/prompt/nativeprompt"],returnFirstDependency):define("prompt",[embyWebComponentsBowerPath+"/prompt/prompt"],returnFirstDependency),browser.tizen||browser.operaTv?define("loading",[embyWebComponentsBowerPath+"/loading/loading-legacy"],returnFirstDependency):define("loading",[embyWebComponentsBowerPath+"/loading/loading-lite"],returnFirstDependency),define("multi-download",[embyWebComponentsBowerPath+"/multidownload"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("fileDownloader",["cordova/filedownloader"],returnFirstDependency),define("localassetmanager",["cordova/localassetmanager"],returnFirstDependency)):(define("fileDownloader",[embyWebComponentsBowerPath+"/filedownloader"],returnFirstDependency),define("localassetmanager",[apiClientBowerPath+"/localassetmanager"],returnFirstDependency)),define("screenLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),Dashboard.isRunningInCordova()&&browser.android?(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",["cordova/wakelock"],returnFirstDependency),define("networkLock",["cordova/networklock"],returnFirstDependency)):(define("resourceLockManager",[embyWebComponentsBowerPath+"/resourcelocks/resourcelockmanager"],returnFirstDependency),define("wakeLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency),define("networkLock",[embyWebComponentsBowerPath+"/resourcelocks/nullresourcelock"],returnFirstDependency)),Dashboard.isRunningInCordova()?define("castSenderApiLoader",[],getDummyCastSenderApiLoader):define("castSenderApiLoader",[],getCastSenderApiLoader)}function init(){Dashboard.isRunningInCordova()&&browserInfo.android&&define("nativedirectorychooser",["cordova/nativedirectorychooser"]),Dashboard.isRunningInCordova()&&browserInfo.android?define("localsync",["cordova/localsync"],returnFirstDependency):define("localsync",["scripts/localsync"],returnFirstDependency),define("livetvcss",["css!css/livetv.css"]),define("detailtablecss",["css!css/detailtable.css"]),define("autoorganizetablecss",["css!css/autoorganizetable.css"]),define("buttonenabled",["legacy/buttonenabled"]),initAfterDependencies()}function getRequirePromise(deps){return new Promise(function(resolve,reject){require(deps,resolve)})}function initAfterDependencies(){var list=[];window.fetch||list.push("fetch"),"function"!=typeof Object.assign&&list.push("objectassign"),Array.prototype.filter||list.push("arraypolyfills"),Function.prototype.bind||list.push("functionbind"),window.requestAnimationFrame||list.push("raf"),require(list,function(){createConnectionManager().then(function(){console.log("initAfterDependencies promises resolved"),require(["globalize"],function(globalize){window.Globalize=globalize,Promise.all([loadCoreDictionary(globalize),loadSharedComponentsDictionary(globalize)]).then(onGlobalizeInit)})})})}function loadSharedComponentsDictionary(globalize){var baseUrl="bower_components/emby-webcomponents/strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sk","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});globalize.loadStrings({name:"sharedcomponents",translations:translations})}function loadCoreDictionary(globalize){var baseUrl="strings/",languages=["ar","bg-bg","ca","cs","da","de","el","en-gb","en-us","es-ar","es-mx","es","fi","fr","gsw","he","hr","hu","id","it","kk","ko","ms","nb","nl","pl","pt-br","pt-pt","ro","ru","sl-si","sv","tr","uk","vi","zh-cn","zh-hk","zh-tw"],translations=languages.map(function(i){return{lang:i,path:baseUrl+i+".json"}});return globalize.defaultModule("core"),globalize.loadStrings({name:"core",translations:translations})}function onGlobalizeInit(){document.title=Globalize.translateDocument(document.title,"core"),require(["apphost"],function(appHost){loadPlugins([],appHost,browserInfo).then(onAppReady)})}function defineRoute(newRoute,dictionary){var baseRoute=Emby.Page.baseUrl(),path=newRoute.path;path=path.replace(baseRoute,""),console.log("Defining route: "+path),newRoute.dictionary=newRoute.dictionary||dictionary||"core",Emby.Page.addRoute(path,newRoute)}function defineCoreRoutes(){console.log("Defining core routes"),defineRoute({path:"/addplugin.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"scripts/addpluginpage"}),defineRoute({path:"/appservices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizelog.html",dependencies:["scripts/taskbutton","autoorganizetablecss"],controller:"dashboard/autoorganizelog",roles:"admin"}),defineRoute({path:"/autoorganizesmart.html",dependencies:["emby-button"],controller:"dashboard/autoorganizesmart",autoFocus:!1,roles:"admin"}),defineRoute({path:"/autoorganizetv.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-select","emby-collapse"],controller:"dashboard/autoorganizetv",autoFocus:!1,roles:"admin"}),defineRoute({path:"/channelitems.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/channels.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/channels"}),defineRoute({path:"/channelsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/cinemamodeconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/connectlogin.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/connectlogin"}),defineRoute({path:"/dashboard.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardgeneral.html",controller:"dashboard/dashboardgeneral",autoFocus:!1,roles:"admin"}),defineRoute({path:"/dashboardhosting.html",dependencies:["emby-input","emby-button"],autoFocus:!1,roles:"admin",controller:"dashboard/dashboardhosting"}),defineRoute({path:"/device.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devices.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/devicesupload.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofile.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnaserversettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/dlnasettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/edititemmetadata.html",dependencies:[],controller:"scripts/edititemmetadata",autoFocus:!1}),defineRoute({path:"/encodingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/favorites.html",dependencies:[],autoFocus:!1,controller:"scripts/favorites"}),defineRoute({path:"/forgotpassword.html",dependencies:["emby-input","emby-button"],anonymous:!0,startup:!0,controller:"scripts/forgotpassword"}),defineRoute({path:"/forgotpasswordpin.html",dependencies:["emby-input","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/forgotpasswordpin"}),defineRoute({path:"/gamegenres.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/games.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesrecommended.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamestudios.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/gamesystems.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/home.html",dependencies:[],autoFocus:!1,controller:"scripts/indexpage",transition:"fade",type:"home"}),defineRoute({path:"/index.html",dependencies:[],autoFocus:!1,isDefaultRoute:!0}),defineRoute({path:"/itemdetails.html",dependencies:["emby-button","scripts/livetvcomponents","paper-icon-button-light","emby-itemscontainer"],controller:"scripts/itemdetailpage",autoFocus:!1,transition:"fade"}),defineRoute({path:"/itemlist.html",dependencies:[],autoFocus:!1,controller:"scripts/itemlistpage",transition:"fade"}),defineRoute({path:"/kids.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/library.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/librarydisplay.html",dependencies:[],autoFocus:!1,roles:"admin",controller:"dashboard/librarydisplay"}),defineRoute({path:"/librarysettings.html",dependencies:["emby-collapse","emby-input","emby-button","emby-select"],autoFocus:!1,roles:"admin",controller:"dashboard/librarysettings"}),defineRoute({path:"/livetv.html",dependencies:["emby-button","livetvcss"],controller:"scripts/livetvsuggested",autoFocus:!1,transition:"fade"}),defineRoute({path:"/livetvguideprovider.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvitems.html",dependencies:[],autoFocus:!1,controller:"scripts/livetvitems"}),defineRoute({path:"/livetvseriestimer.html",dependencies:["emby-checkbox","emby-input","emby-button","emby-collapse","scripts/livetvcomponents","scripts/livetvseriestimer","livetvcss"],autoFocus:!1,controller:"scripts/livetvseriestimer"}),defineRoute({path:"/livetvsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/livetvstatus.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-hdhomerun.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-m3u.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/livetvtunerprovider-satip.html",dependencies:["emby-input"],autoFocus:!1,roles:"admin",controller:"dashboard/livetvtunerprovider-satip"}),defineRoute({path:"/log.html",dependencies:["emby-checkbox"],roles:"admin",controller:"dashboard/logpage"}),defineRoute({path:"/login.html",dependencies:["emby-button","emby-input"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/loginpage"}),defineRoute({path:"/metadataadvanced.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadataimages.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatanfo.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/metadatasubtitles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/movies.html",dependencies:["emby-button"],autoFocus:!1,controller:"scripts/moviesrecommended",transition:"fade"}),defineRoute({path:"/music.html",dependencies:[],controller:"scripts/musicrecommended",autoFocus:!1,transition:"fade"}),defineRoute({path:"/mypreferencesdisplay.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencesdisplay"}),defineRoute({path:"/mypreferenceshome.html",dependencies:["emby-checkbox","emby-button","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceshome"}),defineRoute({path:"/mypreferenceslanguages.html",dependencies:["emby-button","emby-checkbox","emby-select"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferenceslanguages"}),defineRoute({path:"/mypreferencesmenu.html",dependencies:["emby-button"],autoFocus:!1,transition:"fade",controller:"scripts/mypreferencescommon"}),defineRoute({path:"/myprofile.html",dependencies:["emby-button","emby-collapse","emby-checkbox","emby-input"],autoFocus:!1,transition:"fade",controller:"scripts/myprofile"}),defineRoute({path:"/mysync.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/mysync"}),defineRoute({path:"/camerauploadsettings.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/camerauploadsettings"}),defineRoute({path:"/mysyncjob.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/syncjob"}),defineRoute({path:"/mysyncsettings.html",dependencies:["emby-checkbox","emby-input","emby-button","paper-icon-button-light"],autoFocus:!1,transition:"fade",controller:"scripts/mysyncsettings"}),defineRoute({path:"/notificationlist.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/notificationsetting.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/notificationsettings.html",controller:"scripts/notificationsettings",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/nowplaying.html",dependencies:["paper-icon-button-light","emby-slider","emby-button","emby-input","emby-itemscontainer"],controller:"scripts/nowplayingpage",autoFocus:!1,transition:"fade",fullscreen:!0,supportsThemeMedia:!0}),defineRoute({path:"/photos.html",dependencies:[],autoFocus:!1,transition:"fade"}),defineRoute({path:"/playbackconfiguration.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/playlists.html",dependencies:[],autoFocus:!1,transition:"fade",controller:"scripts/playlists"}),defineRoute({path:"/plugincatalog.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/plugins.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/reports.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/scheduledtask.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/scheduledtasks.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/search.html",dependencies:[],controller:"scripts/searchpage"}),defineRoute({path:"/secondaryitems.html",dependencies:[],autoFocus:!1,controller:"scripts/secondaryitems"}),defineRoute({path:"/selectserver.html",dependencies:["listViewStyle","emby-button"],autoFocus:!1,anonymous:!0,startup:!0,controller:"scripts/selectserver"}),defineRoute({path:"/serversecurity.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/shared.html",dependencies:[],autoFocus:!1,anonymous:!0}),defineRoute({path:"/streamingsettings.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/support.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/supporterkey.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/syncactivity.html",dependencies:[],autoFocus:!1,controller:"scripts/syncactivity"}),defineRoute({path:"/syncsettings.html",dependencies:[],autoFocus:!1}),defineRoute({path:"/tv.html",dependencies:["paper-icon-button-light","emby-button"],autoFocus:!1,controller:"scripts/tvrecommended",transition:"fade"}),defineRoute({path:"/useredit.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userlibraryaccess.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/usernew.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userparentalcontrol.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/userpassword.html",dependencies:["emby-input","emby-button","emby-checkbox"],autoFocus:!1,controller:"scripts/userpasswordpage"}),defineRoute({path:"/userprofiles.html",dependencies:[],autoFocus:!1,roles:"admin"}),defineRoute({path:"/wizardagreement.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardcomponents.html",dependencies:["dashboardcss","emby-button","emby-input","emby-select"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardcomponents"}),defineRoute({path:"/wizardfinish.html",dependencies:["emby-button","dashboardcss"],autoFocus:!1,anonymous:!0,controller:"dashboard/wizardfinishpage"}),defineRoute({path:"/wizardlibrary.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvguide.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardlivetvtuner.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardsettings.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizardstart.html",dependencies:["dashboardcss"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/wizarduser.html",dependencies:["dashboardcss","emby-input"],autoFocus:!1,anonymous:!0}),defineRoute({path:"/videoosd.html",dependencies:[],transition:"fade",controller:"scripts/videoosd",autoFocus:!1,type:"video-osd",supportsThemeMedia:!0,fullscreen:!0}),defineRoute({path:"/configurationpage",dependencies:["jQuery"],autoFocus:!1,enableCache:!1,enableContentQueryString:!0,roles:"admin"}),defineRoute({path:"/",isDefaultRoute:!0,autoFocus:!1,dependencies:[]})}function loadPlugins(externalPlugins,appHost,browser,shell){console.log("Loading installed plugins");var list=["bower_components/emby-webcomponents/playback/playbackvalidation"];Dashboard.isRunningInCordova()&&browser.android?(document.createElement("audio").canPlayType("audio/flac").replace(/no/,"")&&document.createElement("audio").canPlayType('audio/ogg; codecs="opus"').replace(/no/,"")?window.VlcAudio=!0:window.VlcAudio=!0,list.push("cordova/vlcplayer")):Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/audioplayer"),list.push("bower_components/emby-webcomponents/htmlaudioplayer/plugin"),Dashboard.isRunningInCordova()&&browser.safari&&list.push("cordova/chromecast"),Dashboard.isRunningInCordova()&&browser.android&&list.push("cordova/externalplayer"),list.push("bower_components/emby-webcomponents/htmlvideoplayer/plugin"),appHost.supports("remotecontrol")&&(list.push("bower_components/emby-webcomponents/sessionplayer"),browser.chrome&&list.push("bower_components/emby-webcomponents/chromecastplayer")),list.push("bower_components/emby-webcomponents/youtubeplayer/plugin");for(var i=0,length=externalPlugins.length;i Date: Sat, 4 Feb 2017 18:32:16 -0500 Subject: [PATCH 18/19] rework guide mappings --- dashboard-ui/bower_components/emby-webcomponents/guide/guide.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js index e22288f082..044e143b07 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js @@ -1 +1 @@ -define(["require","browser","globalize","connectionManager","serverNotifications","loading","datetime","focusManager","userSettings","imageLoader","events","layoutManager","itemShortcuts","registrationServices","dom","clearButtonStyle","css!./guide.css","programStyles","material-icons","scrollStyles","emby-button","paper-icon-button-light","emby-tabs"],function(require,browser,globalize,connectionManager,serverNotifications,loading,datetime,focusManager,userSettings,imageLoader,events,layoutManager,itemShortcuts,registrationServices,dom){"use strict";function showViewSettings(instance){require(["guide-settings-dialog"],function(guideSettingsDialog){guideSettingsDialog.show(instance.categoryOptions).then(function(){instance.refresh()})})}function Guide(options){function restartAutoRefresh(){stopAutoRefresh();var intervalMs=9e5;autoRefreshInterval=setInterval(function(){self.refresh()},intervalMs)}function stopAutoRefresh(){autoRefreshInterval&&(clearInterval(autoRefreshInterval),autoRefreshInterval=null)}function normalizeDateToTimeslot(date){var minutesOffset=date.getMinutes()-cellCurationMinutes;return minutesOffset>=0?date.setHours(date.getHours(),cellCurationMinutes,0,0):date.setHours(date.getHours(),0,0,0),date}function showLoading(){loading.show()}function hideLoading(){loading.hide()}function startCurrentTimeUpdateInterval(){clearCurrentTimeUpdateInterval(),currentTimeUpdateInterval=setInterval(updateCurrentTimeIndicator,6e4),updateCurrentTimeIndicator()}function clearCurrentTimeUpdateInterval(){var interval=currentTimeUpdateInterval;interval&&clearInterval(interval),currentTimeUpdateInterval=null,currentTimeIndicatorBar=null,currentTimeIndicatorArrow=null}function updateCurrentTimeIndicator(){currentTimeIndicatorBar||(currentTimeIndicatorBar=options.element.querySelector(".currentTimeIndicatorBar")),currentTimeIndicatorArrow||(currentTimeIndicatorArrow=options.element.querySelector(".currentTimeIndicatorArrowContainer"));var dateDifference=(new Date).getTime()-currentDate.getTime(),pct=dateDifference>0?dateDifference/totalRendererdMs:0;pct=Math.min(pct,1),pct<=0||pct>=1?(currentTimeIndicatorBar.classList.add("hide"),currentTimeIndicatorArrow.classList.add("hide")):(currentTimeIndicatorBar.classList.remove("hide"),currentTimeIndicatorArrow.classList.remove("hide"),currentTimeIndicatorBar.style.transform="scaleX("+pct+")",currentTimeIndicatorArrow.style.transform="translateX("+100*pct+"%)")}function getChannelLimit(context){return registrationServices.validateFeature("livetv").then(function(){var limit=browser.slow?100:500;return context.querySelector(".guideRequiresUnlock").classList.add("hide"),limit},function(){var limit=5;return context.querySelector(".guideRequiresUnlock").classList.remove("hide"),context.querySelector(".unlockText").innerHTML=globalize.translate("sharedcomponents#LiveTvGuideRequiresUnlock",limit),limit})}function reloadGuide(context,newStartDate,focusProgramOnRender){var apiClient=connectionManager.currentApiClient(),channelQuery={StartIndex:0,EnableFavoriteSorting:"false"!==userSettings.get("livetv-favoritechannelsattop")};channelQuery.UserId=apiClient.getCurrentUserId(),getChannelLimit(context).then(function(channelLimit){currentChannelLimit=channelLimit,showLoading(),channelQuery.StartIndex=currentStartIndex,channelQuery.Limit=channelLimit,channelQuery.AddCurrentProgram=!1,channelQuery.EnableUserData=!1,channelQuery.EnableImageTypes="Primary";var categories=self.categoryOptions.categories||[],displayMovieContent=!categories.length||categories.indexOf("movies")!==-1,displaySportsContent=!categories.length||categories.indexOf("sports")!==-1,displayNewsContent=!categories.length||categories.indexOf("news")!==-1,displayKidsContent=!categories.length||categories.indexOf("kids")!==-1,displaySeriesContent=!categories.length||categories.indexOf("series")!==-1;displayMovieContent&&displaySportsContent&&displayNewsContent&&displayKidsContent?(channelQuery.IsMovie=null,channelQuery.IsSports=null,channelQuery.IsKids=null,channelQuery.IsNews=null,channelQuery.IsSeries=null):(displayNewsContent&&(channelQuery.IsNews=!0),displaySportsContent&&(channelQuery.IsSports=!0),displayKidsContent&&(channelQuery.IsKids=!0),displayMovieContent&&(channelQuery.IsMovie=!0),displaySeriesContent&&(channelQuery.IsSeries=!0)),"DatePlayed"===userSettings.get("livetv-channelorder")?(channelQuery.SortBy="DatePlayed",channelQuery.SortOrder="Descending"):(channelQuery.SortBy=null,channelQuery.SortOrder=null);var date=newStartDate;date=new Date(date.getTime()+1e3);var nextDay=new Date(date.getTime()+msPerDay-2e3);console.log(nextDay),apiClient.getLiveTvChannels(channelQuery).then(function(channelsResult){var btnPreviousPage=context.querySelector(".btnPreviousPage"),btnNextPage=context.querySelector(".btnNextPage");channelsResult.TotalRecordCount>channelLimit?(context.querySelector(".guideOptions").classList.remove("hide"),btnPreviousPage.classList.remove("hide"),btnNextPage.classList.remove("hide"),channelQuery.StartIndex?context.querySelector(".btnPreviousPage").disabled=!1:context.querySelector(".btnPreviousPage").disabled=!0,channelQuery.StartIndex+channelLimit",startDate.setTime(startDate.getTime()+cellDurationMs);return html+='
',html+="
",html+='
',html+='arrow_drop_down',html+="
"}function parseDates(program){if(!program.StartDateLocal)try{program.StartDateLocal=datetime.parseISO8601Date(program.StartDate,{toLocal:!0})}catch(err){}if(!program.EndDateLocal)try{program.EndDateLocal=datetime.parseISO8601Date(program.EndDate,{toLocal:!0})}catch(err){}return null}function getTimerIndicator(item){var status;if("SeriesTimer"===item.Type)return'';if(item.TimerId||item.SeriesTimerId)status=item.Status||"Cancelled";else{if("Timer"!==item.Type)return"";status=item.Status}return item.SeriesTimerId?"Cancelled"!==status?'':'':''}function getChannelProgramsHtml(context,date,channel,programs,options,index){var html="",startMs=date.getTime(),endMs=startMs+msPerDay-1;programs=programs.filter(function(curr){return curr.ChannelId===channel.Id});var outerCssClass=layoutManager.tv?"channelPrograms channelPrograms-tv":"channelPrograms";html+='
';for(var clickAction=layoutManager.tv?"link":"programdialog",categories=self.categoryOptions.categories||[],displayMovieContent=!categories.length||categories.indexOf("movies")!==-1,displaySportsContent=!categories.length||categories.indexOf("sports")!==-1,displayNewsContent=!categories.length||categories.indexOf("news")!==-1,displayKidsContent=!categories.length||categories.indexOf("kids")!==-1,displaySeriesContent=!categories.length||categories.indexOf("series")!==-1,enableColorCodedBackgrounds="true"===userSettings.get("guide-colorcodedbackgrounds"),i=0,length=programs.length;iendMs)break;items[program.Id]=program;var renderStartMs=Math.max(program.StartDateLocal.getTime(),startMs),startPercent=(program.StartDateLocal.getTime()-startMs)/msPerDay;startPercent*=100,startPercent=Math.max(startPercent,0);var renderEndMs=Math.min(program.EndDateLocal.getTime(),endMs),endPercent=(renderEndMs-renderStartMs)/msPerDay;endPercent*=100;var cssClass="programCell clearButton itemAction",accentCssClass=null,displayInnerContent=!0;program.IsKids?(cssClass+=" childProgramInfo",displayInnerContent=displayKidsContent,accentCssClass="childAccent"):program.IsSports?(cssClass+=" sportsProgramInfo",displayInnerContent=displaySportsContent,accentCssClass="sportsAccent"):program.IsNews?(cssClass+=" newsProgramInfo",displayInnerContent=displayNewsContent,accentCssClass="newsAccent"):program.IsMovie?(cssClass+=" movieProgramInfo",displayInnerContent=displayMovieContent,accentCssClass="movieAccent"):program.IsSeries?(cssClass+=" plainProgramInfo",displayInnerContent=displaySeriesContent):(cssClass+=" plainProgramInfo",displayInnerContent=displayMovieContent&&displayNewsContent&&displaySportsContent&&displayKidsContent&&displaySeriesContent),displayInnerContent||(accentCssClass=null),enableColorCodedBackgrounds&&accentCssClass?(cssClass+=" "+accentCssClass,accentCssClass=null):accentCssClass=null;var timerAttributes="";if(program.TimerId&&(timerAttributes+=' data-timerid="'+program.TimerId+'"'),program.SeriesTimerId&&(timerAttributes+=' data-seriestimerid="'+program.SeriesTimerId+'"'),html+='"}}return html+="
"}function renderPrograms(context,date,channels,programs){for(var html=[],allowIndicators=dom.getWindowSize().innerWidth>=600,options={showHdIcon:allowIndicators&&"true"===userSettings.get("guide-indicator-hd"),showLiveIndicator:allowIndicators&&"false"!==userSettings.get("guide-indicator-live"),showPremiereIndicator:allowIndicators&&"false"!==userSettings.get("guide-indicator-premiere"),showNewIndicator:allowIndicators&&"true"===userSettings.get("guide-indicator-new"),showRepeatIndicator:allowIndicators&&"true"===userSettings.get("guide-indicator-repeat"),showEpisodeTitle:!layoutManager.tv},i=0,length=channels.length;i',cssClass="guideChannelNumber",html+='

'+channel.Number+"

",!hasChannelImage&&channel.Name&&(html+='
'+channel.Name+"
"),html+=""}var channelList=context.querySelector(".channelsContainer");channelList.innerHTML=html,imageLoader.lazyChildren(channelList)}function renderGuide(context,date,channels,programs,apiClient,focusProgramOnRender){var activeElement=document.activeElement,itemId=activeElement&&activeElement.getAttribute?activeElement.getAttribute("data-id"):null,channelRowId=null;activeElement&&(channelRowId=dom.parentWithClass(activeElement,"channelPrograms"),channelRowId=channelRowId&&channelRowId.getAttribute?channelRowId.getAttribute("data-channelid"):null),renderChannelHeaders(context,channels,apiClient);var startDate=date,endDate=new Date(startDate.getTime()+msPerDay);if(context.querySelector(".timeslotHeaders").innerHTML=getTimeslotHeadersHtml(startDate,endDate),startCurrentTimeUpdateInterval(),items={},renderPrograms(context,date,channels,programs),focusProgramOnRender){var focusElem;if(itemId&&(focusElem=context.querySelector('[data-id="'+itemId+'"]')),focusElem)focusManager.focus(focusElem);else{var autoFocusParent;channelRowId&&(autoFocusParent=context.querySelector('[data-channelid="'+channelRowId+'"]')),autoFocusParent||(autoFocusParent=context.querySelector(".programGrid")),focusManager.autoFocus(autoFocusParent,!0)}}}function nativeScrollTo(container,pos,horizontal){container.scrollTo?horizontal?container.scrollTo(pos,0):container.scrollTo(0,pos):horizontal?container.scrollLeft=Math.round(pos):container.scrollTop=Math.round(pos)}function onProgramGridScroll(context,elem,timeslotHeaders){(new Date).getTime()-lastHeaderScroll>=1e3&&(lastGridScroll=(new Date).getTime(),nativeScrollTo(timeslotHeaders,elem.scrollLeft,!0))}function onTimeslotHeadersScroll(context,elem,programGrid){(new Date).getTime()-lastGridScroll>=1e3&&(lastHeaderScroll=(new Date).getTime(),nativeScrollTo(programGrid,elem.scrollLeft,!0))}function changeDate(page,date,focusProgramOnRender){clearCurrentTimeUpdateInterval();var newStartDate=normalizeDateToTimeslot(date);currentDate=newStartDate,reloadGuide(page,newStartDate,focusProgramOnRender)}function getDateTabText(date,isActive,tabIndex){var cssClass=isActive?"emby-tab-button guide-date-tab-button emby-tab-button-active":"emby-tab-button guide-date-tab-button",html='"}function setDateRange(page,guideInfo){var today=new Date;today.setHours(today.getHours(),0,0,0);var start=datetime.parseISO8601Date(guideInfo.StartDate,{toLocal:!0}),end=datetime.parseISO8601Date(guideInfo.EndDate,{toLocal:!0});start.setHours(0,0,0,0),end.setHours(0,0,0,0),start.getTime()>=end.getTime()&&end.setDate(start.getDate()+1),start=new Date(Math.max(today,start));var dateTabsHtml="",tabIndex=0,date=new Date;for(currentDate&&date.setTime(currentDate.getTime());start<=end;){var isActive=date.getDate()===start.getDate()&&date.getMonth()===start.getMonth()&&date.getFullYear()===start.getFullYear();dateTabsHtml+=getDateTabText(start,isActive,tabIndex),start.setDate(start.getDate()+1),start.setHours(0,0,0,0),tabIndex++}page.querySelector(".emby-tabs-slider").innerHTML=dateTabsHtml,page.querySelector(".guideDateTabs").refresh(),changeDate(page,date,layoutManager.tv)}function reloadPage(page){showLoading();var apiClient=connectionManager.currentApiClient();apiClient.getLiveTvGuideInfo().then(function(guideInfo){setDateRange(page,guideInfo)})}function setScrollEvents(view,enabled){layoutManager.tv&&require(["scrollHelper"],function(scrollHelper){var fn=enabled?"on":"off";scrollHelper.centerFocus[fn](view.querySelector(".guideVerticalScroller"),!1),scrollHelper.centerFocus[fn](view.querySelector(".programGrid"),!0)})}function onProgramGridFocus(e){var programCell=dom.parentWithClass(e.target,"programCell");if(programCell){var focused=e.target,id=focused.getAttribute("data-id"),item=items[id];item&&events.trigger(self,"focus",[{item:item}])}}function onTimerCreated(e,apiClient,data){for(var programId=data.ProgramId,newTimerId=data.Id,cells=options.element.querySelectorAll('.programCell[data-id="'+programId+'"]'),i=0,length=cells.length;i'),newTimerId&&cell.setAttribute("data-timerid",newTimerId)}}function onSeriesTimerCreated(e,apiClient,data){}function onTimerCancelled(e,apiClient,data){for(var id=data.Id,cells=options.element.querySelectorAll('.programCell[data-timerid="'+id+'"]'),i=0,length=cells.length;i=0?date.setHours(date.getHours(),cellCurationMinutes,0,0):date.setHours(date.getHours(),0,0,0),date}function showLoading(){loading.show()}function hideLoading(){loading.hide()}function startCurrentTimeUpdateInterval(){clearCurrentTimeUpdateInterval(),currentTimeUpdateInterval=setInterval(updateCurrentTimeIndicator,6e4),updateCurrentTimeIndicator()}function clearCurrentTimeUpdateInterval(){var interval=currentTimeUpdateInterval;interval&&clearInterval(interval),currentTimeUpdateInterval=null,currentTimeIndicatorBar=null,currentTimeIndicatorArrow=null}function updateCurrentTimeIndicator(){currentTimeIndicatorBar||(currentTimeIndicatorBar=options.element.querySelector(".currentTimeIndicatorBar")),currentTimeIndicatorArrow||(currentTimeIndicatorArrow=options.element.querySelector(".currentTimeIndicatorArrowContainer"));var dateDifference=(new Date).getTime()-currentDate.getTime(),pct=dateDifference>0?dateDifference/totalRendererdMs:0;pct=Math.min(pct,1),pct<=0||pct>=1?(currentTimeIndicatorBar.classList.add("hide"),currentTimeIndicatorArrow.classList.add("hide")):(currentTimeIndicatorBar.classList.remove("hide"),currentTimeIndicatorArrow.classList.remove("hide"),currentTimeIndicatorBar.style.transform="scaleX("+pct+")",currentTimeIndicatorArrow.style.transform="translateX("+100*pct+"%)")}function getChannelLimit(context){return registrationServices.validateFeature("livetv").then(function(){var limit=browser.slow?100:500;return context.querySelector(".guideRequiresUnlock").classList.add("hide"),limit},function(){var limit=5;return context.querySelector(".guideRequiresUnlock").classList.remove("hide"),context.querySelector(".unlockText").innerHTML=globalize.translate("sharedcomponents#LiveTvGuideRequiresUnlock",limit),limit})}function reloadGuide(context,newStartDate,focusProgramOnRender){var apiClient=connectionManager.currentApiClient(),channelQuery={StartIndex:0,EnableFavoriteSorting:"false"!==userSettings.get("livetv-favoritechannelsattop")};channelQuery.UserId=apiClient.getCurrentUserId(),getChannelLimit(context).then(function(channelLimit){currentChannelLimit=channelLimit,showLoading(),channelQuery.StartIndex=currentStartIndex,channelQuery.Limit=channelLimit,channelQuery.AddCurrentProgram=!1,channelQuery.EnableUserData=!1,channelQuery.EnableImageTypes="Primary";var categories=self.categoryOptions.categories||[],displayMovieContent=!categories.length||categories.indexOf("movies")!==-1,displaySportsContent=!categories.length||categories.indexOf("sports")!==-1,displayNewsContent=!categories.length||categories.indexOf("news")!==-1,displayKidsContent=!categories.length||categories.indexOf("kids")!==-1,displaySeriesContent=!categories.length||categories.indexOf("series")!==-1;displayMovieContent&&displaySportsContent&&displayNewsContent&&displayKidsContent?(channelQuery.IsMovie=null,channelQuery.IsSports=null,channelQuery.IsKids=null,channelQuery.IsNews=null,channelQuery.IsSeries=null):(displayNewsContent&&(channelQuery.IsNews=!0),displaySportsContent&&(channelQuery.IsSports=!0),displayKidsContent&&(channelQuery.IsKids=!0),displayMovieContent&&(channelQuery.IsMovie=!0),displaySeriesContent&&(channelQuery.IsSeries=!0)),"DatePlayed"===userSettings.get("livetv-channelorder")?(channelQuery.SortBy="DatePlayed",channelQuery.SortOrder="Descending"):(channelQuery.SortBy=null,channelQuery.SortOrder=null);var date=newStartDate;date=new Date(date.getTime()+1e3);var nextDay=new Date(date.getTime()+msPerDay-2e3);console.log(nextDay),apiClient.getLiveTvChannels(channelQuery).then(function(channelsResult){var btnPreviousPage=context.querySelector(".btnPreviousPage"),btnNextPage=context.querySelector(".btnNextPage");channelsResult.TotalRecordCount>channelLimit?(context.querySelector(".guideOptions").classList.remove("hide"),btnPreviousPage.classList.remove("hide"),btnNextPage.classList.remove("hide"),channelQuery.StartIndex?context.querySelector(".btnPreviousPage").disabled=!1:context.querySelector(".btnPreviousPage").disabled=!0,channelQuery.StartIndex+channelLimit",startDate.setTime(startDate.getTime()+cellDurationMs);return html+='
',html+="
",html+='
',html+='arrow_drop_down',html+="
"}function parseDates(program){if(!program.StartDateLocal)try{program.StartDateLocal=datetime.parseISO8601Date(program.StartDate,{toLocal:!0})}catch(err){}if(!program.EndDateLocal)try{program.EndDateLocal=datetime.parseISO8601Date(program.EndDate,{toLocal:!0})}catch(err){}return null}function getTimerIndicator(item){var status;if("SeriesTimer"===item.Type)return'';if(item.TimerId||item.SeriesTimerId)status=item.Status||"Cancelled";else{if("Timer"!==item.Type)return"";status=item.Status}return item.SeriesTimerId?"Cancelled"!==status?'':'':''}function getChannelProgramsHtml(context,date,channel,programs,options,index){var html="",startMs=date.getTime(),endMs=startMs+msPerDay-1;programs=programs.filter(function(curr){return curr.ChannelId===channel.Id});var outerCssClass=layoutManager.tv?"channelPrograms channelPrograms-tv":"channelPrograms";html+='
';for(var clickAction=layoutManager.tv?"link":"programdialog",categories=self.categoryOptions.categories||[],displayMovieContent=!categories.length||categories.indexOf("movies")!==-1,displaySportsContent=!categories.length||categories.indexOf("sports")!==-1,displayNewsContent=!categories.length||categories.indexOf("news")!==-1,displayKidsContent=!categories.length||categories.indexOf("kids")!==-1,displaySeriesContent=!categories.length||categories.indexOf("series")!==-1,enableColorCodedBackgrounds="true"===userSettings.get("guide-colorcodedbackgrounds"),i=0,length=programs.length;iendMs)break;items[program.Id]=program;var renderStartMs=Math.max(program.StartDateLocal.getTime(),startMs),startPercent=(program.StartDateLocal.getTime()-startMs)/msPerDay;startPercent*=100,startPercent=Math.max(startPercent,0);var renderEndMs=Math.min(program.EndDateLocal.getTime(),endMs),endPercent=(renderEndMs-renderStartMs)/msPerDay;endPercent*=100;var cssClass="programCell clearButton itemAction",accentCssClass=null,displayInnerContent=!0;program.IsKids?(cssClass+=" childProgramInfo",displayInnerContent=displayKidsContent,accentCssClass="childAccent"):program.IsSports?(cssClass+=" sportsProgramInfo",displayInnerContent=displaySportsContent,accentCssClass="sportsAccent"):program.IsNews?(cssClass+=" newsProgramInfo",displayInnerContent=displayNewsContent,accentCssClass="newsAccent"):program.IsMovie?(cssClass+=" movieProgramInfo",displayInnerContent=displayMovieContent,accentCssClass="movieAccent"):program.IsSeries?(cssClass+=" plainProgramInfo",displayInnerContent=displaySeriesContent):(cssClass+=" plainProgramInfo",displayInnerContent=displayMovieContent&&displayNewsContent&&displaySportsContent&&displayKidsContent&&displaySeriesContent),displayInnerContent||(accentCssClass=null),enableColorCodedBackgrounds&&accentCssClass?(cssClass+=" "+accentCssClass,accentCssClass=null):accentCssClass=null;var timerAttributes="";if(program.TimerId&&(timerAttributes+=' data-timerid="'+program.TimerId+'"'),program.SeriesTimerId&&(timerAttributes+=' data-seriestimerid="'+program.SeriesTimerId+'"'),html+='"}}return html+="
"}function renderPrograms(context,date,channels,programs){for(var html=[],allowIndicators=dom.getWindowSize().innerWidth>=600,options={showHdIcon:allowIndicators&&"true"===userSettings.get("guide-indicator-hd"),showLiveIndicator:allowIndicators&&"false"!==userSettings.get("guide-indicator-live"),showPremiereIndicator:allowIndicators&&"false"!==userSettings.get("guide-indicator-premiere"),showNewIndicator:allowIndicators&&"true"===userSettings.get("guide-indicator-new"),showRepeatIndicator:allowIndicators&&"true"===userSettings.get("guide-indicator-repeat"),showEpisodeTitle:!layoutManager.tv},i=0,length=channels.length;i',channel.Number&&(html+='

'+channel.Number+"

"),!hasChannelImage&&channel.Name&&(html+='
'+channel.Name+"
"),html+=""}var channelList=context.querySelector(".channelsContainer");channelList.innerHTML=html,imageLoader.lazyChildren(channelList)}function renderGuide(context,date,channels,programs,apiClient,focusProgramOnRender){var activeElement=document.activeElement,itemId=activeElement&&activeElement.getAttribute?activeElement.getAttribute("data-id"):null,channelRowId=null;activeElement&&(channelRowId=dom.parentWithClass(activeElement,"channelPrograms"),channelRowId=channelRowId&&channelRowId.getAttribute?channelRowId.getAttribute("data-channelid"):null),renderChannelHeaders(context,channels,apiClient);var startDate=date,endDate=new Date(startDate.getTime()+msPerDay);if(context.querySelector(".timeslotHeaders").innerHTML=getTimeslotHeadersHtml(startDate,endDate),startCurrentTimeUpdateInterval(),items={},renderPrograms(context,date,channels,programs),focusProgramOnRender){var focusElem;if(itemId&&(focusElem=context.querySelector('[data-id="'+itemId+'"]')),focusElem)focusManager.focus(focusElem);else{var autoFocusParent;channelRowId&&(autoFocusParent=context.querySelector('[data-channelid="'+channelRowId+'"]')),autoFocusParent||(autoFocusParent=context.querySelector(".programGrid")),focusManager.autoFocus(autoFocusParent,!0)}}}function nativeScrollTo(container,pos,horizontal){container.scrollTo?horizontal?container.scrollTo(pos,0):container.scrollTo(0,pos):horizontal?container.scrollLeft=Math.round(pos):container.scrollTop=Math.round(pos)}function onProgramGridScroll(context,elem,timeslotHeaders){(new Date).getTime()-lastHeaderScroll>=1e3&&(lastGridScroll=(new Date).getTime(),nativeScrollTo(timeslotHeaders,elem.scrollLeft,!0))}function onTimeslotHeadersScroll(context,elem,programGrid){(new Date).getTime()-lastGridScroll>=1e3&&(lastHeaderScroll=(new Date).getTime(),nativeScrollTo(programGrid,elem.scrollLeft,!0))}function changeDate(page,date,focusProgramOnRender){clearCurrentTimeUpdateInterval();var newStartDate=normalizeDateToTimeslot(date);currentDate=newStartDate,reloadGuide(page,newStartDate,focusProgramOnRender)}function getDateTabText(date,isActive,tabIndex){var cssClass=isActive?"emby-tab-button guide-date-tab-button emby-tab-button-active":"emby-tab-button guide-date-tab-button",html='"}function setDateRange(page,guideInfo){var today=new Date;today.setHours(today.getHours(),0,0,0);var start=datetime.parseISO8601Date(guideInfo.StartDate,{toLocal:!0}),end=datetime.parseISO8601Date(guideInfo.EndDate,{toLocal:!0});start.setHours(0,0,0,0),end.setHours(0,0,0,0),start.getTime()>=end.getTime()&&end.setDate(start.getDate()+1),start=new Date(Math.max(today,start));var dateTabsHtml="",tabIndex=0,date=new Date;for(currentDate&&date.setTime(currentDate.getTime());start<=end;){var isActive=date.getDate()===start.getDate()&&date.getMonth()===start.getMonth()&&date.getFullYear()===start.getFullYear();dateTabsHtml+=getDateTabText(start,isActive,tabIndex),start.setDate(start.getDate()+1),start.setHours(0,0,0,0),tabIndex++}page.querySelector(".emby-tabs-slider").innerHTML=dateTabsHtml,page.querySelector(".guideDateTabs").refresh(),changeDate(page,date,layoutManager.tv)}function reloadPage(page){showLoading();var apiClient=connectionManager.currentApiClient();apiClient.getLiveTvGuideInfo().then(function(guideInfo){setDateRange(page,guideInfo)})}function setScrollEvents(view,enabled){layoutManager.tv&&require(["scrollHelper"],function(scrollHelper){var fn=enabled?"on":"off";scrollHelper.centerFocus[fn](view.querySelector(".guideVerticalScroller"),!1),scrollHelper.centerFocus[fn](view.querySelector(".programGrid"),!0)})}function onProgramGridFocus(e){var programCell=dom.parentWithClass(e.target,"programCell");if(programCell){var focused=e.target,id=focused.getAttribute("data-id"),item=items[id];item&&events.trigger(self,"focus",[{item:item}])}}function onTimerCreated(e,apiClient,data){for(var programId=data.ProgramId,newTimerId=data.Id,cells=options.element.querySelectorAll('.programCell[data-id="'+programId+'"]'),i=0,length=cells.length;i'),newTimerId&&cell.setAttribute("data-timerid",newTimerId)}}function onSeriesTimerCreated(e,apiClient,data){}function onTimerCancelled(e,apiClient,data){for(var id=data.Id,cells=options.element.querySelectorAll('.programCell[data-timerid="'+id+'"]'),i=0,length=cells.length;i Date: Sun, 5 Feb 2017 15:46:14 -0500 Subject: [PATCH 19/19] update sections --- dashboard-ui/components/apphost.js | 2 +- dashboard-ui/scripts/dashboardpage.js | 2 +- dashboard-ui/scripts/sections.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dashboard-ui/components/apphost.js b/dashboard-ui/components/apphost.js index 0b5e1369a7..587eb26bad 100644 --- a/dashboard-ui/components/apphost.js +++ b/dashboard-ui/components/apphost.js @@ -1 +1 @@ -define(["appStorage","browser"],function(appStorage,browser){"use strict";function getDeviceProfile(){return null}function getCapabilities(){var caps={PlayableMediaTypes:["Audio","Video"],SupportsPersistentIdentifier:!1,DeviceProfile:getDeviceProfile()};return caps}function generateDeviceId(){return new Promise(function(resolve,reject){require(["cryptojs-sha1"],function(){var keys=[];keys.push(navigator.userAgent),keys.push((new Date).getTime()),resolve(CryptoJS.SHA1(keys.join("|")).toString())})})}function getDeviceId(){var key="_deviceId2",deviceId=appStorage.getItem(key);return deviceId?Promise.resolve(deviceId):generateDeviceId().then(function(deviceId){return appStorage.setItem(key,deviceId),deviceId})}function getDeviceName(){var deviceName;return deviceName=browser.tizen?"Samsung Smart TV":browser.web0S?"LG Smart TV":browser.operaTv?"Opera TV":browser.xboxOne?"Xbox One":browser.ps4?"Sony PS4":browser.chrome?"Chrome":browser.edge?"Edge":browser.firefox?"Firefox":browser.msie?"Internet Explorer":"Web Browser",browser.version&&(deviceName+=" "+browser.version),browser.ipad?deviceName+=" Ipad":browser.iphone?deviceName+=" Iphone":browser.android&&(deviceName+=" Android"),deviceName}function supportsVoiceInput(){return!browser.tv&&(window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.oSpeechRecognition||window.msSpeechRecognition)}function supportsFullscreen(){if(browser.tv)return!1;var element=document.documentElement;return!!(element.requestFullscreen||element.mozRequestFullScreen||element.webkitRequestFullscreen||element.msRequestFullscreen)||!!document.createElement("video").webkitEnterFullscreen}function getSyncProfile(){return new Promise(function(resolve,reject){require(["browserdeviceprofile","appSettings"],function(profileBuilder,appSettings){var profile=profileBuilder();profile.MaxStaticMusicBitrate=appSettings.maxStaticMusicBitrate(),resolve(profile)})})}function supportsHtmlMediaAutoplay(){if(browser.edgeUwp||browser.tv||browser.ps4||browser.xboxOne)return!0;if(browser.mobile)return!1;var savedResult=appStorage.getItem(htmlMediaAutoplayAppStorageKey);return"true"===savedResult||"false"!==savedResult&&null}var htmlMediaAutoplayAppStorageKey="supportshtmlmediaautoplay0",supportedFeatures=function(){var features=["sharing","externalpremium"];return browser.edgeUwp||browser.tv||browser.xboxOne||browser.ps4||features.push("filedownload"),browser.operaTv||browser.tizen||browser.web0s?features.push("exit"):features.push("exitmenu"),browser.operaTv||features.push("externallinks"),supportsVoiceInput()&&features.push("voiceinput"),supportsHtmlMediaAutoplay()&&(features.push("htmlaudioautoplay"),features.push("htmlvideoautoplay")),window.SyncRegistered,supportsFullscreen()&&features.push("fullscreenchange"),(browser.chrome||browser.edge&&!browser.slow)&&(browser.noAnimation||features.push("imageanalysis")),Dashboard.isConnectMode()&&features.push("multiserver"),(browser.tv||browser.xboxOne||browser.ps4||browser.mobile)&&features.push("physicalvolumecontrol"),browser.tv||browser.xboxOne||browser.ps4||features.push("remotecontrol"),features}();supportedFeatures.indexOf("htmlvideoautoplay")===-1&&supportsHtmlMediaAutoplay()!==!1&&require(["autoPlayDetect"],function(autoPlayDetect){autoPlayDetect.supportsHtmlMediaAutoplay().then(function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"true"),supportedFeatures.push("htmlvideoautoplay"),supportedFeatures.push("htmlaudioautoplay")},function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"false")})});var appInfo,version=window.dashboardVersion||"3.0";return{getWindowState:function(){return document.windowState||"Normal"},setWindowState:function(state){alert("setWindowState is not supported and should not be called")},exit:function(){if(browser.tizen)try{tizen.application.getCurrentApplication().exit()}catch(err){console.log("error closing application: "+err)}else window.close()},supports:function(command){return supportedFeatures.indexOf(command.toLowerCase())!=-1},appInfo:function(){return appInfo?Promise.resolve(appInfo):getDeviceId().then(function(deviceId){return appInfo={deviceId:deviceId,deviceName:getDeviceName(),appName:"Emby Mobile",appVersion:version}})},capabilities:getCapabilities,preferVisualCards:browser.android||browser.chrome,moreIcon:browser.safari||browser.edge?"dots-horiz":"dots-vert",getSyncProfile:getSyncProfile}}); \ No newline at end of file +define(["appStorage","browser"],function(appStorage,browser){"use strict";function getDeviceProfile(){return null}function getCapabilities(){var caps={PlayableMediaTypes:["Audio","Video"],SupportsPersistentIdentifier:!1,DeviceProfile:getDeviceProfile()};return caps}function generateDeviceId(){return new Promise(function(resolve,reject){require(["cryptojs-sha1"],function(){var keys=[];keys.push(navigator.userAgent),keys.push((new Date).getTime()),resolve(CryptoJS.SHA1(keys.join("|")).toString())})})}function getDeviceId(){var key="_deviceId2",deviceId=appStorage.getItem(key);return deviceId?Promise.resolve(deviceId):generateDeviceId().then(function(deviceId){return appStorage.setItem(key,deviceId),deviceId})}function getDeviceName(){var deviceName;return deviceName=browser.tizen?"Samsung Smart TV":browser.web0S?"LG Smart TV":browser.operaTv?"Opera TV":browser.xboxOne?"Xbox One":browser.ps4?"Sony PS4":browser.chrome?"Chrome":browser.edge?"Edge":browser.firefox?"Firefox":browser.msie?"Internet Explorer":"Web Browser",browser.ipad?deviceName+=" Ipad":browser.iphone?deviceName+=" Iphone":browser.android&&(deviceName+=" Android"),deviceName}function supportsVoiceInput(){return!browser.tv&&(window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.oSpeechRecognition||window.msSpeechRecognition)}function supportsFullscreen(){if(browser.tv)return!1;var element=document.documentElement;return!!(element.requestFullscreen||element.mozRequestFullScreen||element.webkitRequestFullscreen||element.msRequestFullscreen)||!!document.createElement("video").webkitEnterFullscreen}function getSyncProfile(){return new Promise(function(resolve,reject){require(["browserdeviceprofile","appSettings"],function(profileBuilder,appSettings){var profile=profileBuilder();profile.MaxStaticMusicBitrate=appSettings.maxStaticMusicBitrate(),resolve(profile)})})}function supportsHtmlMediaAutoplay(){if(browser.edgeUwp||browser.tv||browser.ps4||browser.xboxOne)return!0;if(browser.mobile)return!1;var savedResult=appStorage.getItem(htmlMediaAutoplayAppStorageKey);return"true"===savedResult||"false"!==savedResult&&null}var htmlMediaAutoplayAppStorageKey="supportshtmlmediaautoplay0",supportedFeatures=function(){var features=["sharing","externalpremium"];return browser.edgeUwp||browser.tv||browser.xboxOne||browser.ps4||features.push("filedownload"),browser.operaTv||browser.tizen||browser.web0s?features.push("exit"):features.push("exitmenu"),browser.operaTv||features.push("externallinks"),supportsVoiceInput()&&features.push("voiceinput"),supportsHtmlMediaAutoplay()&&(features.push("htmlaudioautoplay"),features.push("htmlvideoautoplay")),window.SyncRegistered,supportsFullscreen()&&features.push("fullscreenchange"),(browser.chrome||browser.edge&&!browser.slow)&&(browser.noAnimation||features.push("imageanalysis")),Dashboard.isConnectMode()&&features.push("multiserver"),(browser.tv||browser.xboxOne||browser.ps4||browser.mobile)&&features.push("physicalvolumecontrol"),browser.tv||browser.xboxOne||browser.ps4||features.push("remotecontrol"),features}();supportedFeatures.indexOf("htmlvideoautoplay")===-1&&supportsHtmlMediaAutoplay()!==!1&&require(["autoPlayDetect"],function(autoPlayDetect){autoPlayDetect.supportsHtmlMediaAutoplay().then(function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"true"),supportedFeatures.push("htmlvideoautoplay"),supportedFeatures.push("htmlaudioautoplay")},function(){appStorage.setItem(htmlMediaAutoplayAppStorageKey,"false")})});var appInfo,version=window.dashboardVersion||"3.0";return{getWindowState:function(){return document.windowState||"Normal"},setWindowState:function(state){alert("setWindowState is not supported and should not be called")},exit:function(){if(browser.tizen)try{tizen.application.getCurrentApplication().exit()}catch(err){console.log("error closing application: "+err)}else window.close()},supports:function(command){return supportedFeatures.indexOf(command.toLowerCase())!=-1},appInfo:function(){return appInfo?Promise.resolve(appInfo):getDeviceId().then(function(deviceId){return appInfo={deviceId:deviceId,deviceName:getDeviceName(),appName:"Emby Mobile",appVersion:version}})},capabilities:getCapabilities,preferVisualCards:browser.android||browser.chrome,moreIcon:browser.safari||browser.edge?"dots-horiz":"dots-vert",getSyncProfile:getSyncProfile}}); \ No newline at end of file diff --git a/dashboard-ui/scripts/dashboardpage.js b/dashboard-ui/scripts/dashboardpage.js index 7a956feee0..702d1bc5b9 100644 --- a/dashboard-ui/scripts/dashboardpage.js +++ b/dashboard-ui/scripts/dashboardpage.js @@ -1 +1 @@ -define(["datetime","jQuery","dom","humanedate","cardStyle","listViewStyle"],function(datetime,$,dom){"use strict";function renderNoHealthAlertsMessage(page){var html='

';html+='',html+=Globalize.translate("HealthMonitorNoAlerts")+"

",page.querySelector(".healthMonitor").innerHTML=html}function refreshHealthMonitor(page){renderNoHealthAlertsMessage(page)}function onConnectionHelpClick(e){return e.preventDefault(),!1}function onEditServerNameClick(e){var page=dom.parentWithClass(this,"page");return require(["prompt"],function(prompt){prompt({label:Globalize.translate("LabelFriendlyServerName"),description:Globalize.translate("LabelFriendlyServerNameHelp"),value:page.querySelector(".serverNameHeader").innerHTML,confirmText:Globalize.translate("ButtonSave")}).then(function(value){Dashboard.showLoadingMsg(),ApiClient.getServerConfiguration().then(function(config){config.ServerName=value,ApiClient.updateServerConfiguration(config).then(function(){page.querySelector(".serverNameHeader").innerHTML=value,Dashboard.hideLoadingMsg()})})})}),e.preventDefault(),!1}window.DashboardPage={newsStartIndex:0,onPageInit:function(){var page=this;page.querySelector(".btnConnectionHelp").addEventListener("click",onConnectionHelpClick),page.querySelector(".btnEditServerName").addEventListener("click",onEditServerNameClick)},onPageShow:function(){var page=this,apiClient=ApiClient;apiClient&&(DashboardPage.newsStartIndex=0,Dashboard.showLoadingMsg(),DashboardPage.pollForInfo(page),DashboardPage.startInterval(apiClient),Events.on(apiClient,"websocketmessage",DashboardPage.onWebSocketMessage),Events.on(apiClient,"websocketopen",DashboardPage.onWebSocketOpen),DashboardPage.lastAppUpdateCheck=null,DashboardPage.lastPluginUpdateCheck=null,Dashboard.getPluginSecurityInfo().then(function(pluginSecurityInfo){DashboardPage.renderSupporterIcon(page,pluginSecurityInfo)}),DashboardPage.reloadSystemInfo(page),DashboardPage.reloadNews(page),DashboardPage.sessionUpdateTimer=setInterval(DashboardPage.refreshSessionsLocally,6e4),$(".activityItems",page).activityLogList(),$(".swaggerLink",page).attr("href",apiClient.getUrl("swagger-ui/index.html",{api_key:ApiClient.accessToken()})),refreshHealthMonitor(page))},onPageHide:function(){var page=this;$(".activityItems",page).activityLogList("destroy");var apiClient=ApiClient;apiClient&&(Events.off(apiClient,"websocketmessage",DashboardPage.onWebSocketMessage),Events.off(apiClient,"websocketopen",DashboardPage.onWebSocketOpen),DashboardPage.stopInterval(apiClient)),DashboardPage.sessionUpdateTimer&&clearInterval(DashboardPage.sessionUpdateTimer)},renderPaths:function(page,systemInfo){$("#cachePath",page).html(systemInfo.CachePath),$("#logPath",page).html(systemInfo.LogPath),$("#transcodingTemporaryPath",page).html(systemInfo.TranscodingTempPath),$("#metadataPath",page).html(systemInfo.InternalMetadataPath)},refreshSessionsLocally:function(){var list=DashboardPage.sessionsList;list&&DashboardPage.renderActiveConnections($.mobile.activePage,list)},reloadSystemInfo:function(page){ApiClient.getSystemInfo().then(function(systemInfo){page.querySelector(".serverNameHeader").innerHTML=systemInfo.ServerName;var localizedVersion=Globalize.translate("LabelVersionNumber",systemInfo.Version);systemInfo.SystemUpdateLevel&&"Release"!=systemInfo.SystemUpdateLevel&&(localizedVersion+=" "+Globalize.translate("Option"+systemInfo.SystemUpdateLevel).toLowerCase()),$("#appVersionNumber",page).html(localizedVersion),systemInfo.SupportsHttps?$("#ports",page).html(Globalize.translate("LabelRunningOnPorts",systemInfo.HttpServerPortNumber,systemInfo.HttpsPortNumber)):$("#ports",page).html(Globalize.translate("LabelRunningOnPort",systemInfo.HttpServerPortNumber)),systemInfo.CanSelfRestart?$(".btnRestartContainer",page).removeClass("hide"):$(".btnRestartContainer",page).addClass("hide"),DashboardPage.renderUrls(page,systemInfo),DashboardPage.renderPendingInstallations(page,systemInfo),systemInfo.CanSelfUpdate?($("#btnUpdateApplicationContainer",page).show(),$("#btnManualUpdateContainer",page).hide()):($("#btnUpdateApplicationContainer",page).hide(),$("#btnManualUpdateContainer",page).show()),"synology"==systemInfo.PackageName?$("#btnManualUpdateContainer").html(Globalize.translate("SynologyUpdateInstructions")):$("#btnManualUpdateContainer").html(''+Globalize.translate("PleaseUpdateManually")+""),DashboardPage.renderPaths(page,systemInfo),DashboardPage.renderHasPendingRestart(page,systemInfo.HasPendingRestart)})},reloadNews:function(page){var query={StartIndex:DashboardPage.newsStartIndex,Limit:7};ApiClient.getProductNews(query).then(function(result){var html=result.Items.map(function(item){var itemHtml="";itemHtml+='',itemHtml+='
',itemHtml+='dvr',itemHtml+='
',itemHtml+='
',itemHtml+=item.Title,itemHtml+="
",itemHtml+='
';var date=datetime.parseISO8601Date(item.Date,!0);return itemHtml+=datetime.toLocaleDateString(date),itemHtml+="
",itemHtml+="
",itemHtml+="
",itemHtml+="
"}),pagingHtml="";pagingHtml+="
",pagingHtml+=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1}),pagingHtml+="
",html=html.join("")+pagingHtml;var elem=$(".latestNewsItems",page).html(html);$(".btnNextPage",elem).on("click",function(){DashboardPage.newsStartIndex+=query.Limit,DashboardPage.reloadNews(page)}),$(".btnPreviousPage",elem).on("click",function(){DashboardPage.newsStartIndex-=query.Limit,DashboardPage.reloadNews(page)})})},startInterval:function(apiClient){apiClient.isWebSocketOpen()&&(apiClient.sendWebSocketMessage("SessionsStart","0,1500"),apiClient.sendWebSocketMessage("ScheduledTasksInfoStart","0,1000"))},stopInterval:function(apiClient){apiClient.isWebSocketOpen()&&(apiClient.sendWebSocketMessage("SessionsStop"),apiClient.sendWebSocketMessage("ScheduledTasksInfoStop"))},onWebSocketMessage:function(e,msg){var page=$.mobile.activePage;if("Sessions"==msg.MessageType)DashboardPage.renderInfo(page,msg.Data);else if("RestartRequired"==msg.MessageType)DashboardPage.renderHasPendingRestart(page,!0);else if("ServerShuttingDown"==msg.MessageType)DashboardPage.renderHasPendingRestart(page,!0);else if("ServerRestarting"==msg.MessageType)DashboardPage.renderHasPendingRestart(page,!0);else if("ScheduledTasksInfo"==msg.MessageType){var tasks=msg.Data;DashboardPage.renderRunningTasks(page,tasks)}else"PackageInstalling"!=msg.MessageType&&"PackageInstallationCompleted"!=msg.MessageType||(DashboardPage.pollForInfo(page,!0),DashboardPage.reloadSystemInfo(page))},onWebSocketOpen:function(){var apiClient=this;DashboardPage.startInterval(apiClient)},pollForInfo:function(page,forceUpdate){var apiClient=window.ApiClient;apiClient&&(apiClient.getSessions().then(function(sessions){DashboardPage.renderInfo(page,sessions,forceUpdate)}),apiClient.getScheduledTasks().then(function(tasks){DashboardPage.renderRunningTasks(page,tasks)}))},renderInfo:function(page,sessions,forceUpdate){DashboardPage.renderActiveConnections(page,sessions),DashboardPage.renderPluginUpdateInfo(page,forceUpdate),Dashboard.hideLoadingMsg()},renderActiveConnections:function(page,sessions){var html="";DashboardPage.sessionsList=sessions;var parentElement=$(".activeDevices",page);$(".card",parentElement).addClass("deadSession");for(var i=0,length=sessions.length;i',html+='
',html+='
',html+='
',html+='
',html+='
',html+='
'+session.DeviceName+"
",html+='
'+DashboardPage.getAppSecondaryText(session)+"
",html+="
",html+="
",html+='
'+DashboardPage.getSessionNowPlayingTime(session)+"
";var nowPlayingName=DashboardPage.getNowPlayingName(session);if(html+='
',html+=nowPlayingName.html,html+="
",nowPlayingItem&&nowPlayingItem.RunTimeTicks){var position=session.PlayState.PositionTicks||0,value=100*position/nowPlayingItem.RunTimeTicks;html+=''}else html+='';html+=session.TranscodingInfo&&session.TranscodingInfo.CompletionPercentage?'':'',html+="
",html+="
",html+="",html+='
',html+='
',html+=DashboardPage.getSessionNowPlayingStreamInfo(session),html+="
",html+='
';var userImage=DashboardPage.getUserImage(session);html+=userImage?'':'
',html+='
',html+=DashboardPage.getUsersHtml(session)||" ",html+="
",html+="
",html+="
",html+="",html+=""}}parentElement.append(html),$(".deadSession",parentElement).remove()},getSessionNowPlayingStreamInfo:function(session){var html="",showTranscodingInfo=!1;if(session.TranscodingInfo&&session.TranscodingInfo.IsAudioDirect&&session.TranscodingInfo.IsVideoDirect?html+=Globalize.translate("LabelPlayMethodDirectStream"):session.TranscodingInfo&&session.TranscodingInfo.IsVideoDirect?html+=Globalize.translate("LabelPlayMethodDirectStream"):"Transcode"==session.PlayState.PlayMethod?(html+=Globalize.translate("LabelPlayMethodTranscoding"),session.TranscodingInfo&&session.TranscodingInfo.Framerate&&(html+=" ("+session.TranscodingInfo.Framerate+" fps)"),showTranscodingInfo=!0):"DirectStream"==session.PlayState.PlayMethod?html+=Globalize.translate("LabelPlayMethodDirectPlay"):"DirectPlay"==session.PlayState.PlayMethod&&(html+=Globalize.translate("LabelPlayMethodDirectPlay")),showTranscodingInfo){var line=[];session.TranscodingInfo&&(session.TranscodingInfo.Bitrate&&(session.TranscodingInfo.Bitrate>1e6?line.push((session.TranscodingInfo.Bitrate/1e6).toFixed(1)+" Mbps"):line.push(Math.floor(session.TranscodingInfo.Bitrate/1e3)+" kbps")),session.TranscodingInfo.Container&&line.push(session.TranscodingInfo.Container),session.TranscodingInfo.VideoCodec&&line.push(session.TranscodingInfo.VideoCodec),session.TranscodingInfo.AudioCodec&&session.TranscodingInfo.AudioCodec!=session.TranscodingInfo.Container&&line.push(session.TranscodingInfo.AudioCodec)),line.length&&(html+=" - "+line.join(" "))}return html||" "},getSessionNowPlayingTime:function(session){var html="";html+=session.PlayState.PositionTicks?datetime.getDisplayRunningTime(session.PlayState.PositionTicks):"--:--:--",html+=" / ";var nowPlayingItem=session.NowPlayingItem;return html+=nowPlayingItem&&nowPlayingItem.RunTimeTicks?datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks):"--:--:--"},getAppSecondaryText:function(session){return session.ApplicationVersion},getNowPlayingName:function(session){var imgUrl="",nowPlayingItem=session.NowPlayingItem;if(!nowPlayingItem)return{html:"Last seen "+humane_date(session.LastActivityDate),image:imgUrl};var topText=nowPlayingItem.Name,bottomText="";nowPlayingItem.Artists&&nowPlayingItem.Artists.length?(bottomText=topText,topText=nowPlayingItem.Artists[0]):nowPlayingItem.SeriesName||nowPlayingItem.Album?(bottomText=topText,topText=nowPlayingItem.SeriesName||nowPlayingItem.Album):nowPlayingItem.ProductionYear&&(bottomText=nowPlayingItem.ProductionYear),nowPlayingItem.LogoItemId&&(imgUrl=ApiClient.getScaledImageUrl(nowPlayingItem.LogoItemId,{tag:session.LogoImageTag,maxHeight:24,maxWidth:130,type:"Logo"}),topText='');var text=bottomText?topText+"
"+bottomText:topText;return{html:text,image:imgUrl}},getUsersHtml:function(session){var html=[];session.UserId&&html.push(session.UserName);for(var i=0,length=session.AdditionalUsers.length;i";if("dashboard"==clientLowered||"emby web client"==clientLowered){var imgUrl;return imgUrl=device.indexOf("chrome")!=-1?"css/images/clients/chrome.png":"css/images/clients/html5.png","Emby Web Client"}return clientLowered.indexOf("android")!=-1?"":clientLowered.indexOf("ios")!=-1?"":"mb-classic"==clientLowered?"":"roku"==clientLowered?"":"dlna"==clientLowered?"":"kodi"==clientLowered||"xbmc"==clientLowered?"":"chromecast"==clientLowered?"":null},getNowPlayingImageUrl:function(item){return item&&item.BackdropImageTag?ApiClient.getScaledImageUrl(item.BackdropItemId,{type:"Backdrop",width:275,tag:item.BackdropImageTag}):item&&item.ThumbImageTag?ApiClient.getScaledImageUrl(item.ThumbItemId,{type:"Thumb",width:275,tag:item.ThumbImageTag}):item&&item.PrimaryImageTag?ApiClient.getScaledImageUrl(item.PrimaryImageItemId,{type:"Primary",width:275,tag:item.PrimaryImageTag}):null},systemUpdateTaskKey:"SystemUpdateTask",renderRunningTasks:function(page,tasks){var html="";tasks=tasks.filter(function(t){return"Idle"!=t.State&&!t.IsHidden}),tasks.filter(function(t){return t.Key==DashboardPage.systemUpdateTaskKey}).length?$("#btnUpdateApplication",page).buttonEnabled(!1):$("#btnUpdateApplication",page).buttonEnabled(!0),tasks.length?$("#runningTasksCollapsible",page).show():$("#runningTasksCollapsible",page).hide();for(var i=0,length=tasks.length;i",html+=task.Name+"
","Running"==task.State){var progress=(task.CurrentProgressPercentage||0).toFixed(1);html+='',html+=""+progress+"%",html+="",html+=""+progress+"%",html+=''}else"Cancelling"==task.State&&(html+=''+Globalize.translate("LabelStopping")+"");html+="

"}$("#divRunningTasks",page).html(html)},renderUrls:function(page,systemInfo){var helpButton=''+Globalize.translate("ButtonHelp")+"";if(systemInfo.LocalAddress){var localAccessHtml=Globalize.translate("LabelLocalAccessUrl",''+systemInfo.LocalAddress+"");$(".localUrl",page).html(localAccessHtml+helpButton).show().trigger("create")}else $(".externalUrl",page).hide();if(systemInfo.WanAddress){var externalUrl=systemInfo.WanAddress,remoteAccessHtml=Globalize.translate("LabelRemoteAccessUrl",''+externalUrl+"");$(".externalUrl",page).html(remoteAccessHtml+helpButton).show().trigger("create")}else $(".externalUrl",page).hide()},renderSupporterIcon:function(page,pluginSecurityInfo){var imgUrl,text,supporterIconContainer=page.querySelector(".supporterIconContainer");AppInfo.enableSupporterMembership&&pluginSecurityInfo.IsMBSupporter?(supporterIconContainer.classList.remove("hide"),imgUrl="css/images/supporter/supporterbadge.png",text=Globalize.translate("MessageThankYouForSupporting"),supporterIconContainer.innerHTML=''+text+""):supporterIconContainer.classList.add("hide")},renderHasPendingRestart:function(page,hasPendingRestart){if(hasPendingRestart)page.querySelector("#pUpToDate").classList.add("hide"),$("#pUpdateNow",page).hide();else{if(DashboardPage.lastAppUpdateCheck&&(new Date).getTime()-DashboardPage.lastAppUpdateCheck<18e5)return;DashboardPage.lastAppUpdateCheck=(new Date).getTime(),ApiClient.getAvailableApplicationUpdate().then(function(packageInfo){var version=packageInfo[0];version?(page.querySelector("#pUpToDate").classList.add("hide"),$("#pUpdateNow",page).show(),$("#newVersionNumber",page).html(Globalize.translate("VersionXIsAvailableForDownload").replace("{0}",version.versionStr))):(page.querySelector("#pUpToDate").classList.remove("hide"),$("#pUpdateNow",page).hide())})}},renderPendingInstallations:function(page,systemInfo){if(!systemInfo.CompletedInstallations.length)return void $("#collapsiblePendingInstallations",page).hide();$("#collapsiblePendingInstallations",page).show();for(var html="",i=0,length=systemInfo.CompletedInstallations.length;i"+update.Name+" ("+update.Version+")"}$("#pendingInstallations",page).html(html)},renderPluginUpdateInfo:function(page,forceUpdate){!forceUpdate&&DashboardPage.lastPluginUpdateCheck&&(new Date).getTime()-DashboardPage.lastPluginUpdateCheck<18e5||(DashboardPage.lastPluginUpdateCheck=(new Date).getTime(),ApiClient.getAvailablePluginUpdates().then(function(updates){var elem=$("#pPluginUpdates",page);if(!updates.length)return void elem.hide();elem.show();for(var html="",i=0,length=updates.length;i"+Globalize.translate("NewVersionOfSomethingAvailable").replace("{0}",update.name)+"

",html+='"}elem.html(html)}))},installPluginUpdate:function(button){$(button).buttonEnabled(!1);var name=button.getAttribute("data-name"),guid=button.getAttribute("data-guid"),version=button.getAttribute("data-version"),classification=button.getAttribute("data-classification");Dashboard.showLoadingMsg(),ApiClient.installPlugin(name,guid,classification,version).then(function(){Dashboard.hideLoadingMsg()})},updateApplication:function(){var page=$.mobile.activePage;$("#btnUpdateApplication",page).buttonEnabled(!1),Dashboard.showLoadingMsg(),ApiClient.getScheduledTasks().then(function(tasks){var task=tasks.filter(function(t){return t.Key==DashboardPage.systemUpdateTaskKey})[0];ApiClient.startScheduledTask(task.Id).then(function(){DashboardPage.pollForInfo(page),Dashboard.hideLoadingMsg()})})},stopTask:function(id){var page=$.mobile.activePage;ApiClient.stopScheduledTask(id).then(function(){DashboardPage.pollForInfo(page)})},restart:function(){require(["confirm"],function(confirm){confirm({title:Globalize.translate("HeaderRestart"),text:Globalize.translate("MessageConfirmRestart"),confirmText:Globalize.translate("ButtonRestart"),primary:"cancel"}).then(function(){$("#btnRestartServer").buttonEnabled(!1),$("#btnShutdown").buttonEnabled(!1),Dashboard.restartServer()})})},shutdown:function(){require(["confirm"],function(confirm){confirm({title:Globalize.translate("HeaderShutdown"),text:Globalize.translate("MessageConfirmShutdown"),confirmText:Globalize.translate("ButtonShutdown"),primary:"cancel"}).then(function(){$("#btnRestartServer").buttonEnabled(!1),$("#btnShutdown").buttonEnabled(!1),ApiClient.shutdownServer()})})}},$(document).on("pageinit","#dashboardPage",DashboardPage.onPageInit).on("pageshow","#dashboardPage",DashboardPage.onPageShow).on("pagebeforehide","#dashboardPage",DashboardPage.onPageHide),function($,document,window){function getEntryHtml(entry){var html="";html+='
';var color="Error"==entry.Severity||"Fatal"==entry.Severity||"Warn"==entry.Severity?"#cc0000":"#52B54B";if(entry.UserId&&entry.UserPrimaryImageTag){var userImgUrl=ApiClient.getUserImageUrl(entry.UserId,{type:"Primary",tag:entry.UserPrimaryImageTag,height:40});html+='dvr"}else html+='dvr';html+='
',html+='
',html+=entry.Name,html+="
",html+='
';var date=datetime.parseISO8601Date(entry.Date,!0);return html+=datetime.toLocaleString(date).toLowerCase(),html+="
",html+='
',html+=entry.ShortOverview||"",html+="
",html+="
",html+="
"}function renderList(elem,result,startIndex,limit){var html=result.Items.map(getEntryHtml).join("");if(result.TotalRecordCount>limit){var query={StartIndex:startIndex,Limit:limit};html+=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1})}$(elem).html(html),$(".btnNextPage",elem).on("click",function(){reloadData(elem,startIndex+limit,limit)}),$(".btnPreviousPage",elem).on("click",function(){reloadData(elem,startIndex-limit,limit)}),$(".btnShowOverview",elem).on("click",function(){var item=$(this).parents(".newsItem"),overview=$(".newsItemLongDescription",item).html(),name=$(".notificationName",item).html();Dashboard.alert({message:'
'+overview+"
",title:name})})}function reloadData(elem,startIndex,limit){null==startIndex&&(startIndex=parseInt(elem.getAttribute("data-activitystartindex")||"0")),limit=limit||parseInt(elem.getAttribute("data-activitylimit")||"7");var minDate=new Date;minDate.setTime(minDate.getTime()-864e5),ApiClient.getJSON(ApiClient.getUrl("System/ActivityLog/Entries",{startIndex:startIndex,limit:limit,minDate:minDate.toISOString()})).then(function(result){elem.setAttribute("data-activitystartindex",startIndex),elem.setAttribute("data-activitylimit",limit),renderList(elem,result,startIndex,limit)})}function createList(elem){elem.each(function(){reloadData(this)}).addClass("activityLogListWidget");var apiClient=ApiClient;apiClient&&(Events.on(apiClient,"websocketopen",onSocketOpen),Events.on(apiClient,"websocketmessage",onSocketMessage))}function startListening(apiClient){apiClient.isWebSocketOpen()&&apiClient.sendWebSocketMessage("ActivityLogEntryStart","0,1500")}function stopListening(apiClient){apiClient.isWebSocketOpen()&&apiClient.sendWebSocketMessage("ActivityLogEntryStop","0,1500")}function onSocketOpen(){var apiClient=ApiClient;apiClient&&startListening(apiClient)}function onSocketMessage(e,data){var msg=data;"ActivityLogEntry"===msg.MessageType&&$(".activityLogListWidget").each(function(){reloadData(this)})}function destroyList(elem){var apiClient=ApiClient;apiClient&&(Events.off(apiClient,"websocketopen",onSocketOpen),Events.off(apiClient,"websocketmessage",onSocketMessage),stopListening(apiClient))}$.fn.activityLogList=function(action){"destroy"==action?(this.removeClass("activityLogListWidget"),destroyList(this)):createList(this);var apiClient=ApiClient;return apiClient&&startListening(apiClient),this}}(jQuery,document,window),function($,document,window){function dismissWelcome(page,userId){ApiClient.getDisplayPreferences("dashboard",userId,"dashboard").then(function(result){result.CustomPrefs[welcomeTourKey]=welcomeDismissValue,ApiClient.updateDisplayPreferences("dashboard",result,userId,"dashboard"),$(page).off("pageshow",onPageShowCheckTour)})}function showWelcomeIfNeeded(page,apiClient){var userId=Dashboard.getCurrentUserId();apiClient.getDisplayPreferences("dashboard",userId,"dashboard").then(function(result){if(result.CustomPrefs[welcomeTourKey]==welcomeDismissValue)$(".welcomeMessage",page).hide();else{var elem=$(".welcomeMessage",page).show();result.CustomPrefs[welcomeTourKey]?($(".tourHeader",elem).html(Globalize.translate("HeaderWelcomeBack")),$(".tourButtonText",elem).html(Globalize.translate("ButtonTakeTheTourToSeeWhatsNew"))):($(".tourHeader",elem).html(Globalize.translate("HeaderWelcomeToProjectServerDashboard")),$(".tourButtonText",elem).html(Globalize.translate("ButtonTakeTheTour")))}})}function takeTour(page,userId){require(["slideshow"],function(){var slides=[{imageUrl:"css/images/tour/admin/dashboard.png",title:Globalize.translate("DashboardTourDashboard")},{imageUrl:"css/images/tour/admin/help.png",title:Globalize.translate("DashboardTourHelp")},{imageUrl:"css/images/tour/admin/users.png",title:Globalize.translate("DashboardTourUsers")},{imageUrl:"css/images/tour/admin/sync.png",title:Globalize.translate("DashboardTourSync")},{imageUrl:"css/images/tour/admin/cinemamode.png",title:Globalize.translate("DashboardTourCinemaMode")},{imageUrl:"css/images/tour/admin/chapters.png",title:Globalize.translate("DashboardTourChapters")},{imageUrl:"css/images/tour/admin/subtitles.png",title:Globalize.translate("DashboardTourSubtitles")},{imageUrl:"css/images/tour/admin/plugins.png",title:Globalize.translate("DashboardTourPlugins")},{imageUrl:"css/images/tour/admin/notifications.png",title:Globalize.translate("DashboardTourNotifications")},{imageUrl:"css/images/tour/admin/scheduledtasks.png",title:Globalize.translate("DashboardTourScheduledTasks")},{imageUrl:"css/images/tour/admin/mobile.png",title:Globalize.translate("DashboardTourMobile")},{imageUrl:"css/images/tour/enjoy.jpg",title:Globalize.translate("MessageEnjoyYourStay")}];require(["slideshow"],function(slideshow){var newSlideShow=new slideshow({slides:slides,interactive:!0,loop:!1});newSlideShow.show(),dismissWelcome(page,userId),$(".welcomeMessage",page).hide()})})}function onPageShowCheckTour(){var page=this,apiClient=ApiClient;apiClient&&!AppInfo.isNativeApp&&showWelcomeIfNeeded(page,apiClient)}var welcomeDismissValue="12",welcomeTourKey="welcomeTour";$(document).on("pageinit","#dashboardPage",function(){var page=this;$(".btnTakeTour",page).on("click",function(){takeTour(page,Dashboard.getCurrentUserId())})}).on("pageshow","#dashboardPage",onPageShowCheckTour)}(jQuery,document,window),pageClassOn("pageshow","type-interior",function(){var page=this;Dashboard.getPluginSecurityInfo().then(function(pluginSecurityInfo){if(!page.querySelector(".customSupporterPromotion")&&($(".supporterPromotion",page).remove(),!pluginSecurityInfo.IsMBSupporter&&AppInfo.enableSupporterMembership)){var html='";page.querySelector(".content-primary").insertAdjacentHTML("afterbegin",html)}})})}); \ No newline at end of file +define(["datetime","jQuery","dom","humanedate","cardStyle","listViewStyle"],function(datetime,$,dom){"use strict";function renderNoHealthAlertsMessage(page){var html='

';html+='',html+=Globalize.translate("HealthMonitorNoAlerts")+"

",page.querySelector(".healthMonitor").innerHTML=html}function refreshHealthMonitor(page){renderNoHealthAlertsMessage(page)}function onConnectionHelpClick(e){return e.preventDefault(),!1}function onEditServerNameClick(e){var page=dom.parentWithClass(this,"page");return require(["prompt"],function(prompt){prompt({label:Globalize.translate("LabelFriendlyServerName"),description:Globalize.translate("LabelFriendlyServerNameHelp"),value:page.querySelector(".serverNameHeader").innerHTML,confirmText:Globalize.translate("ButtonSave")}).then(function(value){Dashboard.showLoadingMsg(),ApiClient.getServerConfiguration().then(function(config){config.ServerName=value,ApiClient.updateServerConfiguration(config).then(function(){page.querySelector(".serverNameHeader").innerHTML=value,Dashboard.hideLoadingMsg()})})})}),e.preventDefault(),!1}window.DashboardPage={newsStartIndex:0,onPageInit:function(){var page=this;page.querySelector(".btnConnectionHelp").addEventListener("click",onConnectionHelpClick),page.querySelector(".btnEditServerName").addEventListener("click",onEditServerNameClick)},onPageShow:function(){var page=this,apiClient=ApiClient;apiClient&&(DashboardPage.newsStartIndex=0,Dashboard.showLoadingMsg(),DashboardPage.pollForInfo(page),DashboardPage.startInterval(apiClient),Events.on(apiClient,"websocketmessage",DashboardPage.onWebSocketMessage),Events.on(apiClient,"websocketopen",DashboardPage.onWebSocketOpen),DashboardPage.lastAppUpdateCheck=null,DashboardPage.lastPluginUpdateCheck=null,Dashboard.getPluginSecurityInfo().then(function(pluginSecurityInfo){DashboardPage.renderSupporterIcon(page,pluginSecurityInfo)}),DashboardPage.reloadSystemInfo(page),DashboardPage.reloadNews(page),DashboardPage.sessionUpdateTimer=setInterval(DashboardPage.refreshSessionsLocally,6e4),$(".activityItems",page).activityLogList(),$(".swaggerLink",page).attr("href",apiClient.getUrl("swagger-ui/index.html",{api_key:ApiClient.accessToken()})),refreshHealthMonitor(page))},onPageHide:function(){var page=this;$(".activityItems",page).activityLogList("destroy");var apiClient=ApiClient;apiClient&&(Events.off(apiClient,"websocketmessage",DashboardPage.onWebSocketMessage),Events.off(apiClient,"websocketopen",DashboardPage.onWebSocketOpen),DashboardPage.stopInterval(apiClient)),DashboardPage.sessionUpdateTimer&&clearInterval(DashboardPage.sessionUpdateTimer)},renderPaths:function(page,systemInfo){$("#cachePath",page).html(systemInfo.CachePath),$("#logPath",page).html(systemInfo.LogPath),$("#transcodingTemporaryPath",page).html(systemInfo.TranscodingTempPath),$("#metadataPath",page).html(systemInfo.InternalMetadataPath)},refreshSessionsLocally:function(){var list=DashboardPage.sessionsList;list&&DashboardPage.renderActiveConnections($.mobile.activePage,list)},reloadSystemInfo:function(page){ApiClient.getSystemInfo().then(function(systemInfo){page.querySelector(".serverNameHeader").innerHTML=systemInfo.ServerName;var localizedVersion=Globalize.translate("LabelVersionNumber",systemInfo.Version);systemInfo.SystemUpdateLevel&&"Release"!=systemInfo.SystemUpdateLevel&&(localizedVersion+=" "+Globalize.translate("Option"+systemInfo.SystemUpdateLevel).toLowerCase()),$("#appVersionNumber",page).html(localizedVersion),systemInfo.SupportsHttps?$("#ports",page).html(Globalize.translate("LabelRunningOnPorts",systemInfo.HttpServerPortNumber,systemInfo.HttpsPortNumber)):$("#ports",page).html(Globalize.translate("LabelRunningOnPort",systemInfo.HttpServerPortNumber)),systemInfo.CanSelfRestart?$(".btnRestartContainer",page).removeClass("hide"):$(".btnRestartContainer",page).addClass("hide"),DashboardPage.renderUrls(page,systemInfo),DashboardPage.renderPendingInstallations(page,systemInfo),systemInfo.CanSelfUpdate?($("#btnUpdateApplicationContainer",page).show(),$("#btnManualUpdateContainer",page).hide()):($("#btnUpdateApplicationContainer",page).hide(),$("#btnManualUpdateContainer",page).show()),"synology"==systemInfo.PackageName?$("#btnManualUpdateContainer").html(Globalize.translate("SynologyUpdateInstructions")):$("#btnManualUpdateContainer").html(''+Globalize.translate("PleaseUpdateManually")+""),DashboardPage.renderPaths(page,systemInfo),DashboardPage.renderHasPendingRestart(page,systemInfo.HasPendingRestart)})},reloadNews:function(page){var query={StartIndex:DashboardPage.newsStartIndex,Limit:7};ApiClient.getProductNews(query).then(function(result){var html=result.Items.map(function(item){var itemHtml="";itemHtml+='',itemHtml+='
',itemHtml+='dvr',itemHtml+='
',itemHtml+='
',itemHtml+=item.Title,itemHtml+="
",itemHtml+='
';var date=datetime.parseISO8601Date(item.Date,!0);return itemHtml+=datetime.toLocaleDateString(date),itemHtml+="
",itemHtml+="
",itemHtml+="
",itemHtml+="
"}),pagingHtml="";pagingHtml+="
",pagingHtml+=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1}),pagingHtml+="
",html=html.join("")+pagingHtml;var elem=$(".latestNewsItems",page).html(html);$(".btnNextPage",elem).on("click",function(){DashboardPage.newsStartIndex+=query.Limit,DashboardPage.reloadNews(page)}),$(".btnPreviousPage",elem).on("click",function(){DashboardPage.newsStartIndex-=query.Limit,DashboardPage.reloadNews(page)})})},startInterval:function(apiClient){apiClient.isWebSocketOpen()&&(apiClient.sendWebSocketMessage("SessionsStart","0,1500"),apiClient.sendWebSocketMessage("ScheduledTasksInfoStart","0,1000"))},stopInterval:function(apiClient){apiClient.isWebSocketOpen()&&(apiClient.sendWebSocketMessage("SessionsStop"),apiClient.sendWebSocketMessage("ScheduledTasksInfoStop"))},onWebSocketMessage:function(e,msg){var page=$.mobile.activePage;if("Sessions"==msg.MessageType)DashboardPage.renderInfo(page,msg.Data);else if("RestartRequired"==msg.MessageType)DashboardPage.renderHasPendingRestart(page,!0);else if("ServerShuttingDown"==msg.MessageType)DashboardPage.renderHasPendingRestart(page,!0);else if("ServerRestarting"==msg.MessageType)DashboardPage.renderHasPendingRestart(page,!0);else if("ScheduledTasksInfo"==msg.MessageType){var tasks=msg.Data;DashboardPage.renderRunningTasks(page,tasks)}else"PackageInstalling"!=msg.MessageType&&"PackageInstallationCompleted"!=msg.MessageType||(DashboardPage.pollForInfo(page,!0),DashboardPage.reloadSystemInfo(page))},onWebSocketOpen:function(){var apiClient=this;DashboardPage.startInterval(apiClient)},pollForInfo:function(page,forceUpdate){var apiClient=window.ApiClient;apiClient&&(apiClient.getSessions().then(function(sessions){DashboardPage.renderInfo(page,sessions,forceUpdate)}),apiClient.getScheduledTasks().then(function(tasks){DashboardPage.renderRunningTasks(page,tasks)}))},renderInfo:function(page,sessions,forceUpdate){DashboardPage.renderActiveConnections(page,sessions),DashboardPage.renderPluginUpdateInfo(page,forceUpdate),Dashboard.hideLoadingMsg()},renderActiveConnections:function(page,sessions){var html="";DashboardPage.sessionsList=sessions;var parentElement=$(".activeDevices",page);$(".card",parentElement).addClass("deadSession");for(var i=0,length=sessions.length;i',html+='
',html+='
',html+='
',html+='
',html+='
',html+='
'+session.DeviceName+"
",html+='
'+DashboardPage.getAppSecondaryText(session)+"
",html+="
",html+="
",html+='
'+DashboardPage.getSessionNowPlayingTime(session)+"
";var nowPlayingName=DashboardPage.getNowPlayingName(session);if(html+='
',html+=nowPlayingName.html,html+="
",nowPlayingItem&&nowPlayingItem.RunTimeTicks){var position=session.PlayState.PositionTicks||0,value=100*position/nowPlayingItem.RunTimeTicks;html+=''}else html+='';html+=session.TranscodingInfo&&session.TranscodingInfo.CompletionPercentage?'':'',html+="
",html+="
",html+="",html+='
',html+='
',html+=DashboardPage.getSessionNowPlayingStreamInfo(session),html+="
",html+='
';var userImage=DashboardPage.getUserImage(session);html+=userImage?'':'
',html+='
',html+=DashboardPage.getUsersHtml(session)||" ",html+="
",html+="
",html+="
",html+="",html+=""}}parentElement.append(html),$(".deadSession",parentElement).remove()},getSessionNowPlayingStreamInfo:function(session){var html="",showTranscodingInfo=!1;if(session.TranscodingInfo&&session.TranscodingInfo.IsAudioDirect&&session.TranscodingInfo.IsVideoDirect?html+=Globalize.translate("LabelPlayMethodDirectStream"):session.TranscodingInfo&&session.TranscodingInfo.IsVideoDirect?html+=Globalize.translate("LabelPlayMethodDirectStream"):"Transcode"==session.PlayState.PlayMethod?(html+=Globalize.translate("LabelPlayMethodTranscoding"),session.TranscodingInfo&&session.TranscodingInfo.Framerate&&(html+=" ("+session.TranscodingInfo.Framerate+" fps)"),showTranscodingInfo=!0):"DirectStream"==session.PlayState.PlayMethod?html+=Globalize.translate("LabelPlayMethodDirectPlay"):"DirectPlay"==session.PlayState.PlayMethod&&(html+=Globalize.translate("LabelPlayMethodDirectPlay")),showTranscodingInfo){var line=[];session.TranscodingInfo&&(session.TranscodingInfo.Bitrate&&(session.TranscodingInfo.Bitrate>1e6?line.push((session.TranscodingInfo.Bitrate/1e6).toFixed(1)+" Mbps"):line.push(Math.floor(session.TranscodingInfo.Bitrate/1e3)+" kbps")),session.TranscodingInfo.Container&&line.push(session.TranscodingInfo.Container),session.TranscodingInfo.VideoCodec&&line.push(session.TranscodingInfo.VideoCodec),session.TranscodingInfo.AudioCodec&&session.TranscodingInfo.AudioCodec!=session.TranscodingInfo.Container&&line.push(session.TranscodingInfo.AudioCodec)),line.length&&(html+=" - "+line.join(" "))}return html||" "},getSessionNowPlayingTime:function(session){var html="";html+=session.PlayState.PositionTicks?datetime.getDisplayRunningTime(session.PlayState.PositionTicks):"--:--:--",html+=" / ";var nowPlayingItem=session.NowPlayingItem;return html+=nowPlayingItem&&nowPlayingItem.RunTimeTicks?datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks):"--:--:--"},getAppSecondaryText:function(session){return session.Client+" "+session.ApplicationVersion},getNowPlayingName:function(session){var imgUrl="",nowPlayingItem=session.NowPlayingItem;if(!nowPlayingItem)return{html:"Last seen "+humane_date(session.LastActivityDate),image:imgUrl};var topText=nowPlayingItem.Name,bottomText="";nowPlayingItem.Artists&&nowPlayingItem.Artists.length?(bottomText=topText,topText=nowPlayingItem.Artists[0]):nowPlayingItem.SeriesName||nowPlayingItem.Album?(bottomText=topText,topText=nowPlayingItem.SeriesName||nowPlayingItem.Album):nowPlayingItem.ProductionYear&&(bottomText=nowPlayingItem.ProductionYear),nowPlayingItem.LogoItemId&&(imgUrl=ApiClient.getScaledImageUrl(nowPlayingItem.LogoItemId,{tag:session.LogoImageTag,maxHeight:24,maxWidth:130,type:"Logo"}),topText='');var text=bottomText?topText+"
"+bottomText:topText;return{html:text,image:imgUrl}},getUsersHtml:function(session){var html=[];session.UserId&&html.push(session.UserName);for(var i=0,length=session.AdditionalUsers.length;i";if("dashboard"==clientLowered||"emby web client"==clientLowered){var imgUrl;return imgUrl=device.indexOf("chrome")!=-1?"css/images/clients/chrome.png":"css/images/clients/html5.png","Emby Web Client"}return clientLowered.indexOf("android")!=-1?"":clientLowered.indexOf("ios")!=-1?"":"mb-classic"==clientLowered?"":"roku"==clientLowered?"":"dlna"==clientLowered?"":"kodi"==clientLowered||"xbmc"==clientLowered?"":"chromecast"==clientLowered?"":null},getNowPlayingImageUrl:function(item){return item&&item.BackdropImageTag?ApiClient.getScaledImageUrl(item.BackdropItemId,{type:"Backdrop",width:275,tag:item.BackdropImageTag}):item&&item.ThumbImageTag?ApiClient.getScaledImageUrl(item.ThumbItemId,{type:"Thumb",width:275,tag:item.ThumbImageTag}):item&&item.PrimaryImageTag?ApiClient.getScaledImageUrl(item.PrimaryImageItemId,{type:"Primary",width:275,tag:item.PrimaryImageTag}):null},systemUpdateTaskKey:"SystemUpdateTask",renderRunningTasks:function(page,tasks){var html="";tasks=tasks.filter(function(t){return"Idle"!=t.State&&!t.IsHidden}),tasks.filter(function(t){return t.Key==DashboardPage.systemUpdateTaskKey}).length?$("#btnUpdateApplication",page).buttonEnabled(!1):$("#btnUpdateApplication",page).buttonEnabled(!0),tasks.length?$("#runningTasksCollapsible",page).show():$("#runningTasksCollapsible",page).hide();for(var i=0,length=tasks.length;i",html+=task.Name+"
","Running"==task.State){var progress=(task.CurrentProgressPercentage||0).toFixed(1);html+='',html+=""+progress+"%",html+="",html+=""+progress+"%",html+=''}else"Cancelling"==task.State&&(html+=''+Globalize.translate("LabelStopping")+"");html+="

"}$("#divRunningTasks",page).html(html)},renderUrls:function(page,systemInfo){var helpButton=''+Globalize.translate("ButtonHelp")+"";if(systemInfo.LocalAddress){var localAccessHtml=Globalize.translate("LabelLocalAccessUrl",''+systemInfo.LocalAddress+"");$(".localUrl",page).html(localAccessHtml+helpButton).show().trigger("create")}else $(".externalUrl",page).hide();if(systemInfo.WanAddress){var externalUrl=systemInfo.WanAddress,remoteAccessHtml=Globalize.translate("LabelRemoteAccessUrl",''+externalUrl+"");$(".externalUrl",page).html(remoteAccessHtml+helpButton).show().trigger("create")}else $(".externalUrl",page).hide()},renderSupporterIcon:function(page,pluginSecurityInfo){var imgUrl,text,supporterIconContainer=page.querySelector(".supporterIconContainer");AppInfo.enableSupporterMembership&&pluginSecurityInfo.IsMBSupporter?(supporterIconContainer.classList.remove("hide"),imgUrl="css/images/supporter/supporterbadge.png",text=Globalize.translate("MessageThankYouForSupporting"),supporterIconContainer.innerHTML=''+text+""):supporterIconContainer.classList.add("hide")},renderHasPendingRestart:function(page,hasPendingRestart){if(hasPendingRestart)page.querySelector("#pUpToDate").classList.add("hide"),$("#pUpdateNow",page).hide();else{if(DashboardPage.lastAppUpdateCheck&&(new Date).getTime()-DashboardPage.lastAppUpdateCheck<18e5)return;DashboardPage.lastAppUpdateCheck=(new Date).getTime(),ApiClient.getAvailableApplicationUpdate().then(function(packageInfo){var version=packageInfo[0];version?(page.querySelector("#pUpToDate").classList.add("hide"),$("#pUpdateNow",page).show(),$("#newVersionNumber",page).html(Globalize.translate("VersionXIsAvailableForDownload").replace("{0}",version.versionStr))):(page.querySelector("#pUpToDate").classList.remove("hide"),$("#pUpdateNow",page).hide())})}},renderPendingInstallations:function(page,systemInfo){if(!systemInfo.CompletedInstallations.length)return void $("#collapsiblePendingInstallations",page).hide();$("#collapsiblePendingInstallations",page).show();for(var html="",i=0,length=systemInfo.CompletedInstallations.length;i"+update.Name+" ("+update.Version+")"}$("#pendingInstallations",page).html(html)},renderPluginUpdateInfo:function(page,forceUpdate){!forceUpdate&&DashboardPage.lastPluginUpdateCheck&&(new Date).getTime()-DashboardPage.lastPluginUpdateCheck<18e5||(DashboardPage.lastPluginUpdateCheck=(new Date).getTime(),ApiClient.getAvailablePluginUpdates().then(function(updates){var elem=$("#pPluginUpdates",page);if(!updates.length)return void elem.hide();elem.show();for(var html="",i=0,length=updates.length;i"+Globalize.translate("NewVersionOfSomethingAvailable").replace("{0}",update.name)+"

",html+='"}elem.html(html)}))},installPluginUpdate:function(button){$(button).buttonEnabled(!1);var name=button.getAttribute("data-name"),guid=button.getAttribute("data-guid"),version=button.getAttribute("data-version"),classification=button.getAttribute("data-classification");Dashboard.showLoadingMsg(),ApiClient.installPlugin(name,guid,classification,version).then(function(){Dashboard.hideLoadingMsg()})},updateApplication:function(){var page=$.mobile.activePage;$("#btnUpdateApplication",page).buttonEnabled(!1),Dashboard.showLoadingMsg(),ApiClient.getScheduledTasks().then(function(tasks){var task=tasks.filter(function(t){return t.Key==DashboardPage.systemUpdateTaskKey})[0];ApiClient.startScheduledTask(task.Id).then(function(){DashboardPage.pollForInfo(page),Dashboard.hideLoadingMsg()})})},stopTask:function(id){var page=$.mobile.activePage;ApiClient.stopScheduledTask(id).then(function(){DashboardPage.pollForInfo(page)})},restart:function(){require(["confirm"],function(confirm){confirm({title:Globalize.translate("HeaderRestart"),text:Globalize.translate("MessageConfirmRestart"),confirmText:Globalize.translate("ButtonRestart"),primary:"cancel"}).then(function(){$("#btnRestartServer").buttonEnabled(!1),$("#btnShutdown").buttonEnabled(!1),Dashboard.restartServer()})})},shutdown:function(){require(["confirm"],function(confirm){confirm({title:Globalize.translate("HeaderShutdown"),text:Globalize.translate("MessageConfirmShutdown"),confirmText:Globalize.translate("ButtonShutdown"),primary:"cancel"}).then(function(){$("#btnRestartServer").buttonEnabled(!1),$("#btnShutdown").buttonEnabled(!1),ApiClient.shutdownServer()})})}},$(document).on("pageinit","#dashboardPage",DashboardPage.onPageInit).on("pageshow","#dashboardPage",DashboardPage.onPageShow).on("pagebeforehide","#dashboardPage",DashboardPage.onPageHide),function($,document,window){function getEntryHtml(entry){var html="";html+='
';var color="Error"==entry.Severity||"Fatal"==entry.Severity||"Warn"==entry.Severity?"#cc0000":"#52B54B";if(entry.UserId&&entry.UserPrimaryImageTag){var userImgUrl=ApiClient.getUserImageUrl(entry.UserId,{type:"Primary",tag:entry.UserPrimaryImageTag,height:40});html+='dvr"}else html+='dvr';html+='
',html+='
',html+=entry.Name,html+="
",html+='
';var date=datetime.parseISO8601Date(entry.Date,!0);return html+=datetime.toLocaleString(date).toLowerCase(),html+="
",html+='
',html+=entry.ShortOverview||"",html+="
",html+="
",html+="
"}function renderList(elem,result,startIndex,limit){var html=result.Items.map(getEntryHtml).join("");if(result.TotalRecordCount>limit){var query={StartIndex:startIndex,Limit:limit};html+=LibraryBrowser.getQueryPagingHtml({startIndex:query.StartIndex,limit:query.Limit,totalRecordCount:result.TotalRecordCount,showLimit:!1,updatePageSizeSetting:!1})}$(elem).html(html),$(".btnNextPage",elem).on("click",function(){reloadData(elem,startIndex+limit,limit)}),$(".btnPreviousPage",elem).on("click",function(){reloadData(elem,startIndex-limit,limit)}),$(".btnShowOverview",elem).on("click",function(){var item=$(this).parents(".newsItem"),overview=$(".newsItemLongDescription",item).html(),name=$(".notificationName",item).html();Dashboard.alert({message:'
'+overview+"
",title:name})})}function reloadData(elem,startIndex,limit){null==startIndex&&(startIndex=parseInt(elem.getAttribute("data-activitystartindex")||"0")),limit=limit||parseInt(elem.getAttribute("data-activitylimit")||"7");var minDate=new Date;minDate.setTime(minDate.getTime()-864e5),ApiClient.getJSON(ApiClient.getUrl("System/ActivityLog/Entries",{startIndex:startIndex,limit:limit,minDate:minDate.toISOString()})).then(function(result){elem.setAttribute("data-activitystartindex",startIndex),elem.setAttribute("data-activitylimit",limit),renderList(elem,result,startIndex,limit)})}function createList(elem){elem.each(function(){reloadData(this)}).addClass("activityLogListWidget");var apiClient=ApiClient;apiClient&&(Events.on(apiClient,"websocketopen",onSocketOpen),Events.on(apiClient,"websocketmessage",onSocketMessage))}function startListening(apiClient){apiClient.isWebSocketOpen()&&apiClient.sendWebSocketMessage("ActivityLogEntryStart","0,1500")}function stopListening(apiClient){apiClient.isWebSocketOpen()&&apiClient.sendWebSocketMessage("ActivityLogEntryStop","0,1500")}function onSocketOpen(){var apiClient=ApiClient;apiClient&&startListening(apiClient)}function onSocketMessage(e,data){var msg=data;"ActivityLogEntry"===msg.MessageType&&$(".activityLogListWidget").each(function(){reloadData(this)})}function destroyList(elem){var apiClient=ApiClient;apiClient&&(Events.off(apiClient,"websocketopen",onSocketOpen),Events.off(apiClient,"websocketmessage",onSocketMessage),stopListening(apiClient))}$.fn.activityLogList=function(action){"destroy"==action?(this.removeClass("activityLogListWidget"),destroyList(this)):createList(this);var apiClient=ApiClient;return apiClient&&startListening(apiClient),this}}(jQuery,document,window),function($,document,window){function dismissWelcome(page,userId){ApiClient.getDisplayPreferences("dashboard",userId,"dashboard").then(function(result){result.CustomPrefs[welcomeTourKey]=welcomeDismissValue,ApiClient.updateDisplayPreferences("dashboard",result,userId,"dashboard"),$(page).off("pageshow",onPageShowCheckTour)})}function showWelcomeIfNeeded(page,apiClient){var userId=Dashboard.getCurrentUserId();apiClient.getDisplayPreferences("dashboard",userId,"dashboard").then(function(result){if(result.CustomPrefs[welcomeTourKey]==welcomeDismissValue)$(".welcomeMessage",page).hide();else{var elem=$(".welcomeMessage",page).show();result.CustomPrefs[welcomeTourKey]?($(".tourHeader",elem).html(Globalize.translate("HeaderWelcomeBack")),$(".tourButtonText",elem).html(Globalize.translate("ButtonTakeTheTourToSeeWhatsNew"))):($(".tourHeader",elem).html(Globalize.translate("HeaderWelcomeToProjectServerDashboard")),$(".tourButtonText",elem).html(Globalize.translate("ButtonTakeTheTour")))}})}function takeTour(page,userId){require(["slideshow"],function(){var slides=[{imageUrl:"css/images/tour/admin/dashboard.png",title:Globalize.translate("DashboardTourDashboard")},{imageUrl:"css/images/tour/admin/help.png",title:Globalize.translate("DashboardTourHelp")},{imageUrl:"css/images/tour/admin/users.png",title:Globalize.translate("DashboardTourUsers")},{imageUrl:"css/images/tour/admin/sync.png",title:Globalize.translate("DashboardTourSync")},{imageUrl:"css/images/tour/admin/cinemamode.png",title:Globalize.translate("DashboardTourCinemaMode")},{imageUrl:"css/images/tour/admin/chapters.png",title:Globalize.translate("DashboardTourChapters")},{imageUrl:"css/images/tour/admin/subtitles.png",title:Globalize.translate("DashboardTourSubtitles")},{imageUrl:"css/images/tour/admin/plugins.png",title:Globalize.translate("DashboardTourPlugins")},{imageUrl:"css/images/tour/admin/notifications.png",title:Globalize.translate("DashboardTourNotifications")},{imageUrl:"css/images/tour/admin/scheduledtasks.png",title:Globalize.translate("DashboardTourScheduledTasks")},{imageUrl:"css/images/tour/admin/mobile.png",title:Globalize.translate("DashboardTourMobile")},{imageUrl:"css/images/tour/enjoy.jpg",title:Globalize.translate("MessageEnjoyYourStay")}];require(["slideshow"],function(slideshow){var newSlideShow=new slideshow({slides:slides,interactive:!0,loop:!1});newSlideShow.show(),dismissWelcome(page,userId),$(".welcomeMessage",page).hide()})})}function onPageShowCheckTour(){var page=this,apiClient=ApiClient;apiClient&&!AppInfo.isNativeApp&&showWelcomeIfNeeded(page,apiClient)}var welcomeDismissValue="12",welcomeTourKey="welcomeTour";$(document).on("pageinit","#dashboardPage",function(){var page=this;$(".btnTakeTour",page).on("click",function(){takeTour(page,Dashboard.getCurrentUserId())})}).on("pageshow","#dashboardPage",onPageShowCheckTour)}(jQuery,document,window),pageClassOn("pageshow","type-interior",function(){var page=this;Dashboard.getPluginSecurityInfo().then(function(pluginSecurityInfo){if(!page.querySelector(".customSupporterPromotion")&&($(".supporterPromotion",page).remove(),!pluginSecurityInfo.IsMBSupporter&&AppInfo.enableSupporterMembership)){var html='";page.querySelector(".content-primary").insertAdjacentHTML("afterbegin",html)}})})}); \ No newline at end of file diff --git a/dashboard-ui/scripts/sections.js b/dashboard-ui/scripts/sections.js index 7f2f5fb8ad..0ba3cc7c27 100644 --- a/dashboard-ui/scripts/sections.js +++ b/dashboard-ui/scripts/sections.js @@ -1 +1 @@ -define(["libraryBrowser","cardBuilder","appSettings","components/groupedcards","dom","apphost","imageLoader","scrollStyles","emby-button","paper-icon-button-light","emby-itemscontainer"],function(libraryBrowser,cardBuilder,appSettings,groupedcards,dom,appHost,imageLoader){"use strict";function getUserViews(userId){return ApiClient.getUserViews({},userId).then(function(result){return result.Items})}function enableScrollX(){return browserInfo.mobile}function getSquareShape(){return enableScrollX()?"overflowSquare":"square"}function getThumbShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function getPortraitShape(){return enableScrollX()?"overflowPortrait":"portrait"}function getLibraryButtonsHtml(items){for(var html="",i=0,length=items.length;i',html+='
',html+="
",html+=''+icon+"",html+=''+item.Name+"",html+="
",html+="
",html+=""}return html}function loadlibraryButtons(elem,userId,index){return getUserViews(userId).then(function(items){var html="
";return index&&(html+='

'+Globalize.translate("HeaderMyMedia")+"

"),html+='
',html+=getLibraryButtonsHtml(items),html+="
",getAppInfo().then(function(infoHtml){elem.innerHTML=html+infoHtml})})}function getRandomInt(min,max){return Math.floor(Math.random()*(max-min+1))+min}function getAppInfo(){var frequency=864e5;AppInfo.isNativeApp&&(frequency=1728e5);var cacheKey="lastappinfopresent5",lastDatePresented=parseInt(appSettings.get(cacheKey)||"0");return lastDatePresented?(new Date).getTime()-lastDatePresented
';return html+=target?'':'",html+="
"}function getTheaterInfo(){var html="";html+="
",html+='

Discover Emby Theater

';var nameText=AppInfo.isNativeApp?"Emby Theater":'Emby Theater';return html+="

A beautiful app for your TV and large screen tablet. "+nameText+" runs on Windows, Xbox One, Raspberry Pi, Samsung Smart TVs, Sony PS4, Web Browsers, and more.

",html+='
',html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png","https://emby.media/download"),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png","https://emby.media/download"),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png","https://emby.media/download"),html+="
",html+="
",html+="
"}function getPremiereInfo(){var html="";html+="
",html+='

Discover Emby Premiere

';var cardTarget=AppInfo.isNativeApp?"":"https://emby.media/premiere",learnMoreText=AppInfo.isNativeApp?"":'Learn more';return html+="

Design beautiful Cover Art, enjoy free access to Emby apps, and more. "+learnMoreText+"

",html+='
',html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png",cardTarget),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png",cardTarget),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png",cardTarget),html+="
",html+="
",html+="
"}function renderLatestSection(elem,user,parent){var options={Limit:12,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb",ParentId:parent.Id};return ApiClient.getJSON(ApiClient.getUrl("Users/"+user.Id+"/Items/Latest",options)).then(function(items){var html="",scrollX=enableScrollX();if(items.length){html+="
",html+='

'+Globalize.translate("LatestFromLibrary",parent.Name)+"

",html+='",html+="
",html+=scrollX?'
':'
';var viewType=parent.CollectionType,shape="movies"===viewType?getPortraitShape():"music"===viewType?getSquareShape():getThumbShape(),supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis&&("music"===viewType||"movies"===viewType||"tvshows"===viewType||!viewType);html+=cardBuilder.getCardsHtml({items:items,shape:shape,preferThumb:"movies"!==viewType&&"music"!==viewType,showUnplayedIndicator:!1,showChildCountIndicator:!0,context:"home",overlayText:!1,centerText:!cardLayout,overlayPlayButton:"photos"!==viewType,allowBottomPadding:!enableScrollX()&&!cardLayout,cardLayout:cardLayout,showTitle:"music"===viewType||!viewType||cardLayout&&("movies"===viewType||"tvshows"===viewType),showYear:cardLayout&&"movies"===viewType,showSeriesYear:cardLayout&&"tvshows"===viewType,showParentTitle:"music"===viewType||!viewType||cardLayout&&"tvshows"===viewType,vibrant:supportsImageAnalysis&&cardLayout,lines:2}),html+="
"}elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadRecentlyAdded(elem,user){return elem.classList.remove("homePageSection"),getUserViews(user.Id).then(function(items){for(var excludeViewTypes=["playlists","livetv","boxsets","channels"],excludeItemTypes=["Channel"],i=0,length=items.length;i=2400?10:screenWidth>=1600?10:screenWidth>=1440?8:screenWidth>=800?7:6,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",Filters:"IsUnplayed",UserId:userId};return ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest",options)).then(function(result){var html="";result.Items.length&&(html+='

'+Globalize.translate("HeaderLatestChannelMedia")+"

",html+='
',html+=cardBuilder.getCardsHtml({items:result.Items,shape:"auto",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0}),html+="
"),elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadLibraryTiles(elem,user,shape){return getUserViews(user.Id).then(function(items){var html="";if(html+="
",items.length){html+="
",html+='

'+Globalize.translate("HeaderMyMedia")+"

",html+="
";var scrollX=enableScrollX()&&dom.getWindowSize().innerWidth>=500;html+=scrollX?'
':'
',html+=cardBuilder.getCardsHtml({items:items,shape:scrollX?"overflowSmallBackdrop":shape,showTitle:!0,centerText:!0,overlayText:!1,lazy:!0,transition:!1,allowBottomPadding:!enableScrollX()}),html+="
"}return html+="
",getAppInfo().then(function(infoHtml){elem.innerHTML=html+infoHtml,imageLoader.lazyChildren(elem)})})}function loadResume(elem,userId){var limit,screenWidth=dom.getWindowSize().innerWidth;enableScrollX()?limit=12:(limit=screenWidth>=1920?8:screenWidth>=1600?8:screenWidth>=1200?9:6,limit=Math.min(limit,5));var options={SortBy:"DatePlayed",SortOrder:"Descending",Filters:"IsResumable",Limit:limit,Recursive:!0,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",CollapseBoxSetItems:!1,ExcludeLocationTypes:"Virtual",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",EnableTotalRecordCount:!1};return ApiClient.getItems(userId,options).then(function(result){var html="";if(result.Items.length){html+='

'+Globalize.translate("HeaderContinueWatching")+"

",html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis;html+=cardBuilder.getCardsHtml({items:result.Items,preferThumb:!0,shape:getThumbShape(),overlayText:!1,showTitle:!0,showParentTitle:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0,context:"home",centerText:!cardLayout,allowBottomPadding:!1,cardLayout:cardLayout,showYear:!0,lines:2,vibrant:cardLayout&&supportsImageAnalysis}),html+="
"}elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadNextUp(elem,userId){var query={Limit:enableScrollX()?20:10,Fields:"PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo",UserId:userId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb"};ApiClient.getNextUpEpisodes(query).then(function(result){var html="";if(result.Items.length){html+='

'+Globalize.translate("HeaderNextUp")+"

",html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,preferThumb:!0,shape:getThumbShape(),overlayText:!1,showTitle:!0,showParentTitle:!0,lazy:!0,overlayPlayButton:!0,context:"home",centerText:!supportsImageAnalysis,allowBottomPadding:!enableScrollX(),cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
"}elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadLatestChannelItems(elem,userId,options){return options=Object.assign(options||{},{UserId:userId,SupportsLatestItems:!0}),ApiClient.getJSON(ApiClient.getUrl("Channels",options)).then(function(result){var channels=result.Items,channelsHtml=channels.map(function(c){return'
'}).join("");elem.innerHTML=channelsHtml;for(var i=0,length=channels.length;i=1600?10:screenWidth>=1440?5:6,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",Filters:"IsUnplayed",UserId:Dashboard.getCurrentUserId(),ChannelIds:channel.Id};ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest",options)).then(function(result){var html="";if(result.Items.length){html+='
',html+="
";var text=Globalize.translate("HeaderLatestFromChannel").replace("{0}",channel.Name);html+='

'+text+"

",html+='",html+="
",html+='
',html+=cardBuilder.getCardsHtml({items:result.Items,shape:"autohome",defaultShape:"square",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0}),html+="
",html+="
"}var elem=page.querySelector("#channel"+channel.Id);elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadLatestLiveTvRecordings(elem,userId){return ApiClient.getLiveTvRecordings({userId:userId,limit:5,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",IsInProgress:!1,EnableTotalRecordCount:!1,IsLibraryItem:!1}).then(function(result){var html="";result.Items.length&&(html+="
",html+='

'+Globalize.translate("HeaderLatestTvRecordings")+"

",html+='",html+="
"),html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,shape:enableScrollX()?"autooverflow":"auto",showTitle:!0,showParentTitle:!0,coverImage:!0,lazy:!0,showDetailsMenu:!0,centerText:!supportsImageAnalysis,overlayText:!1,overlayPlayButton:!0,allowBottomPadding:!enableScrollX(),preferThumb:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
",elem.innerHTML=html,imageLoader.lazyChildren(elem)})}return window.Sections={loadRecentlyAdded:loadRecentlyAdded,loadLatestChannelMedia:loadLatestChannelMedia,loadLibraryTiles:loadLibraryTiles,loadResume:loadResume,loadNextUp:loadNextUp,loadLatestChannelItems:loadLatestChannelItems,loadLatestLiveTvRecordings:loadLatestLiveTvRecordings,loadlibraryButtons:loadlibraryButtons},window.Sections}); \ No newline at end of file +define(["libraryBrowser","cardBuilder","appSettings","components/groupedcards","dom","apphost","imageLoader","scrollStyles","emby-button","paper-icon-button-light","emby-itemscontainer"],function(libraryBrowser,cardBuilder,appSettings,groupedcards,dom,appHost,imageLoader){"use strict";function getUserViews(userId){return ApiClient.getUserViews({},userId).then(function(result){return result.Items})}function enableScrollX(){return browserInfo.mobile}function getSquareShape(){return enableScrollX()?"overflowSquare":"square"}function getThumbShape(){return enableScrollX()?"overflowBackdrop":"backdrop"}function getPortraitShape(){return enableScrollX()?"overflowPortrait":"portrait"}function getLibraryButtonsHtml(items){for(var html="",i=0,length=items.length;i',html+='
',html+="
",html+=''+icon+"",html+=''+item.Name+"",html+="
",html+="
",html+=""}return html}function loadlibraryButtons(elem,userId,index){return getUserViews(userId).then(function(items){var html="
";return index&&(html+='

'+Globalize.translate("HeaderMyMedia")+"

"),html+='
',html+=getLibraryButtonsHtml(items),html+="
",getAppInfo().then(function(infoHtml){elem.innerHTML=html+infoHtml})})}function getRandomInt(min,max){return Math.floor(Math.random()*(max-min+1))+min}function getAppInfo(){var frequency=864e5;AppInfo.isNativeApp&&(frequency=1728e5);var cacheKey="lastappinfopresent5",lastDatePresented=parseInt(appSettings.get(cacheKey)||"0");return lastDatePresented?(new Date).getTime()-lastDatePresented
';return html+=target?'':'",html+="
"}function getTheaterInfo(){var html="";html+="
",html+='

Discover Emby Theater

';var nameText=AppInfo.isNativeApp?"Emby Theater":'Emby Theater';return html+="

A beautiful app for your TV and large screen tablet. "+nameText+" runs on Windows, Xbox One, Raspberry Pi, Samsung Smart TVs, Sony PS4, Web Browsers, and more.

",html+='
',html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png","https://emby.media/download"),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png","https://emby.media/download"),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png","https://emby.media/download"),html+="
",html+="
",html+="
"}function getPremiereInfo(){var html="";html+="
",html+='

Discover Emby Premiere

';var cardTarget=AppInfo.isNativeApp?"":"https://emby.media/premiere",learnMoreText=AppInfo.isNativeApp?"":'Learn more';return html+="

Design beautiful Cover Art, enjoy free access to Emby apps, and more. "+learnMoreText+"

",html+='
',html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png",cardTarget),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png",cardTarget),html+=getCard("https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png",cardTarget),html+="
",html+="
",html+="
"}function renderLatestSection(elem,user,parent){var options={Limit:12,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Thumb",ParentId:parent.Id};return ApiClient.getJSON(ApiClient.getUrl("Users/"+user.Id+"/Items/Latest",options)).then(function(items){var html="",scrollX=enableScrollX();if(items.length){html+="
",html+='

'+Globalize.translate("LatestFromLibrary",parent.Name)+"

",html+='",html+="
",html+=scrollX?'
':'
';var viewType=parent.CollectionType,shape="movies"===viewType?getPortraitShape():"music"===viewType?getSquareShape():getThumbShape(),supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis&&("music"===viewType||"movies"===viewType||"tvshows"===viewType||!viewType);html+=cardBuilder.getCardsHtml({items:items,shape:shape,preferThumb:"movies"!==viewType&&"music"!==viewType,showUnplayedIndicator:!1,showChildCountIndicator:!0,context:"home",overlayText:!1,centerText:!cardLayout,overlayPlayButton:"photos"!==viewType,allowBottomPadding:!enableScrollX()&&!cardLayout,cardLayout:cardLayout,showTitle:"music"===viewType||!viewType||cardLayout&&("movies"===viewType||"tvshows"===viewType),showYear:cardLayout&&"movies"===viewType,showSeriesYear:cardLayout&&"tvshows"===viewType,showParentTitle:"music"===viewType||!viewType||cardLayout&&"tvshows"===viewType,vibrant:supportsImageAnalysis&&cardLayout,lines:2}),html+="
"}elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadRecentlyAdded(elem,user){return elem.classList.remove("homePageSection"),getUserViews(user.Id).then(function(items){for(var excludeViewTypes=["playlists","livetv","boxsets","channels"],excludeItemTypes=["Channel"],i=0,length=items.length;i=2400?10:screenWidth>=1600?10:screenWidth>=1440?8:screenWidth>=800?7:6,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",Filters:"IsUnplayed",UserId:userId};return ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest",options)).then(function(result){var html="";result.Items.length&&(html+='

'+Globalize.translate("HeaderLatestChannelMedia")+"

",html+='
',html+=cardBuilder.getCardsHtml({items:result.Items,shape:"auto",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0}),html+="
"),elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadLibraryTiles(elem,user,shape){return getUserViews(user.Id).then(function(items){var html="";if(html+="
",items.length){html+="
",html+='

'+Globalize.translate("HeaderMyMedia")+"

",html+="
";var scrollX=enableScrollX();html+=scrollX?'
':'
',html+=cardBuilder.getCardsHtml({items:items,shape:scrollX?"overflowSmallBackdrop":shape,showTitle:!0,centerText:!0,overlayText:!1,lazy:!0,transition:!1,allowBottomPadding:!scrollX}),html+="
"}return html+="
",getAppInfo().then(function(infoHtml){elem.innerHTML=html+infoHtml,imageLoader.lazyChildren(elem)})})}function loadResume(elem,userId){var limit,screenWidth=dom.getWindowSize().innerWidth;enableScrollX()?limit=12:(limit=screenWidth>=1920?8:screenWidth>=1600?8:screenWidth>=1200?9:6,limit=Math.min(limit,5));var options={SortBy:"DatePlayed",SortOrder:"Descending",Filters:"IsResumable",Limit:limit,Recursive:!0,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",CollapseBoxSetItems:!1,ExcludeLocationTypes:"Virtual",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb",EnableTotalRecordCount:!1};return ApiClient.getItems(userId,options).then(function(result){var html="";if(result.Items.length){html+='

'+Globalize.translate("HeaderContinueWatching")+"

",html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis"),cardLayout=supportsImageAnalysis;html+=cardBuilder.getCardsHtml({items:result.Items,preferThumb:!0,shape:getThumbShape(),overlayText:!1,showTitle:!0,showParentTitle:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0,context:"home",centerText:!cardLayout,allowBottomPadding:!1,cardLayout:cardLayout,showYear:!0,lines:2,vibrant:cardLayout&&supportsImageAnalysis}),html+="
"}elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadNextUp(elem,userId){var query={Limit:enableScrollX()?20:10,Fields:"PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo",UserId:userId,ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Banner,Thumb"};ApiClient.getNextUpEpisodes(query).then(function(result){var html="";if(result.Items.length){html+='

'+Globalize.translate("HeaderNextUp")+"

",html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,preferThumb:!0,shape:getThumbShape(),overlayText:!1,showTitle:!0,showParentTitle:!0,lazy:!0,overlayPlayButton:!0,context:"home",centerText:!supportsImageAnalysis,allowBottomPadding:!enableScrollX(),cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
"}elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadLatestChannelItems(elem,userId,options){return options=Object.assign(options||{},{UserId:userId,SupportsLatestItems:!0}),ApiClient.getJSON(ApiClient.getUrl("Channels",options)).then(function(result){var channels=result.Items,channelsHtml=channels.map(function(c){return'
'}).join("");elem.innerHTML=channelsHtml;for(var i=0,length=channels.length;i=1600?10:screenWidth>=1440?5:6,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",Filters:"IsUnplayed",UserId:Dashboard.getCurrentUserId(),ChannelIds:channel.Id};ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest",options)).then(function(result){var html="";if(result.Items.length){html+='
',html+="
";var text=Globalize.translate("HeaderLatestFromChannel").replace("{0}",channel.Name);html+='

'+text+"

",html+='",html+="
",html+='
',html+=cardBuilder.getCardsHtml({items:result.Items,shape:"autohome",defaultShape:"square",showTitle:!0,centerText:!0,lazy:!0,showDetailsMenu:!0,overlayPlayButton:!0}),html+="
",html+="
"}var elem=page.querySelector("#channel"+channel.Id);elem.innerHTML=html,imageLoader.lazyChildren(elem)})}function loadLatestLiveTvRecordings(elem,userId){return ApiClient.getLiveTvRecordings({userId:userId,limit:5,Fields:"PrimaryImageAspectRatio,BasicSyncInfo",IsInProgress:!1,EnableTotalRecordCount:!1,IsLibraryItem:!1}).then(function(result){var html="";result.Items.length&&(html+="
",html+='

'+Globalize.translate("HeaderLatestTvRecordings")+"

",html+='",html+="
"),html+=enableScrollX()?'
':'
';var supportsImageAnalysis=appHost.supports("imageanalysis");html+=cardBuilder.getCardsHtml({items:result.Items,shape:enableScrollX()?"autooverflow":"auto",showTitle:!0,showParentTitle:!0,coverImage:!0,lazy:!0,showDetailsMenu:!0,centerText:!supportsImageAnalysis,overlayText:!1,overlayPlayButton:!0,allowBottomPadding:!enableScrollX(),preferThumb:!0,cardLayout:supportsImageAnalysis,vibrant:supportsImageAnalysis}),html+="
",elem.innerHTML=html,imageLoader.lazyChildren(elem)})}return window.Sections={loadRecentlyAdded:loadRecentlyAdded,loadLatestChannelMedia:loadLatestChannelMedia,loadLibraryTiles:loadLibraryTiles,loadResume:loadResume,loadNextUp:loadNextUp,loadLatestChannelItems:loadLatestChannelItems,loadLatestLiveTvRecordings:loadLatestLiveTvRecordings,loadlibraryButtons:loadlibraryButtons},window.Sections}); \ No newline at end of file