support channels with dlna

This commit is contained in:
Luke Pulverenti 2014-07-29 23:31:35 -04:00
parent 063675bb07
commit 51e964dae3
93 changed files with 957 additions and 326 deletions

View File

@ -626,7 +626,7 @@ namespace MediaBrowser.Api.Playback
/// <param name="state">The state.</param> /// <param name="state">The state.</param>
/// <param name="outputVideoCodec">The output video codec.</param> /// <param name="outputVideoCodec">The output video codec.</param>
/// <returns>System.String.</returns> /// <returns>System.String.</returns>
protected string GetInternalGraphicalSubtitleParam(StreamState state, string outputVideoCodec) protected string GetGraphicalSubtitleParam(StreamState state, string outputVideoCodec)
{ {
var outputSizeParam = string.Empty; var outputSizeParam = string.Empty;

View File

@ -522,7 +522,7 @@ namespace MediaBrowser.Api.Playback.Hls
// This is for internal graphical subs // This is for internal graphical subs
if (hasGraphicalSubs) if (hasGraphicalSubs)
{ {
args += GetInternalGraphicalSubtitleParam(state, codec); args += GetGraphicalSubtitleParam(state, codec);
} }
return args; return args;

View File

@ -186,7 +186,7 @@ namespace MediaBrowser.Api.Playback.Hls
// This is for internal graphical subs // This is for internal graphical subs
if (hasGraphicalSubs) if (hasGraphicalSubs)
{ {
args += GetInternalGraphicalSubtitleParam(state, codec); args += GetGraphicalSubtitleParam(state, codec);
} }
return args; return args;

View File

@ -167,7 +167,7 @@ namespace MediaBrowser.Api.Playback.Progressive
// This is for internal graphical subs // This is for internal graphical subs
if (hasGraphicalSubs) if (hasGraphicalSubs)
{ {
args += GetInternalGraphicalSubtitleParam(state, codec); args += GetGraphicalSubtitleParam(state, codec);
} }
return args; return args;

View File

@ -94,7 +94,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
public bool IsHidden public bool IsHidden
{ {
get { return false; } get { return true; }
} }
public bool IsEnabled public bool IsEnabled

View File

@ -10,12 +10,6 @@ namespace MediaBrowser.Common.Net
/// </summary> /// </summary>
public interface IServerManager : IDisposable public interface IServerManager : IDisposable
{ {
/// <summary>
/// Gets the web socket port number.
/// </summary>
/// <value>The web socket port number.</value>
int WebSocketPortNumber { get; }
/// <summary> /// <summary>
/// Starts this instance. /// Starts this instance.
/// </summary> /// </summary>

View File

@ -43,6 +43,14 @@ namespace MediaBrowser.Controller.Channels
/// <returns>Channel.</returns> /// <returns>Channel.</returns>
Channel GetChannel(string id); Channel GetChannel(string id);
/// <summary>
/// Gets the channels internal.
/// </summary>
/// <param name="query">The query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task&lt;QueryResult&lt;Channel&gt;&gt;.</returns>
Task<QueryResult<Channel>> GetChannelsInternal(ChannelQuery query, CancellationToken cancellationToken);
/// <summary> /// <summary>
/// Gets the channels. /// Gets the channels.
/// </summary> /// </summary>
@ -75,6 +83,14 @@ namespace MediaBrowser.Controller.Channels
/// <returns>Task{QueryResult{BaseItemDto}}.</returns> /// <returns>Task{QueryResult{BaseItemDto}}.</returns>
Task<QueryResult<BaseItemDto>> GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken); Task<QueryResult<BaseItemDto>> GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken);
/// <summary>
/// Gets the channel items internal.
/// </summary>
/// <param name="query">The query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task&lt;QueryResult&lt;BaseItem&gt;&gt;.</returns>
Task<QueryResult<BaseItem>> GetChannelItemsInternal(ChannelItemQuery query, CancellationToken cancellationToken);
/// <summary> /// <summary>
/// Gets the cached channel item media sources. /// Gets the cached channel item media sources.
/// </summary> /// </summary>

View File

@ -14,7 +14,7 @@ namespace MediaBrowser.Controller.Entities
public virtual string CollectionType public virtual string CollectionType
{ {
get { return Model.Entities.CollectionType.BoxSets; } get { return null; }
} }
} }
} }

View File

@ -1,6 +1,7 @@
using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MoreLinq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -29,6 +30,10 @@ namespace MediaBrowser.Controller.Entities
case CollectionType.Trailers: case CollectionType.Trailers:
return mediaFolders.SelectMany(i => i.GetRecursiveChildren(user, includeLinkedChildren)) return mediaFolders.SelectMany(i => i.GetRecursiveChildren(user, includeLinkedChildren))
.OfType<Trailer>(); .OfType<Trailer>();
case CollectionType.Movies:
return mediaFolders.SelectMany(i => i.GetRecursiveChildren(user, includeLinkedChildren))
.Where(i => i is Movie || i is BoxSet)
.DistinctBy(i => i.Id);
default: default:
return mediaFolders.SelectMany(i => i.GetChildren(user, includeLinkedChildren)); return mediaFolders.SelectMany(i => i.GetChildren(user, includeLinkedChildren));
} }
@ -70,4 +75,30 @@ namespace MediaBrowser.Controller.Entities
return standaloneTypes.Contains(collectionFolder.CollectionType ?? string.Empty); return standaloneTypes.Contains(collectionFolder.CollectionType ?? string.Empty);
} }
} }
public class SpecialFolder : Folder
{
public SpecialFolderType SpecialFolderType { get; set; }
public string ItemTypeName { get; set; }
public string ParentId { get; set; }
public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren)
{
var parent = (Folder)LibraryManager.GetItemById(new Guid(ParentId));
if (SpecialFolderType == SpecialFolderType.ItemsByType)
{
var items = parent.GetRecursiveChildren(user, includeLinkedChildren);
return items.Where(i => string.Equals(i.GetType().Name, ItemTypeName, StringComparison.OrdinalIgnoreCase));
}
return new List<BaseItem>();
}
}
public enum SpecialFolderType
{
ItemsByType = 1
}
} }

View File

@ -8,6 +8,7 @@ using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using MediaBrowser.Model.Logging;
namespace MediaBrowser.Controller.Library namespace MediaBrowser.Controller.Library
{ {
@ -136,6 +137,16 @@ namespace MediaBrowser.Controller.Library
return val; return val;
} }
if (filename.StartsWith("s", StringComparison.OrdinalIgnoreCase))
{
var testFilename = filename.Substring(1);
if (int.TryParse(testFilename, NumberStyles.Integer, CultureInfo.InvariantCulture, out val))
{
return val;
}
}
// Look for one of the season folder names // Look for one of the season folder names
foreach (var name in SeasonFolderNames) foreach (var name in SeasonFolderNames)
{ {
@ -182,7 +193,7 @@ namespace MediaBrowser.Controller.Library
return null; return null;
} }
return int.Parse(path.Substring(numericStart, length)); return int.Parse(path.Substring(numericStart, length), CultureInfo.InvariantCulture);
} }
/// <summary> /// <summary>
@ -194,21 +205,59 @@ namespace MediaBrowser.Controller.Library
/// <returns><c>true</c> if [is season folder] [the specified path]; otherwise, <c>false</c>.</returns> /// <returns><c>true</c> if [is season folder] [the specified path]; otherwise, <c>false</c>.</returns>
private static bool IsSeasonFolder(string path, IDirectoryService directoryService, IFileSystem fileSystem) private static bool IsSeasonFolder(string path, IDirectoryService directoryService, IFileSystem fileSystem)
{ {
var seasonNumber = GetSeasonNumberFromPath(path);
var hasSeasonNumber = seasonNumber != null;
if (!hasSeasonNumber)
{
return false;
}
// It's a season folder if it's named as such and does not contain any audio files, apart from theme.mp3 // It's a season folder if it's named as such and does not contain any audio files, apart from theme.mp3
return GetSeasonNumberFromPath(path) != null && foreach (var fileSystemInfo in directoryService.GetFileSystemEntries(path))
!directoryService.GetFiles(path) {
.Any(i => EntityResolutionHelper.IsAudioFile(i.FullName) && !string.Equals(fileSystem.GetFileNameWithoutExtension(i), BaseItem.ThemeSongFilename)); var attributes = fileSystemInfo.Attributes;
if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
{
continue;
}
if ((attributes & FileAttributes.System) == FileAttributes.System)
{
continue;
}
if ((attributes & FileAttributes.Directory) == FileAttributes.Directory)
{
//if (IsBadFolder(fileSystemInfo.Name))
//{
// return false;
//}
}
else
{
if (EntityResolutionHelper.IsAudioFile(fileSystemInfo.FullName) &&
!string.Equals(fileSystem.GetFileNameWithoutExtension(fileSystemInfo), BaseItem.ThemeSongFilename))
{
return false;
}
}
}
return true;
} }
/// <summary> /// <summary>
/// Determines whether [is series folder] [the specified path]. /// Determines whether [is series folder] [the specified path].
/// </summary> /// </summary>
/// <param name="path">The path.</param> /// <param name="path">The path.</param>
/// <param name="considerSeasonlessSeries">if set to <c>true</c> [consider seasonless series].</param> /// <param name="considerSeasonlessEntries">if set to <c>true</c> [consider seasonless entries].</param>
/// <param name="fileSystemChildren">The file system children.</param> /// <param name="fileSystemChildren">The file system children.</param>
/// <param name="directoryService">The directory service.</param> /// <param name="directoryService">The directory service.</param>
/// <param name="fileSystem">The file system.</param>
/// <returns><c>true</c> if [is series folder] [the specified path]; otherwise, <c>false</c>.</returns> /// <returns><c>true</c> if [is series folder] [the specified path]; otherwise, <c>false</c>.</returns>
public static bool IsSeriesFolder(string path, bool considerSeasonlessSeries, IEnumerable<FileSystemInfo> fileSystemChildren, IDirectoryService directoryService, IFileSystem fileSystem) public static bool IsSeriesFolder(string path, bool considerSeasonlessEntries, IEnumerable<FileSystemInfo> fileSystemChildren, IDirectoryService directoryService, IFileSystem fileSystem, ILogger logger)
{ {
// A folder with more than 3 non-season folders in will not becounted as a series // A folder with more than 3 non-season folders in will not becounted as a series
var nonSeriesFolders = 0; var nonSeriesFolders = 0;
@ -231,15 +280,20 @@ namespace MediaBrowser.Controller.Library
{ {
if (IsSeasonFolder(child.FullName, directoryService, fileSystem)) if (IsSeasonFolder(child.FullName, directoryService, fileSystem))
{ {
logger.Debug("{0} is a series because of season folder {1}.", path, child.FullName);
return true; return true;
} }
if (!EntityResolutionHelper.IgnoreFolders.Contains(child.Name, StringComparer.OrdinalIgnoreCase))
if (IsBadFolder(child.Name))
{ {
logger.Debug("Invalid folder under series: {0}", child.FullName);
nonSeriesFolders++; nonSeriesFolders++;
} }
if (nonSeriesFolders >= 3) if (nonSeriesFolders >= 3)
{ {
logger.Debug("{0} not a series due to 3 or more invalid folders.", path);
return false; return false;
} }
} }
@ -249,7 +303,7 @@ namespace MediaBrowser.Controller.Library
if (EntityResolutionHelper.IsVideoFile(fullName) || EntityResolutionHelper.IsVideoPlaceHolder(fullName)) if (EntityResolutionHelper.IsVideoFile(fullName) || EntityResolutionHelper.IsVideoPlaceHolder(fullName))
{ {
if (GetEpisodeNumberFromFile(fullName, considerSeasonlessSeries).HasValue) if (GetEpisodeNumberFromFile(fullName, considerSeasonlessEntries).HasValue)
{ {
return true; return true;
} }
@ -257,9 +311,28 @@ namespace MediaBrowser.Controller.Library
} }
} }
logger.Debug("{0} is not a series folder.", path);
return false; return false;
} }
private static bool IsBadFolder(string name)
{
if (string.Equals(name, BaseItem.ThemeSongsFolderName, StringComparison.OrdinalIgnoreCase))
{
return false;
}
if (string.Equals(name, BaseItem.ThemeVideosFolderName, StringComparison.OrdinalIgnoreCase))
{
return false;
}
if (string.Equals(name, BaseItem.TrailerFolderName, StringComparison.OrdinalIgnoreCase))
{
return false;
}
return !EntityResolutionHelper.IgnoreFolders.Contains(name, StringComparer.OrdinalIgnoreCase);
}
/// <summary> /// <summary>
/// Episodes the number from file. /// Episodes the number from file.
/// </summary> /// </summary>

View File

@ -45,7 +45,7 @@ namespace MediaBrowser.Dlna.Channels
_localServersLookup = localServersLookup; _localServersLookup = localServersLookup;
_deviceDiscovery = deviceDiscovery; _deviceDiscovery = deviceDiscovery;
deviceDiscovery.DeviceDiscovered += deviceDiscovery_DeviceDiscovered; //deviceDiscovery.DeviceDiscovered += deviceDiscovery_DeviceDiscovered;
deviceDiscovery.DeviceLeft += deviceDiscovery_DeviceLeft; deviceDiscovery.DeviceLeft += deviceDiscovery_DeviceLeft;
} }
@ -196,25 +196,16 @@ namespace MediaBrowser.Dlna.Channels
public class ServerChannel : IChannel, IFactoryChannel public class ServerChannel : IChannel, IFactoryChannel
{ {
private readonly List<Device> _servers = new List<Device>();
private readonly IHttpClient _httpClient; private readonly IHttpClient _httpClient;
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly string _controlUrl; public string ControlUrl { get; set; }
public List<Device> Servers { get; set; }
/// <summary> public ServerChannel(IHttpClient httpClient, ILogger logger)
/// Prevents core from throwing an exception
/// </summary>
public ServerChannel()
{ {
}
public ServerChannel(List<Device> servers, IHttpClient httpClient, ILogger logger, string controlUrl)
{
_servers = servers;
_httpClient = httpClient; _httpClient = httpClient;
_logger = logger; _logger = logger;
_controlUrl = controlUrl; Servers = new List<Device>();
} }
public string Name public string Name
@ -272,7 +263,7 @@ namespace MediaBrowser.Dlna.Channels
if (string.IsNullOrWhiteSpace(query.FolderId)) if (string.IsNullOrWhiteSpace(query.FolderId))
{ {
items = _servers.Select(i => new ChannelItemInfo items = Servers.Select(i => new ChannelItemInfo
{ {
FolderType = ChannelFolderType.Container, FolderType = ChannelFolderType.Container,
Id = GetServerId(i), Id = GetServerId(i),
@ -291,7 +282,7 @@ namespace MediaBrowser.Dlna.Channels
Limit = query.Limit, Limit = query.Limit,
StartIndex = query.StartIndex, StartIndex = query.StartIndex,
ParentId = folderId, ParentId = folderId,
ContentDirectoryUrl = _controlUrl ContentDirectoryUrl = ControlUrl
}, cancellationToken).ConfigureAwait(false); }, cancellationToken).ConfigureAwait(false);

View File

@ -1,4 +1,5 @@
using MediaBrowser.Common.Net; using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Dlna; using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Drawing;
@ -21,6 +22,8 @@ namespace MediaBrowser.Dlna.ContentDirectory
private readonly IDlnaManager _dlna; private readonly IDlnaManager _dlna;
private readonly IServerConfigurationManager _config; private readonly IServerConfigurationManager _config;
private readonly IUserManager _userManager; private readonly IUserManager _userManager;
private readonly IUserViewManager _userViewManager;
private readonly IChannelManager _channelManager;
public ContentDirectory(IDlnaManager dlna, public ContentDirectory(IDlnaManager dlna,
IUserDataManager userDataManager, IUserDataManager userDataManager,
@ -29,7 +32,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
IServerConfigurationManager config, IServerConfigurationManager config,
IUserManager userManager, IUserManager userManager,
ILogger logger, ILogger logger,
IHttpClient httpClient) IHttpClient httpClient, IUserViewManager userViewManager, IChannelManager channelManager)
: base(logger, httpClient) : base(logger, httpClient)
{ {
_dlna = dlna; _dlna = dlna;
@ -38,6 +41,8 @@ namespace MediaBrowser.Dlna.ContentDirectory
_libraryManager = libraryManager; _libraryManager = libraryManager;
_config = config; _config = config;
_userManager = userManager; _userManager = userManager;
_userViewManager = userViewManager;
_channelManager = channelManager;
} }
private int SystemUpdateId private int SystemUpdateId
@ -73,7 +78,9 @@ namespace MediaBrowser.Dlna.ContentDirectory
_userDataManager, _userDataManager,
user, user,
SystemUpdateId, SystemUpdateId,
_config) _config,
_userViewManager,
_channelManager)
.ProcessControlRequest(request); .ProcessControlRequest(request);
} }

View File

