Merge pull request #1016 from MediaBrowser/dev

3.0.5518.5
pull/702/head
Luke 10 years ago
commit 8c09665c40

@ -83,6 +83,13 @@ namespace MediaBrowser.Api
{
info.ContentTypeOptions = GetContentTypeOptions(true);
info.ContentType = configuredContentType;
if (string.Equals(inheritedContentType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase))
{
info.ContentTypeOptions = info.ContentTypeOptions
.Where(i => string.IsNullOrWhiteSpace(i.Value) || string.Equals(i.Value, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase))
.ToList();
}
}
}
}

@ -145,12 +145,14 @@ namespace MediaBrowser.Api.Sync
private readonly ISyncManager _syncManager;
private readonly IDtoService _dtoService;
private readonly ILibraryManager _libraryManager;
private readonly IUserManager _userManager;
public SyncService(ISyncManager syncManager, IDtoService dtoService, ILibraryManager libraryManager)
public SyncService(ISyncManager syncManager, IDtoService dtoService, ILibraryManager libraryManager, IUserManager userManager)
{
_syncManager = syncManager;
_dtoService = dtoService;
_libraryManager = libraryManager;
_userManager = userManager;
}
public object Get(GetSyncTargets request)
@ -238,11 +240,15 @@ namespace MediaBrowser.Api.Sync
}
};
var auth = AuthorizationContext.GetAuthorizationInfo(Request);
var authenticatedUser = _userManager.GetUserById(auth.UserId);
var items = request.ItemIds.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(_libraryManager.GetItemById)
.Where(i => i != null);
var dtos = _dtoService.GetBaseItemDtos(items, dtoOptions)
var dtos = _dtoService.GetBaseItemDtos(items, dtoOptions, authenticatedUser)
.ToList();
result.Options = SyncHelper.GetSyncOptions(dtos);
@ -266,9 +272,11 @@ namespace MediaBrowser.Api.Sync
}
}
public object Get(GetReadySyncItems request)
public async Task<object> Get(GetReadySyncItems request)
{
return ToOptimizedResult(_syncManager.GetReadySyncItems(request.TargetId));
var result = await _syncManager.GetReadySyncItems(request.TargetId).ConfigureAwait(false);
return ToOptimizedResult(result);
}
public async Task<object> Post(SyncData request)

@ -157,6 +157,9 @@ namespace MediaBrowser.Api
[ApiMember(Name = "AdjacentTo", Description = "Optional. Return items that are siblings of a supplied item.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string AdjacentTo { get; set; }
[ApiMember(Name = "StartItemId", Description = "Optional. Skip through the list until a given item is found.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string StartItemId { get; set; }
/// <summary>
/// Skips over a given number of items within the results. Use for paging.
/// </summary>
@ -475,6 +478,11 @@ namespace MediaBrowser.Api
episodes = episodes.Where(i => i.IsVirtualUnaired == val);
}
if (!string.IsNullOrWhiteSpace(request.StartItemId))
{
episodes = episodes.SkipWhile(i => !string.Equals(i.Id.ToString("N"), request.StartItemId, StringComparison.OrdinalIgnoreCase));
}
IEnumerable<BaseItem> returnItems = episodes;
// This must be the last filter
@ -483,9 +491,10 @@ namespace MediaBrowser.Api
returnItems = UserViewBuilder.FilterForAdjacency(returnItems, request.AdjacentTo);
}
returnItems = _libraryManager.ReplaceVideosWithPrimaryVersions(returnItems);
var returnList = _libraryManager.ReplaceVideosWithPrimaryVersions(returnItems)
.ToList();
var pagedItems = ApplyPaging(returnItems, request.StartIndex, request.Limit);
var pagedItems = ApplyPaging(returnList, request.StartIndex, request.Limit);
var dtoOptions = GetDtoOptions(request);
@ -494,7 +503,7 @@ namespace MediaBrowser.Api
return new ItemsResult
{
TotalRecordCount = dtos.Length,
TotalRecordCount = returnList.Count,
Items = dtos
};
}

@ -365,9 +365,7 @@ namespace MediaBrowser.Api
throw new ResourceNotFoundException("User not found");
}
var auth = AuthorizationContext.GetAuthorizationInfo(Request);
var result = _userManager.GetOfflineUserDto(user, auth.DeviceId);
var result = _userManager.GetOfflineUserDto(user);
return ToOptimizedResult(result);
}

@ -169,24 +169,27 @@ namespace MediaBrowser.Common.Implementations.Networking
IPAddress address;
if (resolveHost && !IPAddress.TryParse(endpoint, out address))
{
var host = new Uri(endpoint).DnsSafeHost;
Logger.Debug("Resolving host {0}", host);
try
Uri uri;
if (Uri.TryCreate(endpoint, UriKind.RelativeOrAbsolute, out uri))
{
address = GetIpAddresses(host).FirstOrDefault();
var host = uri.DnsSafeHost;
Logger.Debug("Resolving host {0}", host);
if (address != null)
try
{
Logger.Debug("{0} resolved to {1}", host, address);
address = GetIpAddresses(host).FirstOrDefault();
return IsInLocalNetworkInternal(address.ToString(), false);
if (address != null)
{
Logger.Debug("{0} resolved to {1}", host, address);
return IsInLocalNetworkInternal(address.ToString(), false);
}
}
catch (Exception ex)
{
Logger.ErrorException("Error resovling hostname {0}", ex, host);
}
}
catch (Exception ex)
{
Logger.ErrorException("Error resovling hostname {0}", ex, host);
}
}

@ -52,6 +52,16 @@ namespace MediaBrowser.Controller.Entities.Audio
}
}
public override bool IsSaveLocalMetadataEnabled()
{
if (IsAccessedByName)
{
return true;
}
return base.IsSaveLocalMetadataEnabled();
}
private readonly Task _cachedTask = Task.FromResult(true);
protected override Task ValidateChildrenInternal(IProgress<double> progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
{

@ -44,6 +44,11 @@ namespace MediaBrowser.Controller.Entities.Audio
return false;
}
public override bool IsSaveLocalMetadataEnabled()
{
return true;
}
/// <summary>
/// Gets a value indicating whether this instance is owned item.
/// </summary>

@ -976,14 +976,21 @@ namespace MediaBrowser.Controller.Entities
lang = hasLang.PreferredMetadataLanguage;
}
if (string.IsNullOrEmpty(lang))
if (string.IsNullOrWhiteSpace(lang))
{
lang = Parents.OfType<IHasPreferredMetadataLanguage>()
.Select(i => i.PreferredMetadataLanguage)
.FirstOrDefault(i => !string.IsNullOrEmpty(i));
.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
}
if (string.IsNullOrEmpty(lang))
if (string.IsNullOrWhiteSpace(lang))
{
lang = LibraryManager.GetCollectionFolders(this)
.Select(i => i.PreferredMetadataLanguage)
.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
}
if (string.IsNullOrWhiteSpace(lang))
{
lang = ConfigurationManager.Configuration.PreferredMetadataLanguage;
}
@ -1006,14 +1013,21 @@ namespace MediaBrowser.Controller.Entities
lang = hasLang.PreferredMetadataCountryCode;
}
if (string.IsNullOrEmpty(lang))
if (string.IsNullOrWhiteSpace(lang))
{
lang = Parents.OfType<IHasPreferredMetadataLanguage>()
.Select(i => i.PreferredMetadataCountryCode)
.FirstOrDefault(i => !string.IsNullOrEmpty(i));
.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
}
if (string.IsNullOrWhiteSpace(lang))
{
lang = LibraryManager.GetCollectionFolders(this)
.Select(i => i.PreferredMetadataCountryCode)
.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
}
if (string.IsNullOrEmpty(lang))
if (string.IsNullOrWhiteSpace(lang))
{
lang = ConfigurationManager.Configuration.MetadataCountryCode;
}

@ -43,6 +43,11 @@ namespace MediaBrowser.Controller.Entities
}
}
public override bool IsSaveLocalMetadataEnabled()
{
return true;
}
public override bool CanDelete()
{
return false;

@ -34,6 +34,11 @@ namespace MediaBrowser.Controller.Entities
}
}
public override bool IsSaveLocalMetadataEnabled()
{
return true;
}
public override bool CanDelete()
{
return false;

@ -79,6 +79,11 @@ namespace MediaBrowser.Controller.Entities.Movies
return true;
}
public override bool IsSaveLocalMetadataEnabled()
{
return true;
}
/// <summary>
/// Gets the trailer ids.
/// </summary>

@ -1,8 +1,8 @@
using System.Runtime.Serialization;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Providers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
namespace MediaBrowser.Controller.Entities
{
@ -50,6 +50,11 @@ namespace MediaBrowser.Controller.Entities
return false;
}
public override bool IsSaveLocalMetadataEnabled()
{
return true;
}
/// <summary>
/// Gets a value indicating whether this instance is owned item.
/// </summary>

@ -45,6 +45,11 @@ namespace MediaBrowser.Controller.Entities
return false;
}
public override bool IsSaveLocalMetadataEnabled()
{
return true;
}
/// <summary>
/// Gets a value indicating whether this instance is owned item.
/// </summary>
@ -63,7 +68,6 @@ namespace MediaBrowser.Controller.Entities
return inputItems.Where(GetItemFilter());
}
public Func<BaseItem, bool> GetItemFilter()
{
return i => i.Studios.Contains(Name, StringComparer.OrdinalIgnoreCase);

@ -1,7 +1,4 @@
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
@ -10,6 +7,8 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Entities.TV
{

@ -1632,7 +1632,7 @@ namespace MediaBrowser.Controller.Entities
var ok = new[] { item }.Any(i =>
i.People != null &&
i.People.Any(p =>
p.Name.Equals(query.Person, StringComparison.OrdinalIgnoreCase) && (types.Contains(p.Type, StringComparer.OrdinalIgnoreCase) || types.Contains(p.Role, StringComparer.OrdinalIgnoreCase))));
string.Equals(p.Name, query.Person, StringComparison.OrdinalIgnoreCase) && (types.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase) || types.Contains(p.Role ?? string.Empty, StringComparer.OrdinalIgnoreCase))));
if (!ok)
{

@ -52,6 +52,11 @@ namespace MediaBrowser.Controller.Entities
}
}
public override bool IsSaveLocalMetadataEnabled()
{
return true;
}
public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
{
int year;

@ -393,5 +393,12 @@ namespace MediaBrowser.Controller.Library
/// <returns>IEnumerable&lt;Video&gt;.</returns>
IEnumerable<Video> FindExtras(BaseItem owner, List<FileSystemInfo> fileSystemChildren,
IDirectoryService directoryService);
/// <summary>
/// Gets the collection folders.
/// </summary>
/// <param name="item">The item.</param>
/// <returns>IEnumerable&lt;Folder&gt;.</returns>
IEnumerable<Folder> GetCollectionFolders(BaseItem item);
}
}

@ -64,6 +64,6 @@ namespace MediaBrowser.Controller.Library
/// <summary>
/// Updates playstate for an item and returns true or false indicating if it was played to completion
/// </summary>
bool UpdatePlayState(BaseItem item, UserItemData data, long positionTicks);
bool UpdatePlayState(BaseItem item, UserItemData data, long? positionTicks);
}
}

@ -121,9 +121,8 @@ namespace MediaBrowser.Controller.Library
/// Gets the offline user dto.
/// </summary>
/// <param name="user">The user.</param>
/// <param name="deviceId">The device identifier.</param>
/// <returns>UserDto.</returns>
UserDto GetOfflineUserDto(User user, string deviceId);
UserDto GetOfflineUserDto(User user);
/// <summary>
/// Resets the easy password.

@ -294,6 +294,19 @@ namespace MediaBrowser.Controller.Providers
break;
}
case "CountryCode":
{
var val = reader.ReadElementContentAsString();
var hasLanguage = item as IHasPreferredMetadataLanguage;
if (hasLanguage != null)
{
hasLanguage.PreferredMetadataCountryCode = val;
}
break;
}
case "PlaceOfBirth":
{
var val = reader.ReadElementContentAsString();

@ -123,7 +123,7 @@ namespace MediaBrowser.Controller.Sync
/// </summary>
/// <param name="targetId">The target identifier.</param>
/// <returns>List&lt;SyncedItem&gt;.</returns>
List<SyncedItem> GetReadySyncItems(string targetId);
Task<List<SyncedItem>> GetReadySyncItems(string targetId);
/// <summary>
/// Synchronizes the data.

@ -67,7 +67,8 @@ namespace MediaBrowser.Dlna.ContentDirectory
_dlna.GetDefaultProfile();
var serverAddress = request.RequestedUrl.Substring(0, request.RequestedUrl.IndexOf("/dlna", StringComparison.OrdinalIgnoreCase));
string accessToken = null;
var user = GetUser(profile);
return new ControlHandler(
@ -75,6 +76,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
_libraryManager,
profile,
serverAddress,
accessToken,
_imageProcessor,
_userDataManager,
user,

@ -45,7 +45,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
private readonly DeviceProfile _profile;
public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config, ILocalizationManager localization, IChannelManager channelManager)
public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, string accessToken, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config, ILocalizationManager localization, IChannelManager channelManager)
: base(config, logger)
{
_libraryManager = libraryManager;
@ -55,7 +55,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
_channelManager = channelManager;
_profile = profile;
_didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, userDataManager, localization);
_didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, accessToken, userDataManager, localization);
}
protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, Headers methodParams)

@ -33,17 +33,19 @@ namespace MediaBrowser.Dlna.Didl
private readonly DeviceProfile _profile;
private readonly IImageProcessor _imageProcessor;
private readonly string _serverAddress;
private readonly string _accessToken;
private readonly User _user;
private readonly IUserDataManager _userDataManager;
private readonly ILocalizationManager _localization;
public DidlBuilder(DeviceProfile profile, User user, IImageProcessor imageProcessor, string serverAddress, IUserDataManager userDataManager, ILocalizationManager localization)
public DidlBuilder(DeviceProfile profile, User user, IImageProcessor imageProcessor, string serverAddress, string accessToken, IUserDataManager userDataManager, ILocalizationManager localization)
{
_profile = profile;
_imageProcessor = imageProcessor;
_serverAddress = serverAddress;
_userDataManager = userDataManager;
_localization = localization;
_accessToken = accessToken;
_user = user;
}
@ -161,7 +163,7 @@ namespace MediaBrowser.Dlna.Didl
AddVideoResource(container, video, deviceId, filter, contentFeature, streamInfo);
}
foreach (var subtitle in streamInfo.GetExternalSubtitles(_serverAddress, false))
foreach (var subtitle in streamInfo.GetExternalSubtitles(_serverAddress, _accessToken, false))
{
AddSubtitleElement(container, subtitle);
}
@ -206,7 +208,7 @@ namespace MediaBrowser.Dlna.Didl
{
var res = container.OwnerDocument.CreateElement(string.Empty, "res", NS_DIDL);
var url = streamInfo.ToDlnaUrl(_serverAddress);
var url = streamInfo.ToDlnaUrl(_serverAddress, _accessToken);
res.InnerText = url;
@ -351,7 +353,7 @@ namespace MediaBrowser.Dlna.Didl
});
}
var url = streamInfo.ToDlnaUrl(_serverAddress);
var url = streamInfo.ToDlnaUrl(_serverAddress, _accessToken);
res.InnerText = url;

