1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

update dlna profiles

This commit is contained in:
Luke Pulverenti 2014-04-22 13:25:54 -04:00
parent 5ae3f86d2e
commit d875667650
9 changed files with 193 additions and 129 deletions

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>DLNA</title> <title>${TitleDlna}</title>
</head> </head>
<body> <body>
<div id="dlnaProfilePage" data-role="page" class="page type-interior adminPage dlnaPage"> <div id="dlnaProfilePage" data-role="page" class="page type-interior adminPage dlnaPage">
@ -69,11 +69,12 @@
<div data-role="collapsible"> <div data-role="collapsible">
<h2>${HeaderDisplaySettings}</h2> <h2>${HeaderDisplaySettings}</h2>
<div> <div>
<br />
<ul data-role="listview" class="ulForm"> <ul data-role="listview" class="ulForm">
<li> <li>
<label for="chkRequiresPlainFolders">Display all folders as plain storage folders</label> <label for="chkRequiresPlainFolders">Display all folders as plain storage folders</label>
<input type="checkbox" id="chkRequiresPlainFolders" data-mini="true" /> <input type="checkbox" id="chkRequiresPlainFolders" data-mini="true" />
<div class="fieldDescription">If enabled, all folders are represented in DIDL as "object.container.storageFolder" instead of a more specific type, such as "object.container.person.musicArtist".</div> <div class="fieldDescription">If enabled, all folders are represented in DIDL as "object.container.storageFolder" instead of a more specific type, such as "object.container.musicArtist".</div>
</li> </li>
<li> <li>
<label for="chkRequiresPlainVideoItems">Display all videos as plain video items</label> <label for="chkRequiresPlainVideoItems">Display all videos as plain video items</label>
@ -87,6 +88,7 @@
<div data-role="collapsible"> <div data-role="collapsible">
<h2>${HeaderImageSettings}</h2> <h2>${HeaderImageSettings}</h2>
<div> <div>
<br />
<ul data-role="listview" class="ulForm"> <ul data-role="listview" class="ulForm">
<li> <li>
<label for="chkEnableAlbumArtInDidl">Embed album art in Didl</label> <label for="chkEnableAlbumArtInDidl">Embed album art in Didl</label>
@ -125,6 +127,7 @@
<div data-role="collapsible"> <div data-role="collapsible">
<h2>${HeaderPlaybackSettings}</h2> <h2>${HeaderPlaybackSettings}</h2>
<div> <div>
<br />
<ul data-role="listview" class="ulForm"> <ul data-role="listview" class="ulForm">
<li> <li>
<label for="txtMaxAllowedBitrate">Max bitrate:</label> <label for="txtMaxAllowedBitrate">Max bitrate:</label>
@ -139,6 +142,29 @@
</ul> </ul>
</div> </div>
</div> </div>
<div data-role="collapsible">
<h2>${HeaderServerSettings}</h2>
<div>
<p>These values control how Media Browser will present itself to the device.</p>
<ul data-role="listview" class="ulForm">
<li>
<label for="txtXDlnaCap">X-Dlna cap:</label>
<input type="text" id="txtXDlnaCap" data-mini="true" />
<div class="fieldDescription">Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.</div>
</li>
<li>
<label for="txtXDlnaDoc">X-Dlna doc:</label>
<input type="text" id="txtXDlnaDoc" data-mini="true" />
<div class="fieldDescription">Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.</div>
</li>
<li>
<label for="txtSonyAggregationFlags">Sony aggregation flags:</label>
<input type="text" id="txtSonyAggregationFlags" data-mini="true" />
<div class="fieldDescription">Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.</div>
</li>
</ul>
</div>
</div>
</div> </div>
<div class="tabContent tabIdentification"> <div class="tabContent tabIdentification">
@ -493,10 +519,10 @@
<p> <p>
<button type="submit" data-theme="b" data-icon="check" data-mini="true"> <button type="submit" data-theme="b" data-icon="check" data-mini="true">
Ok ${ButtonOk}
</button> </button>
<button type="button" data-icon="delete" onclick="$(this).parents('.popup').popup('close');" data-mini="true"> <button type="button" data-icon="delete" onclick="$(this).parents('.popup').popup('close');" data-mini="true">
Cancel ${ButtonCancel}
</button> </button>
</p> </p>
</form> </form>

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>DLNA</title> <title>${TitleDlna}</title>
</head> </head>
<body> <body>
<div id="dlnaProfilesPage" data-role="page" class="page type-interior adminPage dlnaPage"> <div id="dlnaProfilesPage" data-role="page" class="page type-interior adminPage dlnaPage">

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>DLNA</title> <title>${TitleDlna}</title>
</head> </head>
<body> <body>
<div id="dlnaServerSettingsPage" data-role="page" class="page type-interior adminPage dlnaPage"> <div id="dlnaServerSettingsPage" data-role="page" class="page type-interior adminPage dlnaPage">

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>DLNA</title> <title>${TitleDlna}</title>
</head> </head>
<body> <body>
<div id="dlnaSettingsPage" data-role="page" class="page type-interior adminPage dlnaPage"> <div id="dlnaSettingsPage" data-role="page" class="page type-interior adminPage dlnaPage">