@ -1,4 +1,5 @@
using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
@ -9,8 +10,10 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Dlna.Didl; using MediaBrowser.Dlna.Didl;
using MediaBrowser.Dlna.Server; using MediaBrowser.Dlna.Server;
using MediaBrowser.Dlna.Service; using MediaBrowser.Dlna.Service;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Library;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Querying; using MediaBrowser.Model.Querying;
using System; using System;
@ -19,6 +22,7 @@ using System.Globalization;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks;
using System.Xml; using System.Xml;
namespace MediaBrowser.Dlna.ContentDirectory namespace MediaBrowser.Dlna.ContentDirectory
@ -40,14 +44,18 @@ namespace MediaBrowser.Dlna.ContentDirectory
private readonly DidlBuilder _didlBuilder; private readonly DidlBuilder _didlBuilder;
private readonly DeviceProfile _profile; private readonly DeviceProfile _profile;
private readonly IUserViewManager _userViewManager;
private readonly IChannelManager _channelManager;
public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config) public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config, IUserViewManager userViewManager, IChannelManager channelManager)
: base(config, logger) : base(config, logger)
{ {
_libraryManager = libraryManager; _libraryManager = libraryManager;
_userDataManager = userDataManager; _userDataManager = userDataManager;
_user = user; _user = user;
_systemUpdateId = systemUpdateId; _systemUpdateId = systemUpdateId;
_userViewManager = userViewManager;
_channelManager = channelManager;
_profile = profile; _profile = profile;
_didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress); _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress);
@ -69,7 +77,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
return HandleGetSystemUpdateID(); return HandleGetSystemUpdateID();
if (string.Equals(methodName, "Browse", StringComparison.OrdinalIgnoreCase)) if (string.Equals(methodName, "Browse", StringComparison.OrdinalIgnoreCase))
return HandleBrowse(methodParams, user, deviceId); return HandleBrowse(methodParams, user, deviceId).Result;
if (string.Equals(methodName, "X_GetFeatureList", StringComparison.OrdinalIgnoreCase)) if (string.Equals(methodName, "X_GetFeatureList", StringComparison.OrdinalIgnoreCase))
return HandleXGetFeatureList(); return HandleXGetFeatureList();
@ -78,7 +86,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
return HandleXSetBookmark(methodParams, user); return HandleXSetBookmark(methodParams, user);
if (string.Equals(methodName, "Search", StringComparison.OrdinalIgnoreCase)) if (string.Equals(methodName, "Search", StringComparison.OrdinalIgnoreCase))
return HandleSearch(methodParams, user, deviceId); return HandleSearch(methodParams, user, deviceId).Result;
throw new ResourceNotFoundException("Unexpected control request name: " + methodName); throw new ResourceNotFoundException("Unexpected control request name: " + methodName);
} }
@ -141,7 +149,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
return builder.ToString(); return builder.ToString();
} }
private IEnumerable<KeyValuePair<string, string>> HandleBrowse(Headers sparams, User user, string deviceId) private async Task<IEnumerable<KeyValuePair<string, string>>> HandleBrowse(Headers sparams, User user, string deviceId)
{ {
var id = sparams["ObjectID"]; var id = sparams["ObjectID"];
var flag = sparams["BrowseFlag"]; var flag = sparams["BrowseFlag"];
@ -149,16 +157,20 @@ namespace MediaBrowser.Dlna.ContentDirectory
var sortCriteria = new SortCriteria(sparams.GetValueOrDefault("SortCriteria", "")); var sortCriteria = new SortCriteria(sparams.GetValueOrDefault("SortCriteria", ""));
var provided = 0; var provided = 0;
var requested = 0;
var start = 0;
if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requested) && requested <= 0) int? requested = 0;
int? start = 0;
int requestedVal;
if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requestedVal) && requestedVal > 0)
{ {
requested = 0; requested = requestedVal;
} }
if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out start) && start <= 0)
int startVal;
if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out startVal) && startVal > 0)
{ {
start = 0; start = startVal;
} }
//var root = GetItem(id) as IMediaFolder; //var root = GetItem(id) as IMediaFolder;
@ -173,34 +185,26 @@ namespace MediaBrowser.Dlna.ContentDirectory
var folder = (Folder)GetItemFromObjectId(id, user); var folder = (Folder)GetItemFromObjectId(id, user);
var children = GetChildrenSorted(folder, user, sortCriteria).ToList(); var childrenResult = (await GetChildrenSorted(folder, user, sortCriteria, start, requested).ConfigureAwait(false));
var totalCount = children.Count; var totalCount = childrenResult.TotalRecordCount;
if (string.Equals(flag, "BrowseMetadata")) if (string.Equals(flag, "BrowseMetadata"))
{ {
result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, folder, children.Count, filter)); result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, folder, totalCount, filter));
provided++; provided++;
} }
else else
{ {
if (start > 0) provided = childrenResult.Items.Length;
{
children = children.Skip(start).ToList();
}
if (requested > 0)
{
children = children.Take(requested).ToList();
}
provided = children.Count; foreach (var i in childrenResult.Items)
foreach (var i in children)
{ {
if (i.IsFolder) if (i.IsFolder)
{ {
var f = (Folder)i; var f = (Folder)i;
var childCount = GetChildrenSorted(f, user, sortCriteria).Count(); var childCount = (await GetChildrenSorted(f, user, sortCriteria, null, 0).ConfigureAwait(false))
.TotalRecordCount;
result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, f, childCount, filter)); result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, f, childCount, filter));
} }
@ -222,7 +226,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
}; };
} }
private IEnumerable<KeyValuePair<string, string>> HandleSearch(Headers sparams, User user, string deviceId) private async Task<IEnumerable<KeyValuePair<string, string>>> HandleSearch(Headers sparams, User user, string deviceId)
{ {
var searchCriteria = new SearchCriteria(sparams.GetValueOrDefault("SearchCriteria", "")); var searchCriteria = new SearchCriteria(sparams.GetValueOrDefault("SearchCriteria", ""));
var sortCriteria = new SortCriteria(sparams.GetValueOrDefault("SortCriteria", "")); var sortCriteria = new SortCriteria(sparams.GetValueOrDefault("SortCriteria", ""));
@ -230,16 +234,19 @@ namespace MediaBrowser.Dlna.ContentDirectory
// sort example: dc:title, dc:date // sort example: dc:title, dc:date
var requested = 0; int? requested = 0;
var start = 0; int? start = 0;
if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requested) && requested <= 0) int requestedVal;
if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requestedVal) && requestedVal > 0)
{ {
requested = 0; requested = requestedVal;
} }
if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out start) && start <= 0)
int startVal;
if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out startVal) && startVal > 0)
{ {
start = 0; start = startVal;
} }
//var root = GetItem(id) as IMediaFolder; //var root = GetItem(id) as IMediaFolder;
@ -259,27 +266,19 @@ namespace MediaBrowser.Dlna.ContentDirectory
var folder = (Folder)GetItemFromObjectId(sparams["ContainerID"], user); var folder = (Folder)GetItemFromObjectId(sparams["ContainerID"], user);
var children = GetChildrenSorted(folder, user, searchCriteria, sortCriteria).ToList(); var childrenResult = (await GetChildrenSorted(folder, user, searchCriteria, sortCriteria, start, requested).ConfigureAwait(false));
var totalCount = children.Count; var totalCount = childrenResult.TotalRecordCount;
if (start > 0) var provided = childrenResult.Items.Length;
{
children = children.Skip(start).ToList();
}
if (requested > 0)
{
children = children.Take(requested).ToList();
}
var provided = children.Count; foreach (var i in childrenResult.Items)
foreach (var i in children)
{ {
if (i.IsFolder) if (i.IsFolder)
{ {
var f = (Folder)i; var f = (Folder)i;
var childCount = GetChildrenSorted(f, user, searchCriteria, sortCriteria).Count(); var childCount = (await GetChildrenSorted(f, user, searchCriteria, sortCriteria, null, 0).ConfigureAwait(false))
.TotalRecordCount;
result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, f, childCount, filter)); result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, f, childCount, filter));
} }
@ -300,15 +299,16 @@ namespace MediaBrowser.Dlna.ContentDirectory
}; };
} }
private IEnumerable<BaseItem> GetChildrenSorted(Folder folder, User user, SearchCriteria search, SortCriteria sort) private async Task<QueryResult<BaseItem>> GetChildrenSorted(Folder folder, User user, SearchCriteria search, SortCriteria sort, int? startIndex, int? limit)
{ {
if (search.SearchType == SearchType.Unknown) if (search.SearchType == SearchType.Unknown)
{ {
return GetChildrenSorted(folder, user, sort); return await GetChildrenSorted(folder, user, sort, startIndex, limit).ConfigureAwait(false);
} }
var items = folder.GetRecursiveChildren(user); var result = await GetChildrenSorted(folder, user, sort, null, null).ConfigureAwait(false);
items = FilterUnsupportedContent(items);
var items = FilterUnsupportedContent(result.Items);
if (search.SearchType == SearchType.Audio) if (search.SearchType == SearchType.Audio)
{ {
@ -324,12 +324,123 @@ namespace MediaBrowser.Dlna.ContentDirectory
} }
else if (search.SearchType == SearchType.Playlist) else if (search.SearchType == SearchType.Playlist)
{ {
} }
return SortItems(items, user, sort); items = SortItems(items, user, sort);
return ToResult(items, startIndex, limit);
} }
private IEnumerable<BaseItem> GetChildrenSorted(Folder folder, User user, SortCriteria sort) private async Task<QueryResult<BaseItem>> GetChildrenSorted(Folder folder, User user, SortCriteria sort, int? startIndex, int? limit)
{
if (folder is UserRootFolder)
{
var result = await _userViewManager.GetUserViews(new UserViewQuery
{
UserId = user.Id.ToString("N")
}, CancellationToken.None).ConfigureAwait(false);
return ToResult(result, startIndex, limit);
}
var view = folder as UserView;
if (view != null)
{
var result = await GetUserViewChildren(view, user, sort).ConfigureAwait(false);
return ToResult(result, startIndex, limit);
}
var channel = folder as Channel;
if (channel != null)
{
return await _channelManager.GetChannelItemsInternal(new ChannelItemQuery
{
ChannelId = channel.Id.ToString("N"),
Limit = limit,
StartIndex = startIndex,
UserId = user.Id.ToString("N")
}, CancellationToken.None);
}
var channelFolderItem = folder as ChannelFolderItem;
if (channelFolderItem != null)
{
return await _channelManager.GetChannelItemsInternal(new ChannelItemQuery
{
ChannelId = channelFolderItem.ChannelId,
FolderId = channelFolderItem.Id.ToString("N"),
Limit = limit,
StartIndex = startIndex,
UserId = user.Id.ToString("N")
}, CancellationToken.None);
}
return ToResult(GetPlainFolderChildrenSorted(folder, user, sort), startIndex, limit);
}
private QueryResult<BaseItem> ToResult(IEnumerable<BaseItem> items, int? startIndex, int? limit)
{
var list = items.ToArray();
var totalCount = list.Length;
if (startIndex.HasValue)
{
list = list.Skip(startIndex.Value).ToArray();
}
if (limit.HasValue)
{
list = list.Take(limit.Value).ToArray();
}
return new QueryResult<BaseItem>
{
Items = list,
TotalRecordCount = totalCount
};
}
private async Task<IEnumerable<BaseItem>> GetUserViewChildren(UserView folder, User user, SortCriteria sort)
{
if (string.Equals(folder.ViewType, CollectionType.LiveTv, StringComparison.OrdinalIgnoreCase))
{
return new List<BaseItem>();
}
if (string.Equals(folder.ViewType, CollectionType.Channels, StringComparison.OrdinalIgnoreCase))
{
var result = await _channelManager.GetChannelsInternal(new ChannelQuery()
{
UserId = user.Id.ToString("N")
}, CancellationToken.None).ConfigureAwait(false);
return result.Items;
}
if (string.Equals(folder.ViewType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase))
{
return SortItems(folder.GetChildren(user, true).OfType<Series>(), user, sort);
}
if (string.Equals(folder.ViewType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase))
{
return GetPlainFolderChildrenSorted(folder, user, sort);
}
if (string.Equals(folder.ViewType, CollectionType.Music, StringComparison.OrdinalIgnoreCase))
{
return SortItems(folder.GetChildren(user, true).OfType<MusicArtist>(), user, sort);
}
return GetPlainFolderChildrenSorted(folder, user, sort);
}
private IEnumerable<BaseItem> GetPlainFolderChildrenSorted(Folder folder, User user, SortCriteria sort)
{ {
var items = folder.GetChildren(user, true); var items = folder.GetChildren(user, true);
@ -345,7 +456,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
private IEnumerable<BaseItem> SortItems(IEnumerable<BaseItem> items, User user, SortCriteria sort) private IEnumerable<BaseItem> SortItems(IEnumerable<BaseItem> items, User user, SortCriteria sort)
{ {
return _libraryManager.Sort(items, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending); return _libraryManager.Sort(items, user, new[] { ItemSortBy.SortName }, sort.SortOrder);
} }
private IEnumerable<BaseItem> FilterUnsupportedContent(IEnumerable<BaseItem> items) private IEnumerable<BaseItem> FilterUnsupportedContent(IEnumerable<BaseItem> items)
@ -353,14 +464,12 @@ namespace MediaBrowser.Dlna.ContentDirectory
return items.Where(i => return items.Where(i =>
{ {
// Unplayable // Unplayable
// TODO: Display and prevent playback with restricted flag?
if (i.LocationType == LocationType.Virtual) if (i.LocationType == LocationType.Virtual)
{ {
return false; return false;
} }
// Unplayable // Unplayable
// TODO: Display and prevent playback with restricted flag?
var supportsPlaceHolder = i as ISupportsPlaceHolders; var supportsPlaceHolder = i as ISupportsPlaceHolders;
if (supportsPlaceHolder != null && supportsPlaceHolder.IsPlaceHolder) if (supportsPlaceHolder != null && supportsPlaceHolder.IsPlaceHolder)
{ {
@ -368,7 +477,6 @@ namespace MediaBrowser.Dlna.ContentDirectory
} }
// Upnp renderers won't understand these // Upnp renderers won't understand these
// TODO: Display and prevent playback with restricted flag?
if (i is Game || i is Book) if (i is Game || i is Book)
{ {
return false; return false;

View File

@ -1,4 +1,5 @@
using MediaBrowser.Common.Net; using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Audio;
@ -612,6 +613,13 @@ namespace MediaBrowser.Dlna.Didl
{ {
return GetImageInfo(item, ImageType.Thumb); return GetImageInfo(item, ImageType.Thumb);
} }
if (item.HasImage(ImageType.Backdrop))
{
if (item is Channel)
{
return GetImageInfo(item, ImageType.Backdrop);
}
}
if (item is Audio || item is Episode) if (item is Audio || item is Episode)
{ {
@ -633,7 +641,7 @@ namespace MediaBrowser.Dlna.Didl
try try
{ {
tag = _imageProcessor.GetImageCacheTag(item, ImageType.Primary); tag = _imageProcessor.GetImageCacheTag(item, type);
} }
catch catch
{ {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -184,6 +184,10 @@
<EmbeddedResource Include="Profiles\Xml\Windows 8 RT.xml" /> <EmbeddedResource Include="Profiles\Xml\Windows 8 RT.xml" />
<EmbeddedResource Include="Profiles\Xml\Windows Phone.xml" /> <EmbeddedResource Include="Profiles\Xml\Windows Phone.xml" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Images\logo240.jpg" />
<EmbeddedResource Include="Images\logo240.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@ -424,7 +424,7 @@ namespace MediaBrowser.Dlna.PlayTo
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.ErrorException("Error updating device info", ex); _logger.ErrorException("Error updating device info for {0}", ex, Properties.Name);
_successiveStopCount++; _successiveStopCount++;
@ -444,7 +444,7 @@ namespace MediaBrowser.Dlna.PlayTo
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.ErrorException("Error updating device info", ex); _logger.ErrorException("Error updating device volume info for {0}", ex, Properties.Name);
} }
} }

View File

@ -77,42 +77,44 @@ namespace MediaBrowser.Dlna.PlayTo
return; return;
} }
var uri = new Uri(location); try
var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false);
if (device.RendererCommands != null)
{ {
var sessionInfo = await _sessionManager.LogSessionActivity(device.Properties.ClientType, _appHost.ApplicationVersion.ToString(), device.Properties.UUID, device.Properties.Name, uri.OriginalString, null) var uri = new Uri(location);
.ConfigureAwait(false);
var controller = sessionInfo.SessionController as PlayToController; var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false);
if (controller == null) if (device.RendererCommands != null)
{ {
var serverAddress = GetServerAddress(localIp); var sessionInfo = await _sessionManager.LogSessionActivity(device.Properties.ClientType, _appHost.ApplicationVersion.ToString(), device.Properties.UUID, device.Properties.Name, uri.OriginalString, null)
.ConfigureAwait(false);
sessionInfo.SessionController = controller = new PlayToController(sessionInfo, var controller = sessionInfo.SessionController as PlayToController;
_sessionManager,
_itemRepository,
_libraryManager,
_logger,
_dlnaManager,
_userManager,
_imageProcessor,
serverAddress,
_deviceDiscovery);
controller.Init(device); if (controller == null)
var profile = _dlnaManager.GetProfile(device.Properties.ToDeviceIdentification()) ??
_dlnaManager.GetDefaultProfile();
_sessionManager.ReportCapabilities(sessionInfo.Id, new SessionCapabilities
{ {
PlayableMediaTypes = profile.GetSupportedMediaTypes(), var serverAddress = GetServerAddress(localIp);
SupportedCommands = new List<string> sessionInfo.SessionController = controller = new PlayToController(sessionInfo,
_sessionManager,
_itemRepository,
_libraryManager,
_logger,
_dlnaManager,
_userManager,
_imageProcessor,
serverAddress,
_deviceDiscovery);
controller.Init(device);
var profile = _dlnaManager.GetProfile(device.Properties.ToDeviceIdentification()) ??
_dlnaManager.GetDefaultProfile();
_sessionManager.ReportCapabilities(sessionInfo.Id, new SessionCapabilities
{
PlayableMediaTypes = profile.GetSupportedMediaTypes(),
SupportedCommands = new List<string>
{ {
GeneralCommandType.VolumeDown.ToString(), GeneralCommandType.VolumeDown.ToString(),
GeneralCommandType.VolumeUp.ToString(), GeneralCommandType.VolumeUp.ToString(),
@ -124,12 +126,17 @@ namespace MediaBrowser.Dlna.PlayTo
GeneralCommandType.SetSubtitleStreamIndex.ToString() GeneralCommandType.SetSubtitleStreamIndex.ToString()
}, },
SupportsMediaControl = true SupportsMediaControl = true
}); });
_logger.Info("DLNA Session created for {0} - {1}", device.Properties.Name, device.Properties.ModelName); _logger.Info("DLNA Session created for {0} - {1}", device.Properties.Name, device.Properties.ModelName);
}
} }
} }
catch (Exception ex)
{
_logger.ErrorException("Error creating PlayTo device.", ex);
}
} }
private string GetServerAddress(IPAddress localIp) private string GetServerAddress(IPAddress localIp)

View File

@ -30,6 +30,8 @@ namespace MediaBrowser.Dlna.Profiles
MaxStreamingBitrate = 8000000; MaxStreamingBitrate = 8000000;
MaxStaticBitrate = 8000000; MaxStaticBitrate = 8000000;
EnableAlbumArtInDidl = true;
TranscodingProfiles = new[] TranscodingProfiles = new[]
{ {
new TranscodingProfile new TranscodingProfile

View File

@ -9,7 +9,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -9,7 +9,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -14,7 +14,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -15,7 +15,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -13,7 +13,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -15,7 +15,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio</SupportedMediaTypes> <SupportedMediaTypes>Audio</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -16,7 +16,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -15,7 +15,7 @@
<ModelNumber>3.0</ModelNumber> <ModelNumber>3.0</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -17,7 +17,7 @@
<ModelNumber>3.0</ModelNumber> <ModelNumber>3.0</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -16,7 +16,7 @@
<ModelNumber>3.0</ModelNumber> <ModelNumber>3.0</ModelNumber>
<ModelUrl>http://www.microsoft.com/</ModelUrl> <ModelUrl>http://www.microsoft.com/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_TN</AlbumArtPn> <AlbumArtPn>JPEG_TN</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -16,7 +16,7 @@
<ModelNumber>3.0</ModelNumber> <ModelNumber>3.0</ModelNumber>
<ModelUrl>http://www.microsoft.com/</ModelUrl> <ModelUrl>http://www.microsoft.com/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_TN</AlbumArtPn> <AlbumArtPn>JPEG_TN</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -16,7 +16,7 @@
<ModelNumber>3.0</ModelNumber> <ModelNumber>3.0</ModelNumber>
<ModelUrl>http://www.microsoft.com/</ModelUrl> <ModelUrl>http://www.microsoft.com/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_TN</AlbumArtPn> <AlbumArtPn>JPEG_TN</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -16,7 +16,7 @@
<ModelNumber>3.0</ModelNumber> <ModelNumber>3.0</ModelNumber>
<ModelUrl>http://www.microsoft.com/</ModelUrl> <ModelUrl>http://www.microsoft.com/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_TN</AlbumArtPn> <AlbumArtPn>JPEG_TN</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -16,7 +16,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_TN</AlbumArtPn> <AlbumArtPn>JPEG_TN</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -16,7 +16,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>true</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>true</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -13,7 +13,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -9,7 +9,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -16,7 +16,7 @@
<ModelNumber>12.0</ModelNumber> <ModelNumber>12.0</ModelNumber>
<ModelUrl>http://www.microsoft.com/</ModelUrl> <ModelUrl>http://www.microsoft.com/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -14,7 +14,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -15,7 +15,7 @@
<ModelNumber>Media Browser</ModelNumber> <ModelNumber>Media Browser</ModelNumber>
<ModelUrl>http://mediabrowser.tv/</ModelUrl> <ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<SupportedMediaTypes>Audio</SupportedMediaTypes> <SupportedMediaTypes>Audio</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn> <AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>512</MaxAlbumArtWidth> <MaxAlbumArtWidth>512</MaxAlbumArtWidth>

View File

@ -133,6 +133,24 @@ namespace MediaBrowser.Dlna.Server
{ {
var list = new List<DeviceIcon>(); var list = new List<DeviceIcon>();
list.Add(new DeviceIcon
{
MimeType = "image/png",
Depth = "24",
Width = 240,
Height = 240,
Url = "/mediabrowser/dlna/icons/logo240.png"
});
list.Add(new DeviceIcon
{
MimeType = "image/jpeg",
Depth = "24",
Width = 240,
Height = 240,
Url = "/mediabrowser/dlna/icons/logo240.jpg"
});
list.Add(new DeviceIcon list.Add(new DeviceIcon
{ {
MimeType = "image/png", MimeType = "image/png",

View File

@ -90,9 +90,14 @@ namespace MediaBrowser.Dlna.Ssdp
values["HOST"] = "239.255.255.250:1900"; values["HOST"] = "239.255.255.250:1900";
values["USER-AGENT"] = "UPnP/1.0 DLNADOC/1.50 Platinum/1.0.4.2"; values["USER-AGENT"] = "UPnP/1.0 DLNADOC/1.50 Platinum/1.0.4.2";
values["ST"] = "ssdp:all";
values["MAN"] = "\"ssdp:discover\""; values["MAN"] = "\"ssdp:discover\"";
values["MX"] = "10";
// Search target
values["ST"] = "ssdp:all";
// Seconds to delay response
values["MX"] = "3";
SendDatagram("M-SEARCH * HTTP/1.1", values, localIp); SendDatagram("M-SEARCH * HTTP/1.1", values, localIp);
} }

View File

@ -1,8 +1,14 @@
 using MediaBrowser.Model.Entities;
namespace MediaBrowser.Model.Dlna namespace MediaBrowser.Model.Dlna
{ {
public class SortCriteria public class SortCriteria
{ {
public SortOrder SortOrder
{
get { return SortOrder.Ascending; }
}
public SortCriteria(string value) public SortCriteria(string value)
{ {

View File

@ -71,7 +71,7 @@ namespace MediaBrowser.Server.Implementations.Channels
var startingPercent = numComplete * percentPerUser * 100; var startingPercent = numComplete * percentPerUser * 100;
var innerProgress = new ActionableProgress<double>(); var innerProgress = new ActionableProgress<double>();
innerProgress.RegisterAction(p => progress.Report(startingPercent + (.8 * p))); innerProgress.RegisterAction(p => progress.Report(startingPercent + (percentPerUser * p)));
await DownloadContent(user, cancellationToken, innerProgress).ConfigureAwait(false); await DownloadContent(user, cancellationToken, innerProgress).ConfigureAwait(false);

View File

@ -106,7 +106,7 @@ namespace MediaBrowser.Server.Implementations.Channels
.OrderBy(i => i.Name); .OrderBy(i => i.Name);
} }
public Task<QueryResult<BaseItemDto>> GetChannels(ChannelQuery query, CancellationToken cancellationToken) public Task<QueryResult<Channel>> GetChannelsInternal(ChannelQuery query, CancellationToken cancellationToken)
{ {
var user = string.IsNullOrWhiteSpace(query.UserId) var user = string.IsNullOrWhiteSpace(query.UserId)
? null ? null
@ -148,15 +148,9 @@ namespace MediaBrowser.Server.Implementations.Channels
all = all.Take(query.Limit.Value).ToList(); all = all.Take(query.Limit.Value).ToList();
} }
// Get everything var returnItems = all.ToArray();
var fields = Enum.GetNames(typeof(ItemFields))
.Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
.ToList();
var returnItems = all.Select(i => _dtoService.GetBaseItemDto(i, fields, user)) var result = new QueryResult<Channel>
.ToArray();
var result = new QueryResult<BaseItemDto>
{ {
Items = returnItems, Items = returnItems,
TotalRecordCount = totalCount TotalRecordCount = totalCount
@ -165,6 +159,31 @@ namespace MediaBrowser.Server.Implementations.Channels
return Task.FromResult(result); return Task.FromResult(result);
} }
public async Task<QueryResult<BaseItemDto>> GetChannels(ChannelQuery query, CancellationToken cancellationToken)
{
var user = string.IsNullOrWhiteSpace(query.UserId)
? null
: _userManager.GetUserById(new Guid(query.UserId));
var internalResult = await GetChannelsInternal(query, cancellationToken).ConfigureAwait(false);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields))
.Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
.ToList();
var returnItems = internalResult.Items.Select(i => _dtoService.GetBaseItemDto(i, fields, user))
.ToArray();
var result = new QueryResult<BaseItemDto>
{
Items = returnItems,
TotalRecordCount = internalResult.TotalRecordCount
};
return result;
}
public async Task RefreshChannels(IProgress<double> progress, CancellationToken cancellationToken) public async Task RefreshChannels(IProgress<double> progress, CancellationToken cancellationToken)
{ {
var allChannelsList = GetAllChannels().ToList(); var allChannelsList = GetAllChannels().ToList();
@ -846,7 +865,7 @@ namespace MediaBrowser.Server.Implementations.Channels
} }
} }
public async Task<QueryResult<BaseItemDto>> GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken) public async Task<QueryResult<BaseItem>> GetChannelItemsInternal(ChannelItemQuery query, CancellationToken cancellationToken)
{ {
// Get the internal channel entity // Get the internal channel entity
var channel = GetChannel(query.ChannelId); var channel = GetChannel(query.ChannelId);
@ -868,6 +887,12 @@ namespace MediaBrowser.Server.Implementations.Channels
throw new ArgumentException(string.Format("{0} channel only supports a maximum of {1} records at a time.", channel.Name, channelInfo.MaxPageSize.Value)); throw new ArgumentException(string.Format("{0} channel only supports a maximum of {1} records at a time.", channel.Name, channelInfo.MaxPageSize.Value));
} }
providerLimit = query.Limit; providerLimit = query.Limit;
// This will cause some providers to fail
if (providerLimit == 0)
{
providerLimit = 1;
}
} }
var user = string.IsNullOrWhiteSpace(query.UserId) var user = string.IsNullOrWhiteSpace(query.UserId)
@ -913,6 +938,31 @@ namespace MediaBrowser.Server.Implementations.Channels
return await GetReturnItems(internalItems, providerTotalRecordCount, user, query, cancellationToken).ConfigureAwait(false); return await GetReturnItems(internalItems, providerTotalRecordCount, user, query, cancellationToken).ConfigureAwait(false);
} }
public async Task<QueryResult<BaseItemDto>> GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken)
{
var user = string.IsNullOrWhiteSpace(query.UserId)
? null
: _userManager.GetUserById(new Guid(query.UserId));
var internalResult = await GetChannelItemsInternal(query, cancellationToken).ConfigureAwait(false);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields))
.Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
.ToList();
var returnItems = internalResult.Items.Select(i => _dtoService.GetBaseItemDto(i, fields, user))
.ToArray();
var result = new QueryResult<BaseItemDto>
{
Items = returnItems,
TotalRecordCount = internalResult.TotalRecordCount
};
return result;
}
private readonly SemaphoreSlim _resourcePool = new SemaphoreSlim(1, 1); private readonly SemaphoreSlim _resourcePool = new SemaphoreSlim(1, 1);
private async Task<ChannelItemResult> GetChannelItems(IChannel channel, private async Task<ChannelItemResult> GetChannelItems(IChannel channel,
User user, User user,
@ -1054,7 +1104,7 @@ namespace MediaBrowser.Server.Implementations.Channels
filename + ".json"); filename + ".json");
} }
private async Task<QueryResult<BaseItemDto>> GetReturnItems(IEnumerable<BaseItem> items, int? totalCountFromProvider, User user, ChannelItemQuery query, CancellationToken cancellationToken) private async Task<QueryResult<BaseItem>> GetReturnItems(IEnumerable<BaseItem> items, int? totalCountFromProvider, User user, ChannelItemQuery query, CancellationToken cancellationToken)
{ {
items = ApplyFilters(items, query.Filters, user); items = ApplyFilters(items, query.Filters, user);
@ -1078,10 +1128,9 @@ namespace MediaBrowser.Server.Implementations.Channels
await RefreshIfNeeded(all, cancellationToken).ConfigureAwait(false); await RefreshIfNeeded(all, cancellationToken).ConfigureAwait(false);
var returnItemArray = all.Select(i => _dtoService.GetBaseItemDto(i, query.Fields, user)) var returnItemArray = all.ToArray();
.ToArray();
return new QueryResult<BaseItemDto> return new QueryResult<BaseItem>
{ {
Items = returnItemArray, Items = returnItemArray,
TotalRecordCount = totalCount TotalRecordCount = totalCount

View File

@ -97,11 +97,6 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
var info = _appHost.GetSystemInfo(); var info = _appHost.GetSystemInfo();
CreatePortMap(device, info.HttpServerPortNumber); CreatePortMap(device, info.HttpServerPortNumber);
if (info.WebSocketPortNumber != info.HttpServerPortNumber)
{
CreatePortMap(device, info.WebSocketPortNumber);
}
} }
private void CreatePortMap(INatDevice device, int port) private void CreatePortMap(INatDevice device, int port)

View File

@ -4,6 +4,7 @@ using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Plugins;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Server.Implementations.Udp; using MediaBrowser.Server.Implementations.Udp;
using System.Net.Sockets; using System.Net.Sockets;
@ -37,6 +38,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
/// </summary> /// </summary>
private readonly IHttpServer _httpServer; private readonly IHttpServer _httpServer;
private readonly IServerApplicationHost _appHost; private readonly IServerApplicationHost _appHost;
private readonly IJsonSerializer _json;
public const int PortNumber = 7359; public const int PortNumber = 7359;
@ -47,13 +49,14 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
/// <param name="networkManager">The network manager.</param> /// <param name="networkManager">The network manager.</param>
/// <param name="serverConfigurationManager">The server configuration manager.</param> /// <param name="serverConfigurationManager">The server configuration manager.</param>
/// <param name="httpServer">The HTTP server.</param> /// <param name="httpServer">The HTTP server.</param>
public UdpServerEntryPoint(ILogger logger, INetworkManager networkManager, IServerConfigurationManager serverConfigurationManager, IHttpServer httpServer, IServerApplicationHost appHost) public UdpServerEntryPoint(ILogger logger, INetworkManager networkManager, IServerConfigurationManager serverConfigurationManager, IHttpServer httpServer, IServerApplicationHost appHost, IJsonSerializer json)
{ {
_logger = logger; _logger = logger;
_networkManager = networkManager; _networkManager = networkManager;
_serverConfigurationManager = serverConfigurationManager; _serverConfigurationManager = serverConfigurationManager;
_httpServer = httpServer; _httpServer = httpServer;
_appHost = appHost; _appHost = appHost;
_json = json;
} }
/// <summary> /// <summary>
@ -61,7 +64,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
/// </summary> /// </summary>
public void Run() public void Run()
{ {
var udpServer = new UdpServer(_logger, _networkManager, _serverConfigurationManager, _httpServer, _appHost); var udpServer = new UdpServer(_logger, _networkManager, _serverConfigurationManager, _httpServer, _appHost, _json);
try try
{ {

View File

@ -59,14 +59,16 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
var collectionType = args.GetCollectionType(); var collectionType = args.GetCollectionType();
var isMusicMediaFolder = string.Equals(collectionType, CollectionType.Music,
StringComparison.OrdinalIgnoreCase);
// If there's a collection type and it's not music, don't allow it. // If there's a collection type and it's not music, don't allow it.
if (!string.IsNullOrEmpty(collectionType) && if (!isMusicMediaFolder)
!string.Equals(collectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase))
{ {
return null; return null;
} }
return IsMusicAlbum(args) ? new MusicAlbum() : null; return IsMusicAlbum(args, isMusicMediaFolder) ? new MusicAlbum() : null;
} }
@ -74,27 +76,29 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
/// Determine if the supplied file data points to a music album /// Determine if the supplied file data points to a music album
/// </summary> /// </summary>
/// <param name="path">The path.</param> /// <param name="path">The path.</param>
/// <param name="isMusicMediaFolder">if set to <c>true</c> [is music media folder].</param>
/// <param name="directoryService">The directory service.</param> /// <param name="directoryService">The directory service.</param>
/// <param name="logger">The logger.</param> /// <param name="logger">The logger.</param>
/// <param name="fileSystem">The file system.</param> /// <param name="fileSystem">The file system.</param>
/// <returns><c>true</c> if [is music album] [the specified data]; otherwise, <c>false</c>.</returns> /// <returns><c>true</c> if [is music album] [the specified data]; otherwise, <c>false</c>.</returns>
public static bool IsMusicAlbum(string path, IDirectoryService directoryService, ILogger logger, IFileSystem fileSystem) public static bool IsMusicAlbum(string path, bool isMusicMediaFolder, IDirectoryService directoryService, ILogger logger, IFileSystem fileSystem)
{ {
return ContainsMusic(directoryService.GetFileSystemEntries(path), true, directoryService, logger, fileSystem); return ContainsMusic(directoryService.GetFileSystemEntries(path), isMusicMediaFolder, true, directoryService, logger, fileSystem);
} }
/// <summary> /// <summary>
/// Determine if the supplied resolve args should be considered a music album /// Determine if the supplied resolve args should be considered a music album
/// </summary> /// </summary>
/// <param name="args">The args.</param> /// <param name="args">The args.</param>
/// <param name="isMusicMediaFolder">if set to <c>true</c> [is music media folder].</param>
/// <returns><c>true</c> if [is music album] [the specified args]; otherwise, <c>false</c>.</returns> /// <returns><c>true</c> if [is music album] [the specified args]; otherwise, <c>false</c>.</returns>
private bool IsMusicAlbum(ItemResolveArgs args) private bool IsMusicAlbum(ItemResolveArgs args, bool isMusicMediaFolder)
{ {
// Args points to an album if parent is an Artist folder or it directly contains music // Args points to an album if parent is an Artist folder or it directly contains music
if (args.IsDirectory) if (args.IsDirectory)
{ {
//if (args.Parent is MusicArtist) return true; //saves us from testing children twice //if (args.Parent is MusicArtist) return true; //saves us from testing children twice
if (ContainsMusic(args.FileSystemChildren, true, args.DirectoryService, _logger, _fileSystem)) return true; if (ContainsMusic(args.FileSystemChildren, isMusicMediaFolder, true, args.DirectoryService, _logger, _fileSystem)) return true;
} }
return false; return false;
@ -104,12 +108,18 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
/// Determine if the supplied list contains what we should consider music /// Determine if the supplied list contains what we should consider music
/// </summary> /// </summary>
/// <param name="list">The list.</param> /// <param name="list">The list.</param>
/// <param name="isMusicMediaFolder">if set to <c>true</c> [is music media folder].</param>
/// <param name="allowSubfolders">if set to <c>true</c> [allow subfolders].</param> /// <param name="allowSubfolders">if set to <c>true</c> [allow subfolders].</param>
/// <param name="directoryService">The directory service.</param> /// <param name="directoryService">The directory service.</param>
/// <param name="logger">The logger.</param> /// <param name="logger">The logger.</param>
/// <param name="fileSystem">The file system.</param> /// <param name="fileSystem">The file system.</param>
/// <returns><c>true</c> if the specified list contains music; otherwise, <c>false</c>.</returns> /// <returns><c>true</c> if the specified list contains music; otherwise, <c>false</c>.</returns>
private static bool ContainsMusic(IEnumerable<FileSystemInfo> list, bool allowSubfolders, IDirectoryService directoryService, ILogger logger, IFileSystem fileSystem) private static bool ContainsMusic(IEnumerable<FileSystemInfo> list,
bool isMusicMediaFolder,
bool allowSubfolders,
IDirectoryService directoryService,
ILogger logger,
IFileSystem fileSystem)
{ {
// If list contains at least 2 audio files or at least one and no video files consider it to contain music // If list contains at least 2 audio files or at least one and no video files consider it to contain music
var foundAudio = 0; var foundAudio = 0;
@ -120,7 +130,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
{ {
if ((fileSystemInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory) if ((fileSystemInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
{ {
if (allowSubfolders && IsAlbumSubfolder(fileSystemInfo, directoryService, logger, fileSystem)) if (isMusicMediaFolder && allowSubfolders && IsAlbumSubfolder(fileSystemInfo, true, directoryService, logger, fileSystem))
{ {
discSubfolderCount++; discSubfolderCount++;
} }
@ -135,27 +145,27 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
if (EntityResolutionHelper.IsAudioFile(fullName)) if (EntityResolutionHelper.IsAudioFile(fullName))
{ {
// Don't resolve these into audio files // Don't resolve these into audio files
if (string.Equals(fileSystem.GetFileNameWithoutExtension(fullName), BaseItem.ThemeSongFilename) && EntityResolutionHelper.IsAudioFile(fullName)) if (string.Equals(fileSystem.GetFileNameWithoutExtension(fullName), BaseItem.ThemeSongFilename))
{ {
continue; continue;
} }
foundAudio++; foundAudio++;
} }
else if (EntityResolutionHelper.IsVideoFile(fullName)) return false;
else if (EntityResolutionHelper.IsVideoPlaceHolder(fullName)) return false;
if (foundAudio >= 2) if (foundAudio >= 2)
{ {
return true; return true;
} }
if (EntityResolutionHelper.IsVideoFile(fullName)) return false;
if (EntityResolutionHelper.IsVideoPlaceHolder(fullName)) return false;
} }
// or a single audio file and no video files // or a single audio file and no video files
return foundAudio > 0 || discSubfolderCount > 0; return foundAudio > 0 || discSubfolderCount > 0;
} }
private static bool IsAlbumSubfolder(FileSystemInfo directory, IDirectoryService directoryService, ILogger logger, IFileSystem fileSystem) private static bool IsAlbumSubfolder(FileSystemInfo directory, bool isMusicMediaFolder, IDirectoryService directoryService, ILogger logger, IFileSystem fileSystem)
{ {
var path = directory.FullName; var path = directory.FullName;
@ -163,7 +173,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
{ {
logger.Debug("Found multi-disc folder: " + path); logger.Debug("Found multi-disc folder: " + path);
return ContainsMusic(directoryService.GetFileSystemEntries(path), false, directoryService, logger, fileSystem); return ContainsMusic(directoryService.GetFileSystemEntries(path), isMusicMediaFolder, false, directoryService, logger, fileSystem);
} }
return false; return false;
@ -171,7 +181,8 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
private static bool IsMultiDiscFolder(string path) private static bool IsMultiDiscFolder(string path)
{ {
return EntityResolutionHelper.IsMultiPartFolder(path); return false;
//return EntityResolutionHelper.IsMultiPartFolder(path);
} }
private static bool IsAdditionalSubfolderAllowed(FileSystemInfo directory) private static bool IsAdditionalSubfolderAllowed(FileSystemInfo directory)

View File

@ -62,9 +62,11 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
var collectionType = args.GetCollectionType(); var collectionType = args.GetCollectionType();
var isMusicMediaFolder = string.Equals(collectionType, CollectionType.Music,
StringComparison.OrdinalIgnoreCase);
// If there's a collection type and it's not music, it can't be a series // If there's a collection type and it's not music, it can't be a series
if (!string.IsNullOrEmpty(collectionType) && if (!isMusicMediaFolder)
!string.Equals(collectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase))
{ {
return null; return null;
} }
@ -72,7 +74,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
var directoryService = args.DirectoryService; var directoryService = args.DirectoryService;
// If we contain an album assume we are an artist folder // If we contain an album assume we are an artist folder
return args.FileSystemChildren.Where(i => (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory).Any(i => MusicAlbumResolver.IsMusicAlbum(i.FullName, directoryService, _logger, _fileSystem)) ? new MusicArtist() : null; return args.FileSystemChildren.Where(i => (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory).Any(i => MusicAlbumResolver.IsMusicAlbum(i.FullName, isMusicMediaFolder, directoryService, _logger, _fileSystem)) ? new MusicArtist() : null;
} }
} }

View File

@ -5,6 +5,7 @@ using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Resolvers; using MediaBrowser.Controller.Resolvers;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using System; using System;
using System.IO; using System.IO;
@ -16,10 +17,12 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
public class SeriesResolver : FolderResolver<Series> public class SeriesResolver : FolderResolver<Series>
{ {
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly ILogger _logger;
public SeriesResolver(IFileSystem fileSystem) public SeriesResolver(IFileSystem fileSystem, ILogger logger)
{ {
_fileSystem = fileSystem; _fileSystem = fileSystem;
_logger = logger;
} }
/// <summary> /// <summary>
@ -64,19 +67,8 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
{ {
return null; return null;
} }
// It's a Series if any of the following conditions are met:
// series.xml exists
// [tvdbid= is present in the path
// TVUtils.IsSeriesFolder returns true
var filename = Path.GetFileName(args.Path);
if (string.IsNullOrEmpty(filename)) if (TVUtils.IsSeriesFolder(args.Path, string.Equals(collectionType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase), args.FileSystemChildren, args.DirectoryService, _fileSystem, _logger))
{
return null;
}
if (TVUtils.IsSeriesFolder(args.Path, collectionType == CollectionType.TvShows, args.FileSystemChildren, args.DirectoryService, _fileSystem))
{ {
return new Series(); return new Series();
} }

View File

@ -1,4 +1,7 @@
using MediaBrowser.Common.IO; using System.IO;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Audio;
@ -16,6 +19,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Server.Implementations.Configuration;
namespace MediaBrowser.Server.Implementations.Library namespace MediaBrowser.Server.Implementations.Library
{ {
@ -28,8 +32,9 @@ namespace MediaBrowser.Server.Implementations.Library
private readonly IChannelManager _channelManager; private readonly IChannelManager _channelManager;
private readonly ILiveTvManager _liveTvManager; private readonly ILiveTvManager _liveTvManager;
private readonly IServerApplicationPaths _appPaths;
public UserViewManager(ILibraryManager libraryManager, ILocalizationManager localizationManager, IFileSystem fileSystem, IUserManager userManager, IChannelManager channelManager, ILiveTvManager liveTvManager) public UserViewManager(ILibraryManager libraryManager, ILocalizationManager localizationManager, IFileSystem fileSystem, IUserManager userManager, IChannelManager channelManager, ILiveTvManager liveTvManager, IServerApplicationPaths appPaths)
{ {
_libraryManager = libraryManager; _libraryManager = libraryManager;
_localizationManager = localizationManager; _localizationManager = localizationManager;
@ -37,6 +42,7 @@ namespace MediaBrowser.Server.Implementations.Library
_userManager = userManager; _userManager = userManager;
_channelManager = channelManager; _channelManager = channelManager;
_liveTvManager = liveTvManager; _liveTvManager = liveTvManager;
_appPaths = appPaths;
} }
public async Task<IEnumerable<Folder>> GetUserViews(UserViewQuery query, CancellationToken cancellationToken) public async Task<IEnumerable<Folder>> GetUserViews(UserViewQuery query, CancellationToken cancellationToken)
@ -124,5 +130,37 @@ namespace MediaBrowser.Server.Implementations.Library
return _libraryManager.GetNamedView(name, type, sortName, cancellationToken); return _libraryManager.GetNamedView(name, type, sortName, cancellationToken);
} }
public async Task<SpecialFolder> GetSpecialFolder(string name, SpecialFolderType type, string itemType, CancellationToken cancellationToken)
{
var path = Path.Combine(_appPaths.ItemsByNamePath,
"specialfolders",
_fileSystem.GetValidFilename(name));
var id = (path + "_specialfolder_" + name).GetMBId(typeof(SpecialFolder));
var item = _libraryManager.GetItemById(id) as SpecialFolder;
if (item == null)
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
item = new SpecialFolder
{
Path = path,
Id = id,
DateCreated = DateTime.UtcNow,
Name = name,
SpecialFolderType = type,
ItemTypeName = itemType
};
await _libraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false);
await item.RefreshMetadata(cancellationToken).ConfigureAwait(false);
}
return item;
}
} }
} }

View File

@ -41,7 +41,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{ {
return new ITaskTrigger[] return new ITaskTrigger[]
{ {
new IntervalTrigger{ Interval = TimeSpan.FromHours(24)} new IntervalTrigger{ Interval = TimeSpan.FromHours(12)}
}; };
} }

View File

@ -178,7 +178,6 @@
"LabelVideoCodec": "Video: {0}", "LabelVideoCodec": "Video: {0}",
"LabelRemoteAccessUrl": "Remote access: {0}", "LabelRemoteAccessUrl": "Remote access: {0}",
"LabelRunningOnPort": "Running on port {0}.", "LabelRunningOnPort": "Running on port {0}.",
"LabelRunningOnPorts": "Running on ports {0} and {1}.",
"HeaderLatestFromChannel": "Latest from {0}", "HeaderLatestFromChannel": "Latest from {0}",
"ButtonDownload": "Download", "ButtonDownload": "Download",
"LabelUnknownLanaguage": "Unknown language", "LabelUnknownLanaguage": "Unknown language",

View File

@ -1,5 +1,5 @@
{ {
"SettingsSaved": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.", "SettingsSaved": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.",
"AddUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b \u04af\u0441\u0442\u0435\u0443", "AddUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b \u04af\u0441\u0442\u0435\u0443",
"Users": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440", "Users": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440",
"Delete": "\u0416\u043e\u044e", "Delete": "\u0416\u043e\u044e",
@ -46,9 +46,9 @@
"HeaderTaskTriggers": "\u0422\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043b\u0435\u0440\u0456", "HeaderTaskTriggers": "\u0422\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043b\u0435\u0440\u0456",
"MessageDeleteTaskTrigger": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043e\u0441\u044b \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0456\u043d \u0436\u043e\u044e \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", "MessageDeleteTaskTrigger": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043e\u0441\u044b \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0456\u043d \u0436\u043e\u044e \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?",
"MessageNoPluginsInstalled": "\u041e\u0440\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440 \u0436\u043e\u049b.", "MessageNoPluginsInstalled": "\u041e\u0440\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440 \u0436\u043e\u049b.",
"LabelVersionInstalled": "{0} \u043d\u04b1\u0441\u049b\u0430\u0441\u044b \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d", "LabelVersionInstalled": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d",
"LabelNumberReviews": "{0} \u043f\u0456\u043a\u0456\u0440", "LabelNumberReviews": "{0} \u043f\u0456\u043a\u0456\u0440",
"LabelFree": "\u0410\u049b\u044b\u0441\u044b\u0437", "LabelFree": "\u0422\u0435\u0433\u0456\u043d",
"HeaderSelectAudio": "\u0414\u044b\u0431\u044b\u0441 \u0442\u0430\u04a3\u0434\u0430\u0443", "HeaderSelectAudio": "\u0414\u044b\u0431\u044b\u0441 \u0442\u0430\u04a3\u0434\u0430\u0443",
"HeaderSelectSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0442\u0430\u04a3\u0434\u0430\u0443", "HeaderSelectSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0442\u0430\u04a3\u0434\u0430\u0443",
"LabelDefaultStream": "(\u04d8\u0434\u0435\u043f\u043a\u0456)", "LabelDefaultStream": "(\u04d8\u0434\u0435\u043f\u043a\u0456)",
@ -289,7 +289,7 @@
"ButtonRestart": "\u049a\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443", "ButtonRestart": "\u049a\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443",
"MessagePleaseRefreshPage": "\u0416\u0430\u04a3\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u043b\u0430\u0440\u0434\u044b \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u0431\u0435\u0442\u0442\u0456 \u049b\u0430\u0439\u0442\u0430 \u0436\u04af\u043a\u0442\u0435\u04a3\u0456\u0437.", "MessagePleaseRefreshPage": "\u0416\u0430\u04a3\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u043b\u0430\u0440\u0434\u044b \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u0431\u0435\u0442\u0442\u0456 \u049b\u0430\u0439\u0442\u0430 \u0436\u04af\u043a\u0442\u0435\u04a3\u0456\u0437.",
"ButtonHide": "\u0416\u0430\u0441\u044b\u0440\u0443", "ButtonHide": "\u0416\u0430\u0441\u044b\u0440\u0443",
"MessageSettingsSaved": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0456\u043c \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.", "MessageSettingsSaved": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.",
"ButtonSignOut": "\u0428\u044b\u0493\u0443", "ButtonSignOut": "\u0428\u044b\u0493\u0443",
"ButtonMyProfile": "\u041c\u0435\u043d\u0456\u04a3 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b\u043c", "ButtonMyProfile": "\u041c\u0435\u043d\u0456\u04a3 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b\u043c",
"ButtonMyPreferences": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043c", "ButtonMyPreferences": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043c",

View File

@ -314,7 +314,7 @@
"ButtonSubtitles": "Legendas", "ButtonSubtitles": "Legendas",
"ButtonScenes": "Cenas", "ButtonScenes": "Cenas",
"ButtonQuality": "Quality", "ButtonQuality": "Quality",
"HeaderNotifications": "Notifications", "HeaderNotifications": "Notifica\u00e7\u00f5es",
"HeaderSelectPlayer": "Select Player:", "HeaderSelectPlayer": "Select Player:",
"ButtonSelect": "Selecionar", "ButtonSelect": "Selecionar",
"ButtonNew": "Novo", "ButtonNew": "Novo",

View File

@ -46,8 +46,8 @@
"HeaderTaskTriggers": "\u0422\u0440\u0438\u0433\u0433\u0435\u0440\u044b \u0437\u0430\u0434\u0430\u043d\u0438\u044f", "HeaderTaskTriggers": "\u0422\u0440\u0438\u0433\u0433\u0435\u0440\u044b \u0437\u0430\u0434\u0430\u043d\u0438\u044f",
"MessageDeleteTaskTrigger": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0437\u0430\u0434\u0430\u043d\u0438\u044f?", "MessageDeleteTaskTrigger": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0437\u0430\u0434\u0430\u043d\u0438\u044f?",
"MessageNoPluginsInstalled": "\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430.", "MessageNoPluginsInstalled": "\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430.",
"LabelVersionInstalled": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f: {0}", "LabelVersionInstalled": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430: {0}",
"LabelNumberReviews": "\u041e\u0442\u0437\u044b\u0432\u043e\u0432: {0}", "LabelNumberReviews": "\u041e\u0442\u0437\u044b\u0432\u044b: {0}",
"LabelFree": "\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e", "LabelFree": "\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e",
"HeaderSelectAudio": "\u0412\u044b\u0431\u043e\u0440 \u0430\u0443\u0434\u0438\u043e", "HeaderSelectAudio": "\u0412\u044b\u0431\u043e\u0440 \u0430\u0443\u0434\u0438\u043e",
"HeaderSelectSubtitles": "\u0412\u044b\u0431\u043e\u0440 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432", "HeaderSelectSubtitles": "\u0412\u044b\u0431\u043e\u0440 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432",
@ -232,7 +232,7 @@
"OptionBlockChannelContent": "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043a\u0430\u043d\u0430\u043b\u043e\u0432", "OptionBlockChannelContent": "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043a\u0430\u043d\u0430\u043b\u043e\u0432",
"ButtonRevoke": "\u041e\u0442\u043e\u0437\u0432\u0430\u0442\u044c", "ButtonRevoke": "\u041e\u0442\u043e\u0437\u0432\u0430\u0442\u044c",
"MessageConfirmRevokeApiKey": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043e\u0437\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API? \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a Media Browser \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0437\u043a\u043e \u043e\u0431\u043e\u0440\u0432\u0430\u043d\u043e.", "MessageConfirmRevokeApiKey": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043e\u0437\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API? \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a Media Browser \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0437\u043a\u043e \u043e\u0431\u043e\u0440\u0432\u0430\u043d\u043e.",
"HeaderConfirmRevokeApiKey": "\u041e\u0442\u0437\u044b\u0432 \u043a\u043b\u044e\u0447\u0430 API", "HeaderConfirmRevokeApiKey": "\u041e\u0442\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430 API",
"ValueContainer": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440: {0}", "ValueContainer": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440: {0}",
"ValueAudioCodec": "\u0410\u0443\u0434\u0438\u043e \u043a\u043e\u0434\u0435\u043a: {0}", "ValueAudioCodec": "\u0410\u0443\u0434\u0438\u043e \u043a\u043e\u0434\u0435\u043a: {0}",
"ValueVideoCodec": "\u0412\u0438\u0434\u0435\u043e \u043a\u043e\u0434\u0435\u043a: {0}", "ValueVideoCodec": "\u0412\u0438\u0434\u0435\u043e \u043a\u043e\u0434\u0435\u043a: {0}",

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "System venligt navn", "LabelFriendlyName": "System venligt navn",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Maximale Bitrate:", "LabelMaxBitrate": "Maximale Bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Freundlicher Name", "LabelFriendlyName": "Freundlicher Name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "Estos valores controlan el modo en que Media Browser se presentar\u00e1 en el dispositivo.", "HeaderProfileServerSettingsHelp": "Estos valores controlan el modo en que Media Browser se presentar\u00e1 en el dispositivo.",
"LabelMaxBitrate": "Bitrate m\u00e1ximo:", "LabelMaxBitrate": "Bitrate m\u00e1ximo:",
"LabelMaxBitrateHelp": "Especificar una tasa de bits m\u00e1xima en entornos de ancho de banda limitado, o si el dispositivo impone su propio l\u00edmite.", "LabelMaxBitrateHelp": "Especificar una tasa de bits m\u00e1xima en entornos de ancho de banda limitado, o si el dispositivo impone su propio l\u00edmite.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignorar las solicitudes de intervalo de bytes de transcodificaci\u00f3n", "OptionIgnoreTranscodeByteRangeRequests": "Ignorar las solicitudes de intervalo de bytes de transcodificaci\u00f3n",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Si est\u00e1 activado, estas solicitudes ser\u00e1n atendidas pero ignorar\u00e1n el encabezado de intervalo de bytes.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Si est\u00e1 activado, estas solicitudes ser\u00e1n atendidas pero ignorar\u00e1n el encabezado de intervalo de bytes.",
"LabelFriendlyName": "Nombre amigable", "LabelFriendlyName": "Nombre amigable",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "Estos valores controlan la manera en que Media Browser se presentar\u00e1 a s\u00ed mismo ante el dispositivo.", "HeaderProfileServerSettingsHelp": "Estos valores controlan la manera en que Media Browser se presentar\u00e1 a s\u00ed mismo ante el dispositivo.",
"LabelMaxBitrate": "Tasa de bits m\u00e1xima:", "LabelMaxBitrate": "Tasa de bits m\u00e1xima:",
"LabelMaxBitrateHelp": "Especifique la tasa de bits m\u00e1xima para ambientes con un ancho de banda limitado, o si el dispositivo impone sus propios l\u00edmites.", "LabelMaxBitrateHelp": "Especifique la tasa de bits m\u00e1xima para ambientes con un ancho de banda limitado, o si el dispositivo impone sus propios l\u00edmites.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignorar solicitudes de transcodificaci\u00f3n de rango de byte.", "OptionIgnoreTranscodeByteRangeRequests": "Ignorar solicitudes de transcodificaci\u00f3n de rango de byte.",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Si se habilita, estas solicitudes seran honradas pero se ignorar\u00e1 el encabezado de rango de byte.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Si se habilita, estas solicitudes seran honradas pero se ignorar\u00e1 el encabezado de rango de byte.",
"LabelFriendlyName": "Nombre amistoso:", "LabelFriendlyName": "Nombre amistoso:",
@ -888,5 +892,13 @@
"ButtonSync": "Sincronizar", "ButtonSync": "Sincronizar",
"TabScheduledTasks": "Tareas Programadas", "TabScheduledTasks": "Tareas Programadas",
"HeaderChapters": "Cap\u00edtulos", "HeaderChapters": "Cap\u00edtulos",
"HeaderResumeSettings": "Configuraci\u00f3n para Continuar" "HeaderResumeSettings": "Configuraci\u00f3n para Continuar",
"TabSync": "Sync",
"TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "Ces valeurs contr\u00f4lent comment Media Browser sera pr\u00e9sent\u00e9 \u00e0 l'appareil.", "HeaderProfileServerSettingsHelp": "Ces valeurs contr\u00f4lent comment Media Browser sera pr\u00e9sent\u00e9 \u00e0 l'appareil.",
"LabelMaxBitrate": "D\u00e9bit maximum:", "LabelMaxBitrate": "D\u00e9bit maximum:",
"LabelMaxBitrateHelp": "Sp\u00e9cifiez un d\u00e9bit maximum dans les environnements avec bande passante limit\u00e9e ou si l'appareil impose sa propre limite.", "LabelMaxBitrateHelp": "Sp\u00e9cifiez un d\u00e9bit maximum dans les environnements avec bande passante limit\u00e9e ou si l'appareil impose sa propre limite.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore le transcodage des demandes de plage d'octets", "OptionIgnoreTranscodeByteRangeRequests": "Ignore le transcodage des demandes de plage d'octets",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Si activ\u00e9, ces requ\u00eates\/demandes seront honor\u00e9es mais l'ent\u00eate de plage d'octets sera ignor\u00e9. ", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Si activ\u00e9, ces requ\u00eates\/demandes seront honor\u00e9es mais l'ent\u00eate de plage d'octets sera ignor\u00e9. ",
"LabelFriendlyName": "Surnom d'affichage", "LabelFriendlyName": "Surnom d'affichage",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapitres", "HeaderChapters": "Chapitres",
"HeaderResumeSettings": "Reprendre les param\u00e8tres", "HeaderResumeSettings": "Reprendre les param\u00e8tres",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "Controllano questi valori come Media Browser si presenter\u00e0 al dispositivo.", "HeaderProfileServerSettingsHelp": "Controllano questi valori come Media Browser si presenter\u00e0 al dispositivo.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specificare un bitrate massimo in ambienti larghezza di banda limitata, o se il dispositivo impone il suo limite proprio.", "LabelMaxBitrateHelp": "Specificare un bitrate massimo in ambienti larghezza di banda limitata, o se il dispositivo impone il suo limite proprio.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignorare le richieste di intervallo di byte di trascodifica", "OptionIgnoreTranscodeByteRangeRequests": "Ignorare le richieste di intervallo di byte di trascodifica",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Se abilitata, queste richieste saranno onorati, ma ignorano l'intestazione intervallo di byte.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Se abilitata, queste richieste saranno onorati, ma ignorano l'intestazione intervallo di byte.",
"LabelFriendlyName": "Nome Condiviso", "LabelFriendlyName": "Nome Condiviso",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -16,11 +16,11 @@
"LabelYoureDone": "\u0411\u04d9\u0440\u0456 \u0434\u0430\u0439\u044b\u043d!", "LabelYoureDone": "\u0411\u04d9\u0440\u0456 \u0434\u0430\u0439\u044b\u043d!",
"WelcomeToMediaBrowser": "Media Browser-\u0433\u0435 \u049b\u043e\u0448 \u043a\u0435\u043b\u0434\u0456\u04a3\u0456\u0437!", "WelcomeToMediaBrowser": "Media Browser-\u0433\u0435 \u049b\u043e\u0448 \u043a\u0435\u043b\u0434\u0456\u04a3\u0456\u0437!",
"TitleMediaBrowser": "Media Browser", "TitleMediaBrowser": "Media Browser",
"ThisWizardWillGuideYou": "\u0411\u04b1\u043b \u043a\u043e\u043c\u0435\u043a\u0448\u0456 \u0431\u0430\u0441\u0442\u0430\u043f\u049b\u044b \u043e\u0440\u043d\u0430\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0456 \u0441\u0430\u0442\u044b\u043b\u0430\u0440\u044b\u043c\u0435\u043d \u04e9\u0442\u043a\u0456\u0437\u0435\u0434\u0456. \u0411\u0430\u0441\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \u0442\u0456\u043b\u0434\u0456 \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.", "ThisWizardWillGuideYou": "\u0411\u04b1\u043b \u043a\u043e\u043c\u0435\u043a\u0448\u0456 \u0431\u0430\u0441\u0442\u0430\u043f\u049b\u044b \u043e\u0440\u043d\u0430\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0456 \u0441\u0430\u0442\u044b\u043b\u0430\u0440\u044b\u043c\u0435\u043d \u04e9\u0442\u043a\u0456\u0437\u0435\u0434\u0456. \u0411\u0430\u0441\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \u04e9\u0437\u0456\u04a3\u0456\u0437\u0433\u0435 \u0442\u0456\u043b \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456\u043d \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.",
"TellUsAboutYourself": "\u04e8\u0437\u0456\u04a3\u0456\u0437 \u0442\u0443\u0440\u0430\u043b\u044b \u0430\u0439\u0442\u044b\u04a3\u044b\u0437", "TellUsAboutYourself": "\u04e8\u0437\u0456\u04a3\u0456\u0437 \u0442\u0443\u0440\u0430\u043b\u044b \u0430\u0439\u0442\u044b\u04a3\u044b\u0437",
"LabelYourFirstName": "\u0410\u0442\u044b\u04a3\u044b\u0437:", "LabelYourFirstName": "\u0410\u0442\u044b\u04a3\u044b\u0437:",
"MoreUsersCanBeAddedLater": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u043a\u0435\u0439\u0456\u043d \u0411\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b \u0430\u0440\u049b\u044b\u043b\u044b \u04af\u0441\u0442\u0435\u0443\u0456\u04a3\u0456\u0437 \u043c\u04af\u043c\u043a\u0456\u043d.", "MoreUsersCanBeAddedLater": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u043a\u0435\u0439\u0456\u043d \u0411\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b \u0430\u0440\u049b\u044b\u043b\u044b \u04af\u0441\u0442\u0435\u0443\u0456\u04a3\u0456\u0437 \u043c\u04af\u043c\u043a\u0456\u043d.",
"UserProfilesIntro": "Media Browser \u0431\u0435\u043a\u0456\u0442\u0456\u043b\u0433\u0435\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u043f\u0440\u043e\u0444\u0438\u043b\u044c\u0434\u0435\u0440\u0456\u043d \u049b\u0430\u043c\u0442\u0438\u0434\u044b, \u04d9\u0440 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0493\u0430 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443, \u043e\u0439\u043d\u0430\u0442\u0443 \u043a\u04af\u0439\u0456 \u0436\u04d9\u043d\u0435 \u0436\u0430\u0441\u0442\u0430\u0441 \u0441\u0430\u043d\u0430\u0442\u044b\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443 \u04af\u0448\u0456\u043d \u04e9\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456 \u049b\u043e\u0441\u044b\u043b\u0430\u0434\u044b.", "UserProfilesIntro": "Media Browser \u0431\u0435\u043a\u0456\u0442\u0456\u043b\u0433\u0435\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u043f\u0440\u043e\u0444\u0438\u043b\u044c\u0434\u0435\u0440\u0456\u043d \u049b\u0430\u043c\u0442\u0438\u0434\u044b, \u04d9\u0440 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0493\u0430 \u04e9\u0437\u0456\u043d\u0456\u04a3 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456, \u043e\u0439\u043d\u0430\u0442\u0443 \u043a\u04af\u0439\u0456 \u0436\u04d9\u043d\u0435 \u0436\u0430\u0441\u0442\u0430\u0441 \u0441\u0430\u043d\u0430\u0442\u044b \u049b\u043e\u0441\u044b\u043b\u0430\u0434\u044b.",
"LabelWindowsService": "Windows \u049b\u044b\u0437\u043c\u0435\u0442\u0456", "LabelWindowsService": "Windows \u049b\u044b\u0437\u043c\u0435\u0442\u0456",
"AWindowsServiceHasBeenInstalled": "Windows \u049b\u044b\u0437\u043c\u0435\u0442\u0456 \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b.", "AWindowsServiceHasBeenInstalled": "Windows \u049b\u044b\u0437\u043c\u0435\u0442\u0456 \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b.",
"WindowsServiceIntro1": "Media Browser Server \u0436\u04af\u0439\u0435\u043b\u0456\u043a \u0442\u0430\u049b\u0442\u0430\u0434\u0430\u0493\u044b \u0431\u0435\u043b\u0433\u0456\u0448\u0435\u0441\u0456 \u0431\u0430\u0440 \u0436\u04b1\u043c\u044b\u0441 \u04af\u0441\u0442\u0435\u043b\u0456\u043d\u0456\u04a3 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0441\u044b \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u04d9\u0434\u0435\u043f\u043a\u0456 \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0430\u0434\u044b, \u0431\u0456\u0440\u0430\u049b \u0435\u0433\u0435\u0440 \u0431\u04b1\u043d\u044b \u04e9\u04a3\u0434\u0456\u043a \u049b\u044b\u0437\u043c\u0435\u0442\u0456 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0442\u0435\u04a3\u0448\u0435\u0443\u0434\u0456 \u049b\u0430\u043b\u0430\u0441\u0430\u04a3\u044b\u0437, \u043e\u0440\u043d\u044b\u043d\u0430 \u0431\u04b1\u043b Windows \u049b\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0456 \u0430\u0440\u049b\u044b\u043b\u044b \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.", "WindowsServiceIntro1": "Media Browser Server \u0436\u04af\u0439\u0435\u043b\u0456\u043a \u0442\u0430\u049b\u0442\u0430\u0434\u0430\u0493\u044b \u0431\u0435\u043b\u0433\u0456\u0448\u0435\u0441\u0456 \u0431\u0430\u0440 \u0436\u04b1\u043c\u044b\u0441 \u04af\u0441\u0442\u0435\u043b\u0456\u043d\u0456\u04a3 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0441\u044b \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u04d9\u0434\u0435\u043f\u043a\u0456 \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0430\u0434\u044b, \u0431\u0456\u0440\u0430\u049b \u0435\u0433\u0435\u0440 \u0431\u04b1\u043d\u044b \u04e9\u04a3\u0434\u0456\u043a \u049b\u044b\u0437\u043c\u0435\u0442\u0456 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0442\u0435\u04a3\u0448\u0435\u0443\u0434\u0456 \u049b\u0430\u043b\u0430\u0441\u0430\u04a3\u044b\u0437, \u043e\u0440\u043d\u044b\u043d\u0430 \u0431\u04b1\u043b Windows \u049b\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0456 \u0430\u0440\u049b\u044b\u043b\u044b \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.",
@ -43,7 +43,7 @@
"ReferToMediaLibraryWiki": "\u0422\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430 \u0442\u0443\u0440\u0430\u043b\u044b \u0443\u0438\u043a\u0438 \u0456\u0448\u0456\u043d\u0435\u043d \u049b\u0430\u0440\u0430\u04a3\u044b\u0437.", "ReferToMediaLibraryWiki": "\u0422\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430 \u0442\u0443\u0440\u0430\u043b\u044b \u0443\u0438\u043a\u0438 \u0456\u0448\u0456\u043d\u0435\u043d \u049b\u0430\u0440\u0430\u04a3\u044b\u0437.",
"LabelCountry": "\u0415\u043b:", "LabelCountry": "\u0415\u043b:",
"LabelLanguage": "\u0422\u0456\u043b:", "LabelLanguage": "\u0422\u0456\u043b:",
"HeaderPreferredMetadataLanguage": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0442\u0456\u043b\u0456\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456:", "HeaderPreferredMetadataLanguage": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0442\u0456\u043b\u0456\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456:",
"LabelSaveLocalMetadata": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435 v\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0456 \u0442\u0430\u0441\u0443\u0448\u044b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b \u0456\u0448\u0456\u043d\u0434\u0435 \u0441\u0430\u049b\u0442\u0430\u0443", "LabelSaveLocalMetadata": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435 v\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0456 \u0442\u0430\u0441\u0443\u0448\u044b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b \u0456\u0448\u0456\u043d\u0434\u0435 \u0441\u0430\u049b\u0442\u0430\u0443",
"LabelSaveLocalMetadataHelp": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435 \u043c\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0456 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u0442\u0430\u0441\u0443\u0448\u044b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b \u0456\u0448\u0456\u043d\u0434\u0435 \u0441\u0430\u049b\u0442\u0430\u043b\u0443\u044b \u043e\u043b\u0430\u0440\u0434\u044b \u0436\u0435\u04a3\u0456\u043b \u04e9\u04a3\u0434\u0435\u0439 \u0430\u043b\u0430\u0442\u044b\u043d \u043e\u0440\u044b\u043d\u0493\u0430 \u049b\u043e\u044f\u0434\u044b.", "LabelSaveLocalMetadataHelp": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435 \u043c\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0456 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u0442\u0430\u0441\u0443\u0448\u044b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b \u0456\u0448\u0456\u043d\u0434\u0435 \u0441\u0430\u049b\u0442\u0430\u043b\u0443\u044b \u043e\u043b\u0430\u0440\u0434\u044b \u0436\u0435\u04a3\u0456\u043b \u04e9\u04a3\u0434\u0435\u0439 \u0430\u043b\u0430\u0442\u044b\u043d \u043e\u0440\u044b\u043d\u0493\u0430 \u049b\u043e\u044f\u0434\u044b.",
"LabelDownloadInternetMetadata": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435 \u043c\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0456 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0442\u0435\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443", "LabelDownloadInternetMetadata": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435 \u043c\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0456 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0442\u0435\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443",
@ -281,7 +281,7 @@
"LabelAutomaticUpdatesTmdbHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0436\u0430\u04a3\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 TheMovieDB.org \u0434\u0435\u0440\u0435\u049b\u043e\u0440\u044b\u043d\u0430 \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u0431\u043e\u0439\u0434\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0430\u0434\u044b. \u0411\u0430\u0440 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 \u0430\u0443\u044b\u0441\u0442\u044b\u0440\u044b\u043b\u043c\u0430\u0439\u0434\u044b.", "LabelAutomaticUpdatesTmdbHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0436\u0430\u04a3\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 TheMovieDB.org \u0434\u0435\u0440\u0435\u049b\u043e\u0440\u044b\u043d\u0430 \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u0431\u043e\u0439\u0434\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0430\u0434\u044b. \u0411\u0430\u0440 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 \u0430\u0443\u044b\u0441\u0442\u044b\u0440\u044b\u043b\u043c\u0430\u0439\u0434\u044b.",
"LabelAutomaticUpdatesTvdbHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0436\u0430\u04a3\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 TheTVDB.com \u0434\u0435\u0440\u0435\u049b\u043e\u0440\u044b\u043d\u0430 \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u0431\u043e\u0439\u0434\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0430\u0434\u044b. \u0411\u0430\u0440 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 \u0430\u0443\u044b\u0441\u0442\u044b\u0440\u044b\u043b\u043c\u0430\u0439\u0434\u044b.", "LabelAutomaticUpdatesTvdbHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0436\u0430\u04a3\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 TheTVDB.com \u0434\u0435\u0440\u0435\u049b\u043e\u0440\u044b\u043d\u0430 \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u0431\u043e\u0439\u0434\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0430\u0434\u044b. \u0411\u0430\u0440 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 \u0430\u0443\u044b\u0441\u0442\u044b\u0440\u044b\u043b\u043c\u0430\u0439\u0434\u044b.",
"ExtractChapterImagesHelp": "\u0421\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0448\u044b\u0493\u0430\u0440\u044b\u043f \u0430\u043b\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440\u0433\u0435 \u0441\u0430\u0445\u043d\u0430 \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u0443\u0433\u0435 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u0441\u044b\u0437\u0431\u0430\u043b\u044b\u049b \u043c\u04d9\u0437\u0456\u0440\u043b\u0435\u0440\u0434\u0456 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u0411\u04b1\u043b \u043f\u0440\u043e\u0446\u0435\u0441 \u0431\u0430\u044f\u0443, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0434\u044b \u0442\u043e\u0437\u0434\u044b\u0440\u0430\u0442\u044b\u043d \u0436\u04d9\u043d\u0435 \u0431\u0456\u0440\u0430\u0437 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u043a\u0442\u0456 \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0442\u0456\u043d \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d. \u041e\u043b \u0431\u0435\u0439\u043d\u0435\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u0442\u0430\u0431\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0436\u04d9\u043d\u0435 \u0442\u0430\u04a3\u0493\u044b 4:00 \u0441\u0430\u0493\u0430\u0442\u044b\u043d\u0430 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0439\u0434\u0456. \u041e\u0440\u044b\u043d\u0434\u0430\u0443 \u043a\u0435\u0441\u0442\u0435\u0441\u0456 \u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0443\u0448\u044b \u0430\u0439\u043c\u0430\u0493\u044b\u043d\u0434\u0430 \u0442\u0435\u04a3\u0448\u0435\u043b\u0435\u0434\u0456. \u0411\u04b1\u043b \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043d\u044b \u049b\u0430\u0440\u0431\u0430\u043b\u0430\u0441 \u0441\u0430\u0493\u0430\u0442\u0442\u0430\u0440\u044b\u043d\u0434\u0430 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0442\u043a\u0456\u0437\u0443 \u04b1\u0441\u044b\u043d\u044b\u043b\u043c\u0430\u0439\u0434\u044b.", "ExtractChapterImagesHelp": "\u0421\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0448\u044b\u0493\u0430\u0440\u044b\u043f \u0430\u043b\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440\u0433\u0435 \u0441\u0430\u0445\u043d\u0430 \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u0443\u0433\u0435 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u0441\u044b\u0437\u0431\u0430\u043b\u044b\u049b \u043c\u04d9\u0437\u0456\u0440\u043b\u0435\u0440\u0434\u0456 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u0411\u04b1\u043b \u043f\u0440\u043e\u0446\u0435\u0441 \u0431\u0430\u044f\u0443, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0434\u044b \u0442\u043e\u0437\u0434\u044b\u0440\u0430\u0442\u044b\u043d \u0436\u04d9\u043d\u0435 \u0431\u0456\u0440\u0430\u0437 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u043a\u0442\u0456 \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0442\u0456\u043d \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d. \u041e\u043b \u0431\u0435\u0439\u043d\u0435\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u0442\u0430\u0431\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0436\u04d9\u043d\u0435 \u0442\u0430\u04a3\u0493\u044b 4:00 \u0441\u0430\u0493\u0430\u0442\u044b\u043d\u0430 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0439\u0434\u0456. \u041e\u0440\u044b\u043d\u0434\u0430\u0443 \u043a\u0435\u0441\u0442\u0435\u0441\u0456 \u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0443\u0448\u044b \u0430\u0439\u043c\u0430\u0493\u044b\u043d\u0434\u0430 \u0442\u0435\u04a3\u0448\u0435\u043b\u0435\u0434\u0456. \u0411\u04b1\u043b \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043d\u044b \u049b\u0430\u0440\u0431\u0430\u043b\u0430\u0441 \u0441\u0430\u0493\u0430\u0442\u0442\u0430\u0440\u044b\u043d\u0434\u0430 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0442\u043a\u0456\u0437\u0443 \u04b1\u0441\u044b\u043d\u044b\u043b\u043c\u0430\u0439\u0434\u044b.",
"LabelMetadataDownloadLanguage": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0442\u0456\u043b\u0456\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456:", "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:",
"ButtonAutoScroll": "\u0410\u0432\u0442\u043e\u0430\u0439\u043d\u0430\u043b\u0434\u044b\u0440\u0443", "ButtonAutoScroll": "\u0410\u0432\u0442\u043e\u0430\u0439\u043d\u0430\u043b\u0434\u044b\u0440\u0443",
"LabelImageSavingConvention": "\u0421\u0443\u0440\u0435\u0442 \u0441\u0430\u049b\u0442\u0430\u0443 \u043a\u0435\u043b\u0456\u0441\u0456\u043c\u0456:", "LabelImageSavingConvention": "\u0421\u0443\u0440\u0435\u0442 \u0441\u0430\u049b\u0442\u0430\u0443 \u043a\u0435\u043b\u0456\u0441\u0456\u043c\u0456:",
"LabelImageSavingConventionHelp": "Media Browser \u043a\u0435\u04a3 \u0442\u0430\u0440\u0430\u0493\u0430\u043d \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0430 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b\u043d\u0430\u043d \u0430\u043b\u044b\u043d\u0493\u0430\u043d \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0442\u0430\u043d\u0438\u0434\u044b. \u0421\u043e\u043d\u044b\u043c\u0435\u043d \u049b\u0430\u0442\u0430\u0440 \u0431\u0430\u0441\u049b\u0430 \u04e9\u043d\u0456\u043c\u0434\u0435\u0440 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0434\u0430 \u0431\u043e\u043b\u0441\u0430, \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u043a\u0435\u043b\u0456\u0441\u0456\u043c\u0456\u043d \u0442\u0430\u04a3\u0434\u0430\u0443 \u043f\u0430\u0439\u0434\u0430\u043b\u044b.", "LabelImageSavingConventionHelp": "Media Browser \u043a\u0435\u04a3 \u0442\u0430\u0440\u0430\u0493\u0430\u043d \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0430 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b\u043d\u0430\u043d \u0430\u043b\u044b\u043d\u0493\u0430\u043d \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0442\u0430\u043d\u0438\u0434\u044b. \u0421\u043e\u043d\u044b\u043c\u0435\u043d \u049b\u0430\u0442\u0430\u0440 \u0431\u0430\u0441\u049b\u0430 \u04e9\u043d\u0456\u043c\u0434\u0435\u0440 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0434\u0430 \u0431\u043e\u043b\u0441\u0430, \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u043a\u0435\u043b\u0456\u0441\u0456\u043c\u0456\u043d \u0442\u0430\u04a3\u0434\u0430\u0443 \u043f\u0430\u0439\u0434\u0430\u043b\u044b.",
@ -676,7 +676,7 @@
"TabResponses": "\u04ae\u043d \u049b\u0430\u0442\u0443\u043b\u0430\u0440", "TabResponses": "\u04ae\u043d \u049b\u0430\u0442\u0443\u043b\u0430\u0440",
"HeaderProfileInformation": "\u041f\u0440\u043e\u0444\u0430\u0439\u043b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u044b", "HeaderProfileInformation": "\u041f\u0440\u043e\u0444\u0430\u0439\u043b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u044b",
"LabelEmbedAlbumArtDidl": "Didl \u0456\u0448\u0456\u043d\u0435 \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0435\u043d\u0434\u0456\u0440\u0443", "LabelEmbedAlbumArtDidl": "Didl \u0456\u0448\u0456\u043d\u0435 \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0435\u043d\u0434\u0456\u0440\u0443",
"LabelEmbedAlbumArtDidlHelp": "\u041a\u0435\u0439\u0431\u0456\u0440 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440\u0493\u0430 \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u04d9\u0434\u0456\u0441 \u049b\u0430\u0436\u0435\u0442. \u0411\u0430\u0441\u049b\u0430\u043b\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b, \u043e\u0441\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043e\u0439\u043d\u0430\u0442\u0443 \u0441\u04d9\u0442\u0441\u0456\u0437 \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.", "LabelEmbedAlbumArtDidlHelp": "\u041a\u0435\u0439\u0431\u0456\u0440 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440\u0493\u0430 \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u04d9\u0434\u0456\u0441 \u049b\u0430\u0436\u0435\u0442. \u0411\u0430\u0441\u049b\u0430\u043b\u0430\u0440 \u04af\u0448\u0456\u043d, \u043e\u0441\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043e\u0439\u043d\u0430\u0442\u0443 \u0441\u04d9\u0442\u0441\u0456\u0437 \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.",
"LabelAlbumArtPN": "\u0410\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456 PN:", "LabelAlbumArtPN": "\u0410\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456 PN:",
"LabelAlbumArtHelp": "PN \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456 \u04af\u0448\u0456\u043d upnp:albumArtURI \u0456\u0448\u0456\u043d\u0434\u0435\u0433\u0456 dlna:profileID \u0442\u04e9\u043b\u0441\u0438\u043f\u0430\u0442\u044b\u043c\u0435\u043d \u0431\u0456\u0440\u0433\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b. \u041a\u0435\u0439\u0431\u0456\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440 \u04af\u0448\u0456\u043d \u0441\u0443\u0440\u0435\u0442\u0442\u0456\u04a3 \u04e9\u043b\u0448\u0435\u043c\u0456\u043d\u0435 \u0430\u04a3\u0493\u0430\u0440\u0443\u0441\u044b\u0437 \u043d\u0430\u049b\u0442\u044b \u043c\u04d9\u043d \u049b\u0430\u0436\u0435\u0442.", "LabelAlbumArtHelp": "PN \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456 \u04af\u0448\u0456\u043d upnp:albumArtURI \u0456\u0448\u0456\u043d\u0434\u0435\u0433\u0456 dlna:profileID \u0442\u04e9\u043b\u0441\u0438\u043f\u0430\u0442\u044b\u043c\u0435\u043d \u0431\u0456\u0440\u0433\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b. \u041a\u0435\u0439\u0431\u0456\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440 \u04af\u0448\u0456\u043d \u0441\u0443\u0440\u0435\u0442\u0442\u0456\u04a3 \u04e9\u043b\u0448\u0435\u043c\u0456\u043d\u0435 \u0430\u04a3\u0493\u0430\u0440\u0443\u0441\u044b\u0437 \u043d\u0430\u049b\u0442\u044b \u043c\u04d9\u043d \u049b\u0430\u0436\u0435\u0442.",
"LabelAlbumArtMaxWidth": "\u0410\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d\u0456\u04a3 \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u0435\u043d\u0456:", "LabelAlbumArtMaxWidth": "\u0410\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d\u0456\u04a3 \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u0435\u043d\u0456:",
@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "\u0411\u04b1\u043b \u043c\u04d9\u043d\u0434\u0435\u0440 Media Browser \u049b\u0430\u043b\u0430\u0439 \u04e9\u0437\u0456\u043d \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430 \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0442\u0456\u043d\u0456\u04a3 \u0431\u0430\u0441\u049b\u0430\u0440\u0430\u0434\u044b.", "HeaderProfileServerSettingsHelp": "\u0411\u04b1\u043b \u043c\u04d9\u043d\u0434\u0435\u0440 Media Browser \u049b\u0430\u043b\u0430\u0439 \u04e9\u0437\u0456\u043d \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430 \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0442\u0456\u043d\u0456\u04a3 \u0431\u0430\u0441\u049b\u0430\u0440\u0430\u0434\u044b.",
"LabelMaxBitrate": "\u0415\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d:", "LabelMaxBitrate": "\u0415\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d:",
"LabelMaxBitrateHelp": "\u04e8\u0442\u043a\u0456\u0437\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456 \u0448\u0435\u043a\u0442\u0435\u043b\u0433\u0435\u043d \u043e\u0440\u0442\u0430\u043b\u0430\u0440\u0434\u0430\u0493\u044b \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d\u0434\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.", "LabelMaxBitrateHelp": "\u04e8\u0442\u043a\u0456\u0437\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456 \u0448\u0435\u043a\u0442\u0435\u043b\u0433\u0435\u043d \u043e\u0440\u0442\u0430\u043b\u0430\u0440\u0434\u0430\u0493\u044b \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d\u0434\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "\u049a\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443 \u0431\u0430\u0439\u0442 \u0430\u0443\u049b\u044b\u043c\u044b \u0441\u04b1\u0440\u0430\u043d\u044b\u0441\u0442\u0430\u0440\u044b\u043d \u0435\u043b\u0435\u043c\u0435\u0443", "OptionIgnoreTranscodeByteRangeRequests": "\u049a\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443 \u0431\u0430\u0439\u0442 \u0430\u0443\u049b\u044b\u043c\u044b \u0441\u04b1\u0440\u0430\u043d\u044b\u0441\u0442\u0430\u0440\u044b\u043d \u0435\u043b\u0435\u043c\u0435\u0443",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043e\u0441\u044b \u0441\u04b1\u0440\u0430\u043d\u044b\u0441\u0442\u0430\u0440\u043c\u0435\u043d \u0441\u0430\u043d\u0430\u0441\u0443 \u0431\u043e\u043b\u0430\u0434\u044b, \u0431\u0456\u0440\u0430\u049b \u0431\u0430\u0439\u0442 \u0430\u0443\u049b\u044b\u043c\u044b\u043d\u044b\u04a3 \u0431\u0430\u0441 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u043c\u0435\u0441\u0456 \u0435\u043b\u0435\u043f \u0435\u0441\u043a\u0435\u0440\u0456\u043b\u043c\u0435\u0439\u0434\u0456.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043e\u0441\u044b \u0441\u04b1\u0440\u0430\u043d\u044b\u0441\u0442\u0430\u0440\u043c\u0435\u043d \u0441\u0430\u043d\u0430\u0441\u0443 \u0431\u043e\u043b\u0430\u0434\u044b, \u0431\u0456\u0440\u0430\u049b \u0431\u0430\u0439\u0442 \u0430\u0443\u049b\u044b\u043c\u044b\u043d\u044b\u04a3 \u0431\u0430\u0441 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u043c\u0435\u0441\u0456 \u0435\u043b\u0435\u043f \u0435\u0441\u043a\u0435\u0440\u0456\u043b\u043c\u0435\u0439\u0434\u0456.",
"LabelFriendlyName": "\u0422\u04af\u0441\u0456\u043d\u0456\u043a\u0442\u0456 \u0430\u0442\u044b", "LabelFriendlyName": "\u0422\u04af\u0441\u0456\u043d\u0456\u043a\u0442\u0456 \u0430\u0442\u044b",
@ -885,10 +889,16 @@
"TabUsers": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440", "TabUsers": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440",
"HeaderFeatures": "\u041c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440", "HeaderFeatures": "\u041c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440",
"HeaderAdvanced": "\u049a\u043e\u0441\u044b\u043c\u0448\u0430", "HeaderAdvanced": "\u049a\u043e\u0441\u044b\u043c\u0448\u0430",
"ButtonSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443", "ButtonSync": "\u0421\u0438\u043d\u0445\u0440\u043e",
"TabScheduledTasks": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0443\u0448\u044b", "TabScheduledTasks": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0443\u0448\u044b",
"HeaderChapters": "\u0421\u0430\u0445\u043d\u0430\u043b\u0430\u0440", "HeaderChapters": "\u0421\u0430\u0445\u043d\u0430\u043b\u0430\u0440",
"HeaderResumeSettings": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", "HeaderResumeSettings": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456",
"TabSync": "Sync", "TabSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443",
"TitleUsers": "Users" "TitleUsers": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -65,12 +65,12 @@
"LabelSubtitleLanguagePreference": "Voorkeurs taal ondertiteling:", "LabelSubtitleLanguagePreference": "Voorkeurs taal ondertiteling:",
"OptionDefaultSubtitles": "Standaard", "OptionDefaultSubtitles": "Standaard",
"OptionOnlyForcedSubtitles": "Alleen 'geforceerde' ondertiteling", "OptionOnlyForcedSubtitles": "Alleen 'geforceerde' ondertiteling",
"OptionAlwaysPlaySubtitles": "Altijd ondertiteling weergeven", "OptionAlwaysPlaySubtitles": "Ondertiteling altijd weergeven",
"OptionNoSubtitles": "Geen ondertitels", "OptionNoSubtitles": "Geen ondertitels",
"OptionDefaultSubtitlesHelp": "Ondertiteling wordt weergegeven in de voorkeurstaal als de audio in een buitenlandse taal is.", "OptionDefaultSubtitlesHelp": "Ondertiteling wordt weergegeven in de voorkeurstaal als de audio in een andere taal is.",
"OptionOnlyForcedSubtitlesHelp": "Alleen ondertiteling die als 'forced' gemarkeerd zijn worden geladen.", "OptionOnlyForcedSubtitlesHelp": "Alleen ondertitels gemarkeerd als \"gedwongen\" zullen worden geladen.",
"OptionAlwaysPlaySubtitlesHelp": "Ondertiteling wordt weergegeveen in de voorkeurstaal ongeacht de taal van de audio.", "OptionAlwaysPlaySubtitlesHelp": "Ondertiteling wordt weergegeveen in de voorkeurstaal ongeacht de taal van de audio.",
"OptionNoSubtitlesHelp": "Ondertiteling wordt niet standaard weergegeven.", "OptionNoSubtitlesHelp": "Ondertiteling wordt standaard niet weergegeven.",
"TabProfiles": "Profielen", "TabProfiles": "Profielen",
"TabSecurity": "Beveiliging", "TabSecurity": "Beveiliging",
"ButtonAddUser": "Gebruiker toevoegen", "ButtonAddUser": "Gebruiker toevoegen",
@ -136,7 +136,7 @@
"OptionAlbumArtist": "Albumartiest", "OptionAlbumArtist": "Albumartiest",
"OptionArtist": "Artiest", "OptionArtist": "Artiest",
"OptionAlbum": "Album", "OptionAlbum": "Album",
"OptionTrackName": "Track Naam", "OptionTrackName": "Naam van Nummer",
"OptionCommunityRating": "Gemeenschaps Waardering", "OptionCommunityRating": "Gemeenschaps Waardering",
"OptionNameSort": "Naam", "OptionNameSort": "Naam",
"OptionFolderSort": "Mappen", "OptionFolderSort": "Mappen",
@ -237,7 +237,7 @@
"ButtonGroupVersions": "Groepeer Versies", "ButtonGroupVersions": "Groepeer Versies",
"ButtonAddToCollection": "Toevoegen aan verzameling", "ButtonAddToCollection": "Toevoegen aan verzameling",
"PismoMessage": "Pismo File Mount (met een geschonken licentie).", "PismoMessage": "Pismo File Mount (met een geschonken licentie).",
"TangibleSoftwareMessage": "Tangible Solution Java\/C# converters worden onder een gedoneerde licentie gebruikt.", "TangibleSoftwareMessage": "Gebruik makend van concrete oplossingen als Java \/ C converters door een geschonken licentie.",
"HeaderCredits": "Credits", "HeaderCredits": "Credits",
"PleaseSupportOtherProduces": "Steun A.U.B. ook de andere gratis producten die wij gebruiken:", "PleaseSupportOtherProduces": "Steun A.U.B. ook de andere gratis producten die wij gebruiken:",
"VersionNumber": "Versie {0}", "VersionNumber": "Versie {0}",
@ -296,7 +296,7 @@
"PasswordLocalhostMessage": "Wachtwoorden zijn niet vereist bij het aanmelden van localhost.", "PasswordLocalhostMessage": "Wachtwoorden zijn niet vereist bij het aanmelden van localhost.",
"TabGuide": "Gids", "TabGuide": "Gids",
"TabChannels": "Kanalen", "TabChannels": "Kanalen",
"TabCollections": "Verzameling", "TabCollections": "Verzamelingen",
"HeaderChannels": "Kanalen", "HeaderChannels": "Kanalen",
"TabRecordings": "Opnamen", "TabRecordings": "Opnamen",
"TabScheduled": "Gepland", "TabScheduled": "Gepland",
@ -613,7 +613,7 @@
"ButtonArrowRight": "Rechts", "ButtonArrowRight": "Rechts",
"ButtonBack": "Terug", "ButtonBack": "Terug",
"ButtonInfo": "Info", "ButtonInfo": "Info",
"ButtonOsd": "On Screen Display", "ButtonOsd": "Weergave op het scherm",
"ButtonPageUp": "Page Up", "ButtonPageUp": "Page Up",
"ButtonPageDown": "Page Down", "ButtonPageDown": "Page Down",
"PageAbbreviation": "PG", "PageAbbreviation": "PG",
@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "Deze waarden bepalen hoe Media Browser zichzelf zal presenteren aan het apparaat.", "HeaderProfileServerSettingsHelp": "Deze waarden bepalen hoe Media Browser zichzelf zal presenteren aan het apparaat.",
"LabelMaxBitrate": "Max. bitrate:", "LabelMaxBitrate": "Max. bitrate:",
"LabelMaxBitrateHelp": "Geef een max. bitrate in bandbreedte beperkte omgevingen, of als het apparaat zijn eigen limiet heeft.", "LabelMaxBitrateHelp": "Geef een max. bitrate in bandbreedte beperkte omgevingen, of als het apparaat zijn eigen limiet heeft.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Transcodeer byte range-aanvragen negeren", "OptionIgnoreTranscodeByteRangeRequests": "Transcodeer byte range-aanvragen negeren",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Indien ingeschakeld, zal deze verzoeken worden gehonoreerd, maar zal de byte bereik header worden genegerd.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Indien ingeschakeld, zal deze verzoeken worden gehonoreerd, maar zal de byte bereik header worden genegerd.",
"LabelFriendlyName": "Aangepaste naam", "LabelFriendlyName": "Aangepaste naam",
@ -745,14 +749,14 @@
"LabelDisplayPluginsFor": "Toon Plug-ins voor:", "LabelDisplayPluginsFor": "Toon Plug-ins voor:",
"PluginTabMediaBrowserClassic": "MB Classic", "PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater", "PluginTabMediaBrowserTheater": "MB Theater",
"LabelEpisodeName": "Naam aflevering", "LabelEpisodeName": "Aflevering naam",
"LabelSeriesName": "Naam serie", "LabelSeriesName": "Serie naam",
"ValueSeriesNamePeriod": "Naam.Serie", "ValueSeriesNamePeriod": "Serie.Naam",
"ValueSeriesNameUnderscore": "Naam_Serie", "ValueSeriesNameUnderscore": "Serie_naam",
"ValueEpisodeNamePeriod": "Naam.Aflevering", "ValueEpisodeNamePeriod": "Aflevering.naam",
"ValueEpisodeNameUnderscore": "Naam_Aflevering", "ValueEpisodeNameUnderscore": "Aflevering_naam",
"HeaderTypeText": "Voer tekst in", "HeaderTypeText": "Voer tekst in",
"LabelTypeText": "tekst", "LabelTypeText": "Tekst",
"HeaderSearchForSubtitles": "Zoeken naar Ondertitels", "HeaderSearchForSubtitles": "Zoeken naar Ondertitels",
"MessageNoSubtitleSearchResultsFound": "Geen zoekresultaten gevonden.", "MessageNoSubtitleSearchResultsFound": "Geen zoekresultaten gevonden.",
"TabDisplay": "Weergave", "TabDisplay": "Weergave",
@ -800,7 +804,7 @@
"LabelEnableChannelContentDownloadingFor": "Schakel kanaalinhoud downloaden in voor:", "LabelEnableChannelContentDownloadingFor": "Schakel kanaalinhoud downloaden in voor:",
"LabelEnableChannelContentDownloadingForHelp": "Sommige kanalen ondersteunen downloaden en later kijken. Schakel deze optie in als er weinig bandbreedte beschikbaar is. Inhoud zal dan tijdens de kanaal download taak uitgevoerd worden.", "LabelEnableChannelContentDownloadingForHelp": "Sommige kanalen ondersteunen downloaden en later kijken. Schakel deze optie in als er weinig bandbreedte beschikbaar is. Inhoud zal dan tijdens de kanaal download taak uitgevoerd worden.",
"LabelChannelDownloadPath": "Kanaal inhoud download pad:", "LabelChannelDownloadPath": "Kanaal inhoud download pad:",
"LabelChannelDownloadPathHelp": "Geef een eigen download pad op als dit gewenst is, leeglaten voor dowloaden naar de interne program data map.", "LabelChannelDownloadPathHelp": "Geef een eigen download pad op als dit gewenst is, leeglaten voor dowloaden naar de interne programa data map.",
"LabelChannelDownloadAge": "Verwijder inhoud na: (dagen)", "LabelChannelDownloadAge": "Verwijder inhoud na: (dagen)",
"LabelChannelDownloadAgeHelp": "Gedownloade inhoud die ouder is zal worden verwijderd. Afspelen via internet streaming blijft mogelijk.", "LabelChannelDownloadAgeHelp": "Gedownloade inhoud die ouder is zal worden verwijderd. Afspelen via internet streaming blijft mogelijk.",
"ChannelSettingsFormHelp": "Installeer kanalen zoals Trailers en Vimeo in de Plug-in catalogus.", "ChannelSettingsFormHelp": "Installeer kanalen zoals Trailers en Vimeo in de Plug-in catalogus.",
@ -836,7 +840,7 @@
"LabelGroupChannelsIntoViews": "Toon de volgende kanalen binnen mijn overzichten:", "LabelGroupChannelsIntoViews": "Toon de volgende kanalen binnen mijn overzichten:",
"LabelGroupChannelsIntoViewsHelp": "Indien ingeschakeld, zullen deze kanalen direct naast andere overzichten worden weergegeven. Indien uitgeschakeld, zullen ze worden weergegeven in een aparte kanalen overzicht.", "LabelGroupChannelsIntoViewsHelp": "Indien ingeschakeld, zullen deze kanalen direct naast andere overzichten worden weergegeven. Indien uitgeschakeld, zullen ze worden weergegeven in een aparte kanalen overzicht.",
"LabelDisplayCollectionsView": "Toon Collecties in Mijn Overzichten om film collecties te tonen", "LabelDisplayCollectionsView": "Toon Collecties in Mijn Overzichten om film collecties te tonen",
"LabelXbmcMetadataEnableExtraThumbs": "Kopieer extrafanart naar extrathunms", "LabelXbmcMetadataEnableExtraThumbs": "Kopieer extrafanart naar extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "Als er afbeeldingen gedownload worden kunnen deze in extrafanart en extrathumbs worden opgeslagen voor maximale compatibiliteit met XBMC skins", "LabelXbmcMetadataEnableExtraThumbsHelp": "Als er afbeeldingen gedownload worden kunnen deze in extrafanart en extrathumbs worden opgeslagen voor maximale compatibiliteit met XBMC skins",
"TabServices": "Meta Diensten", "TabServices": "Meta Diensten",
"TabLogs": "Logboeken", "TabLogs": "Logboeken",
@ -890,5 +894,11 @@
"HeaderChapters": "Hoofdstukken", "HeaderChapters": "Hoofdstukken",
"HeaderResumeSettings": "Instellingen voor Hervatten", "HeaderResumeSettings": "Instellingen voor Hervatten",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Gebruikers",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "Estes valores controlam como o Media Browser ser\u00e1 exibido no dispositivo.", "HeaderProfileServerSettingsHelp": "Estes valores controlam como o Media Browser ser\u00e1 exibido no dispositivo.",
"LabelMaxBitrate": "Taxa de bits m\u00e1xima:", "LabelMaxBitrate": "Taxa de bits m\u00e1xima:",
"LabelMaxBitrateHelp": "Especifique uma taxa de bits m\u00e1xima para ambientes com restri\u00e7\u00e3o de tamanho de banda, ou se o dispositivo imp\u00f5e esse limite.", "LabelMaxBitrateHelp": "Especifique uma taxa de bits m\u00e1xima para ambientes com restri\u00e7\u00e3o de tamanho de banda, ou se o dispositivo imp\u00f5e esse limite.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignorar requisi\u00e7\u00f5es de extens\u00e3o do byte de transcodifica\u00e7\u00e3o", "OptionIgnoreTranscodeByteRangeRequests": "Ignorar requisi\u00e7\u00f5es de extens\u00e3o do byte de transcodifica\u00e7\u00e3o",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Se ativadas, estas requisi\u00e7\u00f5es ser\u00e3o honradas mas ir\u00e3o ignorar o cabe\u00e7alho da extens\u00e3o do byte.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Se ativadas, estas requisi\u00e7\u00f5es ser\u00e3o honradas mas ir\u00e3o ignorar o cabe\u00e7alho da extens\u00e3o do byte.",
"LabelFriendlyName": "Nome amig\u00e1vel", "LabelFriendlyName": "Nome amig\u00e1vel",
@ -767,10 +771,10 @@
"OptionAuto": "Auto", "OptionAuto": "Auto",
"OptionYes": "Sim", "OptionYes": "Sim",
"OptionNo": "N\u00e3o", "OptionNo": "N\u00e3o",
"LabelHomePageSection1": "Se\u00e7\u00e3o um da tela de in\u00edcio:", "LabelHomePageSection1": "Tela de in\u00edcio se\u00e7\u00e3o 1:",
"LabelHomePageSection2": "Se\u00e7\u00e3o dois da tela de in\u00edcio:", "LabelHomePageSection2": "Tela de in\u00edcio se\u00e7\u00e3o 2:",
"LabelHomePageSection3": "Se\u00e7\u00e3o tr\u00eas da tela de in\u00edcio:", "LabelHomePageSection3": "Tela de in\u00edcio se\u00e7\u00e3o 3:",
"LabelHomePageSection4": "Se\u00e7\u00e3o quatro da tela de in\u00edcio", "LabelHomePageSection4": "Tela de in\u00edcio se\u00e7\u00e3o 4:",
"OptionMyViewsButtons": "Minhas visualiza\u00e7\u00f5es (bot\u00f5es)", "OptionMyViewsButtons": "Minhas visualiza\u00e7\u00f5es (bot\u00f5es)",
"OptionMyViews": "Minhas visualiza\u00e7\u00f5es", "OptionMyViews": "Minhas visualiza\u00e7\u00f5es",
"OptionMyViewsSmall": "Minhas visualiza\u00e7\u00f5es (pequeno)", "OptionMyViewsSmall": "Minhas visualiza\u00e7\u00f5es (pequeno)",
@ -889,6 +893,12 @@
"TabScheduledTasks": "Tarefas Agendadas", "TabScheduledTasks": "Tarefas Agendadas",
"HeaderChapters": "Cap\u00edtulos", "HeaderChapters": "Cap\u00edtulos",
"HeaderResumeSettings": "Ajustes para Retomar", "HeaderResumeSettings": "Ajustes para Retomar",
"TabSync": "Sync", "TabSync": "Sincroniza\u00e7\u00e3o",
"TitleUsers": "Users" "TitleUsers": "Usu\u00e1rios",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -190,7 +190,7 @@
"HeaderStatus": "Estado", "HeaderStatus": "Estado",
"OptionContinuing": "A Continuar", "OptionContinuing": "A Continuar",
"OptionEnded": "Terminado", "OptionEnded": "Terminado",
"HeaderAirDays": "Dias de Exibi\u00e7\u00e3o:", "HeaderAirDays": "Dias de Exibi\u00e7\u00e3o",
"OptionSunday": "Domingo", "OptionSunday": "Domingo",
"OptionMonday": "Segunda", "OptionMonday": "Segunda",
"OptionTuesday": "Ter\u00e7a", "OptionTuesday": "Ter\u00e7a",
@ -198,8 +198,8 @@
"OptionThursday": "Quinta", "OptionThursday": "Quinta",
"OptionFriday": "Sexta", "OptionFriday": "Sexta",
"OptionSaturday": "S\u00e1bado", "OptionSaturday": "S\u00e1bado",
"HeaderManagement": "Gest\u00e3o:", "HeaderManagement": "Gest\u00e3o",
"LabelManagement": "Management:", "LabelManagement": "Administra\u00e7\u00e3o:",
"OptionMissingImdbId": "Id do IMDb em falta", "OptionMissingImdbId": "Id do IMDb em falta",
"OptionMissingTvdbId": "iD do TheTVDB em falta", "OptionMissingTvdbId": "iD do TheTVDB em falta",
"OptionMissingOverview": "Descri\u00e7\u00e3o em falta", "OptionMissingOverview": "Descri\u00e7\u00e3o em falta",
@ -257,11 +257,11 @@
"ButtonSelectDirectory": "Selecione a diretoria", "ButtonSelectDirectory": "Selecione a diretoria",
"LabelCustomPaths": "Defina localiza\u00e7\u00f5es personalizadas. Deixe os campos em branco para usar os valores padr\u00e3o.", "LabelCustomPaths": "Defina localiza\u00e7\u00f5es personalizadas. Deixe os campos em branco para usar os valores padr\u00e3o.",
"LabelCachePath": "Localiza\u00e7\u00e3o da cache:", "LabelCachePath": "Localiza\u00e7\u00e3o da cache:",
"LabelCachePathHelp": "Esta pasta cont\u00e9m ficheiros de cacha do servidor, como por exemplo, imagens.", "LabelCachePathHelp": "Defina uma localiza\u00e7\u00e3o para ficheiros de cache do servidor, como por exemplo, imagens.",
"LabelImagesByNamePath": "Localiza\u00e7\u00e3o das imagens por nome:", "LabelImagesByNamePath": "Localiza\u00e7\u00e3o das imagens por nome:",
"LabelImagesByNamePathHelp": "Esta pasta cont\u00e9m imagens de atores, artistas, g\u00e9neros e est\u00fadios.", "LabelImagesByNamePathHelp": "Defina uma localiza\u00e7\u00e3o para imagens de atores, artistas, g\u00e9neros e est\u00fadios.",
"LabelMetadataPath": "Localiza\u00e7\u00e3o dos metadados:", "LabelMetadataPath": "Localiza\u00e7\u00e3o dos metadados:",
"LabelMetadataPathHelp": "Esta localiza\u00e7\u00e3o cont\u00e9m imagens e metadados transferidos que n\u00e3o foram configurados para serem armazenados nas pastas multim\u00e9dia.", "LabelMetadataPathHelp": "Defina uma localiza\u00e7\u00e3o para imagens e metadados transferidos que n\u00e3o foram configurados para serem armazenados nas pastas multim\u00e9dia.",
"LabelTranscodingTempPath": "Localiza\u00e7\u00e3o tempor\u00e1ria das transcodifica\u00e7\u00f5es:", "LabelTranscodingTempPath": "Localiza\u00e7\u00e3o tempor\u00e1ria das transcodifica\u00e7\u00f5es:",
"LabelTranscodingTempPathHelp": "Esta pasta cont\u00e9m ficheiros de trabalho usados pelo transcodificador.", "LabelTranscodingTempPathHelp": "Esta pasta cont\u00e9m ficheiros de trabalho usados pelo transcodificador.",
"TabBasics": "B\u00e1sico", "TabBasics": "B\u00e1sico",
@ -630,7 +630,7 @@
"ButtonFullscreen": "Toggle fullscreen", "ButtonFullscreen": "Toggle fullscreen",
"ButtonScenes": "Cenas", "ButtonScenes": "Cenas",
"ButtonSubtitles": "Legendas", "ButtonSubtitles": "Legendas",
"ButtonAudioTracks": "Audio tracks", "ButtonAudioTracks": "Faixas de \u00e1udio",
"ButtonPreviousTrack": "Previous track", "ButtonPreviousTrack": "Previous track",
"ButtonNextTrack": "Next track", "ButtonNextTrack": "Next track",
"ButtonStop": "Parar", "ButtonStop": "Parar",
@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "Estes valores controlam como o Media Browser ser\u00e1 exibido no dispositivo.", "HeaderProfileServerSettingsHelp": "Estes valores controlam como o Media Browser ser\u00e1 exibido no dispositivo.",
"LabelMaxBitrate": "Taxa de bits m\u00e1xima:", "LabelMaxBitrate": "Taxa de bits m\u00e1xima:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Nome amig\u00e1vel", "LabelFriendlyName": "Nome amig\u00e1vel",
@ -871,24 +875,30 @@
"HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.", "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
"HeaderHttpHeaders": "Http Headers", "HeaderHttpHeaders": "Http Headers",
"HeaderIdentificationHeader": "Identification Header", "HeaderIdentificationHeader": "Identification Header",
"LabelValue": "Value:", "LabelValue": "Valor:",
"LabelMatchType": "Match type:", "LabelMatchType": "Match type:",
"OptionEquals": "Equals", "OptionEquals": "Iguais",
"OptionRegex": "Regex", "OptionRegex": "Regex",
"OptionSubstring": "Substring", "OptionSubstring": "Substring",
"TabView": "View", "TabView": "View",
"TabSort": "Sort", "TabSort": "Ordenar",
"TabFilter": "Filter", "TabFilter": "Filtro",
"ButtonView": "View", "ButtonView": "Visualizar",
"LabelPageSize": "Item limit:", "LabelPageSize": "Item limit:",
"LabelView": "View:", "LabelView": "Visualizar:",
"TabUsers": "Users", "TabUsers": "Users",
"HeaderFeatures": "Features", "HeaderFeatures": "Features",
"HeaderAdvanced": "Advanced", "HeaderAdvanced": "Avan\u00e7ado",
"ButtonSync": "Sync", "ButtonSync": "Sincronizar",
"TabScheduledTasks": "Scheduled Tasks", "TabScheduledTasks": "Scheduled Tasks",
"HeaderChapters": "Chapters", "HeaderChapters": "Cap\u00edtulos",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -47,7 +47,7 @@
"LabelSaveLocalMetadata": "\u0421\u043e\u0445\u0440\u0430\u043d\u044f\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\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043e\u043a", "LabelSaveLocalMetadata": "\u0421\u043e\u0445\u0440\u0430\u043d\u044f\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\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043e\u043a",
"LabelSaveLocalMetadataHelp": "\u0418\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043e\u043a, \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0430\u0432\u0438\u0442\u044c.", "LabelSaveLocalMetadataHelp": "\u0418\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043e\u043a, \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0430\u0432\u0438\u0442\u044c.",
"LabelDownloadInternetMetadata": "\u0417\u0430\u0433\u0440\u0443\u0436\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 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430", "LabelDownloadInternetMetadata": "\u0417\u0430\u0433\u0440\u0443\u0436\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 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430",
"LabelDownloadInternetMetadataHelp": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f Media Browser, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445.", "LabelDownloadInternetMetadataHelp": "\u0414\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u0435 \u0432 Media Browser.",
"TabPreferences": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", "TabPreferences": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
"TabPassword": "\u041f\u0430\u0440\u043e\u043b\u044c", "TabPassword": "\u041f\u0430\u0440\u043e\u043b\u044c",
"TabLibraryAccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435", "TabLibraryAccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435",
@ -337,7 +337,7 @@
"OptionAutomatic": "\u0410\u0432\u0442\u043e", "OptionAutomatic": "\u0410\u0432\u0442\u043e",
"LiveTvPluginRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d-\u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a \u0443\u0441\u043b\u0443\u0433 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0422\u0412 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f.", "LiveTvPluginRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d-\u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a \u0443\u0441\u043b\u0443\u0433 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0422\u0412 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f.",
"LiveTvPluginRequiredHelp": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043e\u0434\u0438\u043d \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, NextPVR \u0438\u043b\u0438 ServerWMC.", "LiveTvPluginRequiredHelp": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043e\u0434\u0438\u043d \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, NextPVR \u0438\u043b\u0438 ServerWMC.",
"LabelCustomizeOptionsPerMediaType": "\u041f\u043e\u0434\u0433\u043e\u043d\u043a\u0430 \u043f\u043e \u0442\u0438\u043f\u0443 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044f:", "LabelCustomizeOptionsPerMediaType": "\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e \u0442\u0438\u043f\u0443 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044f:",
"OptionDownloadThumbImage": "\u0411\u0435\u0433\u0443\u043d\u043e\u043a", "OptionDownloadThumbImage": "\u0411\u0435\u0433\u0443\u043d\u043e\u043a",
"OptionDownloadMenuImage": "\u041c\u0435\u043d\u044e", "OptionDownloadMenuImage": "\u041c\u0435\u043d\u044e",
"OptionDownloadLogoImage": "\u041b\u043e\u0433\u043e\u0442\u0438\u043f", "OptionDownloadLogoImage": "\u041b\u043e\u0433\u043e\u0442\u0438\u043f",
@ -590,7 +590,7 @@
"NotificationOptionInstallationFailed": "\u0421\u0431\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438", "NotificationOptionInstallationFailed": "\u0421\u0431\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438",
"NotificationOptionNewLibraryContent": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e", "NotificationOptionNewLibraryContent": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e",
"NotificationOptionNewLibraryContentMultiple": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e (\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e)", "NotificationOptionNewLibraryContentMultiple": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e (\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e)",
"SendNotificationHelp": "\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u044f\u0449\u0438\u043a \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0418\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u0438. \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439.", "SendNotificationHelp": "\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u044f\u0449\u0438\u043a \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0432 \u0418\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u0438. \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439.",
"NotificationOptionServerRestartRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430", "NotificationOptionServerRestartRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430",
"LabelNotificationEnabled": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435", "LabelNotificationEnabled": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435",
"LabelMonitorUsers": "\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442:", "LabelMonitorUsers": "\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442:",
@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "\u042d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442, \u043a\u0430\u043a Media Browser \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435.", "HeaderProfileServerSettingsHelp": "\u042d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442, \u043a\u0430\u043a Media Browser \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435.",
"LabelMaxBitrate": "\u041c\u0430\u043a\u0441. \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c:", "LabelMaxBitrate": "\u041c\u0430\u043a\u0441. \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c:",
"LabelMaxBitrateHelp": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432 \u0441\u0440\u0435\u0434\u0430\u0445 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e, \u043b\u0438\u0431\u043e \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0451 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435.", "LabelMaxBitrateHelp": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432 \u0441\u0440\u0435\u0434\u0430\u0445 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e, \u043b\u0438\u0431\u043e \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0451 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438", "OptionIgnoreTranscodeByteRangeRequests": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u044d\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0443\u0447\u0442\u0435\u043d\u044b, \u043d\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u044d\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0443\u0447\u0442\u0435\u043d\u044b, \u043d\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d.",
"LabelFriendlyName": "\u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0438\u043c\u044f", "LabelFriendlyName": "\u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0438\u043c\u044f",
@ -705,7 +709,7 @@
"HeaderIdentificationCriteriaHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043e\u0434\u0438\u043d \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439.", "HeaderIdentificationCriteriaHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043e\u0434\u0438\u043d \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439.",
"HeaderDirectPlayProfileHelp": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e.", "HeaderDirectPlayProfileHelp": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e.",
"HeaderTranscodingProfileHelp": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430.", "HeaderTranscodingProfileHelp": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430.",
"HeaderResponseProfileHelp": "\u041f\u0440\u043e\u0444\u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u0438\u043a\u043e\u0432 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0434\u043e\u0433\u043d\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c\u0443\u044e \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0440\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u0435\u0439.", "HeaderResponseProfileHelp": "\u041f\u0440\u043e\u0444\u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u0438\u043a\u043e\u0432 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c\u043e\u0439 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0440\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u0435\u0439.",
"LabelXDlnaCap": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 X-Dlna:", "LabelXDlnaCap": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 X-Dlna:",
"LabelXDlnaCapHelp": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 X_DLNACAP \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0451\u043d urn:schemas-dlna-org:device-1-0", "LabelXDlnaCapHelp": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 X_DLNACAP \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0451\u043d urn:schemas-dlna-org:device-1-0",
"LabelXDlnaDoc": "\u0421\u0445\u0435\u043c\u0430 X-Dlna:", "LabelXDlnaDoc": "\u0421\u0445\u0435\u043c\u0430 X-Dlna:",
@ -792,7 +796,7 @@
"MessageNoCollectionsAvailable": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u043c \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u0437 \u0444\u0438\u043b\u044c\u043c\u043e\u0432, \u0441\u0435\u0440\u0438\u0430\u043b\u043e\u0432, \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432 \u0438 \u0438\u0433\u0440. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \"\u0421\u043e\u0437\u0434\u0430\u0442\u044c\", \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.", "MessageNoCollectionsAvailable": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u043c \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u0437 \u0444\u0438\u043b\u044c\u043c\u043e\u0432, \u0441\u0435\u0440\u0438\u0430\u043b\u043e\u0432, \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432 \u0438 \u0438\u0433\u0440. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \"\u0421\u043e\u0437\u0434\u0430\u0442\u044c\", \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.",
"HeaderWelcomeToMediaBrowserWebClient": "\u0412\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 Media Browser \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0430\u0441!", "HeaderWelcomeToMediaBrowserWebClient": "\u0412\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 Media Browser \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0430\u0441!",
"ButtonDismiss": "\u0421\u043a\u0440\u044b\u0442\u044c", "ButtonDismiss": "\u0421\u043a\u0440\u044b\u0442\u044c",
"MessageLearnHowToCustomize": "\u0418\u0437\u0443\u0447\u0438\u0442\u0435, \u043a\u0430\u043a \u043f\u043e\u0434\u043e\u0433\u043d\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0432\u043a\u0443\u0441\u0443. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0430\u0432\u0430\u0442\u0430\u0440\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 \u044d\u043a\u0440\u0430\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.", "MessageLearnHowToCustomize": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c, \u043a\u0430\u043a \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u0432\u043a\u0443\u0441\u0443. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0430\u0432\u0430\u0442\u0430\u0440\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 \u044d\u043a\u0440\u0430\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.",
"ButtonEditOtherUserPreferences": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u043b\u0438\u0447\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.", "ButtonEditOtherUserPreferences": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u043b\u0438\u0447\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.",
"LabelChannelStreamQuality": "\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442:", "LabelChannelStreamQuality": "\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442:",
"LabelChannelStreamQualityHelp": "\u0412 \u0441\u0440\u0435\u0434\u0435 \u0441 \u043d\u0438\u0437\u043a\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f.", "LabelChannelStreamQualityHelp": "\u0412 \u0441\u0440\u0435\u0434\u0435 \u0441 \u043d\u0438\u0437\u043a\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f.",
@ -842,7 +846,7 @@
"TabLogs": "\u0416\u0443\u0440\u043d\u0430\u043b\u044b", "TabLogs": "\u0416\u0443\u0440\u043d\u0430\u043b\u044b",
"HeaderServerLogFiles": "\u0424\u0430\u0439\u043b\u044b \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430:", "HeaderServerLogFiles": "\u0424\u0430\u0439\u043b\u044b \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430:",
"TabBranding": "\u0411\u0440\u0435\u043d\u0434\u0438\u043d\u0433", "TabBranding": "\u0411\u0440\u0435\u043d\u0434\u0438\u043d\u0433",
"HeaderBrandingHelp": "\u041f\u043e\u0434\u0433\u043e\u043d\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 Media Browser \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u043b\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.", "HeaderBrandingHelp": "\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 Media Browser \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u043b\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.",
"LabelLoginDisclaimer": "\u041e\u0433\u043e\u0432\u043e\u0440\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u0445\u043e\u0434\u0430:", "LabelLoginDisclaimer": "\u041e\u0433\u043e\u0432\u043e\u0440\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u0445\u043e\u0434\u0430:",
"LabelLoginDisclaimerHelp": "\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.", "LabelLoginDisclaimerHelp": "\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.",
"LabelAutomaticallyDonate": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043a\u0430\u0436\u0434\u044b\u0435 \u0448\u0435\u0441\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432", "LabelAutomaticallyDonate": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043a\u0430\u0436\u0434\u044b\u0435 \u0448\u0435\u0441\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432",
@ -858,7 +862,7 @@
"HeaderLatestMusic": "\u041d\u043e\u0432\u0438\u043d\u043a\u0438 \u043c\u0443\u0437\u044b\u043a\u0438", "HeaderLatestMusic": "\u041d\u043e\u0432\u0438\u043d\u043a\u0438 \u043c\u0443\u0437\u044b\u043a\u0438",
"HeaderBranding": "\u0411\u0440\u0435\u043d\u0434\u0438\u043d\u0433", "HeaderBranding": "\u0411\u0440\u0435\u043d\u0434\u0438\u043d\u0433",
"HeaderApiKeys": "\u041a\u043b\u044e\u0447\u0438 API", "HeaderApiKeys": "\u041a\u043b\u044e\u0447\u0438 API",
"HeaderApiKeysHelp": "\u0412\u043d\u0435\u0448\u043d\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447 API, \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Media Browser. \u041a\u043b\u044e\u0447\u0438 \u0432\u044b\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0441 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c\u044e Media Browser, \u0438\u043b\u0438 \u043a\u043b\u044e\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e.", "HeaderApiKeysHelp": "\u0412\u043d\u0435\u0448\u043d\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447 API, \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Media Browser. \u041a\u043b\u044e\u0447\u0438 \u0432\u044b\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0441 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c\u044e Media Browser, \u0438\u043b\u0438 \u043a\u043b\u044e\u0447 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0432\u0440\u0443\u0447\u043d\u0443\u044e.",
"HeaderApiKey": "\u041a\u043b\u044e\u0447 API", "HeaderApiKey": "\u041a\u043b\u044e\u0447 API",
"HeaderApp": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435", "HeaderApp": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435",
"HeaderDevice": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", "HeaderDevice": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
@ -889,6 +893,12 @@
"TabScheduledTasks": "\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a", "TabScheduledTasks": "\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a",
"HeaderChapters": "\u0421\u0446\u0435\u043d\u044b", "HeaderChapters": "\u0421\u0446\u0435\u043d\u044b",
"HeaderResumeSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f", "HeaderResumeSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f",
"TabSync": "Sync", "TabSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f",
"TitleUsers": "Users" "TitleUsers": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "Dessa v\u00e4rden styr hur Media Browser presenterar sig f\u00f6r enheten.", "HeaderProfileServerSettingsHelp": "Dessa v\u00e4rden styr hur Media Browser presenterar sig f\u00f6r enheten.",
"LabelMaxBitrate": "H\u00f6gsta bithastighet:", "LabelMaxBitrate": "H\u00f6gsta bithastighet:",
"LabelMaxBitrateHelp": "Ange en h\u00f6gsta bithastighet i bandbreddsbegr\u00e4nsade milj\u00f6er, eller i fall d\u00e4r enheten har sina egna begr\u00e4nsningar.", "LabelMaxBitrateHelp": "Ange en h\u00f6gsta bithastighet i bandbreddsbegr\u00e4nsade milj\u00f6er, eller i fall d\u00e4r enheten har sina egna begr\u00e4nsningar.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignorera beg\u00e4ran om \"byte range\" vid omkodning", "OptionIgnoreTranscodeByteRangeRequests": "Ignorera beg\u00e4ran om \"byte range\" vid omkodning",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Om aktiverad kommer beg\u00e4ran att uppfyllas, men \"byte range\"-rubriken ignoreras.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Om aktiverad kommer beg\u00e4ran att uppfyllas, men \"byte range\"-rubriken ignoreras.",
"LabelFriendlyName": "\u00d6nskat namn", "LabelFriendlyName": "\u00d6nskat namn",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -691,6 +691,10 @@
"HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
"LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrate": "Max bitrate:",
"LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
"LabelMaxStreamingBitrate": "Max streaming bitrate:",
"LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
"LabelMaxStaticBitrate": "Max sync bitrate:",
"LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name", "LabelFriendlyName": "Friendly name",
@ -890,5 +894,11 @@
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync", "TabSync": "Sync",
"TitleUsers": "Users" "TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync"
} }

View File

@ -61,15 +61,6 @@ namespace MediaBrowser.Server.Implementations.ServerManager
/// <value>The configuration manager.</value> /// <value>The configuration manager.</value>
private IServerConfigurationManager ConfigurationManager { get; set; } private IServerConfigurationManager ConfigurationManager { get; set; }
/// <summary>
/// Gets the web socket port number.
/// </summary>
/// <value>The web socket port number.</value>
public int WebSocketPortNumber
{
get { return ConfigurationManager.Configuration.HttpServerPortNumber; }
}
/// <summary> /// <summary>
/// Gets the web socket listeners. /// Gets the web socket listeners.
/// </summary> /// </summary>

View File

@ -234,6 +234,8 @@ namespace MediaBrowser.Server.Implementations.Session
private Task SendMessage<T>(WebSocketMessage<T> message, CancellationToken cancellationToken) private Task SendMessage<T>(WebSocketMessage<T> message, CancellationToken cancellationToken)
{ {
if (SkipSending()) return Task.FromResult(true);
var socket = GetActiveSocket(); var socket = GetActiveSocket();
return socket.SendAsync(message, cancellationToken); return socket.SendAsync(message, cancellationToken);
@ -241,6 +243,8 @@ namespace MediaBrowser.Server.Implementations.Session
private Task SendMessages<T>(WebSocketMessage<T> message, CancellationToken cancellationToken) private Task SendMessages<T>(WebSocketMessage<T> message, CancellationToken cancellationToken)
{ {
if (SkipSending()) return Task.FromResult(true);
var tasks = GetActiveSockets().Select(i => Task.Run(async () => var tasks = GetActiveSockets().Select(i => Task.Run(async () =>
{ {
try try
@ -257,6 +261,27 @@ namespace MediaBrowser.Server.Implementations.Session
return Task.WhenAll(tasks); return Task.WhenAll(tasks);
} }
private bool SkipSending()
{
if (Session != null)
{
if (string.Equals(Session.Client, "mb-classic", StringComparison.OrdinalIgnoreCase))
{
Version version;
if (!string.IsNullOrWhiteSpace(Session.ApplicationVersion) && Version.TryParse(Session.ApplicationVersion, out version))
{
if (version < new Version(3, 0, 196))
{
_logger.Debug("Skipping web socket message to MBC version {0}.", version);
return true;
}
}
}
}
return false;
}
public void Dispose() public void Dispose()
{ {
foreach (var socket in Sockets.ToList()) foreach (var socket in Sockets.ToList())

View File

@ -54,13 +54,14 @@ namespace MediaBrowser.Server.Implementations.Udp
/// <param name="serverConfigurationManager">The server configuration manager.</param> /// <param name="serverConfigurationManager">The server configuration manager.</param>
/// <param name="httpServer">The HTTP server.</param> /// <param name="httpServer">The HTTP server.</param>
/// <param name="appHost">The application host.</param> /// <param name="appHost">The application host.</param>
public UdpServer(ILogger logger, INetworkManager networkManager, IServerConfigurationManager serverConfigurationManager, IHttpServer httpServer, IServerApplicationHost appHost) public UdpServer(ILogger logger, INetworkManager networkManager, IServerConfigurationManager serverConfigurationManager, IHttpServer httpServer, IServerApplicationHost appHost, IJsonSerializer json)
{ {
_logger = logger; _logger = logger;
_networkManager = networkManager; _networkManager = networkManager;
_serverConfigurationManager = serverConfigurationManager; _serverConfigurationManager = serverConfigurationManager;
_httpServer = httpServer; _httpServer = httpServer;
_appHost = appHost; _appHost = appHost;
_json = json;
AddMessageResponder("who is MediaBrowserServer?", RespondToV1Message); AddMessageResponder("who is MediaBrowserServer?", RespondToV1Message);
AddMessageResponder("who is MediaBrowserServer_v2?", RespondToV2Message); AddMessageResponder("who is MediaBrowserServer_v2?", RespondToV2Message);
@ -77,13 +78,20 @@ namespace MediaBrowser.Server.Implementations.Udp
/// Raises the <see cref="E:MessageReceived" /> event. /// Raises the <see cref="E:MessageReceived" /> event.
/// </summary> /// </summary>
/// <param name="e">The <see cref="UdpMessageReceivedEventArgs"/> instance containing the event data.</param> /// <param name="e">The <see cref="UdpMessageReceivedEventArgs"/> instance containing the event data.</param>
private async void OnMessageReceived(UdpMessageReceivedEventArgs e) private void OnMessageReceived(UdpMessageReceivedEventArgs e)
{ {
var responder = _responders.FirstOrDefault(i => i.Item1.SequenceEqual(e.Bytes)); var responder = _responders.FirstOrDefault(i => i.Item1.SequenceEqual(e.Bytes));
if (responder != null) if (responder != null)
{ {
responder.Item2(e.RemoteEndPoint); try
{
responder.Item2(e.RemoteEndPoint);
}
catch (Exception ex)
{
_logger.ErrorException("Error in OnMessageReceived", ex);
}
} }
} }

View File

@ -18,7 +18,7 @@ namespace MediaBrowser.ServerApplication.Native
/// <param name="webSocketPort">The web socket port.</param> /// <param name="webSocketPort">The web socket port.</param>
/// <param name="udpPort">The UDP port.</param> /// <param name="udpPort">The UDP port.</param>
/// <param name="tempDirectory">The temp directory.</param> /// <param name="tempDirectory">The temp directory.</param>
public static void AuthorizeServer(int httpServerPort, string httpServerUrlPrefix, int webSocketPort, int udpPort, string tempDirectory) public static void AuthorizeServer(int httpServerPort, string httpServerUrlPrefix, int udpPort, string tempDirectory)
{ {
} }

View File

@ -533,8 +533,8 @@ namespace MediaBrowser.ServerApplication
AuthenticationRepository = await GetAuthenticationRepository().ConfigureAwait(false); AuthenticationRepository = await GetAuthenticationRepository().ConfigureAwait(false);
RegisterSingleInstance(AuthenticationRepository); RegisterSingleInstance(AuthenticationRepository);
SyncRepository = await GetSyncRepository().ConfigureAwait(false); //SyncRepository = await GetSyncRepository().ConfigureAwait(false);
RegisterSingleInstance(SyncRepository); //RegisterSingleInstance(SyncRepository);
UserManager = new UserManager(LogManager.GetLogger("UserManager"), ServerConfigurationManager, UserRepository, XmlSerializer); UserManager = new UserManager(LogManager.GetLogger("UserManager"), ServerConfigurationManager, UserRepository, XmlSerializer);
RegisterSingleInstance(UserManager); RegisterSingleInstance(UserManager);
@ -598,9 +598,6 @@ namespace MediaBrowser.ServerApplication
var dlnaManager = new DlnaManager(XmlSerializer, FileSystemManager, ApplicationPaths, LogManager.GetLogger("Dlna"), JsonSerializer); var dlnaManager = new DlnaManager(XmlSerializer, FileSystemManager, ApplicationPaths, LogManager.GetLogger("Dlna"), JsonSerializer);
RegisterSingleInstance<IDlnaManager>(dlnaManager); RegisterSingleInstance<IDlnaManager>(dlnaManager);
var contentDirectory = new ContentDirectory(dlnaManager, UserDataManager, ImageProcessor, LibraryManager, ServerConfigurationManager, UserManager, LogManager.GetLogger("UpnpContentDirectory"), HttpClient);
RegisterSingleInstance<IContentDirectory>(contentDirectory);
var connectionManager = new ConnectionManager(dlnaManager, ServerConfigurationManager, LogManager.GetLogger("UpnpConnectionManager"), HttpClient); var connectionManager = new ConnectionManager(dlnaManager, ServerConfigurationManager, LogManager.GetLogger("UpnpConnectionManager"), HttpClient);
RegisterSingleInstance<IConnectionManager>(connectionManager); RegisterSingleInstance<IConnectionManager>(connectionManager);
@ -610,9 +607,12 @@ namespace MediaBrowser.ServerApplication
LiveTvManager = new LiveTvManager(ServerConfigurationManager, FileSystemManager, Logger, ItemRepository, ImageProcessor, UserDataManager, DtoService, UserManager, LibraryManager, TaskManager, LocalizationManager); LiveTvManager = new LiveTvManager(ServerConfigurationManager, FileSystemManager, Logger, ItemRepository, ImageProcessor, UserDataManager, DtoService, UserManager, LibraryManager, TaskManager, LocalizationManager);
RegisterSingleInstance(LiveTvManager); RegisterSingleInstance(LiveTvManager);
UserViewManager = new UserViewManager(LibraryManager, LocalizationManager, FileSystemManager, UserManager, ChannelManager, LiveTvManager); UserViewManager = new UserViewManager(LibraryManager, LocalizationManager, FileSystemManager, UserManager, ChannelManager, LiveTvManager, ApplicationPaths);
RegisterSingleInstance(UserViewManager); RegisterSingleInstance(UserViewManager);
var contentDirectory = new ContentDirectory(dlnaManager, UserDataManager, ImageProcessor, LibraryManager, ServerConfigurationManager, UserManager, LogManager.GetLogger("UpnpContentDirectory"), HttpClient, UserViewManager, ChannelManager);
RegisterSingleInstance<IContentDirectory>(contentDirectory);
NotificationManager = new NotificationManager(LogManager, UserManager, ServerConfigurationManager); NotificationManager = new NotificationManager(LogManager, UserManager, ServerConfigurationManager);
RegisterSingleInstance(NotificationManager); RegisterSingleInstance(NotificationManager);
@ -1024,7 +1024,7 @@ namespace MediaBrowser.ServerApplication
HasPendingRestart = HasPendingRestart, HasPendingRestart = HasPendingRestart,
Version = ApplicationVersion.ToString(), Version = ApplicationVersion.ToString(),
IsNetworkDeployed = CanSelfUpdate, IsNetworkDeployed = CanSelfUpdate,
WebSocketPortNumber = ServerManager.WebSocketPortNumber, WebSocketPortNumber = HttpServerPort,
SupportsNativeWebSocket = true, SupportsNativeWebSocket = true,
FailedPluginAssemblies = FailedAssemblies.ToList(), FailedPluginAssemblies = FailedAssemblies.ToList(),
InProgressInstallations = InstallationManager.CurrentInstallations.Select(i => i.Item1).ToList(), InProgressInstallations = InstallationManager.CurrentInstallations.Select(i => i.Item1).ToList(),

View File

@ -35,7 +35,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg
switch (arg) switch (arg)
{ {
case "Version": case "Version":
return "20140721"; return "20140612";
case "FFMpegFilename": case "FFMpegFilename":
return "ffmpeg.exe"; return "ffmpeg.exe";
case "FFProbeFilename": case "FFProbeFilename":
@ -113,8 +113,8 @@ namespace MediaBrowser.ServerApplication.FFMpeg
case PlatformID.Win32NT: case PlatformID.Win32NT:
return new[] return new[]
{ {
"http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20140721-git-ce385c8-win32-static.7z", "http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20140612-git-3a1c895-win32-static.7z",
"https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/windows/ffmpeg-20140721-git-ce385c8-win32-static.7z" "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/windows/ffmpeg-20140612-git-3a1c895-win32-static.7z"
}; };
case PlatformID.Unix: case PlatformID.Unix:
@ -222,4 +222,4 @@ namespace MediaBrowser.ServerApplication.FFMpeg
public string sysname = string.Empty; public string sysname = string.Empty;
public string machine = string.Empty; public string machine = string.Empty;
} }
} }

View File

@ -1,12 +1,10 @@
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.IO; using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net; using MediaBrowser.Common.Net;
using MediaBrowser.Common.Progress;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net; using MediaBrowser.Model.Net;
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -140,13 +138,9 @@ namespace MediaBrowser.ServerApplication.FFMpeg
ExtractFFMpeg(tempFile, directory); ExtractFFMpeg(tempFile, directory);
return; return;
} }
catch (HttpException ex)
{
_logger.ErrorException("Error downloading {0}", ex, url);
}
catch (Exception ex) catch (Exception ex)
{ {
_logger.ErrorException("Error unpacking {0}", ex, url); _logger.ErrorException("Error downloading {0}", ex, url);
} }
} }

View File

@ -166,6 +166,8 @@ namespace MediaBrowser.Tests.Resolvers
Assert.AreEqual(1, TVUtils.GetSeasonNumberFromPath(@"\Drive\Season 1")); Assert.AreEqual(1, TVUtils.GetSeasonNumberFromPath(@"\Drive\Season 1"));
Assert.AreEqual(1, TVUtils.GetSeasonNumberFromPath(@"\Drive\Season 1")); Assert.AreEqual(1, TVUtils.GetSeasonNumberFromPath(@"\Drive\Season 1"));
Assert.AreEqual(2, TVUtils.GetSeasonNumberFromPath(@"\Drive\Seinfeld\S02"));
Assert.AreEqual(2, TVUtils.GetSeasonNumberFromPath(@"\Drive\Seinfeld\2")); Assert.AreEqual(2, TVUtils.GetSeasonNumberFromPath(@"\Drive\Seinfeld\2"));
//Four Digits seasons //Four Digits seasons