@ -38,6 +38,7 @@ namespace MediaBrowser.Dlna.PlayTo
private readonly DeviceDiscovery _deviceDiscovery;
private readonly string _serverAddress;
private readonly string _accessToken;
public bool IsSessionActive
{
@ -54,7 +55,7 @@ namespace MediaBrowser.Dlna.PlayTo
private Timer _updateTimer;
public PlayToController(SessionInfo session, ISessionManager sessionManager, IItemRepository itemRepository, ILibraryManager libraryManager, ILogger logger, IDlnaManager dlnaManager, IUserManager userManager, IImageProcessor imageProcessor, string serverAddress, DeviceDiscovery deviceDiscovery, IUserDataManager userDataManager, ILocalizationManager localization)
public PlayToController(SessionInfo session, ISessionManager sessionManager, IItemRepository itemRepository, ILibraryManager libraryManager, ILogger logger, IDlnaManager dlnaManager, IUserManager userManager, IImageProcessor imageProcessor, string serverAddress, string accessToken, DeviceDiscovery deviceDiscovery, IUserDataManager userDataManager, ILocalizationManager localization)
{
_session = session;
_itemRepository = itemRepository;
@ -67,6 +68,7 @@ namespace MediaBrowser.Dlna.PlayTo
_deviceDiscovery = deviceDiscovery;
_userDataManager = userDataManager;
_localization = localization;
_accessToken = accessToken;
_logger = logger;
}
@ -306,18 +308,16 @@ namespace MediaBrowser.Dlna.PlayTo
var playlist = new List<PlaylistItem>();
var isFirst = true;
var serverAddress = GetServerAddress();
foreach (var item in items)
{
if (isFirst && command.StartPositionTicks.HasValue)
{
playlist.Add(CreatePlaylistItem(item, user, command.StartPositionTicks.Value, serverAddress));
playlist.Add(CreatePlaylistItem(item, user, command.StartPositionTicks.Value));
isFirst = false;
}
else
{
playlist.Add(CreatePlaylistItem(item, user, 0, serverAddress));
playlist.Add(CreatePlaylistItem(item, user, 0));
}
}
@ -381,7 +381,7 @@ namespace MediaBrowser.Dlna.PlayTo
if (info.Item != null && !info.IsDirectStream)
{
var user = _session.UserId.HasValue ? _userManager.GetUserById(_session.UserId.Value) : null;
var newItem = CreatePlaylistItem(info.Item, user, newPosition, GetServerAddress(), info.MediaSourceId, info.AudioStreamIndex, info.SubtitleStreamIndex);
var newItem = CreatePlaylistItem(info.Item, user, newPosition, info.MediaSourceId, info.AudioStreamIndex, info.SubtitleStreamIndex);
await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);
@ -458,12 +458,12 @@ namespace MediaBrowser.Dlna.PlayTo
}
}
private PlaylistItem CreatePlaylistItem(BaseItem item, User user, long startPostionTicks, string serverAddress)
private PlaylistItem CreatePlaylistItem(BaseItem item, User user, long startPostionTicks)
{
return CreatePlaylistItem(item, user, startPostionTicks, serverAddress, null, null, null);
return CreatePlaylistItem(item, user, startPostionTicks, null, null, null);
}
private PlaylistItem CreatePlaylistItem(BaseItem item, User user, long startPostionTicks, string serverAddress, string mediaSourceId, int? audioStreamIndex, int? subtitleStreamIndex)
private PlaylistItem CreatePlaylistItem(BaseItem item, User user, long startPostionTicks, string mediaSourceId, int? audioStreamIndex, int? subtitleStreamIndex)
{
var deviceInfo = _device.Properties;
@ -478,9 +478,9 @@ namespace MediaBrowser.Dlna.PlayTo
var playlistItem = GetPlaylistItem(item, mediaSources, profile, _session.DeviceId, mediaSourceId, audioStreamIndex, subtitleStreamIndex);
playlistItem.StreamInfo.StartPositionTicks = startPostionTicks;
playlistItem.StreamUrl = playlistItem.StreamInfo.ToUrl(serverAddress);
playlistItem.StreamUrl = playlistItem.StreamInfo.ToUrl(_serverAddress, _accessToken);
var itemXml = new DidlBuilder(profile, user, _imageProcessor, serverAddress, _userDataManager, _localization)
var itemXml = new DidlBuilder(profile, user, _imageProcessor, _serverAddress, _accessToken, _userDataManager, _localization)
.GetItemDidl(item, null, _session.DeviceId, new Filter(), playlistItem.StreamInfo);
playlistItem.Didl = itemXml;
@ -745,7 +745,7 @@ namespace MediaBrowser.Dlna.PlayTo
var newPosition = progress.PositionTicks ?? 0;
var user = _session.UserId.HasValue ? _userManager.GetUserById(_session.UserId.Value) : null;
var newItem = CreatePlaylistItem(info.Item, user, newPosition, GetServerAddress(), info.MediaSourceId, newIndex, info.SubtitleStreamIndex);
var newItem = CreatePlaylistItem(info.Item, user, newPosition, info.MediaSourceId, newIndex, info.SubtitleStreamIndex);
await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);
@ -771,7 +771,7 @@ namespace MediaBrowser.Dlna.PlayTo
var newPosition = progress.PositionTicks ?? 0;
var user = _session.UserId.HasValue ? _userManager.GetUserById(_session.UserId.Value) : null;
var newItem = CreatePlaylistItem(info.Item, user, newPosition, GetServerAddress(), info.MediaSourceId, info.AudioStreamIndex, newIndex);
var newItem = CreatePlaylistItem(info.Item, user, newPosition, info.MediaSourceId, info.AudioStreamIndex, newIndex);
await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);

@ -98,6 +98,7 @@ namespace MediaBrowser.Dlna.PlayTo
if (controller == null)
{
var serverAddress = GetServerAddress(localIp);
string accessToken = null;
sessionInfo.SessionController = controller = new PlayToController(sessionInfo,
_sessionManager,
@ -108,6 +109,7 @@ namespace MediaBrowser.Dlna.PlayTo
_userManager,
_imageProcessor,
serverAddress,
accessToken,
_deviceDiscovery,
_userDataManager,
_localization);

@ -1,5 +1,4 @@
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;

@ -421,6 +421,10 @@ namespace MediaBrowser.LocalMetadata.Savers
{
builder.Append("<Language>" + SecurityElement.Escape(hasLanguage.PreferredMetadataLanguage) + "</Language>");
}
if (!string.IsNullOrEmpty(hasLanguage.PreferredMetadataCountryCode))
{
builder.Append("<CountryCode>" + SecurityElement.Escape(hasLanguage.PreferredMetadataCountryCode) + "</CountryCode>");
}
}
// Use original runtime here, actual file runtime later in MediaInfo

@ -110,6 +110,9 @@
<Compile Include="..\MediaBrowser.Model\ApiClient\IServerEvents.cs">
<Link>ApiClient\IServerEvents.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\ApiClient\NetworkStatus.cs">
<Link>ApiClient\NetworkStatus.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\ApiClient\RemoteLogoutReason.cs">
<Link>ApiClient\RemoteLogoutReason.cs</Link>
</Compile>

@ -75,6 +75,9 @@
<Compile Include="..\MediaBrowser.Model\ApiClient\IServerEvents.cs">
<Link>ApiClient\IServerEvents.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\ApiClient\NetworkStatus.cs">
<Link>ApiClient\NetworkStatus.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\ApiClient\RemoteLogoutReason.cs">
<Link>ApiClient\RemoteLogoutReason.cs</Link>
</Compile>

@ -54,6 +54,13 @@ namespace MediaBrowser.Model.ApiClient
/// <returns>IApiClient.</returns>
IApiClient GetApiClient(IHasServerId item);
/// <summary>
/// Gets the API client.
/// </summary>
/// <param name="serverId">The server identifier.</param>
/// <returns>IApiClient.</returns>
IApiClient GetApiClient(string serverId);
/// <summary>
/// Connects the specified cancellation token.
/// </summary>

@ -0,0 +1,30 @@

namespace MediaBrowser.Model.ApiClient
{
public class NetworkStatus
{
/// <summary>
/// Gets or sets a value indicating whether this instance is network available.
/// </summary>
/// <value><c>true</c> if this instance is network available; otherwise, <c>false</c>.</value>
public bool IsNetworkAvailable { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance is local network available.
/// </summary>
/// <value><c>null</c> if [is local network available] contains no value, <c>true</c> if [is local network available]; otherwise, <c>false</c>.</value>
public bool? IsLocalNetworkAvailable { get; set; }
/// <summary>
/// Gets the is any local network available.
/// </summary>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
public bool GetIsAnyLocalNetworkAvailable()
{
if (!IsLocalNetworkAvailable.HasValue)
{
return IsNetworkAvailable;
}
return IsLocalNetworkAvailable.Value;
}
}
}

@ -203,7 +203,7 @@ namespace MediaBrowser.Model.Configuration
public bool EnableAudioArchiveFiles { get; set; }
public bool EnableVideoArchiveFiles { get; set; }
public bool EnableLegacyCollections { get; set; }
public bool EnableLegacyCollectionInView { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="ServerConfiguration" /> class.

@ -85,12 +85,12 @@ namespace MediaBrowser.Model.Dlna
}
}
public string ToUrl(string baseUrl)
public string ToUrl(string baseUrl, string accessToken)
{
return ToDlnaUrl(baseUrl);
return ToDlnaUrl(baseUrl, accessToken);
}
public string ToDlnaUrl(string baseUrl)
public string ToDlnaUrl(string baseUrl, string accessToken)
{
if (PlayMethod == PlayMethod.DirectPlay)
{
@ -152,7 +152,47 @@ namespace MediaBrowser.Model.Dlna
return string.Format("Params={0}", string.Join(";", list.ToArray()));
}
public List<SubtitleStreamInfo> GetExternalSubtitles(string baseUrl, bool includeSelectedTrackOnly)
public List<SubtitleStreamInfo> GetExternalSubtitles(bool includeSelectedTrackOnly)
{
List<SubtitleStreamInfo> list = new List<SubtitleStreamInfo>();
// First add the selected track
if (SubtitleStreamIndex.HasValue)
{
foreach (MediaStream stream in MediaSource.MediaStreams)
{
if (stream.Type == MediaStreamType.Subtitle && stream.Index == SubtitleStreamIndex.Value)
{
SubtitleStreamInfo info = GetSubtitleStreamInfo(stream);
if (info != null)
{
list.Add(info);
}
}
}
}
if (!includeSelectedTrackOnly)
{
foreach (MediaStream stream in MediaSource.MediaStreams)
{
if (stream.Type == MediaStreamType.Subtitle && (!SubtitleStreamIndex.HasValue || stream.Index != SubtitleStreamIndex.Value))
{
SubtitleStreamInfo info = GetSubtitleStreamInfo(stream);
if (info != null)
{
list.Add(info);
}
}
}
}
return list;
}
public List<SubtitleStreamInfo> GetExternalSubtitles(string baseUrl, string accessToken, bool includeSelectedTrackOnly)
{
if (string.IsNullOrEmpty(baseUrl))
{
@ -173,7 +213,12 @@ namespace MediaBrowser.Model.Dlna
{
if (stream.Type == MediaStreamType.Subtitle && stream.Index == SubtitleStreamIndex.Value)
{
AddSubtitle(list, stream, baseUrl, startPositionTicks);
SubtitleStreamInfo info = GetSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks);
if (info != null)
{
list.Add(info);
}
}
}
}
@ -184,7 +229,12 @@ namespace MediaBrowser.Model.Dlna
{
if (stream.Type == MediaStreamType.Subtitle && (!SubtitleStreamIndex.HasValue || stream.Index != SubtitleStreamIndex.Value))
{
AddSubtitle(list, stream, baseUrl, startPositionTicks);
SubtitleStreamInfo info = GetSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks);
if (info != null)
{
list.Add(info);
}
}
}
}
@ -192,32 +242,41 @@ namespace MediaBrowser.Model.Dlna
return list;
}
private void AddSubtitle(List<SubtitleStreamInfo> list, MediaStream stream, string baseUrl, long startPositionTicks)
private SubtitleStreamInfo GetSubtitleStreamInfo(MediaStream stream, string baseUrl, string accessToken, long startPositionTicks)
{
var subtitleProfile = StreamBuilder.GetSubtitleProfile(stream, DeviceProfile);
SubtitleStreamInfo info = GetSubtitleStreamInfo(stream);
if (subtitleProfile.Method != SubtitleDeliveryMethod.External)
if (info != null)
{
return;
info.Url = string.Format("{0}/Videos/{1}/{2}/Subtitles/{3}/{4}/Stream.{5}",
baseUrl,
ItemId,
MediaSourceId,
StringHelper.ToStringCultureInvariant(stream.Index),
StringHelper.ToStringCultureInvariant(startPositionTicks),
SubtitleFormat);
}
string url = string.Format("{0}/Videos/{1}/{2}/Subtitles/{3}/{4}/Stream.{5}",
baseUrl,
ItemId,
MediaSourceId,
StringHelper.ToStringCultureInvariant(stream.Index),
StringHelper.ToStringCultureInvariant(startPositionTicks),
SubtitleFormat);
return info;
}
private SubtitleStreamInfo GetSubtitleStreamInfo(MediaStream stream)
{
SubtitleProfile subtitleProfile = StreamBuilder.GetSubtitleProfile(stream, DeviceProfile);
if (subtitleProfile.Method != SubtitleDeliveryMethod.External)
{
return null;
}
list.Add(new SubtitleStreamInfo
return new SubtitleStreamInfo
{
Url = url,
IsForced = stream.IsForced,
Language = stream.Language,
Name = stream.Language ?? "Unknown",
Format = SubtitleFormat,
Index = stream.Index
});
};
}
/// <summary>

@ -87,6 +87,12 @@ namespace MediaBrowser.Model.Dto
/// <value>The percent played.</value>
public int? PercentPlayed { get; set; }
/// <summary>
/// Gets or sets the un played count.
/// </summary>
/// <value>The un played count.</value>
public int? UnPlayedCount { get; set; }
/// <summary>
/// Gets or sets the color of the background.
/// </summary>

@ -61,6 +61,12 @@ namespace MediaBrowser.Model.Dto
/// </summary>
/// <value>The offline password.</value>
public string OfflinePassword { get; set; }
/// <summary>
/// Gets or sets the offline password salt.
/// </summary>
/// <value>The offline password salt.</value>
public string OfflinePasswordSalt { get; set; }
/// <summary>
/// Gets or sets the primary image tag.

@ -72,6 +72,7 @@
<Compile Include="ApiClient\IDevice.cs" />
<Compile Include="ApiClient\IServerEvents.cs" />
<Compile Include="ApiClient\GeneralCommandEventArgs.cs" />
<Compile Include="ApiClient\NetworkStatus.cs" />
<Compile Include="ApiClient\RemoteLogoutReason.cs" />
<Compile Include="ApiClient\ServerCredentials.cs" />
<Compile Include="ApiClient\ServerDiscoveryInfo.cs" />