View file

@ -213,7 +213,7 @@
Dashboard.alert({ Dashboard.alert({
title: "Error Launching Chromecast", 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 () { self.getPlayerStateInternal = function () {
return { var state = {
itemName: "Chromecast", PlayState: {
canSeek: self.positionTicks < self.runtimeTicks,
positionTicks: self.positionTicks, CanSeek: self.positionTicks < self.runtimeTicks,
runtimeTicks: self.runtimeTicks, PositionTicks: self.positionTicks,
volumeLevel: castPlayer.currentVolume * 100, RunTimeTicks: self.runtimeTicks,
isPaused: self.isPaused, VolumeLevel: castPlayer.currentVolume * 100,
isMuted: self.isMuted 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;
}; };
} }

View file

@ -67,6 +67,10 @@
$('#chkRequiresPlainFolders', page).checked(profile.RequiresPlainFolders).checkboxradio('refresh'); $('#chkRequiresPlainFolders', page).checked(profile.RequiresPlainFolders).checkboxradio('refresh');
$('#chkRequiresPlainVideoItems', page).checked(profile.RequiresPlainVideoItems).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.DirectPlayProfiles = (profile.DirectPlayProfiles || []);
profile.TranscodingProfiles = (profile.TranscodingProfiles || []); profile.TranscodingProfiles = (profile.TranscodingProfiles || []);
profile.ContainerProfiles = (profile.ContainerProfiles || []); profile.ContainerProfiles = (profile.ContainerProfiles || []);
@ -674,6 +678,10 @@
profile.IgnoreTranscodeByteRangeRequests = $('#chkIgnoreTranscodeByteRangeRequests', page).checked(); profile.IgnoreTranscodeByteRangeRequests = $('#chkIgnoreTranscodeByteRangeRequests', page).checked();
profile.MaxBitrate = $('#txtMaxAllowedBitrate', page).val(); 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(); profile.UserId = $('#selectUser', page).val();
} }

View file

@ -537,29 +537,30 @@
self.getNowPlayingNameHtml = function (playerState) { self.getNowPlayingNameHtml = function (playerState) {
var topText = playerState.itemName; var nowPlayingItem = playerState.NowPlayingItem;
var topText = nowPlayingItem.Name;
if (playerState.mediaType == 'Video') { if (nowPlayingItem.MediaType == 'Video') {
if (playerState.indexNumber != null) { if (nowPlayingItem.IndexNumber != null) {
topText = playerState.indexNumber + " - " + topText; topText = nowPlayingItem.IndexNumber + " - " + topText;
} }
if (playerState.parentIndexNumber != null) { if (nowPlayingItem.ParentIndexNumber != null) {
topText = playerState.parentIndexNumber + "." + topText; topText = nowPlayingItem.ParentIndexNumber + "." + topText;
} }
} }
var bottomText = ''; var bottomText = '';
if (playerState.artists && playerState.artists.length) { if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) {
bottomText = topText; bottomText = topText;
topText = playerState.artists[0]; topText = nowPlayingItem.Artists[0];
} }
else if (playerState.seriesName || playerState.album) { else if (nowPlayingItem.SeriesName || nowPlayingItem.Album) {
bottomText = topText; bottomText = topText;
topText = playerState.seriesName || playerState.album; topText = nowPlayingItem.SeriesName || nowPlayingItem.Album;
} }
else if (playerState.productionYear) { else if (nowPlayingItem.ProductionYear) {
bottomText = playerState.productionYear; bottomText = nowPlayingItem.ProductionYear;
} }
return bottomText ? topText + '<br/>' + bottomText : topText; return bottomText ? topText + '<br/>' + bottomText : topText;
@ -950,67 +951,96 @@
self.getPlayerStateInternal = function (playerElement, item, mediaSource) { self.getPlayerStateInternal = function (playerElement, item, mediaSource) {
var state = {}; var state = {
PlayState: {}
};
if (playerElement) { if (playerElement) {
state.volumeLevel = playerElement.volume * 100; state.PlayState.VolumeLevel = playerElement.volume * 100;
state.isMuted = playerElement.volume == 0; state.PlayState.IsMuted = playerElement.volume == 0;
state.isPaused = playerElement.paused; state.PlayState.IsPaused = playerElement.paused;
state.positionTicks = self.getCurrentTicks(playerElement); 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) { if (mediaSource) {
state.mediaSourceId = mediaSource.Id; state.PlayState.MediaSourceId = mediaSource.Id;
state.runtimeTicks = mediaSource.RunTimeTicks;
state.canSeek = mediaSource.RunTimeTicks && mediaSource.RunTimeTicks > 0; state.NowPlayingItem = {
RunTimeTicks: mediaSource.RunTimeTicks
};
state.PlayState.CanSeek = mediaSource.RunTimeTicks && mediaSource.RunTimeTicks > 0;
} }
if (item) { if (item) {
state.itemId = item.Id; state.NowPlayingItem = state.NowPlayingItem || {};
state.mediaType = item.MediaType; var nowPlayingItem = state.NowPlayingItem;
state.itemType = item.Type;
state.indexNumber = item.IndexNumber; nowPlayingItem.Id = item.Id;
state.indexNumberEnd = item.IndexNumberEnd; nowPlayingItem.MediaType = item.MediaType;
state.parentIndexNumber = item.ParentIndexNumber; nowPlayingItem.Type = item.Type;
state.productionYear = item.ProductionYear; nowPlayingItem.Name = item.Name;
state.premiereDate = item.PremiereDate;
state.seriesName = item.SeriesName; nowPlayingItem.IndexNumber = item.IndexNumber;
state.album = item.Album; nowPlayingItem.IndexNumberEnd = item.IndexNumberEnd;
state.itemName = item.Name; nowPlayingItem.ParentIndexNumber = item.ParentIndexNumber;
state.artists = item.Artists; nowPlayingItem.ProductionYear = item.ProductionYear;
nowPlayingItem.PremiereDate = item.PremiereDate;
nowPlayingItem.SeriesName = item.SeriesName;
nowPlayingItem.Album = item.Album;
nowPlayingItem.Artists = item.Artists;
var imageTags = item.ImageTags || {}; var imageTags = item.ImageTags || {};
if (imageTags.Primary) { if (imageTags.Primary) {
state.primaryImageItemId = item.Id; nowPlayingItem.PrimaryImageItemId = item.Id;
state.primaryImageTag = imageTags.Primary; nowPlayingItem.PrimaryImageTag = imageTags.Primary;
} }
else if (item.AlbumPrimaryImageTag) { else if (item.AlbumPrimaryImageTag) {
state.primaryImageItemId = item.AlbumId; nowPlayingItem.PrimaryImageItemId = item.AlbumId;
state.primaryImageTag = item.AlbumPrimaryImageTag; nowPlayingItem.PrimaryImageTag = item.AlbumPrimaryImageTag;
} }
else if (item.SeriesPrimaryImageTag) { else if (item.SeriesPrimaryImageTag) {
state.primaryImageItemId = item.SeriesId; nowPlayingItem.PrimaryImageItemId = item.SeriesId;
state.primaryImageTag = item.SeriesPrimaryImageTag; nowPlayingItem.PrimaryImageTag = item.SeriesPrimaryImageTag;
} }
if (item.BackdropImageTags && item.BackdropImageTags.length) { if (item.BackdropImageTags && item.BackdropImageTags.length) {
state.backdropItemId = item.Id; nowPlayingItem.BackdropItemId = item.Id;
state.backdropImageTag = item.BackdropImageTags[0]; nowPlayingItem.BackdropImageTag = item.BackdropImageTags[0];
} }
if (imageTags.Thumb) { if (imageTags.Thumb) {
state.thumbItemId = item.Id; nowPlayingItem.ThumbItemId = item.Id;
state.thumbImageTag = imageTags.Thumb; nowPlayingItem.ThumbImageTag = imageTags.Thumb;
} }
} }
@ -1073,7 +1103,7 @@
var mediaSource = currentMediaSource; var mediaSource = currentMediaSource;
ApiClient.reportPlaybackStopped({ ApiClient.reportPlaybackStopped({
itemId: item.Id, itemId: item.Id,
mediaSourceId: mediaSource.Id, mediaSourceId: mediaSource.Id,
positionTicks: position positionTicks: position

View file

@ -131,7 +131,8 @@
if (currentPlayer && lastPlayerState) { if (currentPlayer && lastPlayerState) {
var newPercent = parseFloat(this.value); var newPercent = parseFloat(this.value);
var newPositionTicks = (newPercent / 100) * lastPlayerState.runtimeTicks; var newPositionTicks = (newPercent / 100) * lastPlayerState.NowPlayingItem.RunTimeTicks;
currentPlayer.seek(Math.floor(newPositionTicks)); currentPlayer.seek(Math.floor(newPositionTicks));
} }
}); });
@ -162,7 +163,7 @@
function updatePlayerState(state) { function updatePlayerState(state) {
if (state.itemName) { if (state.NowPlayingItem) {
showNowPlayingBar(); showNowPlayingBar();
} else { } else {
hideNowPlayingBar(); hideNowPlayingBar();
@ -197,7 +198,9 @@
unmuteButton.prop('disabled', ''); unmuteButton.prop('disabled', '');
} }
if (state.isMuted) { var playState = state.PlayState || {};
if (playState.IsMuted) {
hideButton(muteButton); hideButton(muteButton);
showButton(unmuteButton); showButton(unmuteButton);
@ -208,7 +211,7 @@
hideButton(unmuteButton); hideButton(unmuteButton);
} }
if (state.isPaused) { if (playState.IsPaused) {
hideButton(pauseButton); hideButton(pauseButton);
showButton(unpauseButton); showButton(unpauseButton);
@ -220,16 +223,17 @@
} }
if (!isVolumeSliderActive) { if (!isVolumeSliderActive) {
volumeSlider.val(state.volumeLevel || 0); volumeSlider.val(playState.VolumeLevel || 0);
} }
volumeSlider.slider('refresh'); volumeSlider.slider('refresh');
var nowPlayingItem = state.NowPlayingItem || {};
if (!isPositionSliderActive) { if (!isPositionSliderActive) {
if (state.canSeek) { if (playState.CanSeek) {
var pct = state.positionTicks / state.runtimeTicks; var pct = playState.PositionTicks / nowPlayingItem.RunTimeTicks;
pct *= 100; pct *= 100;
positionSlider.val(pct).slider("enable"); positionSlider.val(pct).slider("enable");
@ -242,11 +246,11 @@
positionSlider.slider('refresh'); 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); nowPlayingTextElement.html(nameHtml);
var url; var url;
var nowPlayingItem = state.NowPlayingItem;
if (state.primaryImageTag) { if (nowPlayingItem.PrimaryImageTag) {
url = ApiClient.getImageUrl(state.primaryImageItemId, { url = ApiClient.getImageUrl(nowPlayingItem.PrimaryImageItemId, {
type: "Primary", type: "Primary",
height: 80, 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", type: "Backdrop",
height: 80, height: 80,
tag: state.backdropImageTag, tag: nowPlayingItem.BackdropImageTag,
index: 0 index: 0
}); });
} else if (state.thumbImageTag) { } else if (nowPlayingItem.ThumbImageTag) {
url = ApiClient.getImageUrl(state.thumbImageItemId, { url = ApiClient.getImageUrl(nowPlayingItem.ThumbImageItemId, {
type: "Thumb", type: "Thumb",
height: 80, 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"; url = "css/images/items/detail/tv.png";
} }
else if (state.mediaType == "Audio") { else if (nowPlayingItem.MediaType == "Audio") {
url = "css/images/items/detail/audio.png"; url = "css/images/items/detail/audio.png";
} }
else { else {
@ -355,7 +361,7 @@
//console.log('nowplaying event: ' + e.type); //console.log('nowplaying event: ' + e.type);
var player = this; var player = this;
if (player.isDefaultPlayer && state.mediaType == 'Video') { if (player.isDefaultPlayer && state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') {
return; return;
} }

View file

@ -103,7 +103,7 @@
}; };
self.unMute = function () { self.unMute = function () {
sendCommand('Unmnute'); sendCommand('Unmute');
}; };
self.toggleMute = function () { self.toggleMute = function () {
@ -238,53 +238,7 @@
function getPlayerState(session) { function getPlayerState(session) {
var state = {}; return session;
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;
} }
function firePlaybackEvent(name, session) { function firePlaybackEvent(name, session) {