From c057c9a24cc5bb3c7c82d462612d0ac057e1e728 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 27 Jan 2017 23:23:06 -0500 Subject: [PATCH] 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