@ -3,20 +3,57 @@ namespace MediaBrowser.Model.Querying
{
public class EpisodeQuery
{
/// <summary>
/// Gets or sets the user identifier.
/// </summary>
/// <value>The user identifier.</value>
public string UserId { get; set; }
/// <summary>
/// Gets or sets the season identifier.
/// </summary>
/// <value>The season identifier.</value>
public string SeasonId { get; set; }
/// <summary>
/// Gets or sets the series identifier.
/// </summary>
/// <value>The series identifier.</value>
public string SeriesId { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance is missing.
/// </summary>
/// <value><c>null</c> if [is missing] contains no value, <c>true</c> if [is missing]; otherwise, <c>false</c>.</value>
public bool? IsMissing { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance is virtual unaired.
/// </summary>
/// <value><c>null</c> if [is virtual unaired] contains no value, <c>true</c> if [is virtual unaired]; otherwise, <c>false</c>.</value>
public bool? IsVirtualUnaired { get; set; }
/// <summary>
/// Gets or sets the season number.
/// </summary>
/// <value>The season number.</value>
public int? SeasonNumber { get; set; }
/// <summary>
/// Gets or sets the fields.
/// </summary>
/// <value>The fields.</value>
public ItemFields[] Fields { get; set; }
/// <summary>
/// Gets or sets the start index.
/// </summary>
/// <value>The start index.</value>
public int? StartIndex { get; set; }
/// <summary>
/// Gets or sets the limit.
/// </summary>
/// <value>The limit.</value>
public int? Limit { get; set; }
/// <summary>
/// Gets or sets the start item identifier.
/// </summary>
/// <value>The start item identifier.</value>
public string StartItemId { get; set; }
public EpisodeQuery()
{
Fields = new ItemFields[] { };

@ -83,5 +83,6 @@ namespace MediaBrowser.Model.Querying
public const string Players = "Players";
public const string GameSystem = "GameSystem";
public const string IsFavoriteOrLiked = "IsFavoriteOrLiked";
public const string DateLastContentAdded = "DateLastContentAdded";
}
}

@ -5,10 +5,12 @@ using MediaBrowser.Controller.FileOrganization;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.FileOrganization;
using MediaBrowser.Model.Logging;
using MediaBrowser.Naming.Common;
using MediaBrowser.Naming.IO;
using MediaBrowser.Server.Implementations.Library;
using MediaBrowser.Server.Implementations.Logging;
using System;
using System.Collections.Generic;
using System.Globalization;
@ -16,8 +18,6 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Server.Implementations.Library;
using MediaBrowser.Server.Implementations.Logging;
namespace MediaBrowser.Server.Implementations.FileOrganization
{
@ -202,15 +202,25 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
if (overwriteExisting)
{
var hasRenamedFiles = false;
foreach (var path in otherDuplicatePaths)
{
_logger.Debug("Removing duplicate episode {0}", path);
_libraryMonitor.ReportFileSystemChangeBeginning(path);
var renameRelatedFiles = !hasRenamedFiles &&
string.Equals(Path.GetDirectoryName(path), Path.GetDirectoryName(result.TargetPath), StringComparison.OrdinalIgnoreCase);
if (renameRelatedFiles)
{
hasRenamedFiles = true;
}
try
{
_fileSystem.DeleteFile(path);
DeleteLibraryFile(path, renameRelatedFiles, result.TargetPath);
}
catch (IOException ex)
{
@ -224,6 +234,43 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
}
}
private void DeleteLibraryFile(string path, bool renameRelatedFiles, string targetPath)
{
_fileSystem.DeleteFile(path);
if (!renameRelatedFiles)
{
return;
}
// Now find other files
var originalFilenameWithoutExtension = Path.GetFileNameWithoutExtension(path);
var directory = Path.GetDirectoryName(path);
if (!string.IsNullOrWhiteSpace(originalFilenameWithoutExtension) && !string.IsNullOrWhiteSpace(directory))
{
// Get all related files, e.g. metadata, images, etc
var files = Directory.EnumerateFiles(directory, "*", SearchOption.TopDirectoryOnly)
.Where(i => (Path.GetFileNameWithoutExtension(i) ?? string.Empty).StartsWith(originalFilenameWithoutExtension, StringComparison.OrdinalIgnoreCase))
.ToList();
var targetFilenameWithoutExtension = Path.GetFileNameWithoutExtension(targetPath);
foreach (var file in files)
{
directory = Path.GetDirectoryName(file);
var filename = Path.GetFileName(file);
filename = filename.Replace(originalFilenameWithoutExtension, targetFilenameWithoutExtension,
StringComparison.OrdinalIgnoreCase);
var destination = Path.Combine(directory, filename);
File.Move(file, destination);
}
}
}
private List<string> GetOtherDuplicatePaths(string targetPath, Series series, int seasonNumber, int episodeNumber, int? endingEpisodeNumber)
{
var episodePaths = series.GetRecursiveChildren()
@ -281,11 +328,11 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
Directory.CreateDirectory(Path.GetDirectoryName(result.TargetPath));
var copy = File.Exists(result.TargetPath);
var targetAlreadyExists = File.Exists(result.TargetPath);
try
{
if (copy || options.CopyOriginalFile)
if (targetAlreadyExists || options.CopyOriginalFile)
{
File.Copy(result.OriginalPath, result.TargetPath, true);
}
@ -312,7 +359,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
_libraryMonitor.ReportFileSystemChangeComplete(result.TargetPath, true);
}
if (copy && !options.CopyOriginalFile)
if (targetAlreadyExists && !options.CopyOriginalFile)
{
try
{

@ -380,6 +380,14 @@ namespace MediaBrowser.Server.Implementations.HttpServer
Priority = route.Priority,
Summary = route.Summary
});
// TODO: This is a hack for iOS. Remove it asap.
routes.Add(new RouteAttribute(DoubleNormalizeRoutePath(route.Path), route.Verbs)
{
Notes = route.Notes,
Priority = route.Priority,
Summary = route.Summary
});
}
return routes.ToArray();
@ -395,6 +403,16 @@ namespace MediaBrowser.Server.Implementations.HttpServer
return "mediabrowser/" + path;
}
private string DoubleNormalizeRoutePath(string path)
{
if (path.StartsWith("/", StringComparison.OrdinalIgnoreCase))
{
return "/mediabrowser/mediabrowser" + path;
}
return "mediabrowser//mediabrowser" + path;
}
/// <summary>
/// Releases the specified instance.
/// </summary>

@ -401,7 +401,7 @@ namespace MediaBrowser.Server.Implementations.Library
}
catch (DirectoryNotFoundException)
{
}
catch (Exception ex)
{
@ -1489,6 +1489,23 @@ namespace MediaBrowser.Server.Implementations.Library
return ItemRepository.RetrieveItem(id);
}
public IEnumerable<Folder> GetCollectionFolders(BaseItem item)
{
while (!(item.Parent is AggregateFolder) && item.Parent != null)
{
item = item.Parent;
}
if (item == null)
{
return new List<Folder>();
}
return GetUserRootFolder().Children
.OfType<Folder>()
.Where(i => string.Equals(i.Path, item.Path, StringComparison.OrdinalIgnoreCase) || i.PhysicalLocations.Contains(item.Path));
}
public string GetContentType(BaseItem item)
{
string configuredContentType = GetConfiguredContentType(item, false);
@ -1547,7 +1564,7 @@ namespace MediaBrowser.Server.Implementations.Library
}
return null;
}
private string GetTopFolderContentType(BaseItem item)
{
while (!(item.Parent is AggregateFolder) && item.Parent != null)
@ -1840,7 +1857,7 @@ namespace MediaBrowser.Server.Implementations.Library
options.VideoFileExtensions.Remove(".rar");
options.VideoFileExtensions.Remove(".zip");
}
return options;
}

@ -208,10 +208,11 @@ namespace MediaBrowser.Server.Implementations.Library
};
}
public bool UpdatePlayState(BaseItem item, UserItemData data, long positionTicks)
public bool UpdatePlayState(BaseItem item, UserItemData data, long? reportedPositionTicks)
{
var playedToCompletion = false;
var positionTicks = reportedPositionTicks ?? item.RunTimeTicks ?? 0;
var hasRuntime = item.RunTimeTicks.HasValue && item.RunTimeTicks > 0;
// If a position has been reported, and if we know the duration

@ -402,15 +402,17 @@ namespace MediaBrowser.Server.Implementations.Library
return dto;
}
public UserDto GetOfflineUserDto(User user, string deviceId)
public UserDto GetOfflineUserDto(User user)
{
var dto = GetUserDto(user);
var offlinePasswordHash = GetLocalPasswordHash(user);
dto.HasPassword = !IsPasswordEmpty(offlinePasswordHash);
dto.OfflinePasswordSalt = Guid.NewGuid().ToString("N");
// Hash the pin with the device Id to create a unique result for this device
dto.OfflinePassword = GetSha1String((offlinePasswordHash + deviceId).ToLower());
dto.OfflinePassword = GetSha1String((offlinePasswordHash + dto.OfflinePasswordSalt).ToLower());
dto.ServerName = _appHost.FriendlyName;

@ -86,7 +86,8 @@ namespace MediaBrowser.Server.Implementations.Library
list.Add(await GetUserView(CollectionType.Movies, string.Empty, cancellationToken).ConfigureAwait(false));
}
if (foldersWithViewTypes.Any(i => string.Equals(i.CollectionType, CollectionType.Games, StringComparison.OrdinalIgnoreCase)))
if (foldersWithViewTypes.Any(i => string.Equals(i.CollectionType, CollectionType.Games, StringComparison.OrdinalIgnoreCase))
|| _config.Configuration.EnableLegacyCollectionInView)
{
list.Add(await GetUserView(CollectionType.Games, string.Empty, cancellationToken).ConfigureAwait(false));
}

@ -54,10 +54,10 @@
"SyncJobStatusFailed": "Fallito",
"SyncJobStatusCancelled": "Cancellato",
"SyncJobStatusCompleted": "Sinc.to",
"SyncJobStatusReadyToTransfer": "Ready to Transfer",
"SyncJobStatusReadyToTransfer": "Pronti a trasferire",
"SyncJobStatusTransferring": "Trasferimento",
"SyncJobStatusCompletedWithError": "Sincronizzato con errori",
"SyncJobItemStatusReadyToTransfer": "Ready to Transfer",
"SyncJobItemStatusReadyToTransfer": "Pronti a trasferire",
"LabelCollection": "Collezione",
"HeaderAddToCollection": "Aggiungi alla Collezione",
"NewCollectionNameExample": "Esempio: Collezione Star wars",
@ -70,7 +70,7 @@
"HeaderSelectCertificatePath": "Seleziona il percorso del Certificato",
"ConfirmMessageScheduledTaskButton": "L'operazione viene normalmente eseguita come operazione pianificata. Pu\u00f2 anche essere avviata manualmente da qui. Per configurare le operazioni pianificate, vedi:",
"HeaderSupporterBenefit": "La sottoscrizione Supporter concede dei benefici come: l'accesso a plug-in premium, contenuti dei canali internet, e altro. {0}Scopri di pi\u00f9{1}",
"LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.",
"LabelSyncNoTargetsHelp": "Sembra che al momento non avete applicazioni che supportano la sincronizzazione.",
"HeaderWelcomeToMediaBrowserServerDashboard": "Benvenuti nel Dashboard di Media Browser",
"HeaderWelcomeToMediaBrowserWebClient": "Benvenuti nel Media Browser Web client",
"ButtonTakeTheTour": "Fai il tour",
@ -99,7 +99,7 @@
"HeaderSelectSubtitles": "Seleziona sottotitoli",
"ButtonMarkForRemoval": "Rimuovi dal dispositivo",
"ButtonUnmarkForRemoval": "Annulla rimozione dal dispositivo",
"LabelSyncQualityHelp": "Use high quality for the maximum supported quality by the device. Medium and low quality will reduce the allowed bitrate. Original will sync the original file, regardless of whether the device is capable of playing it or not.",
"LabelSyncQualityHelp": "Utilizzare alta qualit\u00e0 per la massima supportata qualit\u00e0 dal dispositivo. Media e bassa qualit\u00e0 riduce il bitrate consentito. Original sincronizzer\u00e0 il file originale, indipendentemente dal fatto che il dispositivo \u00e8 in grado di riprodurre o meno.",
"LabelDefaultStream": "(Predefinito)",
"LabelForcedStream": "(forzato)",
"LabelDefaultForcedStream": "(Predefinito\/Forzato)",
@ -275,7 +275,7 @@
"ButtonStart": "Avvio",
"HeaderChannels": "Canali",
"HeaderMediaFolders": "Cartelle dei media",
"HeaderBlockItemsWithNoRating": "Block content with no rating information:",
"HeaderBlockItemsWithNoRating": "Bloccare i contenuti senza informazioni valutazione:",
"OptionBlockOthers": "Altri",
"OptionBlockTvShows": "Serie TV",
"OptionBlockTrailers": "Trailer",
@ -646,7 +646,7 @@
"WebClientTourUserPreferences4": "Configurare fondali, sigle e lettori esterni",
"WebClientTourMobile1": "Il client web funziona alla grande su smartphone e tablet ...",
"WebClientTourMobile2": "e controlla facilmente altri dispositivi e applicazioni Media Browser",
"WebClientTourMySync": "Sync your personal media to your devices for offline viewing.",
"WebClientTourMySync": "Sincronizza il tuo personal media per i dispositivi per la visualizzazione offline.",
"MessageEnjoyYourStay": "Godetevi il vostro soggiorno",
"DashboardTourDashboard": "Il pannello di controllo del server consente di monitorare il vostro server e gli utenti. Potrai sempre sapere chi sta facendo cosa e dove sono.",
"DashboardTourHelp": "In-app help offre pulsanti facili da aprire le pagine wiki relative al contenuto sullo schermo.",
@ -658,7 +658,7 @@
"DashboardTourNotifications": "Inviare automaticamente notifiche di eventi server al vostro dispositivo mobile, e-mail e altro ancora.",
"DashboardTourScheduledTasks": "Gestire facilmente le operazioni di lunga esecuzione con le operazioni pianificate. Decidere quando corrono, e con quale frequenza.",
"DashboardTourMobile": "Il cruscotto Media Browser funziona alla grande su smartphone e tablet. Gestisci il tuo server dal palmo della tua mano in qualsiasi momento, ovunque.",
"DashboardTourSync": "Sync your personal media to your devices for offline viewing.",
"DashboardTourSync": "Sincronizza il tuo personal media per i dispositivi per la visualizzazione offline.",
"MessageRefreshQueued": "Aggiornamento programmato",
"TabDevices": "Dispositivi",
"TabExtras": "Extra",
@ -702,7 +702,7 @@
"LabelSyncTo": "Sincronizza su:",
"LabelSyncJobName": "Nome Attivit\u00e0 di Sincroniz.:",
"LabelQuality": "Qualit\u00e0:",
"OptionOriginal": "Original",
"OptionOriginal": "Originale",
"OptionHigh": "Alto",
"OptionMedium": "Medio",
"OptionLow": "Basso",

