added new channel settings

pull/702/head
Luke Pulverenti 10 years ago
parent 20d35a6405
commit 37683565e7

@ -1427,13 +1427,12 @@ namespace MediaBrowser.Api.Playback
}
else if (item is IChannelMediaItem)
{
var channelMediaSources = await ChannelManager.GetChannelItemMediaSources(request.Id, CancellationToken.None).ConfigureAwait(false);
var source = channelMediaSources.First();
var source = await GetChannelMediaInfo(request.Id, CancellationToken.None).ConfigureAwait(false);
state.IsInputVideo = string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase);
state.IsRemote = source.IsRemote;
state.MediaPath = source.Path;
state.RunTimeTicks = item.RunTimeTicks;
mediaStreams = GetMediaStreams(source).ToList();
}
else
{
@ -1479,28 +1478,7 @@ namespace MediaBrowser.Api.Playback
}).ToList();
if (videoRequest != null)
{
if (string.IsNullOrEmpty(videoRequest.VideoCodec))
{
videoRequest.VideoCodec = InferVideoCodec(url);
}
state.VideoStream = GetMediaStream(mediaStreams, videoRequest.VideoStreamIndex, MediaStreamType.Video);
state.SubtitleStream = GetMediaStream(mediaStreams, videoRequest.SubtitleStreamIndex, MediaStreamType.Subtitle, false);
state.AudioStream = GetMediaStream(mediaStreams, videoRequest.AudioStreamIndex, MediaStreamType.Audio);
if (state.VideoStream != null && state.VideoStream.IsInterlaced)
{
state.DeInterlace = true;
}
EnforceResolutionLimit(state, videoRequest);
}
else
{
state.AudioStream = GetMediaStream(mediaStreams, null, MediaStreamType.Audio, true);
}
AttachMediaStreamInfo(state, mediaStreams, videoRequest, url);
state.SegmentLength = state.ReadInputAtNativeFramerate ? 5 : 10;
state.HlsListSize = state.ReadInputAtNativeFramerate ? 100 : 1440;
@ -1538,6 +1516,96 @@ namespace MediaBrowser.Api.Playback
return state;
}
private void AttachMediaStreamInfo(StreamState state,
List<MediaStream> mediaStreams,
VideoStreamRequest videoRequest,
string requestedUrl)
{
if (videoRequest != null)
{
if (string.IsNullOrEmpty(videoRequest.VideoCodec))
{
videoRequest.VideoCodec = InferVideoCodec(requestedUrl);
}
state.VideoStream = GetMediaStream(mediaStreams, videoRequest.VideoStreamIndex, MediaStreamType.Video);
state.SubtitleStream = GetMediaStream(mediaStreams, videoRequest.SubtitleStreamIndex, MediaStreamType.Subtitle, false);
state.AudioStream = GetMediaStream(mediaStreams, videoRequest.AudioStreamIndex, MediaStreamType.Audio);
if (state.VideoStream != null && state.VideoStream.IsInterlaced)
{
state.DeInterlace = true;
}
EnforceResolutionLimit(state, videoRequest);
}
else
{
state.AudioStream = GetMediaStream(mediaStreams, null, MediaStreamType.Audio, true);
}
}
private IEnumerable<MediaStream> GetMediaStreams(ChannelMediaInfo info)
{
var list = new List<MediaStream>();
if (!string.IsNullOrWhiteSpace(info.VideoCodec) &&
!string.IsNullOrWhiteSpace(info.AudioCodec))
{
list.Add(new MediaStream
{
Type = MediaStreamType.Video,
Width = info.Width,
RealFrameRate = info.Framerate,
Profile = info.VideoProfile,
Level = info.VideoLevel,
Index = -1,
Height = info.Height,
Codec = info.VideoCodec,
BitRate = info.VideoBitrate,
AverageFrameRate = info.Framerate
});
list.Add(new MediaStream
{
Type = MediaStreamType.Audio,
Index = -1,
Codec = info.AudioCodec,
BitRate = info.AudioBitrate,
Channels = info.AudioChannels,
SampleRate = info.AudioSampleRate
});
}
return list;
}
private async Task<ChannelMediaInfo> GetChannelMediaInfo(string id, CancellationToken cancellationToken)
{
var channelMediaSources = await ChannelManager.GetChannelItemMediaSources(id, cancellationToken)
.ConfigureAwait(false);
var list = channelMediaSources.ToList();
var preferredWidth = ServerConfigurationManager.Configuration.ChannelOptions.PreferredStreamingWidth;
if (preferredWidth.HasValue)
{
var val = preferredWidth.Value;
return list
.OrderBy(i => Math.Abs(i.Width ?? 0 - val))
.ThenByDescending(i => i.Width ?? 0)
.ThenBy(list.IndexOf)
.First();
}
return list
.OrderByDescending(i => i.Width ?? 0)
.ThenBy(list.IndexOf)
.First();
}
private bool CanStreamCopyVideo(VideoStreamRequest request, MediaStream videoStream)
{
if (videoStream.IsInterlaced)

@ -170,7 +170,7 @@ namespace MediaBrowser.Common.Implementations.Updates
// Let dev users get results more often for testing purposes
var cacheLength = _config.CommonConfiguration.SystemUpdateLevel == PackageVersionClass.Dev
? TimeSpan.FromMinutes(3)
: TimeSpan.FromHours(4);
: TimeSpan.FromHours(6);
if ((DateTime.UtcNow - _lastPackageListResult.Item2) < cacheLength)
{

@ -17,9 +17,14 @@ namespace MediaBrowser.Controller.Channels
public int? Width { get; set; }
public int? Height { get; set; }
public int? AudioChannels { get; set; }
public int? AudioSampleRate { get; set; }
public bool IsRemote { get; set; }
public string VideoProfile { get; set; }
public float? VideoLevel { get; set; }
public float? Framerate { get; set; }
public ChannelMediaInfo()
{
RequiredHttpHeaders = new Dictionary<string, string>();

@ -218,7 +218,7 @@ namespace MediaBrowser.Model.ApiClient
/// </summary>
/// <param name="itemId">The item identifier.</param>
/// <returns>Task{BaseItemDto[]}.</returns>
Task<BaseItemDto[]> GetAdditionalParts(string itemId, string userId);
Task<ItemsResult> GetAdditionalParts(string itemId, string userId);
/// <summary>
/// Gets the users async.
@ -443,8 +443,9 @@ namespace MediaBrowser.Model.ApiClient
/// <summary>
/// Gets the system status async.
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{SystemInfo}.</returns>
Task<SystemInfo> GetSystemInfoAsync();
Task<SystemInfo> GetSystemInfoAsync(CancellationToken cancellationToken);
/// <summary>
/// Gets a person

@ -226,6 +226,8 @@ namespace MediaBrowser.Model.Configuration
[Obsolete]
public string[] ManualLoginClients { get; set; }
public ChannelOptions ChannelOptions { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="ServerConfiguration" /> class.
/// </summary>
@ -293,6 +295,13 @@ namespace MediaBrowser.Model.Configuration
NotificationOptions = new NotificationOptions();
SubtitleOptions = new SubtitleOptions();
ChannelOptions = new ChannelOptions();
}
}
public class ChannelOptions
{
public int? PreferredStreamingWidth { get; set; }
}
}

@ -2,6 +2,9 @@
namespace MediaBrowser.Model.Extensions
{
/// <summary>
/// Isolating these helpers allow this entire project to be easily converted to Java
/// </summary>
public static class DoubleHelper
{
/// <summary>

@ -2,6 +2,9 @@
namespace MediaBrowser.Model.Extensions
{
/// <summary>
/// Isolating these helpers allow this entire project to be easily converted to Java
/// </summary>
public static class IntHelper
{
/// <summary>

@ -3,6 +3,9 @@ using System.Globalization;
namespace MediaBrowser.Model.Extensions
{
/// <summary>
/// Isolating these helpers allow this entire project to be easily converted to Java
/// </summary>
public static class StringHelper
{
/// <summary>

@ -1,5 +1,4 @@
using System.Globalization;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
@ -519,7 +518,7 @@ namespace MediaBrowser.Server.Implementations.Channels
{
// Increment this as needed to force new downloads
// Incorporate Name because it's being used to convert channel entity to provider
return externalId + (channelProvider.DataVersion ?? string.Empty) + (channelProvider.Name ?? string.Empty) + "13";
return externalId + (channelProvider.DataVersion ?? string.Empty) + (channelProvider.Name ?? string.Empty) + "14";
}
private async Task<BaseItem> GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Channel internalChannel, CancellationToken cancellationToken)

@ -1171,7 +1171,12 @@ namespace MediaBrowser.Server.Implementations.Dto
LocationType = item.LocationType,
Name = item.Name,
Path = GetMappedPath(item),
MediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery { ItemId = item.Id }).ToList(),
MediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery
{
ItemId = item.Id
}).ToList(),
RunTimeTicks = item.RunTimeTicks
}
};

@ -563,6 +563,7 @@
"LabelDefaultUser": "Default user:",
"LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles.",
"TitleDlna": "DLNA",
"TitleChannels": "Channels",
"HeaderServerSettings": "Server Settings",
"LabelWeatherDisplayLocation": "Weather display location:",
"LabelWeatherDisplayLocationHelp": "US zip code / City, State, Country / City, Country",
@ -796,5 +797,8 @@
"HeaderWelcomeToMediaBrowserWebClient": "Welcome to the Media Browser Web Client",
"ButtonDismiss": "Dismiss",
"MessageLearnHowToCustomize": "Learn how to customize this page to your own personal tastes. Click your user icon in the top right corner of the screen to view and update your preferences.",
"ButtonEditOtherUserPreferences": "Edit this user's personal preferences."
"ButtonEditOtherUserPreferences": "Edit this user's personal preferences.",
"ChannelStreamOptionBestAvailable": "Best available",
"LabelChannelStreamOptionBestAvailable": "Preferred streaming quality:",
"LabelChannelStreamOptionBestAvailableHelp": "Determines the selected quality when channel content is available in multiple resolutions."
}

@ -539,6 +539,7 @@ namespace MediaBrowser.WebDashboard.Api
"autoorganizelog.js",
"channels.js",
"channelitems.js",
"channelsettings.js",
"dashboardgeneral.js",
"dashboardinfo.js",
"dashboardpage.js",

@ -103,6 +103,9 @@
<Content Include="dashboard-ui\channels.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\channelsettings.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\css\chromecast.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@ -613,6 +616,9 @@
<Content Include="dashboard-ui\scripts\channels.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\scripts\channelsettings.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\scripts\chromecast.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common.Internal</id>
<version>3.0.388</version>
<version>3.0.391</version>
<title>MediaBrowser.Common.Internal</title>
<authors>Luke</authors>
<owners>ebr,Luke,scottisafool</owners>
@ -12,7 +12,7 @@
<description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
<dependency id="MediaBrowser.Common" version="3.0.388" />
<dependency id="MediaBrowser.Common" version="3.0.391" />
<dependency id="NLog" version="2.1.0" />
<dependency id="SimpleInjector" version="2.5.0" />
<dependency id="sharpcompress" version="0.10.2" />

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common</id>
<version>3.0.388</version>
<version>3.0.391</version>
<title>MediaBrowser.Common</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Server.Core</id>
<version>3.0.388</version>
<version>3.0.391</version>
<title>Media Browser.Server.Core</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>
@ -12,7 +12,7 @@
<description>Contains core components required to build plugins for Media Browser Server.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
<dependency id="MediaBrowser.Common" version="3.0.388" />
<dependency id="MediaBrowser.Common" version="3.0.391" />
</dependencies>
</metadata>
<files>

Loading…
Cancel
Save