diff --git a/dashboard-ui/dlnaprofile.html b/dashboard-ui/dlnaprofile.html index 999080b6d5..8b4e9d5a5a 100644 --- a/dashboard-ui/dlnaprofile.html +++ b/dashboard-ui/dlnaprofile.html @@ -1,7 +1,7 @@  - DLNA + ${TitleDlna}
@@ -69,11 +69,12 @@

${HeaderDisplaySettings}

+
  • -
    If enabled, all folders are represented in DIDL as "object.container.storageFolder" instead of a more specific type, such as "object.container.person.musicArtist".
    +
    If enabled, all folders are represented in DIDL as "object.container.storageFolder" instead of a more specific type, such as "object.container.musicArtist".
  • @@ -87,6 +88,7 @@

    ${HeaderImageSettings}

    +
    • @@ -125,6 +127,7 @@

      ${HeaderPlaybackSettings}

      +
      • @@ -139,6 +142,29 @@
      +
      +

      ${HeaderServerSettings}

      +
      +

      These values control how Media Browser will present itself to the device.

      +
        +
      • + + +
        Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.
        +
      • +
      • + + +
        Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.
        +
      • +
      • + + +
        Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.
        +
      • +
      +
      +
    @@ -493,10 +519,10 @@

    diff --git a/dashboard-ui/dlnaprofiles.html b/dashboard-ui/dlnaprofiles.html index 02b148bc6b..0fd5ebfdab 100644 --- a/dashboard-ui/dlnaprofiles.html +++ b/dashboard-ui/dlnaprofiles.html @@ -1,7 +1,7 @@  - DLNA + ${TitleDlna}
    diff --git a/dashboard-ui/dlnaserversettings.html b/dashboard-ui/dlnaserversettings.html index 7227cd1191..634e0f34b5 100644 --- a/dashboard-ui/dlnaserversettings.html +++ b/dashboard-ui/dlnaserversettings.html @@ -1,7 +1,7 @@  - DLNA + ${TitleDlna}
    diff --git a/dashboard-ui/dlnasettings.html b/dashboard-ui/dlnasettings.html index 8a0e1f3b13..1b78f8e0b3 100644 --- a/dashboard-ui/dlnasettings.html +++ b/dashboard-ui/dlnasettings.html @@ -1,7 +1,7 @@  - DLNA + ${TitleDlna}
    diff --git a/dashboard-ui/scripts/chromecast.js b/dashboard-ui/scripts/chromecast.js index 4b537b4c9b..41887d2044 100644 --- a/dashboard-ui/scripts/chromecast.js +++ b/dashboard-ui/scripts/chromecast.js @@ -213,7 +213,7 @@ Dashboard.alert({ title: "Error Launching Chromecast", - message: "There was an error launching chromecast. Please ensure your device is connected to your wifi network." + message: "There was an error launching chromecast. Please ensure your device is connected to your wireless network." }); @@ -1377,15 +1377,55 @@ self.getPlayerStateInternal = function () { - return { - itemName: "Chromecast", - canSeek: self.positionTicks < self.runtimeTicks, - positionTicks: self.positionTicks, - runtimeTicks: self.runtimeTicks, - volumeLevel: castPlayer.currentVolume * 100, - isPaused: self.isPaused, - isMuted: self.isMuted + var state = { + PlayState: { + + CanSeek: self.positionTicks < self.runtimeTicks, + PositionTicks: self.positionTicks, + RunTimeTicks: self.runtimeTicks, + VolumeLevel: castPlayer.currentVolume * 100, + IsPaused: self.isPaused, + IsMuted: self.isMuted + + // TODO: Implement + // AudioStreamIndex: null, + // SubtitleStreamIndex: null, + // PlayMethod: 'DirectStream' or 'Transcode' + } }; + + // TODO: Implement + var isPlaying = false; + + if (isPlaying) { + + //state.PlayState.MediaSourceId = 'xxx'; + + state.NowPlayingItem = { + + Name: 'Chromecast' + }; + + var nowPlayingItem = state.NowPlayingItem; + + // TODO: Fill in these properties using chromecast mediainfo and/or custom data + //nowPlayingItem.Id = item.Id; + //nowPlayingItem.MediaType = item.MediaType; + //nowPlayingItem.Type = item.Type; + //nowPlayingItem.Name = item.Name; + + //nowPlayingItem.IndexNumber = item.IndexNumber; + //nowPlayingItem.IndexNumberEnd = item.IndexNumberEnd; + //nowPlayingItem.ParentIndexNumber = item.ParentIndexNumber; + //nowPlayingItem.ProductionYear = item.ProductionYear; + //nowPlayingItem.PremiereDate = item.PremiereDate; + //nowPlayingItem.SeriesName = item.SeriesName; + //nowPlayingItem.Album = item.Album; + //nowPlayingItem.Artists = item.Artists; + + } + + return state; }; } diff --git a/dashboard-ui/scripts/dlnaprofile.js b/dashboard-ui/scripts/dlnaprofile.js index f04b9f5167..44938c5f2a 100644 --- a/dashboard-ui/scripts/dlnaprofile.js +++ b/dashboard-ui/scripts/dlnaprofile.js @@ -67,6 +67,10 @@ $('#chkRequiresPlainFolders', page).checked(profile.RequiresPlainFolders).checkboxradio('refresh'); $('#chkRequiresPlainVideoItems', page).checked(profile.RequiresPlainVideoItems).checkboxradio('refresh'); + $('#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 || []); @@ -674,6 +678,10 @@ profile.IgnoreTranscodeByteRangeRequests = $('#chkIgnoreTranscodeByteRangeRequests', page).checked(); profile.MaxBitrate = $('#txtMaxAllowedBitrate', page).val(); + profile.XDlnaCap = $('#txtXDlnaCap', page).val(); + profile.XDlnaDoc = $('#txtXDlnaDoc', page).val(); + profile.SonyAggregationFlags = $('#txtSonyAggregationFlags', page).val(); + profile.UserId = $('#selectUser', page).val(); } diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js index 644c159477..33e17ddaa7 100644 --- a/dashboard-ui/scripts/mediaplayer.js +++ b/dashboard-ui/scripts/mediaplayer.js @@ -537,29 +537,30 @@ self.getNowPlayingNameHtml = function (playerState) { - var topText = playerState.itemName; + var nowPlayingItem = playerState.NowPlayingItem; + var topText = nowPlayingItem.Name; - if (playerState.mediaType == 'Video') { - if (playerState.indexNumber != null) { - topText = playerState.indexNumber + " - " + topText; + if (nowPlayingItem.MediaType == 'Video') { + if (nowPlayingItem.IndexNumber != null) { + topText = nowPlayingItem.IndexNumber + " - " + topText; } - if (playerState.parentIndexNumber != null) { - topText = playerState.parentIndexNumber + "." + topText; + if (nowPlayingItem.ParentIndexNumber != null) { + topText = nowPlayingItem.ParentIndexNumber + "." + topText; } } var bottomText = ''; - if (playerState.artists && playerState.artists.length) { + if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) { bottomText = topText; - topText = playerState.artists[0]; + topText = nowPlayingItem.Artists[0]; } - else if (playerState.seriesName || playerState.album) { + else if (nowPlayingItem.SeriesName || nowPlayingItem.Album) { bottomText = topText; - topText = playerState.seriesName || playerState.album; + topText = nowPlayingItem.SeriesName || nowPlayingItem.Album; } - else if (playerState.productionYear) { - bottomText = playerState.productionYear; + else if (nowPlayingItem.ProductionYear) { + bottomText = nowPlayingItem.ProductionYear; } return bottomText ? topText + '
    ' + bottomText : topText; @@ -950,67 +951,96 @@ self.getPlayerStateInternal = function (playerElement, item, mediaSource) { - var state = {}; + var state = { + PlayState: {} + }; if (playerElement) { - state.volumeLevel = playerElement.volume * 100; - state.isMuted = playerElement.volume == 0; - state.isPaused = playerElement.paused; - state.positionTicks = self.getCurrentTicks(playerElement); + state.PlayState.VolumeLevel = playerElement.volume * 100; + state.PlayState.IsMuted = playerElement.volume == 0; + state.PlayState.IsPaused = playerElement.paused; + state.PlayState.PositionTicks = self.getCurrentTicks(playerElement); + + var currentSrc = playerElement.currentSrc; + + if (currentSrc) { + + var audioStreamIndex = getParameterByName('AudioStreamIndex', currentSrc); + + if (audioStreamIndex) { + state.PlayState.AudioStreamIndex = parseInt(audioStreamIndex); + } + var subtitleStreamIndex = getParameterByName('SubtitleStreamIndex', currentSrc); + + if (subtitleStreamIndex) { + state.PlayState.SubtitleStreamIndex = parseInt(subtitleStreamIndex); + } + + state.PlayState.PlayMethod = getParameterByName('static', currentSrc) == 'true' ? + 'DirectStream' : + 'Transcode'; + } } if (mediaSource) { - state.mediaSourceId = mediaSource.Id; - state.runtimeTicks = mediaSource.RunTimeTicks; + state.PlayState.MediaSourceId = mediaSource.Id; - state.canSeek = mediaSource.RunTimeTicks && mediaSource.RunTimeTicks > 0; + state.NowPlayingItem = { + RunTimeTicks: mediaSource.RunTimeTicks + }; + + state.PlayState.CanSeek = mediaSource.RunTimeTicks && mediaSource.RunTimeTicks > 0; } if (item) { - state.itemId = item.Id; - state.mediaType = item.MediaType; - state.itemType = item.Type; - state.indexNumber = item.IndexNumber; - state.indexNumberEnd = item.IndexNumberEnd; - state.parentIndexNumber = item.ParentIndexNumber; - state.productionYear = item.ProductionYear; - state.premiereDate = item.PremiereDate; - state.seriesName = item.SeriesName; - state.album = item.Album; - state.itemName = item.Name; - state.artists = item.Artists; + state.NowPlayingItem = state.NowPlayingItem || {}; + var nowPlayingItem = state.NowPlayingItem; + + nowPlayingItem.Id = item.Id; + nowPlayingItem.MediaType = item.MediaType; + nowPlayingItem.Type = item.Type; + nowPlayingItem.Name = item.Name; + + nowPlayingItem.IndexNumber = item.IndexNumber; + nowPlayingItem.IndexNumberEnd = item.IndexNumberEnd; + nowPlayingItem.ParentIndexNumber = item.ParentIndexNumber; + nowPlayingItem.ProductionYear = item.ProductionYear; + nowPlayingItem.PremiereDate = item.PremiereDate; + nowPlayingItem.SeriesName = item.SeriesName; + nowPlayingItem.Album = item.Album; + nowPlayingItem.Artists = item.Artists; var imageTags = item.ImageTags || {}; if (imageTags.Primary) { - state.primaryImageItemId = item.Id; - state.primaryImageTag = imageTags.Primary; + nowPlayingItem.PrimaryImageItemId = item.Id; + nowPlayingItem.PrimaryImageTag = imageTags.Primary; } else if (item.AlbumPrimaryImageTag) { - state.primaryImageItemId = item.AlbumId; - state.primaryImageTag = item.AlbumPrimaryImageTag; + nowPlayingItem.PrimaryImageItemId = item.AlbumId; + nowPlayingItem.PrimaryImageTag = item.AlbumPrimaryImageTag; } else if (item.SeriesPrimaryImageTag) { - state.primaryImageItemId = item.SeriesId; - state.primaryImageTag = item.SeriesPrimaryImageTag; + nowPlayingItem.PrimaryImageItemId = item.SeriesId; + nowPlayingItem.PrimaryImageTag = item.SeriesPrimaryImageTag; } if (item.BackdropImageTags && item.BackdropImageTags.length) { - state.backdropItemId = item.Id; - state.backdropImageTag = item.BackdropImageTags[0]; + nowPlayingItem.BackdropItemId = item.Id; + nowPlayingItem.BackdropImageTag = item.BackdropImageTags[0]; } if (imageTags.Thumb) { - state.thumbItemId = item.Id; - state.thumbImageTag = imageTags.Thumb; + nowPlayingItem.ThumbItemId = item.Id; + nowPlayingItem.ThumbImageTag = imageTags.Thumb; } } @@ -1073,7 +1103,7 @@ var mediaSource = currentMediaSource; ApiClient.reportPlaybackStopped({ - + itemId: item.Id, mediaSourceId: mediaSource.Id, positionTicks: position diff --git a/dashboard-ui/scripts/nowplayingbar.js b/dashboard-ui/scripts/nowplayingbar.js index b64b118988..2d18c829f2 100644 --- a/dashboard-ui/scripts/nowplayingbar.js +++ b/dashboard-ui/scripts/nowplayingbar.js @@ -131,7 +131,8 @@ if (currentPlayer && lastPlayerState) { var newPercent = parseFloat(this.value); - var newPositionTicks = (newPercent / 100) * lastPlayerState.runtimeTicks; + var newPositionTicks = (newPercent / 100) * lastPlayerState.NowPlayingItem.RunTimeTicks; + currentPlayer.seek(Math.floor(newPositionTicks)); } }); @@ -162,7 +163,7 @@ function updatePlayerState(state) { - if (state.itemName) { + if (state.NowPlayingItem) { showNowPlayingBar(); } else { hideNowPlayingBar(); @@ -197,7 +198,9 @@ unmuteButton.prop('disabled', ''); } - if (state.isMuted) { + var playState = state.PlayState || {}; + + if (playState.IsMuted) { hideButton(muteButton); showButton(unmuteButton); @@ -208,7 +211,7 @@ hideButton(unmuteButton); } - if (state.isPaused) { + if (playState.IsPaused) { hideButton(pauseButton); showButton(unpauseButton); @@ -220,16 +223,17 @@ } if (!isVolumeSliderActive) { - volumeSlider.val(state.volumeLevel || 0); + volumeSlider.val(playState.VolumeLevel || 0); } volumeSlider.slider('refresh'); + var nowPlayingItem = state.NowPlayingItem || {}; if (!isPositionSliderActive) { - if (state.canSeek) { + if (playState.CanSeek) { - var pct = state.positionTicks / state.runtimeTicks; + var pct = playState.PositionTicks / nowPlayingItem.RunTimeTicks; pct *= 100; positionSlider.val(pct).slider("enable"); @@ -242,11 +246,11 @@ positionSlider.slider('refresh'); } - var timeText = Dashboard.getDisplayTime(state.positionTicks); + var timeText = Dashboard.getDisplayTime(playState.PositionTicks); - if (state.runtimeTicks) { + if (nowPlayingItem.RunTimeTicks) { - timeText += " / " + Dashboard.getDisplayTime(state.runtimeTicks); + timeText += " / " + Dashboard.getDisplayTime(nowPlayingItem.RunTimeTicks); } @@ -269,37 +273,39 @@ nowPlayingTextElement.html(nameHtml); var url; + + var nowPlayingItem = state.NowPlayingItem; - if (state.primaryImageTag) { + if (nowPlayingItem.PrimaryImageTag) { - url = ApiClient.getImageUrl(state.primaryImageItemId, { + url = ApiClient.getImageUrl(nowPlayingItem.PrimaryImageItemId, { type: "Primary", height: 80, - tag: state.primaryImageTag + tag: nowPlayingItem.PrimaryImageTag }); } - else if (state.backdropImageTag) { + else if (nowPlayingItem.BackdropImageTag) { - url = ApiClient.getImageUrl(state.backdropItemId, { + url = ApiClient.getImageUrl(nowPlayingItem.BackdropItemId, { type: "Backdrop", height: 80, - tag: state.backdropImageTag, + tag: nowPlayingItem.BackdropImageTag, index: 0 }); - } else if (state.thumbImageTag) { + } else if (nowPlayingItem.ThumbImageTag) { - url = ApiClient.getImageUrl(state.thumbImageItemId, { + url = ApiClient.getImageUrl(nowPlayingItem.ThumbImageItemId, { type: "Thumb", height: 80, - tag: state.thumbImageTag + tag: nowPlayingItem.ThumbImageTag }); } - else if (state.itemType == "TvChannel" || state.itemType == "Recording") { + else if (nowPlayingItem.Type == "TvChannel" || nowPlayingItem.Type == "Recording") { url = "css/images/items/detail/tv.png"; } - else if (state.mediaType == "Audio") { + else if (nowPlayingItem.MediaType == "Audio") { url = "css/images/items/detail/audio.png"; } else { @@ -355,7 +361,7 @@ //console.log('nowplaying event: ' + e.type); var player = this; - if (player.isDefaultPlayer && state.mediaType == 'Video') { + if (player.isDefaultPlayer && state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') { return; } diff --git a/dashboard-ui/scripts/remotecontrol.js b/dashboard-ui/scripts/remotecontrol.js index acaef475b9..15dfc6a13b 100644 --- a/dashboard-ui/scripts/remotecontrol.js +++ b/dashboard-ui/scripts/remotecontrol.js @@ -103,7 +103,7 @@ }; self.unMute = function () { - sendCommand('Unmnute'); + sendCommand('Unmute'); }; self.toggleMute = function () { @@ -238,53 +238,7 @@ function getPlayerState(session) { - var state = {}; - - var playerState = session.PlayState; - - if (playerState) { - - state.isMuted = playerState.IsMuted; - state.isPaused = playerState.IsPaused; - state.canSeek = playerState.CanSeek; - state.positionTicks = playerState.PositionTicks || 0; - - state.mediaSource = playerState.MediaSourceId; - state.volumeLevel = playerState.VolumeLevel; - state.audioStreamIndex = playerState.AudioStreamIndex; - state.subtitleStreamIndex = playerState.SubtitleStreamIndex; - } - - var item = session.NowPlayingItem; - - if (item) { - - state.itemId = item.Id; - state.mediaType = item.MediaType; - state.itemType = item.Type; - state.indexNumber = item.IndexNumber; - state.indexNumberEnd = item.IndexNumberEnd; - state.parentIndexNumber = item.ParentIndexNumber; - state.productionYear = item.ProductionYear; - state.premiereDate = item.PremiereDate; - state.seriesName = item.SeriesName; - state.album = item.Album; - state.itemName = item.Name; - state.artists = item.Artists; - - state.primaryImageItemId = item.PrimaryImageItemId; - state.primaryImageTag = item.PrimaryImageTag; - - state.backdropItemId = item.BackdropItemId; - state.backdropImageTag = item.BackdropImageTag; - - state.thumbItemId = item.ThumbItemId; - state.thumbImageTag = item.ThumbImageTag; - - state.runtimeTicks = item.RunTimeTicks; - } - - return state; + return session; } function firePlaybackEvent(name, session) {