@ -27,7 +27,7 @@
"OptionDev": "\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443 (\u0442\u04b1\u0440\u0430\u049b\u0441\u044b\u0437)",
"UninstallPluginHeader": "\u041f\u043b\u0430\u0433\u0438\u043d \u043e\u0440\u043d\u0430\u0442\u0443\u044b\u043d \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443",
"UninstallPluginConfirmation": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d {0} \u043e\u0440\u043d\u0430\u0442\u0443\u044b\u043d \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?",
"NoPluginConfigurationMessage": "\u0411\u04b1\u043b \u043f\u043b\u0430\u0433\u0438\u043d \u04af\u0448\u0456\u043d \u0435\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043b\u0430\u0443 \u0436\u043e\u049b.",
"NoPluginConfigurationMessage": "\u041e\u0441\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435 \u0435\u0448\u0442\u0435\u04a3\u0435 \u0442\u0435\u04a3\u0448\u0435\u043b\u0435\u0442\u0456\u043d \u0436\u043e\u049b.",
"NoPluginsInstalledMessage": "\u041e\u0440\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440 \u0436\u043e\u049b.",
"BrowsePluginCatalogMessage": "\u049a\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440\u043c\u0435\u043d \u0442\u0430\u043d\u044b\u0441\u0443 \u04af\u0448\u0456\u043d \u043f\u043b\u0430\u0433\u0438\u043d \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0456\u043d \u0448\u043e\u043b\u044b\u04a3\u044b\u0437.",
"MessageKeyEmailedTo": "\u041a\u0456\u043b\u0442 {0} \u04af\u0448\u0456\u043d \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0434\u044b \u043f\u043e\u0448\u0442\u0430\u043c\u0435\u043d \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0434\u0456.",
@ -61,7 +61,7 @@
"LabelCollection": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b",
"HeaderAddToCollection": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u049b\u0430 \u04af\u0441\u0442\u0435\u0443",
"NewCollectionNameExample": "\u041c\u044b\u0441\u0430\u043b: \u0416\u04b1\u043b\u0434\u044b\u0437 \u0441\u043e\u0493\u044b\u0441\u0442\u0430\u0440\u044b (\u0436\u0438\u044b\u043d\u0442\u044b\u049b)",
"OptionSearchForInternetMetadata": "\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 \u0456\u0437\u0434\u0435\u0443",
"OptionSearchForInternetMetadata": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435\u043b\u0435\u0440 \u0431\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0442\u0435\u043d \u0456\u0437\u0434\u0435\u0443",
"LabelSelectCollection": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u044b \u0442\u0430\u04a3\u0434\u0430\u0443:",
"HeaderDevices": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440",
"ButtonScheduledTasks": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043b\u0430\u0440\u0493\u0430 \u04e9\u0442\u0443",
@ -243,7 +243,7 @@
"HeaderLatestTvRecordings": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440",
"ButtonOk": "\u0416\u0430\u0440\u0430\u0439\u0434\u044b",
"ButtonCancel": "\u0411\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443",
"ButtonRefresh": "\u041a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0443",
"ButtonRefresh": "\u0416\u0430\u04a3\u0493\u044b\u0440\u0442\u0443",
"LabelCurrentPath": "\u0410\u0493\u044b\u043c\u0434\u044b\u049b \u0436\u043e\u043b:",
"HeaderSelectMediaPath": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448 \u0436\u043e\u043b\u044b\u043d \u0442\u0430\u04a3\u0434\u0430\u0443",
"HeaderSelectPath": "\u0416\u043e\u043b\u0434\u044b \u0442\u0430\u04a3\u0434\u0430\u0443",
@ -288,7 +288,7 @@
"OptionBlockChannelContent": "\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0430\u0440\u043d\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b",
"ButtonRevoke": "\u0411\u0430\u0441 \u0442\u0430\u0440\u0442\u0443",
"MessageConfirmRevokeApiKey": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043e\u0441\u044b API \u043a\u0456\u043b\u0442\u0456\u043d\u0435\u043d \u0431\u0430\u0441 \u0442\u0430\u0440\u0442\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435? \u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u043c\u0435\u043d Media Browser \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u049b\u043e\u0441\u044b\u043b\u044b\u043c \u043a\u0435\u043d\u0435\u0442 \u04af\u0437\u0456\u043b\u0435\u0434\u0456.",
"HeaderConfirmRevokeApiKey": "API \u043a\u0456\u043b\u0442\u0456\u043d\u0435\u043d \u0431\u0430\u0441 \u0442\u0430\u0440\u0442\u0443",
"HeaderConfirmRevokeApiKey": "API-\u043a\u0456\u043b\u0442\u0442\u0435\u043d \u0431\u0430\u0441 \u0442\u0430\u0440\u0442\u0443",
"ValueContainer": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440: {0}",
"ValueAudioCodec": "\u0414\u044b\u0431\u044b\u0441 \u043a\u043e\u0434\u0435\u0433\u0456: {0}",
"ValueVideoCodec": "\u0411\u0435\u0439\u043d\u0435 \u043a\u043e\u0434\u0435\u0433\u0456: {0}",
@ -347,7 +347,7 @@
"HeaderAlert": "\u0415\u0441\u043a\u0435\u0440\u0442\u0443",
"MessagePleaseRestart": "\u0416\u0430\u04a3\u0430\u0440\u0442\u0443\u0434\u044b \u0430\u044f\u049b\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u04a3\u044b\u0437.",
"ButtonRestart": "\u049a\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443",
"MessagePleaseRefreshPage": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0435\u043d \u0436\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 \u043a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0456\u04a3\u0456\u0437.",
"MessagePleaseRefreshPage": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0435\u043d \u0436\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 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u044b\u04a3\u044b\u0437.",
"ButtonHide": "\u0416\u0430\u0441\u044b\u0440\u0443",
"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",
@ -361,7 +361,7 @@
"TabServer": "\u0421\u0435\u0440\u0432\u0435\u0440",
"TabUsers": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440",
"TabLibrary": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430",
"TabMetadata": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a",
"TabMetadata": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440",
"TabDLNA": "DLNA",
"TabLiveTV": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414",
"TabAutoOrganize": "\u0410\u0432\u0442\u043e\u04b1\u0439\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u0440\u0443",
@ -401,7 +401,7 @@
"HeaderParentalRating": "\u0416\u0430\u0441\u0442\u0430\u0441 \u0441\u0430\u043d\u0430\u0442\u044b",
"HeaderReleaseDate": "\u0428\u044b\u0493\u0430\u0440\u0443 \u043a\u04af\u043d\u0456",
"HeaderDateAdded": "\u04ae\u0441\u0442\u0435\u0443 \u043a\u04af\u043d\u0456",
"HeaderSeries": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430",
"HeaderSeries": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430\u043b\u0430\u0440",
"HeaderSeason": "\u041c\u0430\u0443\u0441\u044b\u043c",
"HeaderSeasonNumber": "\u041c\u0430\u0443\u0441\u044b\u043c \u043d\u04e9\u043c\u0456\u0440\u0456",
"HeaderNetwork": "\u0422\u0435\u043b\u0435\u0436\u0435\u043b\u0456",
@ -413,9 +413,9 @@
"HeaderDisc": "\u0414\u0438\u0441\u043a\u0456",
"OptionMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440",
"OptionCollections": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440",
"OptionSeries": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430\u043b\u0430\u0440",
"OptionSeasons": "\u041c\u0430\u0443\u0441\u044b\u043c\u0434\u0430\u0440",
"OptionEpisodes": "\u042d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440",
"OptionSeries": "\u0422\u0414-\u0442\u043e\u043f\u0442\u0430\u043c\u0430\u043b\u0430\u0440",
"OptionSeasons": "\u0422\u0414-\u043c\u0430\u0443\u0441\u044b\u043c\u0434\u0430\u0440",
"OptionEpisodes": "\u0422\u0414-\u044d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440",
"OptionGames": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440",
"OptionGameSystems": "\u041e\u0439\u044b\u043d \u0436\u04af\u0439\u0435\u043b\u0435\u0440\u0456",
"OptionMusicArtists": "\u041c\u0443\u0437\u044b\u043a\u0430 \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b",
@ -427,11 +427,11 @@
"OptionAdultVideos": "\u0415\u0440\u0435\u0441\u0435\u043a \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0456",
"ButtonUp": "\u0416\u043e\u0493\u0430\u0440\u044b\u0493\u0430",
"ButtonDown": "\u0422\u04e9\u043c\u0435\u043d\u0433\u0435",
"LabelMetadataReaders": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u043e\u049b\u0443\u0448\u044b\u043b\u0430\u0440\u044b:",
"LabelMetadataReadersHelp": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u049b\u0430\u0439\u043d\u0430\u0440 \u043a\u04e9\u0437\u0434\u0435\u0440\u0456\u043d\u0435 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u049b \u0440\u0435\u0442\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0434\u04d9\u0440\u0435\u0436\u0435 \u0431\u0435\u0440\u0456\u04a3\u0456\u0437. \u0411\u0456\u0440\u0456\u043d\u0448\u0456 \u0442\u0430\u0431\u044b\u043b\u0493\u0430\u043d \u0444\u0430\u0439\u043b \u043e\u049b\u044b\u043b\u0430\u0434\u044b.",
"LabelMetadataDownloaders": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456:",
"LabelMetadataDownloadersHelp": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u049b \u0440\u0435\u0442\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0434\u04d9\u0440\u0435\u0436\u0435 \u0431\u0435\u0440\u0456\u04a3\u0456\u0437. \u0422\u04e9\u043c\u0435\u043d\u0433\u0456 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u0493\u044b \u0431\u0430\u0440 \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440 \u0442\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u043e\u049b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u0442\u043e\u043b\u0442\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.",
"LabelMetadataSavers": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0441\u0430\u049b\u0442\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b:",
"LabelMetadataReaders": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u043e\u049b\u0443\u0448\u044b\u043b\u0430\u0440\u044b:",
"LabelMetadataReadersHelp": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u049b\u0430\u0439\u043d\u0430\u0440 \u043a\u04e9\u0437\u0434\u0435\u0440\u0456\u043d\u0435 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u049b \u0440\u0435\u0442\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0434\u04d9\u0440\u0435\u0436\u0435 \u0431\u0435\u0440\u0456\u04a3\u0456\u0437. \u0411\u0456\u0440\u0456\u043d\u0448\u0456 \u0442\u0430\u0431\u044b\u043b\u0493\u0430\u043d \u0444\u0430\u0439\u043b \u043e\u049b\u044b\u043b\u0430\u0434\u044b.",
"LabelMetadataDownloaders": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456:",
"LabelMetadataDownloadersHelp": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u049b \u0440\u0435\u0442\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0434\u04d9\u0440\u0435\u0436\u0435 \u0431\u0435\u0440\u0456\u04a3\u0456\u0437. \u0422\u04e9\u043c\u0435\u043d\u0433\u0456 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u0493\u044b \u0431\u0430\u0440 \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440 \u0442\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u043e\u049b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u0442\u043e\u043b\u0442\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.",
"LabelMetadataSavers": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0441\u0430\u049b\u0442\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b:",
"LabelMetadataSaversHelp": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0434\u0430 \u0441\u0430\u049b\u0442\u0430\u0439\u0442\u044b\u043d \u0444\u0430\u0439\u043b \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u0442\u0430\u04a3\u0434\u0430\u0443.",
"LabelImageFetchers": "\u0421\u0443\u0440\u0435\u0442 \u0456\u0440\u0456\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456:",
"LabelImageFetchersHelp": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u0441\u0443\u0440\u0435\u0442 \u0456\u0440\u0456\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u049b \u0440\u0435\u0442\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0434\u04d9\u0440\u0435\u0436\u0435 \u0431\u0435\u0440\u0456\u04a3\u0456\u0437.",
@ -481,7 +481,7 @@
"FolderTypeBooks": "\u041a\u0456\u0442\u0430\u043f\u0442\u0430\u0440",
"FolderTypeTvShows": "\u0422\u0414",
"TabMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440",
"TabSeries": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430",
"TabSeries": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430\u043b\u0430\u0440",
"TabEpisodes": "\u042d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440",
"TabTrailers": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440",
"TabGames": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440",
@ -659,7 +659,7 @@
"DashboardTourScheduledTasks": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043b\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u04b1\u0437\u0430\u049b \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0430\u0442\u044b\u043d \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0436\u0435\u04a3\u0456\u043b \u0431\u0430\u0441\u049b\u0430\u0440\u044b\u04a3\u044b\u0437. \u0411\u04b1\u043b\u0430\u0440 \u049b\u0430\u0448\u0430\u043d \u0436\u04d9\u043d\u0435 \u049b\u0430\u043d\u0434\u0430\u0439 \u0436\u0438\u0456\u043b\u0456\u043a\u043f\u0435\u043d \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0430\u0442\u044b\u043d\u044b\u043d \u0448\u0435\u0448\u0456\u04a3\u0456\u0437.",
"DashboardTourMobile": "Media Browser \u0431\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0434\u0430\u0440\u0434\u0430 \u0436\u04d9\u043d\u0435 \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0442\u0435\u0440\u0434\u0435 \u0442\u0430\u043c\u0430\u0448\u0430 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0439\u0434\u0456. \u0421\u0435\u0440\u0432\u0435\u0440\u0456\u04a3\u0456\u0437\u0434\u0456 \u04d9\u0440 \u0443\u0430\u049b\u044b\u0442\u0442\u0430, \u04d9\u0440 \u0436\u0435\u0440\u0434\u0435 \u049b\u043e\u043b\u044b\u04a3\u044b\u0437\u0434\u044b\u04a3 \u0430\u043b\u0430\u049b\u0430\u043d\u044b\u043d\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u044b\u04a3\u044b\u0437.",
"DashboardTourSync": "\u0414\u0435\u0440\u0431\u0435\u0441 \u049b\u0430\u0440\u0430\u0443 \u04af\u0448\u0456\u043d \u04e9\u0437\u0456\u043d\u0434\u0456\u043a \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u04a3\u0456\u0437\u0434\u0456 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b\u04a3\u044b\u0437\u0431\u0435\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0456\u04a3\u0456\u0437.",
"MessageRefreshQueued": "\u041a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0443\u0456 \u043a\u0435\u0437\u0435\u043a\u0442\u0435",
"MessageRefreshQueued": "\u0416\u0430\u04a3\u0493\u044b\u0440\u0442\u0443 \u043a\u0435\u0437\u0435\u043a\u0442\u0435",
"TabDevices": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440",
"TabExtras": "\u049a\u043e\u0441\u044b\u043c\u0448\u0430\u043b\u0430\u0440",
"DeviceLastUsedByUserName": "{0} \u0430\u0440\u049b\u044b\u043b\u044b \u0435\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0493\u0430\u043d",

@ -230,8 +230,8 @@
"LabelPlayMethodDirectPlay": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e",
"LabelAudioCodec": "\u0410\u0443\u0434\u0438\u043e: {0}",
"LabelVideoCodec": "\u0412\u0438\u0434\u0435\u043e: {0}",
"LabelLocalAccessUrl": "\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441: {0}",
"LabelRemoteAccessUrl": "\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f: {0}",
"LabelLocalAccessUrl": "\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f: {0}",
"LabelRemoteAccessUrl": "\u0423\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f: {0}",
"LabelRunningOnPort": "\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 HTTP-\u043f\u043e\u0440\u0442\u0443 {0}.",
"LabelRunningOnPorts": "\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 HTTP-\u043f\u043e\u0440\u0442\u0443 {0} \u0438 HTTPS-\u043f\u043e\u0440\u0442\u0443 {1}.",
"HeaderLatestFromChannel": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u0437 {0}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -891,7 +891,7 @@
"MessageNoPlaylistsAvailable": "Wiedergabeliste erlauben es dir eine Liste mit Inhalt zu erstellen der fortlaufend abgespielt wird. Um einer Wiedergabeliste Inhalte hinzuzuf\u00fcgen klicke rechts oder mache einen langen Tap und w\u00e4hle daraufhin \"Zur Wiedergabeliste hinzuf\u00fcgen\" aus.",
"MessageNoPlaylistItemsAvailable": "Diese Wiedergabeliste ist momentan leer.",
"ButtonDismiss": "Verwerfen",
"ButtonEditOtherUserPreferences": "Edit this user's profile, image and personal preferences.",
"ButtonEditOtherUserPreferences": "Bearbeite dieses Benutzerprofil, das Benutzerbild und die pers\u00f6nlichen Einstellungen.",
"LabelChannelStreamQuality": "Bevorzugte Qualit\u00e4t des Internetstreams",
"LabelChannelStreamQualityHelp": "In einer Umgebung mit langsamer Bandbreite kann die Beschr\u00e4nkung der Wiedergabequalit\u00e4t eine fl\u00fcssige Darstellung sichern.",
"OptionBestAvailableStreamQuality": "Die besten verf\u00fcgbaren",
@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server wurde aktualisiert",
"AuthenticationSucceededWithUserName": "{0} erfolgreich authentifiziert",
"FailedLoginAttemptWithUserName": "Fehlgeschlagener Anmeldeversuch von {0}",
"UserDownloadingItemWithValues": "{0} l\u00e4dt {1} herunter",
"UserStartedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} gestartet",
"UserStoppedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} beendet",
"AppDeviceValues": "App: {0}, Ger\u00e4t: {1}",
@ -1118,7 +1119,7 @@
"ViewTypeLiveTvRecordingGroups": "Aufnahmen",
"ViewTypeLiveTvChannels": "Kan\u00e4le",
"LabelEasyPinCode": "Einfacher pin code:",
"EasyPasswordHelp": "Ihr einfacher PIN Code wird f\u00fcr den offline Zugriff mit unterst\u00fctzenden Media Browser Apps verwenden und kann ebenso verwendet werden wenn Sie sich im selben Netzwerk befinden.",
"EasyPasswordHelp": "Ihr einfacher PIN Code wird f\u00fcr den offline Zugriff mit unterst\u00fctzenden Media Browser Apps verwendet und kann ebenso verwendet werden wenn Sie sich im selben Netzwerk befinden.",
"LabelInNetworkSignInWithEasyPassword": "Schalte Login mit einfachen Passwort f\u00fcr das eigene Netzwerk ein.",
"LabelInNetworkSignInWithEasyPasswordHelp": "Wenn eingeschaltet k\u00f6nnen Sie sich mit Ihrem einfachen PIN innerhalb Ihres Heimnetzwerkes anmelden. Ihr regul\u00e4res Passwort wird nur dann verwendet, wenn Sie nicht Zuhause sind. Wenn Sie dieses Passwort frei lassen ben\u00f6tigen Sie kein Passwort in Ihrem Heimnetzwerk.",
"HeaderPassword": "Passwort",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -891,7 +891,7 @@
"MessageNoPlaylistsAvailable": "Las listas de reproducci\u00f3n le permiten crear listas de contenidos a ser reproducidos de manera consecutiva. Para agregar \u00edtems a una lista de reproducci\u00f3n, haga clic derecho o seleccione y mantenga, despu\u00e9s seleccione Agregar a Lista de Reproducci\u00f3n.",
"MessageNoPlaylistItemsAvailable": "Esta lista de reproducci\u00f3n se encuentra vac\u00eda.",
"ButtonDismiss": "Descartar",
"ButtonEditOtherUserPreferences": "Edit this user's profile, image and personal preferences.",
"ButtonEditOtherUserPreferences": "Editar el perf\u00edl de este usuario. im\u00e1gen y preferencias personales.",
"LabelChannelStreamQuality": "Calidad por defecto para transmisi\u00f3n por internet:",
"LabelChannelStreamQualityHelp": "En un ambiente de ancho de banda limitado, limitar la calidad puede ayudar a asegurar una experiencia de transimisi\u00f3n en tiempo real fluida.",
"OptionBestAvailableStreamQuality": "La mejor disponible",
@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Se ha actualizado el Servidor de Media Browser",
"AuthenticationSucceededWithUserName": "{0} autenticado con \u00e9xito",
"FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesi\u00f3n de {0}",
"UserDownloadingItemWithValues": "{0} esta descargando {1}",
"UserStartedPlayingItemWithValues": "{0} ha iniciado la reproducci\u00f3n de {1}",
"UserStoppedPlayingItemWithValues": "{0} ha detenido la reproducci\u00f3n de {1}",
"AppDeviceValues": "App: {0}, Dispositivo: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server a \u00e9t\u00e9 mis \u00e0 jour.",
"AuthenticationSucceededWithUserName": "{0} s'est authentifi\u00e9 avec succ\u00e8s",
"FailedLoginAttemptWithUserName": "Echec d'une tentative de connexion de {0}",
"UserDownloadingItemWithValues": "{0} est en train de t\u00e9l\u00e9charger {1}",
"UserStartedPlayingItemWithValues": "{0} vient de commencer la lecture de {1}",
"UserStoppedPlayingItemWithValues": "{0} vient d'arr\u00eater la lecture de {1}",
"AppDeviceValues": "Application : {0}, Appareil: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -63,7 +63,7 @@
"LabelSyncTempPath": "Percorso file temporanei",
"LabelSyncTempPathHelp": "Specifica una cartella per la sincronizzazione. I file multimediali convertiti durante la sincronizzazione verranno collocati qui.",
"LabelCustomCertificatePath": "Percorso certificati personalizzato:",
"LabelCustomCertificatePathHelp": "Supply your own ssl certificate .pfx file. If omitted, the server will create a self-signed certificate.",
"LabelCustomCertificatePathHelp": "Fornire un tuo file .pfx certificato SSL. Se omesso, il server creer\u00e0 un certificato auto-firmato.",
"TitleNotifications": "Notifiche",
"ButtonDonateWithPayPal": "Effettua una donazione con PayPal",
"OptionDetectArchiveFilesAsMedia": "Considera gli archivi come file multimediali",
@ -285,10 +285,10 @@
"ButtonHelp": "Aiuto",
"OptionAllowUserToManageServer": "Consenti a questo utente di accedere alla configurazione del SERVER",
"HeaderFeatureAccess": "Accesso alle funzionalit\u00e0",
"OptionAllowMediaPlayback": "Allow media playback",
"OptionAllowBrowsingLiveTv": "Allow Live TV access",
"OptionAllowDeleteLibraryContent": "Allow media deletion",
"OptionAllowManageLiveTv": "Allow Live TV recording management",
"OptionAllowMediaPlayback": "Consentire la riproduzione multimediale",
"OptionAllowBrowsingLiveTv": "Consenti accesso TV Live",
"OptionAllowDeleteLibraryContent": "Consenti l'eliminazione dei media",
"OptionAllowManageLiveTv": "Consenti la gestione di registrazione Live TV",
"OptionAllowRemoteControlOthers": "Consenti controllo remoto di altri utenti",
"OptionAllowRemoteSharedDevices": "Consenti controllo remoto di dispositivi condivisi",
"OptionAllowRemoteSharedDevicesHelp": "Dispositivi DLNA sono considerati condivisa fino a quando un utente inizia controllarlo.",
@ -891,7 +891,7 @@
"MessageNoPlaylistsAvailable": "Playlist ti permettere di mettere in coda gli elementi da riprodurre.Usa il tasto destro o tap e tieni premuto quindi seleziona elemento da aggiungere",
"MessageNoPlaylistItemsAvailable": "Questa playlist al momento \u00e8 vuota",
"ButtonDismiss": "Cancella",
"ButtonEditOtherUserPreferences": "Edit this user's profile, image and personal preferences.",
"ButtonEditOtherUserPreferences": "Modifica questo utente di profilo, l'immagine e le preferenze personali.",
"LabelChannelStreamQuality": "Preferenziale qualit\u00e0 del flusso internet:",
"LabelChannelStreamQualityHelp": "In un ambiente a bassa larghezza di banda, limitando la qualit\u00e0 pu\u00f2 contribuire a garantire un'esperienza di streaming continuo.",
"OptionBestAvailableStreamQuality": "Migliore disponibile",
@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server \u00e8 stato aggiornato",
"AuthenticationSucceededWithUserName": "{0} Autenticati con successo",
"FailedLoginAttemptWithUserName": "Login fallito da {0}",
"UserDownloadingItemWithValues": "{0} sta scaricando {1}",
"UserStartedPlayingItemWithValues": "{0} \u00e8 partito da {1}",
"UserStoppedPlayingItemWithValues": "{0} stoppato {1}",
"AppDeviceValues": "App: {0}, Dispositivo: {1}",
@ -1338,19 +1339,19 @@
"HeaderVideoTypes": "Tipi Video",
"HeaderYears": "Anni",
"HeaderAddTag": "Aggiungi Tag",
"LabelBlockContentWithTags": "Block content with tags:",
"LabelBlockContentWithTags": "Blocco dei contenuti con le etichette:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limitato a singola immagine incorporata",
"LabelEnableSingleImageInDidlLimitHelp": "Alcuni dispositivi non renderanno correttamente se pi\u00f9 immagini sono incorporati all'interno didl.",
"TabActivity": "Attivit\u00e0",
"TitleSync": "Sincronizza",
"OptionAllowSyncContent": "Allow Sync",
"OptionAllowContentDownloading": "Allow media downloading",
"OptionAllowSyncContent": "Consenti Sync",
"OptionAllowContentDownloading": "Consenti media download",
"NameSeasonUnknown": "Stagione sconosciuto",
"NameSeasonNumber": "Stagione {0}",
"LabelNewUserNameHelp": "I nomi utente possono contenere lettere (az), numeri (0-9), trattini (-), underscore (_), apostrofi ('), e periodi (.)",
"TabJobs": "Attivit\u00e0",
"TabSyncJobs": "Attiv. di Sinc.",
"LabelTagFilterMode": "Mode:",
"LabelTagFilterAllowModeHelp": "If allowed tags are used as part of a deeply nested folder structure, content that is tagged will require parent folders to be tagged as well."
"LabelTagFilterMode": "Modalit\u00e0:",
"LabelTagFilterAllowModeHelp": "Se i tag permessi vengono utilizzati come parte di una struttura di cartelle profondamente nidificate, il contenuto che viene etichettato richieder\u00e0 cartelle principali di essere etichettato come bene."
}

@ -1,13 +1,13 @@
{
"LabelExit": "\u0428\u044b\u0493\u0443",
"LabelVisitCommunity": "\u049a\u0430\u0443\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u049b\u049b\u0430 \u0431\u0430\u0440\u0443",
"LabelGithub": "Github \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439\u0456",
"LabelGithub": "GitHub \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439\u0456",
"LabelSwagger": "Swagger \u0442\u0456\u043b\u0434\u0435\u0441\u0443\u0456",
"LabelStandard": "\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0442\u044b",
"LabelApiDocumentation": "API \u049b\u04b1\u0436\u0430\u0442\u0442\u0430\u043c\u0430\u0441\u044b",
"LabelDeveloperResources": "\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443\u0448\u044b \u043a\u04e9\u0437\u0434\u0435\u0440\u0456",
"LabelBrowseLibrary": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b \u0448\u043e\u043b\u0443",
"LabelConfigureMediaBrowser": "Media Browser \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0441\u044b",
"LabelConfigureMediaBrowser": "Media Browser \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456",
"LabelOpenLibraryViewer": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b \u049b\u0430\u0440\u0430\u0443 \u049b\u04b1\u0440\u0430\u043b\u044b",
"LabelRestartServer": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443",
"LabelShowLogWindow": "\u0416\u04b1\u0440\u043d\u0430\u043b \u0442\u0435\u0440\u0435\u0437\u0435\u0441\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443",
@ -26,15 +26,15 @@
"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.",
"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.",
"WindowsServiceIntro2": "\u0415\u0433\u0435\u0440 Windows \u049b\u044b\u0437\u043c\u0435\u0442\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0434\u0430 \u0431\u043e\u043b\u0441\u0430, \u0435\u0441\u043a\u0435\u0440\u0456\u04a3\u0456\u0437, \u0431\u04b1\u043b \u0441\u043e\u043b \u043c\u0435\u0437\u0433\u0456\u043b\u0434\u0435 \u0436\u04af\u0439\u0435\u043b\u0456\u043a \u0442\u0430\u049b\u0442\u0430\u0434\u0430\u0493\u044b \u0431\u0435\u043b\u0433\u0456\u0448\u0435\u0434\u0435\u0439 \u0436\u04af\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d \u0435\u043c\u0435\u0441, \u0441\u043e\u043d\u044b\u043c\u0435\u043d \u049b\u044b\u0437\u043c\u0435\u0442\u0442\u0456 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443 \u04af\u0448\u0456\u043d \u0436\u04af\u0439\u0435\u043b\u0456\u043a \u0442\u0430\u049b\u0442\u0430\u0434\u0430\u043d \u0448\u044b\u0493\u0443\u044b\u04a3\u044b\u0437 \u049b\u0430\u0436\u0435\u0442. \u0421\u043e\u0493\u0430\u043d \u049b\u0430\u0442\u0430\u0440, \u049b\u044b\u0437\u043c\u0435\u0442\u0442\u0456 \u04d9\u043a\u0456\u043c\u0448\u0456 \u049b\u04b1\u049b\u044b\u049b\u0442\u0430\u0440\u044b\u043d\u0430 \u0438\u0435 \u0431\u043e\u043b\u044b\u043f \u049a\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0456 \u0430\u0440\u049b\u044b\u043b\u044b \u0442\u0435\u04a3\u0448\u0435\u0443 \u049b\u0430\u0436\u0435\u0442. \u041d\u0430\u0437\u0430\u0440 \u0430\u0443\u0434\u0430\u0440\u044b\u04a3\u044b\u0437! \u049a\u0430\u0437\u0456\u0440\u0433\u0456 \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u0431\u04b1\u043b \u049b\u044b\u0437\u043c\u0435\u0442 \u04e9\u0437\u0456\u043d\u0435\u043d-\u04e9\u0437\u0456 \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u043c\u0430\u0439\u0434\u044b, \u0441\u043e\u043d\u0434\u044b\u049b\u0442\u0430\u043d \u0436\u0430\u04a3\u0430 \u043d\u04b1\u0441\u049b\u0430\u043b\u0430\u0440 \u049b\u043e\u043b\u043c\u0435\u043d \u04e9\u0437\u0430\u0440\u0430 \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0435\u0441\u0443\u0434\u0456 \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0434\u0456.",
"WindowsServiceIntro2": "\u0415\u0433\u0435\u0440 Windows \u049b\u044b\u0437\u043c\u0435\u0442\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0434\u0430 \u0431\u043e\u043b\u0441\u0430, \u0435\u0441\u043a\u0435\u0440\u0456\u04a3\u0456\u0437, \u0431\u04b1\u043b \u0441\u043e\u043b \u043c\u0435\u0437\u0433\u0456\u043b\u0434\u0435 \u0436\u04af\u0439\u0435\u043b\u0456\u043a \u0442\u0430\u049b\u0442\u0430\u0434\u0430\u0493\u044b \u0431\u0435\u043b\u0433\u0456\u0448\u0435\u0434\u0435\u0439 \u0436\u04af\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d \u0435\u043c\u0435\u0441, \u0441\u043e\u043d\u044b\u043c\u0435\u043d \u049b\u044b\u0437\u043c\u0435\u0442\u0442\u0456 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443 \u04af\u0448\u0456\u043d \u0436\u04af\u0439\u0435\u043b\u0456\u043a \u0442\u0430\u049b\u0442\u0430\u0434\u0430\u043d \u0448\u044b\u0493\u0443\u044b\u04a3\u044b\u0437 \u049b\u0430\u0436\u0435\u0442. \u0421\u043e\u0493\u0430\u043d \u049b\u0430\u0442\u0430\u0440, \u049b\u044b\u0437\u043c\u0435\u0442\u0442\u0456 \u04d9\u043a\u0456\u043c\u0448\u0456 \u049b\u04b1\u049b\u044b\u049b\u0442\u0430\u0440\u044b\u043d\u0430 \u0438\u0435 \u0431\u043e\u043b\u044b\u043f \u049a\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u0440\u0435\u0442\u0442\u0435\u0443\u0456\u0448\u0456 \u0430\u0440\u049b\u044b\u043b\u044b \u0442\u0435\u04a3\u0448\u0435\u0443 \u049b\u0430\u0436\u0435\u0442. \u041d\u0430\u0437\u0430\u0440 \u0430\u0443\u0434\u0430\u0440\u044b\u04a3\u044b\u0437! \u049a\u0430\u0437\u0456\u0440\u0433\u0456 \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u0431\u04b1\u043b \u049b\u044b\u0437\u043c\u0435\u0442 \u04e9\u0437\u0456\u043d\u0435\u043d-\u04e9\u0437\u0456 \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u043c\u0430\u0439\u0434\u044b, \u0441\u043e\u043d\u0434\u044b\u049b\u0442\u0430\u043d \u0436\u0430\u04a3\u0430 \u043d\u04b1\u0441\u049b\u0430\u043b\u0430\u0440 \u049b\u043e\u043b\u043c\u0435\u043d \u04e9\u0437\u0430\u0440\u0430 \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0435\u0441\u0443\u0434\u0456 \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0434\u0456.",
"WizardCompleted": "\u0411\u04b1\u043b \u04d9\u0437\u0456\u0440\u0448\u0435 \u0431\u0456\u0437\u0433\u0435 \u043a\u0435\u0440\u0435\u0433\u0456\u043d\u0456\u04a3 \u0431\u04d9\u0440\u0456. Media Browser \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u04a3\u044b\u0437 \u0442\u0443\u0440\u0430\u043b\u044b \u043c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0436\u0438\u043d\u0430\u0443\u0434\u044b \u0431\u0430\u0441\u0442\u0430\u0434\u044b. \u041a\u0435\u0439\u0431\u0456\u0440 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b\u043c\u044b\u0437\u0431\u0435\u043d \u0442\u0430\u043d\u044b\u0441\u044b\u043f \u0448\u044b\u0493\u044b\u04a3\u044b\u0437 \u0434\u0430, <b>\u0421\u0435\u0440\u0432\u0435\u0440 \u0431\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d<\/b> \u043a\u04e9\u0440\u0443 \u04af\u0448\u0456\u043d \u043a\u0435\u0439\u0456\u043d <b>\u0414\u0430\u0439\u044b\u043d<\/b>\u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456\u043d \u0431\u0430\u0441\u044b\u04a3\u044b\u0437.",
"LabelConfigureSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043b\u0430\u0443",
"LabelConfigureSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u0442\u0435\u04a3\u0448\u0435\u0443",
"LabelEnableVideoImageExtraction": "\u0411\u0435\u0439\u043d\u0435 \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0448\u044b\u0493\u0430\u0440\u044b\u043f \u0430\u043b\u0443\u0434\u044b \u049b\u043e\u0441\u0443",
"VideoImageExtractionHelp": "\u04d8\u043b\u0456 \u0434\u0435 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456 \u0436\u043e\u049b, \u0436\u04d9\u043d\u0435 \u043e\u043b\u0430\u0440 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0442\u0435 \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0493\u0430\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440 \u04af\u0448\u0456\u043d. \u0411\u04b1\u043b \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b\u04a3 \u0431\u0430\u0441\u0442\u0430\u043f\u049b\u044b \u0441\u043a\u0430\u043d\u0435\u0440\u043b\u0435\u0443\u0456 \u04af\u0448\u0456\u043d \u049b\u043e\u0441\u044b\u043c\u0448\u0430 \u0443\u0430\u049b\u044b\u0442 \u04af\u0441\u0442\u0435\u0439\u0434\u0456, \u0431\u0456\u0440\u0430\u049b \u043d\u04d9\u0442\u0438\u0436\u0435\u0441\u0456\u043d\u0434\u0435 \u04b1\u043d\u0430\u043c\u0434\u044b\u043b\u0430\u0443 \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043c \u0431\u043e\u043b\u0430\u0434\u044b.",
"LabelEnableChapterImageExtractionForMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440 \u04af\u0448\u0456\u043d \u0441\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0448\u044b\u0493\u0430\u0440\u044b\u043f \u0430\u043b\u0443\u0434\u044b \u049b\u043e\u0441\u0443",
"LabelChapterImageExtractionForMoviesHelp": "\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. \u0411\u04b1\u043b \u0442\u04af\u043d\u0433\u0456 \u0443\u0430\u049b\u044b\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, \u0434\u0435\u0433\u0435\u043d\u043c\u0435\u043d \u0431\u04b1\u043b \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 \u043e\u0440\u044b\u043d\u0434\u0430\u0443 \u04b1\u0441\u044b\u043d\u044b\u043b\u043c\u0430\u0439\u0434\u044b.",
"LabelEnableAutomaticPortMapping": "\u041f\u043e\u0440\u0442 \u0430\u0432\u0442\u043e\u0441\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443\u044b\u043d \u049b\u043e\u0441\u0443",
"LabelEnableAutomaticPortMappingHelp": "\u049a\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u043e\u04a3\u0430\u0439\u0442\u044b\u043b\u044b\u043f \u049b\u0430\u0442\u044b\u043d\u0430\u0443 \u04af\u0448\u0456\u043d UPnP \u0436\u043e\u043b \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u044b\u0448\u0442\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043b\u0430\u0443\u0493\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u0411\u04b1\u043b \u043a\u0435\u0439\u0431\u0456\u0440 \u0436\u043e\u043b \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u044b\u0448 \u04af\u043b\u0433\u0456\u043b\u0435\u0440\u0456\u043c\u0435\u043d \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u043c\u0435\u0439\u0442\u0456\u043d\u0456 \u043c\u04af\u043c\u043a\u0456\u043d.",
"LabelEnableAutomaticPortMappingHelp": "\u049a\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u043e\u04a3\u0430\u0439\u0442\u044b\u043b\u044b\u043f \u049b\u0430\u0442\u044b\u043d\u0430\u0443 \u04af\u0448\u0456\u043d UPnP \u0436\u043e\u043b \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u044b\u0448\u0442\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0442\u0435\u04a3\u0448\u0435\u0443\u0433\u0435 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u0411\u04b1\u043b \u043a\u0435\u0439\u0431\u0456\u0440 \u0436\u043e\u043b \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u044b\u0448 \u04af\u043b\u0433\u0456\u043b\u0435\u0440\u0456\u043c\u0435\u043d \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u043c\u0435\u0439\u0442\u0456\u043d\u0456 \u043c\u04af\u043c\u043a\u0456\u043d.",
"HeaderTermsOfService": "Media Browser \u049a\u044b\u0437\u043c\u0435\u0442 \u0448\u0430\u0440\u0442\u0442\u0430\u0440\u044b",
"MessagePleaseAcceptTermsOfService": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u043c\u0430\u0441 \u0431\u04b1\u0440\u044b\u043d \u049a\u044b\u0437\u043c\u0435\u0442 \u0448\u0430\u0440\u0442\u0442\u0430\u0440\u044b\u043d \u0436\u04d9\u043d\u0435 \u049a\u04b1\u043f\u0438\u044f\u043b\u044b\u043b\u044b\u049b \u0441\u0430\u044f\u0441\u0430\u0442\u044b\u043d \u049b\u0430\u0431\u044b\u043b\u0434\u0430\u04a3\u044b\u0437.",
"OptionIAcceptTermsOfService": "\u049a\u044b\u0437\u043c\u0435\u0442 \u0448\u0430\u0440\u0442\u0442\u0430\u0440\u044b\u043d \u049b\u0430\u0431\u044b\u043b\u0434\u0430\u0439\u043c\u044b\u043d",
@ -92,9 +92,9 @@
"LabelLanguage": "\u0422\u0456\u043b:",
"ButtonJoinTheDevelopmentTeam": "\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443\u0448\u044b\u043b\u0430\u0440 \u0442\u043e\u0431\u044b\u043d\u0430 \u043a\u0456\u0440\u0443",
"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\u044b\u0493\u044b\u0448 \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\u044b\u0493\u044b\u0448 \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",
"LabelSaveLocalMetadata": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435\u043b\u0435\u0440 \u0431\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \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\u043b\u0435\u0440 \u0431\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \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\u043b\u0435\u0440 \u0431\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0442\u0435\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443",
"LabelDownloadInternetMetadataHelp": "\u0422\u043e\u043b\u044b \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043b\u0456\u043c\u0434\u0435\u0440\u0434\u0456 \u049b\u043e\u0441\u0443 \u04af\u0448\u0456\u043d Media Browser \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0442\u0443\u0440\u0430\u043b\u044b \u043c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0436\u04af\u043a\u0442\u0435\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d.",
"TabPreferences": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440",
"TabPassword": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437",
@ -102,7 +102,7 @@
"TabAccess": "\u049a\u0430\u0442\u044b\u043d\u0430\u0443",
"TabImage": "\u0421\u0443\u0440\u0435\u0442",
"TabProfile": "\u041f\u0440\u043e\u0444\u0438\u043b\u044c",
"TabMetadata": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a",
"TabMetadata": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440",
"TabImages": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440",
"TabNotifications": "\u0425\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u0443\u043b\u0430\u0440",
"TabCollectionTitles": "\u0422\u0443\u044b\u043d\u0434\u044b\u043b\u0430\u0440",
@ -219,7 +219,7 @@
"HeaderLatestSongs": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u04a3\u0433\u0456 \u04d9\u0443\u0435\u043d\u0434\u0435\u0440",
"HeaderRecentlyPlayed": "\u0416\u0430\u049b\u044b\u043d\u0434\u0430 \u043e\u0439\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d\u0434\u0430\u0440",
"HeaderFrequentlyPlayed": "\u0416\u0438\u0456 \u043e\u0439\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d\u0434\u0430\u0440",
"DevBuildWarning": "\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443 \u049b\u04b1\u0440\u0430\u0441\u0442\u044b\u0440\u043c\u0430\u043b\u0430\u0440 \u0441\u04b1\u0440\u0430\u043f\u044b\u043b \u049b\u044b\u0440\u043b\u044b \u0431\u043e\u043b\u044b\u043f \u0442\u0430\u0431\u044b\u043b\u0430\u0434\u044b. \u0416\u0438\u0456 \u0448\u044b\u0493\u0430\u0440\u043b\u044b\u043f \u043c\u044b\u043d\u0430 \u049b\u04b1\u0440\u0430\u0441\u0442\u044b\u0440\u043c\u0430\u043b\u0430\u0440 \u0442\u043e\u043b\u044b\u049b \u0441\u044b\u043d\u0430\u049b\u0442\u0430\u043c\u0430\u043b\u0430\u0443\u0434\u0430\u043d \u04e9\u0442\u043f\u0435\u0433\u0435\u043d. \u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0431\u04b1\u0437\u044b\u043b\u0443 \u043c\u04af\u043c\u043a\u0456\u043d \u0436\u04d9\u043d\u0435 \u0430\u049b\u044b\u0440 \u0430\u044f\u0493\u044b\u043d\u0434\u0430 \u0435\u0440\u0435\u043a\u0448\u0435\u043b\u0456\u043a\u0442\u0435\u0440 \u0431\u04af\u0442\u0456\u043d\u0434\u0435\u0439 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u043c\u0435\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d.",
"DevBuildWarning": "\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443 \u049b\u04b1\u0440\u0430\u0441\u0442\u044b\u0440\u043c\u0430\u043b\u0430\u0440 \u0435\u04a3 \u0430\u043b\u0434\u044b\u04a3\u0493\u044b \u049b\u0430\u0442\u0430\u0440\u043b\u044b \u0431\u043e\u043b\u044b\u043f \u0442\u0430\u0431\u044b\u043b\u0430\u0434\u044b. \u0416\u0438\u0456 \u0448\u044b\u0493\u0430\u0440\u043b\u044b\u043f \u043c\u044b\u043d\u0430 \u049b\u04b1\u0440\u0430\u0441\u0442\u044b\u0440\u043c\u0430\u043b\u0430\u0440 \u0442\u043e\u043b\u044b\u049b \u0441\u044b\u043d\u0430\u049b\u0442\u0430\u043c\u0430\u043b\u0430\u0443\u0434\u0430\u043d \u04e9\u0442\u043f\u0435\u0433\u0435\u043d. \u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0431\u04b1\u0437\u044b\u043b\u0443 \u043c\u04af\u043c\u043a\u0456\u043d \u0436\u04d9\u043d\u0435 \u0430\u049b\u044b\u0440 \u0430\u044f\u0493\u044b\u043d\u0434\u0430 \u0435\u0440\u0435\u043a\u0448\u0435\u043b\u0456\u043a\u0442\u0435\u0440 \u0431\u04af\u0442\u0456\u043d\u0434\u0435\u0439 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u043c\u0435\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d.",
"LabelVideoType": "\u0411\u0435\u0439\u043d\u0435 \u0442\u04af\u0440\u0456:",
"OptionBluray": "BluRay",
"OptionDvd": "DVD",
@ -335,9 +335,9 @@
"TabOthers": "\u0411\u0430\u0441\u049b\u0430\u043b\u0430\u0440",
"HeaderExtractChapterImagesFor": "\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 \u043c\u0430\u043a\u0441\u0430\u0442\u044b:",
"OptionMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440",
"OptionEpisodes": "\u042d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440",
"OptionEpisodes": "\u0422\u0414-\u044d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440",
"OptionOtherVideos": "\u0411\u0430\u0441\u049b\u0430 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440",
"TitleMetadata": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a",
"TitleMetadata": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440",
"LabelAutomaticUpdates": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u043b\u0430\u0440\u0434\u044b \u049b\u043e\u0441\u0443",
"LabelAutomaticUpdatesTmdb": "TheMovieDB.org \u043a\u04e9\u0437\u0456\u043d\u0435\u043d \u0430\u0432\u0442\u043e\u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u0434\u044b \u049b\u043e\u0441\u0443",
"LabelAutomaticUpdatesTvdb": "TheTVDB.com \u043a\u04e9\u0437\u0456\u043d\u0435\u043d \u0430\u0432\u0442\u043e\u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u0434\u044b \u049b\u043e\u0441\u0443",
@ -366,7 +366,7 @@
"HeaderChannels": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440",
"TabRecordings": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440",
"TabScheduled": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d",
"TabSeries": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430",
"TabSeries": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430\u043b\u0430\u0440",
"TabFavorites": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b\u043b\u0430\u0440",
"TabMyLibrary": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043c",
"ButtonCancelRecording": "\u0416\u0430\u0437\u0443\u0434\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443",
@ -379,9 +379,9 @@
"HeaderUpcomingTV": "\u041a\u04af\u0442\u0456\u043b\u0433\u0435\u043d \u0422\u0414",
"TabStatus": "\u041a\u04af\u0439",
"TabSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440",
"ButtonRefreshGuideData": "\u0410\u043d\u044b\u049b\u0442\u0430\u0493\u044b\u0448 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043d \u043a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0443",
"ButtonRefresh": "\u041a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0443",
"ButtonAdvancedRefresh": "\u041a\u0435\u04a3\u0435\u0439\u0442\u0456\u043b\u0433\u0435\u043d \u043a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0443",
"ButtonRefreshGuideData": "\u0410\u043d\u044b\u049b\u0442\u0430\u0493\u044b\u0448 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043d \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u0443",
"ButtonRefresh": "\u0416\u0430\u04a3\u0493\u044b\u0440\u0442\u0443",
"ButtonAdvancedRefresh": "\u041a\u0435\u04a3\u0435\u0439\u0442\u0456\u043b\u0433\u0435\u043d \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u0443",
"OptionPriority": "\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442",
"OptionRecordOnAllChannels": "\u0411\u0435\u0440\u0456\u043b\u0456\u043c\u0434\u0456 \u0431\u0430\u0440\u043b\u044b\u049b \u0430\u0440\u043d\u0430\u043b\u0430\u0440\u0434\u0430\u043d \u0436\u0430\u0437\u044b\u043f \u0430\u043b\u0443",
"OptionRecordAnytime": "\u0411\u0435\u0440\u0456\u043b\u0456\u043c\u0434\u0456 \u04d9\u0440 \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u0436\u0430\u0437\u044b\u043f \u0430\u043b\u0443",
@ -510,7 +510,7 @@
"HeaderLinks": "\u0421\u0456\u043b\u0442\u0435\u043c\u0435\u043b\u0435\u0440",
"HeaderSystemPaths": "\u0416\u04af\u0439\u0435\u043b\u0456\u043a \u0436\u043e\u043b\u0434\u0430\u0440",
"LinkCommunity": "\u049a\u0430\u0443\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u049b",
"LinkGithub": "Github \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439\u0456",
"LinkGithub": "GitHub",
"LinkApi": "API",
"LinkApiDocumentation": "API \u049b\u04b1\u0436\u0430\u0442\u0442\u0430\u043c\u0430\u0441\u044b",
"LabelFriendlyServerName": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456\u04a3 \u043e\u04a3\u0430\u0439 \u0430\u0442\u044b:",
@ -650,7 +650,7 @@
"HeaderRequireManualLoginHelp": "\u0410\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440 \u043f\u0430\u0439\u0434\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u043a\u04e9\u0440\u043d\u0435\u043a\u0456 \u0442\u0430\u04a3\u0434\u0430\u0443\u044b \u0431\u0430\u0440 \u043a\u0456\u0440\u0443 \u044d\u043a\u0440\u0430\u043d\u044b\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d.",
"OptionOtherApps": "\u0411\u0430\u0441\u049b\u0430 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440",
"OptionMobileApps": "\u04b0\u0442\u049b\u044b\u0440 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440",
"HeaderNotificationList": "\u0416\u0456\u0431\u0435\u0440\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456\u043d \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043b\u0430\u0443 \u04af\u0448\u0456\u043d \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u043c\u0430\u043d\u044b \u043d\u04b1\u049b\u044b\u04a3\u044b\u0437.",
"HeaderNotificationList": "\u0416\u0456\u0431\u0435\u0440\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u0443 \u04af\u0448\u0456\u043d \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u043c\u0430\u043d\u044b \u043d\u04b1\u049b\u044b\u04a3\u044b\u0437.",
"NotificationOptionApplicationUpdateAvailable": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u049b\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456",
"NotificationOptionApplicationUpdateInstalled": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b",
"NotificationOptionPluginUpdateInstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b",
@ -736,9 +736,9 @@
"HeaderDirectPlayProfile": "\u0422\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b",
"HeaderTranscodingProfile": "\u049a\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b",
"HeaderCodecProfile": "\u041a\u043e\u0434\u0435\u043a \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b",
"HeaderCodecProfileHelp": "\u041a\u043e\u0434\u0435\u043a \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u043d\u0430\u049b\u0442\u044b \u043a\u043e\u0434\u0435\u043a\u0442\u0435\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b\u04a3 \u0448\u0435\u043a\u0442\u0435\u0443\u043b\u0435\u0440\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0434\u0456. \u0415\u0433\u0435\u0440 \u0448\u0435\u043a\u0442\u0435\u0443 \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u043b\u0441\u0430, \u0441\u043e\u043d\u0434\u0430 \u043a\u043e\u0434\u0435\u043a \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0441\u0435\u0434\u0435 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u043b\u044b\u043d\u0430\u0434\u044b.",
"HeaderCodecProfileHelp": "\u041a\u043e\u0434\u0435\u043a \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u043d\u0430\u049b\u0442\u044b \u043a\u043e\u0434\u0435\u043a\u0442\u0435\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b\u04a3 \u0448\u0435\u043a\u0442\u0435\u0443\u043b\u0435\u0440\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0434\u0456. \u0415\u0433\u0435\u0440 \u0448\u0435\u043a\u0442\u0435\u0443 \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u043b\u0441\u0430, \u0441\u043e\u043d\u0434\u0430 \u043a\u043e\u0434\u0435\u043a \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0441\u0435 \u0434\u0435 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u043b\u044b\u043d\u0430\u0434\u044b.",
"HeaderContainerProfile": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b",
"HeaderContainerProfileHelp": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u043d\u0430\u049b\u0442\u044b \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b\u04a3 \u0448\u0435\u043a\u0442\u0435\u0443\u043b\u0435\u0440\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0434\u0456. \u0415\u0433\u0435\u0440 \u0448\u0435\u043a\u0442\u0435\u0443 \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u043b\u0441\u0430, \u0441\u043e\u043d\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0441\u0435\u0434\u0435 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u043b\u044b\u043d\u0430\u0434\u044b.",
"HeaderContainerProfileHelp": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u043d\u0430\u049b\u0442\u044b \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b\u04a3 \u0448\u0435\u043a\u0442\u0435\u0443\u043b\u0435\u0440\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0434\u0456. \u0415\u0433\u0435\u0440 \u0448\u0435\u043a\u0442\u0435\u0443 \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u043b\u0441\u0430, \u0441\u043e\u043d\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0441\u0435 \u0434\u0435 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u043b\u044b\u043d\u0430\u0434\u044b.",
"OptionProfileVideo": "\u0411\u0435\u0439\u043d\u0435",
"OptionProfileAudio": "\u0414\u044b\u0431\u044b\u0441",
"OptionProfileVideoAudio": "\u0411\u0435\u0439\u043d\u0435 \u0414\u044b\u0431\u044b\u0441",
@ -837,8 +837,8 @@
"PluginTabMediaBrowserTheater": "MB Theater",
"LabelEpisodeNamePlain": "\u042d\u043f\u0438\u0437\u043e\u0434 \u0430\u0442\u0430\u0443\u044b",
"LabelSeriesNamePlain": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430 \u0430\u0442\u0430\u0443\u044b",
"ValueSeriesNamePeriod": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430.\u0430\u0442\u0430\u0443",
"ValueSeriesNameUnderscore": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430_\u0430\u0442\u0430\u0443",
"ValueSeriesNamePeriod": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430.\u0430\u0442\u0430\u0443\u044b",
"ValueSeriesNameUnderscore": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430_\u0430\u0442\u0430\u0443\u044b",
"ValueEpisodeNamePeriod": "\u042d\u043f\u0438\u0437\u043e\u0434.\u0430\u0442\u044b",
"ValueEpisodeNameUnderscore": "\u042d\u043f\u0438\u0437\u043e\u0434_\u0430\u0442\u044b",
"LabelSeasonNumberPlain": "\u041c\u0430\u0443\u0441\u044b\u043c \u043d\u04e9\u043c\u0456\u0440\u0456",
@ -950,7 +950,7 @@
"LabelProtocolInfo": "\u041f\u0440\u043e\u0442\u043e\u049b\u043e\u043b \u0442\u0443\u0440\u0430\u043b\u044b:",
"LabelProtocolInfoHelp": "\u0411\u04b1\u043b \u043c\u04d9\u043d \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b\u04a3 GetProtocolInfo \u0441\u04b1\u0440\u0430\u043d\u044b\u0441\u0442\u0430\u0440\u044b\u043d\u0430 \u0436\u0430\u0443\u0430\u043f \u0431\u0435\u0440\u0433\u0435\u043d\u0434\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.",
"TabNfo": "NFO-\u0444\u0430\u0439\u043b\u0434\u0430\u0440",
"HeaderKodiMetadataHelp": "Media Browser \u0431\u0430\u0493\u0434\u0430\u0440\u043b\u0430\u043c\u0430\u0441\u044b \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0442\u0435\u0440\u0434\u0456\u04a3 NFO-\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u049b\u043e\u043b\u0434\u0430\u0443\u044b\u043d \u049b\u0430\u043c\u0442\u0438\u0434\u044b. NFO-\u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u0443 \u043d\u0435\u043c\u0435\u0441\u0435 \u04e9\u0448\u0456\u0440\u0443 \u04af\u0448\u0456\u043d \u049a\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u049b\u043e\u0439\u044b\u043d\u0434\u044b\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0442\u04af\u0440\u043b\u0435\u0440\u0456\u043d\u0435 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u04a3\u044b\u0437.",
"HeaderKodiMetadataHelp": "Media Browser \u0431\u0430\u0493\u0434\u0430\u0440\u043b\u0430\u043c\u0430\u0441\u044b \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0442\u0435\u0440\u0434\u0456\u04a3 NFO-\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u049b\u043e\u043b\u0434\u0430\u0443\u044b\u043d \u049b\u0430\u043c\u0442\u0438\u0434\u044b. NFO-\u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u0443 \u043d\u0435\u043c\u0435\u0441\u0435 \u04e9\u0448\u0456\u0440\u0443 \u04af\u0448\u0456\u043d \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0442\u04af\u0440\u043b\u0435\u0440\u0456\u043d\u0435 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u0442\u0435\u04a3\u0448\u0435\u0443\u0433\u0435 \u049a\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u049b\u043e\u0439\u044b\u043d\u0434\u044b\u0441\u044b\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u04a3\u044b\u0437.",
"LabelKodiMetadataUser": "NFO-\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u0434\u044b \u043c\u044b\u043d\u0430 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u049b\u0430\u0440\u0430\u0443 \u043a\u04af\u0439\u0456\u043c\u0435\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443:",
"LabelKodiMetadataUserHelp": "\u049a\u0430\u0440\u0430\u0443 \u043a\u04af\u0439\u0434\u0456 Media Browser \u0436\u04d9\u043d\u0435 NFO-\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430 \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0456\u043f \u0442\u04b1\u0440\u0443 \u04af\u0448\u0456\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437.",
"LabelKodiMetadataDateFormat": "\u0428\u044b\u0493\u0430\u0440\u0443 \u043a\u04af\u043d\u0456\u043d\u0456\u04a3 \u043f\u0456\u0448\u0456\u043c\u0456:",
@ -985,15 +985,15 @@
"LabelTranscodingTemporaryFiles": "\u049a\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443\u044b\u043d\u044b\u04a3 \u0443\u0430\u049b\u044b\u0442\u0448\u0430 \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b:",
"HeaderLatestMusic": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456 \u043c\u0443\u0437\u044b\u043a\u0430",
"HeaderBranding": "\u0411\u0435\u0437\u0435\u043d\u0434\u0456\u0440\u0443",
"HeaderApiKeys": "API \u043a\u0456\u043b\u0442\u0442\u0435\u0440\u0456",
"HeaderApiKeys": "API-\u043a\u0456\u043b\u0442\u0442\u0435\u0440",
"HeaderApiKeysHelp": "\u0421\u044b\u0440\u0442\u049b\u044b \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440 Media Browser \u0431\u0430\u0493\u0434\u0430\u0440\u043b\u0430\u043c\u0430\u0441\u044b\u043c\u0435\u043d \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443 \u04af\u0448\u0456\u043d API \u043a\u0456\u043b\u0442\u0456 \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0434\u0456. \u041a\u0456\u043b\u0442\u0442\u0435\u0440 Media Browser \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d\u0435 \u043a\u0456\u0440\u0433\u0435\u043d\u0434\u0435, \u043d\u0435\u043c\u0435\u0441\u0435 \u043a\u0456\u043b\u0442\u0442\u0456 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0493\u0430 \u049b\u043e\u043b\u043c\u0435\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0456\u043b\u0433\u0435\u043d\u0434\u0435 \u0431\u0435\u0440\u0456\u043b\u0435\u0434\u0456.",
"HeaderApiKey": "API \u043a\u0456\u043b\u0442\u0456",
"HeaderApiKey": "API-\u043a\u0456\u043b\u0442",
"HeaderApp": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430",
"HeaderDevice": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b",
"HeaderUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b",
"HeaderDateIssued": "\u0411\u0435\u0440\u0456\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456",
"LabelChapterName": "{0}-\u0441\u0430\u0445\u043d\u0430",
"HeaderNewApiKey": "\u0416\u0430\u04a3\u0430 API \u043a\u0456\u043b\u0442\u0456",
"HeaderNewApiKey": "\u0416\u0430\u04a3\u0430 API-\u043a\u0456\u043b\u0442",
"LabelAppName": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0430\u0442\u044b",
"LabelAppNameExample": "\u041c\u044b\u0441\u0430\u043b\u044b: Sickbeard, NzbDrone",
"HeaderNewApiKeyHelp": "Media Browser \u0431\u0430\u0493\u0434\u0430\u0440\u043b\u0430\u043c\u0430\u0441\u044b\u043c\u0435\u043d \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443 \u049b\u04b1\u049b\u044b\u049b\u044b\u0493\u044b \u04af\u0448\u0456\u043d \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0493\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443.",
@ -1059,14 +1059,14 @@
"OptionSeason0": "0-\u043c\u0430\u0443\u0441\u044b\u043c",
"LabelReport": "\u0411\u0430\u044f\u043d\u0430\u0442:",
"OptionReportSongs": "\u04d8\u0443\u0435\u043d\u0434\u0435\u0440",
"OptionReportSeries": "\u0422\u043e\u043f\u0442\u0430\u043c\u0430\u043b\u0430\u0440",
"OptionReportSeasons": "\u041c\u0430\u0443\u0441\u044b\u043c\u0434\u0430\u0440",
"OptionReportSeries": "\u0422\u0414-\u0442\u043e\u043f\u0442\u0430\u043c\u0430\u043b\u0430\u0440",
"OptionReportSeasons": "\u0422\u0414-\u043c\u0430\u0443\u0441\u044b\u043c\u0434\u0430\u0440",
"OptionReportTrailers": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440",
"OptionReportMusicVideos": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044b\u049b \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440",
"OptionReportMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440",
"OptionReportHomeVideos": "\u04ae\u0439 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0456",
"OptionReportGames": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440",
"OptionReportEpisodes": "\u042d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440",
"OptionReportEpisodes": "\u0422\u0414-\u044d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440",
"OptionReportCollections": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440",
"OptionReportBooks": "\u041a\u0456\u0442\u0430\u043f\u0442\u0430\u0440",
"OptionReportArtists": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440",
@ -1092,15 +1092,16 @@
"SubtitleDownloadFailureForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 {0} \u04af\u0448\u0456\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u044b\u043d\u0443\u044b \u0441\u04d9\u0442\u0441\u0456\u0437",
"LabelRunningTimeValue": "\u0406\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443 \u0443\u0430\u049b\u044b\u0442\u044b: {0}",
"LabelIpAddressValue": "IP \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b: {0}",
"UserConfigurationUpdatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u04af\u0448\u0456\u043d \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b",
"UserConfigurationUpdatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b",
"UserCreatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u0436\u0430\u0441\u0430\u043b\u0493\u0430\u043d",
"UserPasswordChangedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u04af\u0448\u0456\u043d \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u04e9\u0437\u0433\u0435\u0440\u0442\u0456\u043b\u0434\u0456",
"UserDeletedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u0436\u043e\u0439\u044b\u043b\u0493\u0430\u043d",
"MessageServerConfigurationUpdated": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0441\u044b \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b",
"MessageNamedServerConfigurationUpdatedWithValue": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0441\u044b (\u0431\u04e9\u043b\u0456\u043c {0}) \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b",
"MessageServerConfigurationUpdated": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456 \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b",
"MessageNamedServerConfigurationUpdatedWithValue": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456 ({0} \u0431\u04e9\u043b\u0456\u043c\u0456) \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b",
"MessageApplicationUpdated": "Media Browser Server \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b",
"AuthenticationSucceededWithUserName": "{0} \u0442\u04af\u043f\u043d\u04b1\u0441\u049b\u0430\u043b\u044b\u0493\u044b\u043d \u0440\u0430\u0441\u0442\u0430\u043b\u0443\u044b \u0441\u04d9\u0442\u0442\u0456",
"FailedLoginAttemptWithUserName": "{0} \u043a\u0456\u0440\u0443 \u04d9\u0440\u0435\u043a\u0435\u0442\u0456 \u0441\u04d9\u0442\u0441\u0456\u0437",
"UserDownloadingItemWithValues": "{0} \u043c\u044b\u043d\u0430\u043d\u044b \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443\u0434\u0430: {1}",
"UserStartedPlayingItemWithValues": "{0} - {1} \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0431\u0430\u0441\u0442\u0430\u043b\u0434\u044b",
"UserStoppedPlayingItemWithValues": "{0} - {1} \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0442\u043e\u049b\u0442\u0430\u043b\u0434\u044b",
"AppDeviceValues": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430: {0}, \u0416\u0430\u0431\u0434\u044b\u049b: {1}",
@ -1126,14 +1127,14 @@
"HeaderViewOrder": "\u0410\u0441\u043f\u0435\u043a\u0442\u0442\u0435\u0440 \u0440\u0435\u0442\u0456",
"ButtonResetEasyPassword": "\u041e\u04a3\u0430\u0439\u0442\u044b\u043b\u0493\u0430\u043d PIN-\u043a\u043e\u0434\u0442\u044b \u044b\u0441\u044b\u0440\u0443",
"LabelSelectUserViewOrder": "Media Browser \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b\u043d\u0434\u0430 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0442\u0456\u043d \u041c\u0435\u043d\u0456\u04a3 \u0430\u0441\u043f\u0435\u043a\u0442\u0442\u0435\u0440\u0456\u043c \u0440\u0435\u0442\u0456\u043d \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437",
"LabelMetadataRefreshMode": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u043a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0443 \u0440\u0435\u0436\u0456\u043c\u0456:",
"LabelImageRefreshMode": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u043a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0443 \u0440\u0435\u0436\u0456\u043c\u0456:",
"LabelMetadataRefreshMode": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u0443 \u0440\u0435\u0436\u0456\u043c\u0456:",
"LabelImageRefreshMode": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u0443 \u0440\u0435\u0436\u0456\u043c\u0456:",
"OptionDownloadMissingImages": "\u0416\u043e\u049b \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443",
"OptionReplaceExistingImages": "\u0411\u0430\u0440 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0430\u0443\u044b\u0441\u0442\u044b\u0440\u0443",
"OptionRefreshAllData": "\u0411\u0430\u0440\u043b\u044b\u049b \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u043a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0443",
"OptionRefreshAllData": "\u0411\u0430\u0440\u043b\u044b\u049b \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u0443",
"OptionAddMissingDataOnly": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u043e\u043a \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u04af\u0441\u0442\u0435\u0443",
"OptionLocalRefreshOnly": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u0435\u0440\u0433\u0456\u043b\u0456\u043a\u0442\u0456 \u043a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0443",
"HeaderRefreshMetadata": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u043a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0443",
"OptionLocalRefreshOnly": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u0435\u0440\u0433\u0456\u043b\u0456\u043a\u0442\u0456 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u0443",
"HeaderRefreshMetadata": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u0443",
"HeaderPersonInfo": "\u0422\u04b1\u043b\u0493\u0430 \u0442\u0443\u0440\u0430\u043b\u044b",
"HeaderIdentifyItem": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u0443",
"HeaderIdentifyItemHelp": "\u0406\u0437\u0434\u0435\u0443\u0434\u0456\u04a3 \u0431\u0456\u0440 \u043d\u0435 \u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0448\u0430\u0440\u0442\u044b\u043d \u0435\u043d\u0433\u0456\u0437\u0456\u04a3\u0456\u0437. \u0406\u0437\u0434\u0435\u0443 \u043d\u04d9\u0442\u0438\u0436\u0435\u043b\u0435\u0440\u0456\u043d \u043a\u04e9\u0431\u0435\u0439\u0442\u0443 \u04af\u0448\u0456\u043d \u0448\u0430\u0440\u0442\u0442\u044b \u0430\u043b\u0430\u0441\u0442\u0430\u04a3\u044b\u0437.",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server har blitt oppdatert",
"AuthenticationSucceededWithUserName": "{0} autentisert med suksess",
"FailedLoginAttemptWithUserName": "P\u00e5loggingsfors\u00f8k feilet fra {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} har startet avspilling av {1}",
"UserStoppedPlayingItemWithValues": "{0} har stoppet avspilling av {1}",
"AppDeviceValues": "App: {0} , Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server is bijgewerkt",
"AuthenticationSucceededWithUserName": "{0} is succesvol geverifieerd",
"FailedLoginAttemptWithUserName": "Mislukte aanmeld poging van {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} heeft afspelen van {1} gestart",
"UserStoppedPlayingItemWithValues": "{0} heeft afspelen van {1} gestopt",
"AppDeviceValues": "App: {0}, Apparaat: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "O Servidor Media Browser foi atualizado",
"AuthenticationSucceededWithUserName": "{0} autenticou-se com sucesso",
"FailedLoginAttemptWithUserName": "Falha em tentativa de login de {0}",
"UserDownloadingItemWithValues": "{0} est\u00e1 fazendo download de {1}",
"UserStartedPlayingItemWithValues": "{0} come\u00e7ou a reproduzir {1}",
"UserStoppedPlayingItemWithValues": "{0} parou de reproduzir {1}",
"AppDeviceValues": "App: {0}, Dispositivo: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -219,7 +219,7 @@
"HeaderLatestSongs": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043c\u0435\u043b\u043e\u0434\u0438\u0438",
"HeaderRecentlyPlayed": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u043e",
"HeaderFrequentlyPlayed": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u043e",
"DevBuildWarning": "\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043e\u0447\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u044b\u0440\u044b\u043c\u0438 \u0438 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c\u0438. \u0412\u044b\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u043e, \u044d\u0442\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435 \u0431\u044b\u043b\u0438 \u043e\u0442\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u0441\u044f, \u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c.",
"DevBuildWarning": "\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043e\u0447\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0434\u043e\u0432\u044b\u043c\u0438. \u0412\u044b\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u043e, \u044d\u0442\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435 \u0431\u044b\u043b\u0438 \u043e\u0442\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u0441\u044f, \u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c.",
"LabelVideoType": "\u0422\u0438\u043f \u0432\u0438\u0434\u0435\u043e:",
"OptionBluray": "BluRay",
"OptionDvd": "DVD",
@ -1051,7 +1051,7 @@
"OptionLogo": "\u041b\u043e\u0433\u043e\u0442\u0438\u043f",
"OptionMenu": "\u041c\u0435\u043d\u044e",
"OptionScreenshot": "\u0421\u043d\u0438\u043c\u043e\u043a \u044d\u043a\u0440\u0430\u043d\u0430",
"OptionLocked": "\u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435",
"OptionLocked": "\u0417\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435",
"OptionUnidentified": "\u041d\u0435\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043d\u043e\u0435",
"OptionMissingParentalRating": "\u041d\u0435\u0442 \u0432\u043e\u0437\u0440\u0430\u0441\u0442. \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438",
"OptionStub": "\u0417\u0430\u0433\u043b\u0443\u0448\u043a\u0430",
@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server \u0431\u044b\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d",
"AuthenticationSucceededWithUserName": "{0} - \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u0430",
"FailedLoginAttemptWithUserName": "{0} - \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430",
"UserDownloadingItemWithValues": "{0} \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 {1}",
"UserStartedPlayingItemWithValues": "{0} - \u0432\u043e\u0441\u043f\u0440-\u0438\u0435 \u00ab{1}\u00bb \u0437\u0430\u043f-\u043d\u043e",
"UserStoppedPlayingItemWithValues": "{0} - \u0432\u043e\u0441\u043f\u0440-\u0438\u0435 \u00ab{1}\u00bb \u043e\u0441\u0442-\u043d\u043e",
"AppDeviceValues": "\u041f\u0440\u0438\u043b.: {0}, \u0423\u0441\u0442\u0440.: {1}",
@ -1185,7 +1186,7 @@
"HeaderStudios": "\u0421\u0442\u0443\u0434\u0438\u0438",
"HeaderTags": "\u0422\u0435\u0433\u0438",
"HeaderMetadataSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445",
"LabelLockItemToPreventChanges": "\u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0431\u0443\u0434\u0443\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f",
"LabelLockItemToPreventChanges": "\u0417\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0431\u0443\u0434\u0443\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f",
"MessageLeaveEmptyToInherit": "\u041e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043e\u043b\u0435 \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.",
"TabDonate": "\u041f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f",
"HeaderDonationType": "\u0422\u0438\u043f \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f:",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server har uppdaterats",
"AuthenticationSucceededWithUserName": "{0} har autentiserats",
"FailedLoginAttemptWithUserName": "Misslyckat inloggningsf\u00f6rs\u00f6k fr\u00e5n {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} har p\u00e5b\u00f6rjat uppspelning av {1}",
"UserStoppedPlayingItemWithValues": "{0} har avslutat uppspelning av {1}",
"AppDeviceValues": "App: {0}, enhet: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser\u670d\u52a1\u5668\u5df2\u66f4\u65b0",
"AuthenticationSucceededWithUserName": "{0} \u6210\u529f\u88ab\u6388\u6743",
"FailedLoginAttemptWithUserName": "\u5931\u8d25\u7684\u767b\u5f55\u5c1d\u8bd5\uff0c\u6765\u81ea {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} \u5f00\u59cb\u64ad\u653e {1}",
"UserStoppedPlayingItemWithValues": "{0} \u505c\u6b62\u64ad\u653e {1}",
"AppDeviceValues": "App\uff1a {0}\uff0c\u8bbe\u5907\uff1a {1}",

@ -1101,6 +1101,7 @@
"MessageApplicationUpdated": "Media Browser Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",

@ -82,7 +82,7 @@ namespace MediaBrowser.Server.Implementations.Sync
IProgress<double> progress,
CancellationToken cancellationToken)
{
var jobItems = _syncManager.GetReadySyncItems(target.Id);
var jobItems = await _syncManager.GetReadySyncItems(target.Id).ConfigureAwait(false);
var numComplete = 0;
double startingPercent = 0;

@ -336,11 +336,12 @@ namespace MediaBrowser.Server.Implementations.Sync
return new[] { item };
}
public async Task EnsureSyncJobItems(CancellationToken cancellationToken)
private async Task EnsureSyncJobItems(string targetId, CancellationToken cancellationToken)
{
var jobResult = _syncRepo.GetJobs(new SyncJobQuery
{
SyncNewContent = true
SyncNewContent = true,
TargetId = targetId
});
foreach (var job in jobResult.Items)
@ -356,7 +357,7 @@ namespace MediaBrowser.Server.Implementations.Sync
public async Task Sync(IProgress<double> progress, CancellationToken cancellationToken)
{
await EnsureSyncJobItems(cancellationToken).ConfigureAwait(false);
await EnsureSyncJobItems(null, cancellationToken).ConfigureAwait(false);
// If it already has a converting status then is must have been aborted during conversion
var result = _syncRepo.GetJobItems(new SyncJobItemQuery
@ -375,6 +376,21 @@ namespace MediaBrowser.Server.Implementations.Sync
// Clean files in sync temp folder that are not linked to any sync jobs
}
public async Task SyncJobItems(string targetId, bool enableConversion, IProgress<double> progress,
CancellationToken cancellationToken)
{
await EnsureSyncJobItems(targetId, cancellationToken).ConfigureAwait(false);
// If it already has a converting status then is must have been aborted during conversion
var result = _syncRepo.GetJobItems(new SyncJobItemQuery
{
Statuses = new List<SyncJobItemStatus> { SyncJobItemStatus.Queued, SyncJobItemStatus.Converting },
TargetId = targetId
});
await SyncJobItems(result.Items, true, progress, cancellationToken).ConfigureAwait(false);
}
public async Task SyncJobItems(SyncJobItem[] items, bool enableConversion, IProgress<double> progress, CancellationToken cancellationToken)
{
if (items.Length > 0)
@ -483,7 +499,7 @@ namespace MediaBrowser.Server.Implementations.Sync
// No sense creating external subs if we're already burning one into the video
var externalSubs = streamInfo.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode ?
new List<SubtitleStreamInfo>() :
streamInfo.GetExternalSubtitles("dummy", false);
streamInfo.GetExternalSubtitles(false);
// Mark as requiring conversion if transcoding the video, or if any subtitles need to be extracted
var requiresVideoTranscoding = streamInfo.PlayMethod == PlayMethod.Transcode && job.Quality != SyncQuality.Original;

@ -47,6 +47,7 @@ namespace MediaBrowser.Server.Implementations.Sync
private readonly IFileSystem _fileSystem;
private readonly Func<ISubtitleEncoder> _subtitleEncoder;
private readonly IConfigurationManager _config;
private IUserDataManager _userDataManager;
private ISyncProvider[] _providers = { };
@ -56,7 +57,7 @@ namespace MediaBrowser.Server.Implementations.Sync
public event EventHandler<GenericEventArgs<SyncJobItem>> SyncJobItemUpdated;
public event EventHandler<GenericEventArgs<SyncJobItem>> SyncJobItemCreated;
public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, Func<IDtoService> dtoService, IApplicationHost appHost, ITVSeriesManager tvSeriesManager, Func<IMediaEncoder> mediaEncoder, IFileSystem fileSystem, Func<ISubtitleEncoder> subtitleEncoder, IConfigurationManager config)
public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, Func<IDtoService> dtoService, IApplicationHost appHost, ITVSeriesManager tvSeriesManager, Func<IMediaEncoder> mediaEncoder, IFileSystem fileSystem, Func<ISubtitleEncoder> subtitleEncoder, IConfigurationManager config, IUserDataManager userDataManager)
{
_libraryManager = libraryManager;
_repo = repo;
@ -70,6 +71,7 @@ namespace MediaBrowser.Server.Implementations.Sync
_fileSystem = fileSystem;
_subtitleEncoder = subtitleEncoder;
_config = config;
_userDataManager = userDataManager;
}
public void AddParts(IEnumerable<ISyncProvider> providers)
@ -133,10 +135,17 @@ namespace MediaBrowser.Server.Implementations.Sync
ParentId = request.ParentId
};
// It's just a static list
if (!items.Any(i => i.IsFolder || i is IItemByName))
if (!request.Category.HasValue && request.ItemIds != null)
{
job.SyncNewContent = false;
var requestedItems = request.ItemIds
.Select(_libraryManager.GetItemById)
.Where(i => i != null);
// It's just a static list
if (!requestedItems.Any(i => i.IsFolder || i is IItemByName))
{
job.SyncNewContent = false;
}
}
await _repo.Create(job).ConfigureAwait(false);
@ -666,11 +675,32 @@ namespace MediaBrowser.Server.Implementations.Sync
public Task ReportOfflineAction(UserAction action)
{
return Task.FromResult(true);
switch (action.Type)
{
case UserActionType.PlayedItem:
return ReportOfflinePlayedItem(action);
default:
throw new ArgumentException("Unexpected action type");
}
}
public List<SyncedItem> GetReadySyncItems(string targetId)
private Task ReportOfflinePlayedItem(UserAction action)
{
var item = _libraryManager.GetItemById(action.ItemId);
var userData = _userDataManager.GetUserData(new Guid(action.UserId), item.GetUserDataKey());
userData.LastPlayedDate = action.Date;
_userDataManager.UpdatePlayState(item, userData, action.PositionTicks);
return _userDataManager.SaveUserData(new Guid(action.UserId), item, userData, UserDataSaveReason.Import, CancellationToken.None);
}
public async Task<List<SyncedItem>> GetReadySyncItems(string targetId)
{
var processor = GetSyncJobProcessor();
await processor.SyncJobItems(targetId, false, new Progress<double>(), CancellationToken.None).ConfigureAwait(false);
var jobItemResult = GetJobItems(new SyncJobItemQuery
{
TargetId = targetId,

@ -445,7 +445,7 @@ namespace MediaBrowser.Server.Startup.Common
TVSeriesManager = new TVSeriesManager(UserManager, UserDataManager, LibraryManager);
RegisterSingleInstance(TVSeriesManager);
SyncManager = new SyncManager(LibraryManager, SyncRepository, ImageProcessor, LogManager.GetLogger("SyncManager"), UserManager, () => DtoService, this, TVSeriesManager, () => MediaEncoder, FileSystemManager, () => SubtitleEncoder, ServerConfigurationManager);
SyncManager = new SyncManager(LibraryManager, SyncRepository, ImageProcessor, LogManager.GetLogger("SyncManager"), UserManager, () => DtoService, this, TVSeriesManager, () => MediaEncoder, FileSystemManager, () => SubtitleEncoder, ServerConfigurationManager, UserDataManager);
RegisterSingleInstance(SyncManager);
DtoService = new DtoService(Logger, LibraryManager, UserDataManager, ItemRepository, ImageProcessor, ServerConfigurationManager, FileSystemManager, ProviderManager, () => ChannelManager, SyncManager, this, () => DeviceManager);

@ -33,16 +33,7 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
case OperatingSystem.Linux:
info.ArchiveType = "7z";
switch (environment.SystemArchitecture)
{
case Architecture.X86_X64:
info.Version = "20150124";
break;
case Architecture.X86:
info.Version = "20150124";
break;
}
info.Version = "20150124";
break;
case OperatingSystem.Osx:

@ -193,6 +193,8 @@ namespace MediaBrowser.WebDashboard.Api
sb.Append("<link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"css/images/touchicon114.png\" />");
sb.Append("<link rel=\"apple-touch-startup-image\" href=\"css/images/iossplash.png\" />");
sb.Append("<link rel=\"shortcut icon\" href=\"css/images/favicon.ico\" />");
sb.Append("<meta name=\"msapplication-TileImage\" content=\"css/images/touchicon144.png\">");
sb.Append("<meta name=\"msapplication-TileColor\" content=\"#23456B\">");
return sb.ToString();
}
@ -285,8 +287,12 @@ namespace MediaBrowser.WebDashboard.Api
"thirdparty/apiclient/network.js",
"thirdparty/apiclient/device.js",
"thirdparty/apiclient/credentials.js",
"thirdparty/apiclient/ajax.js",
"thirdparty/apiclient/events.js",
"thirdparty/apiclient/deferred.js",
"thirdparty/apiclient/mediabrowser.apiclient.js",
"thirdparty/apiclient/connectservice.js",
"thirdparty/apiclient/serverdiscovery.js",
"thirdparty/apiclient/connectionmanager.js"
})
{

@ -93,6 +93,9 @@
<Content Include="dashboard-ui\css\images\splash.jpg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\css\images\touchicon144.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\css\images\tour\dashboard\help.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@ -156,12 +159,24 @@
<Content Include="dashboard-ui\syncsettings.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\apiclient\ajax.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\apiclient\connectservice.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\apiclient\deferred.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\apiclient\deferredAlt.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\apiclient\device.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\apiclient\events.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\apiclient\logger.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@ -921,6 +936,9 @@
<Content Include="dashboard-ui\thirdparty\apiclient\network.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\apiclient\serverdiscovery.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\apiclient\sha1.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

@ -350,6 +350,19 @@ namespace MediaBrowser.XbmcMetadata.Parsers
break;
}
case "countrycode":
{
var val = reader.ReadElementContentAsString();
var hasLanguage = item as IHasPreferredMetadataLanguage;
if (hasLanguage != null)
{
hasLanguage.PreferredMetadataCountryCode = val;
}
break;
}
case "website":
{
var val = reader.ReadElementContentAsString();

@ -589,6 +589,10 @@ namespace MediaBrowser.XbmcMetadata.Savers
{
writer.WriteElementString("language", hasLanguage.PreferredMetadataLanguage);
}
if (!string.IsNullOrEmpty(hasLanguage.PreferredMetadataCountryCode))
{
writer.WriteElementString("countrycode", hasLanguage.PreferredMetadataCountryCode);
}
}
if (item.PremiereDate.HasValue && !(item is Episode))

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

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

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

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

@ -1,4 +1,4 @@
using System.Reflection;
//[assembly: AssemblyVersion("3.0.*")]
[assembly: AssemblyVersion("3.0.5518.4")]
[assembly: AssemblyVersion("3.0.5518.5")]

Loading…
Cancel
Save