display trailers within suggestions

This commit is contained in:
Luke Pulverenti 2014-09-30 00:47:30 -04:00
parent 1fcfff41c7
commit 4aa959c1e2
35 changed files with 719 additions and 400 deletions

View file

@ -138,6 +138,8 @@ namespace MediaBrowser.Api.Images
/// </summary>
[Route("/Users/{Id}/Images/{Type}", "GET")]
[Route("/Users/{Id}/Images/{Type}/{Index}", "GET")]
[Route("/Users/{Id}/Images/{Type}", "HEAD")]
[Route("/Users/{Id}/Images/{Type}/{Index}", "HEAD")]
[Api(Description = "Gets a user image")]
public class GetUserImage : ImageRequest
{
@ -410,6 +412,13 @@ namespace MediaBrowser.Api.Images
return GetImage(request, item, false);
}
public object Head(GetUserImage request)
{
var item = _userManager.GetUserById(request.Id);
return GetImage(request, item, true);
}
public object Get(GetItemByNameImage request)
{
var pathInfo = PathInfo.Parse(Request.PathInfo);

View file

@ -421,7 +421,6 @@ namespace MediaBrowser.Api.Library
MovieCount = movies.Count,
SeriesCount = series.Count,
SongCount = songs.Count,
TrailerCount = filteredItems.OfType<Trailer>().Count(),
MusicVideoCount = musicVideos.Count,
AdultVideoCount = adultVideos.Count,
BoxSetCount = boxsets.Count,

View file

@ -1,17 +1,22 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
using MoreLinq;
using ServiceStack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Api.Movies
{
@ -21,13 +26,6 @@ namespace MediaBrowser.Api.Movies
[Route("/Movies/{Id}/Similar", "GET", Summary = "Finds movies and trailers similar to a given movie.")]
public class GetSimilarMovies : BaseGetSimilarItemsFromItem
{
[ApiMember(Name = "IncludeTrailers", Description = "Whether or not to include trailers within the results. Defaults to true.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool IncludeTrailers { get; set; }
public GetSimilarMovies()
{
IncludeTrailers = true;
}
}
[Route("/Movies/Recommendations", "GET", Summary = "Gets movie recommendations")]
@ -52,7 +50,7 @@ namespace MediaBrowser.Api.Movies
/// <value>The parent id.</value>
[ApiMember(Name = "ParentId", Description = "Specify this to localize the search to a specific item or folder. Omit to use the root", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string ParentId { get; set; }
public GetMovieRecommendations()
{
CategoryLimit = 5;
@ -85,19 +83,22 @@ namespace MediaBrowser.Api.Movies
private readonly IItemRepository _itemRepo;
private readonly IDtoService _dtoService;
private readonly IChannelManager _channelManager;
/// <summary>
/// Initializes a new instance of the <see cref="MoviesService"/> class.
/// </summary>
/// <param name="userManager">The user manager.</param>
/// <param name="userDataRepository">The user data repository.</param>
/// <param name="libraryManager">The library manager.</param>
public MoviesService(IUserManager userManager, IUserDataManager userDataRepository, ILibraryManager libraryManager, IItemRepository itemRepo, IDtoService dtoService)
public MoviesService(IUserManager userManager, IUserDataManager userDataRepository, ILibraryManager libraryManager, IItemRepository itemRepo, IDtoService dtoService, IChannelManager channelManager)
{
_userManager = userManager;
_userDataRepository = userDataRepository;
_libraryManager = libraryManager;
_itemRepo = itemRepo;
_dtoService = dtoService;
_channelManager = channelManager;
}
/// <summary>
@ -105,38 +106,111 @@ namespace MediaBrowser.Api.Movies
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get(GetSimilarMovies request)
public async Task<object> Get(GetSimilarMovies request)
{
var result = SimilarItemsHelper.GetSimilarItemsResult(_userManager,
_itemRepo,
_libraryManager,
_userDataRepository,
_dtoService,
Logger,
var result = await GetSimilarItemsResult(
// Strip out secondary versions
request, item => (item is Movie || (item is Trailer && request.IncludeTrailers)) && !((Video)item).PrimaryVersionId.HasValue,
request, item => (item is Movie) && !((Video)item).PrimaryVersionId.HasValue,
SimilarItemsHelper.GetSimiliarityScore);
SimilarItemsHelper.GetSimiliarityScore).ConfigureAwait(false);
return ToOptimizedSerializedResultUsingCache(result);
}
public object Get(GetMovieRecommendations request)
public async Task<object> Get(GetMovieRecommendations request)
{
var user = _userManager.GetUserById(request.UserId.Value);
var movies = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId)
.OfType<Movie>();
.Where(i => i is Movie);
movies = _libraryManager.ReplaceVideosWithPrimaryVersions(movies).Cast<Movie>();
movies = _libraryManager.ReplaceVideosWithPrimaryVersions(movies);
var result = GetRecommendationCategories(user, movies.ToList(), request.CategoryLimit, request.ItemLimit, request.GetItemFields().ToList());
var list = movies.ToList();
if (user.Configuration.IncludeTrailersInSuggestions)
{
var trailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery
{
ContentTypes = new[] { ChannelMediaContentType.MovieExtra },
ExtraTypes = new[] { ExtraType.Trailer },
UserId = user.Id.ToString("N")
}, CancellationToken.None).ConfigureAwait(false);
var newTrailers = trailerResult.Items;
list.AddRange(newTrailers);
list = list
.DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase)
.DistinctBy(i => i.GetProviderId(MetadataProviders.Imdb) ?? Guid.NewGuid().ToString(), StringComparer.OrdinalIgnoreCase)
.ToList();
}
var result = GetRecommendationCategories(user, list, request.CategoryLimit, request.ItemLimit, request.GetItemFields().ToList());
return ToOptimizedResult(result);
}
private IEnumerable<RecommendationDto> GetRecommendationCategories(User user, List<Movie> allMovies, int categoryLimit, int itemLimit, List<ItemFields> fields)
private async Task<ItemsResult> GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, BaseItem, int> getSimilarityScore)
{
var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
var item = string.IsNullOrEmpty(request.Id) ?
(request.UserId.HasValue ? user.RootFolder :
_libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id);
var fields = request.GetItemFields().ToList();
var inputItems = user == null
? _libraryManager.RootFolder.GetRecursiveChildren().Where(i => i.Id != item.Id)
: user.RootFolder.GetRecursiveChildren(user).Where(i => i.Id != item.Id);
inputItems = inputItems.Where(includeInSearch);
var list = inputItems.ToList();
if (item is Movie && user != null && user.Configuration.IncludeTrailersInSuggestions)
{
var trailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery
{
ContentTypes = new[] { ChannelMediaContentType.MovieExtra },
ExtraTypes = new[] { ExtraType.Trailer },
UserId = user.Id.ToString("N")
}, CancellationToken.None).ConfigureAwait(false);
var newTrailers = trailerResult.Items;
list.AddRange(newTrailers);
list = list
.DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase)
.DistinctBy(i => i.GetProviderId(MetadataProviders.Imdb) ?? Guid.NewGuid().ToString(), StringComparer.OrdinalIgnoreCase)
.ToList();
}
var items = SimilarItemsHelper.GetSimilaritems(item, list, getSimilarityScore).ToList();
IEnumerable<BaseItem> returnItems = items;
if (request.Limit.HasValue)
{
returnItems = returnItems.Take(request.Limit.Value);
}
var result = new ItemsResult
{
Items = returnItems.Select(i => _dtoService.GetBaseItemDto(i, fields, user)).ToArray(),
TotalRecordCount = items.Count
};
return result;
}
private IEnumerable<RecommendationDto> GetRecommendationCategories(User user, List<BaseItem> allMovies, int categoryLimit, int itemLimit, List<ItemFields> fields)
{
var categories = new List<RecommendationDto>();
@ -144,7 +218,7 @@ namespace MediaBrowser.Api.Movies
.Select(i =>
{
var userdata = _userDataRepository.GetUserData(user.Id, i.GetUserDataKey());
return new Tuple<Movie, bool, DateTime>(i, userdata.Played, userdata.LastPlayedDate ?? DateTime.MinValue);
return new Tuple<BaseItem, bool, DateTime>(i, userdata.Played, userdata.LastPlayedDate ?? DateTime.MinValue);
})
.Where(i => i.Item2)
.OrderByDescending(i => i.Item3)
@ -167,7 +241,7 @@ namespace MediaBrowser.Api.Movies
score = userData.Likes.HasValue ? userData.Likes.Value ? 1 : -1 : 0;
}
return new Tuple<Movie, int>(i, score);
return new Tuple<BaseItem, int>(i, score);
})
.OrderByDescending(i => i.Item2)
.ThenBy(i => Guid.NewGuid())
@ -233,7 +307,7 @@ namespace MediaBrowser.Api.Movies
return categories.OrderBy(i => i.RecommendationType).ThenBy(i => Guid.NewGuid());
}
private IEnumerable<RecommendationDto> GetWithDirector(User user, List<Movie> allMovies, IEnumerable<string> directors, int itemLimit, List<ItemFields> fields, RecommendationType type)
private IEnumerable<RecommendationDto> GetWithDirector(User user, List<BaseItem> allMovies, IEnumerable<string> directors, int itemLimit, List<ItemFields> fields, RecommendationType type)
{
var userId = user.Id;
@ -257,7 +331,7 @@ namespace MediaBrowser.Api.Movies
}
}
private IEnumerable<RecommendationDto> GetWithActor(User user, List<Movie> allMovies, IEnumerable<string> names, int itemLimit, List<ItemFields> fields, RecommendationType type)
private IEnumerable<RecommendationDto> GetWithActor(User user, List<BaseItem> allMovies, IEnumerable<string> names, int itemLimit, List<ItemFields> fields, RecommendationType type)
{
var userId = user.Id;
@ -281,7 +355,7 @@ namespace MediaBrowser.Api.Movies
}
}
private IEnumerable<RecommendationDto> GetSimilarTo(User user, List<Movie> allMovies, IEnumerable<Movie> baselineItems, int itemLimit, List<ItemFields> fields, RecommendationType type)
private IEnumerable<RecommendationDto> GetSimilarTo(User user, List<BaseItem> allMovies, IEnumerable<BaseItem> baselineItems, int itemLimit, List<ItemFields> fields, RecommendationType type)
{
var userId = user.Id;

View file

@ -36,7 +36,7 @@ namespace MediaBrowser.Controller.Channels
SortBy = query.SortBy,
SortOrder = query.SortOrder
}, CancellationToken.None);
}, new Progress<double>(), CancellationToken.None);
}
catch
{

View file

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Entities;
using System;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Querying;
@ -58,7 +59,7 @@ namespace MediaBrowser.Controller.Channels
SortBy = query.SortBy,
SortOrder = query.SortOrder
}, CancellationToken.None);
}, new Progress<double>(), CancellationToken.None);
}
catch
{

View file

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Entities;
using System;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Querying;
@ -82,6 +83,14 @@ namespace MediaBrowser.Controller.Channels
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{QueryResult{BaseItemDto}}.</returns>
Task<QueryResult<BaseItemDto>> GetLatestChannelItems(AllChannelMediaQuery query, CancellationToken cancellationToken);
/// <summary>
/// Gets the latest channel items internal.
/// </summary>
/// <param name="query">The query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task&lt;QueryResult&lt;BaseItem&gt;&gt;.</returns>
Task<QueryResult<BaseItem>> GetLatestChannelItemsInternal(AllChannelMediaQuery query, CancellationToken cancellationToken);
/// <summary>
/// Gets the channel items.
@ -95,9 +104,10 @@ namespace MediaBrowser.Controller.Channels
/// Gets the channel items internal.
/// </summary>
/// <param name="query">The query.</param>
/// <param name="progress">The progress.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task&lt;QueryResult&lt;BaseItem&gt;&gt;.</returns>
Task<QueryResult<BaseItem>> GetChannelItemsInternal(ChannelItemQuery query, CancellationToken cancellationToken);
Task<QueryResult<BaseItem>> GetChannelItemsInternal(ChannelItemQuery query, IProgress<double> progress, CancellationToken cancellationToken);
/// <summary>
/// Gets the cached channel item media sources.
@ -129,5 +139,15 @@ namespace MediaBrowser.Controller.Channels
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>BaseItemDto.</returns>
Task<BaseItemDto> GetChannelFolder(string userId, CancellationToken cancellationToken);
/// <summary>
/// Downloads the channel item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="destinationPath">The destination path.</param>
/// <param name="progress">The progress.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
Task DownloadChannelItem(IChannelMediaItem item, string destinationPath, IProgress<double> progress, CancellationToken cancellationToken);
}
}

View file

@ -1,4 +1,5 @@
using MediaBrowser.Model.Channels;
using System;
using MediaBrowser.Model.Channels;
using System.Collections.Generic;
namespace MediaBrowser.Controller.Channels
@ -38,6 +39,12 @@ namespace MediaBrowser.Controller.Channels
/// <value>The automatic refresh levels.</value>
public int? AutoRefreshLevels { get; set; }
/// <summary>
/// Gets or sets the daily download limit.
/// </summary>
/// <value>The daily download limit.</value>
public int? DailyDownloadLimit { get; set; }
public InternalChannelFeatures()
{
MediaTypes = new List<ChannelMediaType>();
@ -46,4 +53,13 @@ namespace MediaBrowser.Controller.Channels
DefaultSortFields = new List<ChannelItemSortField>();
}
}
public class ChannelDownloadException : Exception
{
public ChannelDownloadException(string message)
: base(message)
{
}
}
}

View file

@ -218,7 +218,7 @@ namespace MediaBrowser.Controller.Entities
{
if (query.Recursive)
{
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music }), query);
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }), query);
}
var list = new List<BaseItem>();
@ -251,7 +251,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetMusicAlbumArtists(Folder parent, User user, UserItemsQuery query)
{
var artists = GetRecursiveChildren(parent, user, new[] { CollectionType.Music })
var artists = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos })
.Where(i => !i.IsFolder)
.OfType<IHasAlbumArtist>()
.SelectMany(i => i.AlbumArtists)
@ -275,7 +275,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetMusicArtists(Folder parent, User user, UserItemsQuery query)
{
var artists = GetRecursiveChildren(parent, user, new[] { CollectionType.Music })
var artists = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos })
.Where(i => !i.IsFolder)
.OfType<IHasArtist>()
.SelectMany(i => i.Artists)
@ -299,7 +299,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetFavoriteArtists(Folder parent, User user, UserItemsQuery query)
{
var artists = GetRecursiveChildren(parent, user, new[] { CollectionType.Music })
var artists = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos })
.Where(i => !i.IsFolder)
.OfType<IHasAlbumArtist>()
.SelectMany(i => i.AlbumArtists)
@ -323,12 +323,12 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetMusicAlbums(Folder parent, User user, UserItemsQuery query)
{
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music }).Where(i => i is MusicAlbum), query);
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }).Where(i => i is MusicAlbum), query);
}
private QueryResult<BaseItem> GetMusicSongs(Folder parent, User user, UserItemsQuery query)
{
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music }).Where(i => i is Audio.Audio), query);
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }).Where(i => i is Audio.Audio), query);
}
private QueryResult<BaseItem> GetMusicLatest(Folder parent, User user, UserItemsQuery query)
@ -336,7 +336,7 @@ namespace MediaBrowser.Controller.Entities
query.SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName };
query.SortOrder = SortOrder.Descending;
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music }).Where(i => i is MusicVideo || i is Audio.Audio), GetSpecialItemsLimit(), query);
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }).Where(i => i is MusicVideo || i is Audio.Audio), GetSpecialItemsLimit(), query);
}
private async Task<QueryResult<BaseItem>> GetMovieFolders(Folder parent, User user, UserItemsQuery query)

View file

@ -11,6 +11,8 @@ namespace MediaBrowser.Model.Configuration
public bool EnableCustomIntro { get; set; }
public bool EnableIntrosParentalControl { get; set; }
public string CustomIntroPath { get; set; }
public bool EnableIntrosFromUpcomingDvdMovies { get; set; }
public bool EnableIntrosFromUpcomingStreamingMovies { get; set; }
public CinemaModeConfiguration()
{
@ -18,6 +20,8 @@ namespace MediaBrowser.Model.Configuration
EnableIntrosFromMoviesInLibrary = true;
EnableIntrosFromUpcomingTrailers = true;
EnableIntrosParentalControl = true;
EnableIntrosFromUpcomingDvdMovies = true;
EnableIntrosFromUpcomingStreamingMovies = true;
}
}
}

View file

@ -82,6 +82,7 @@ namespace MediaBrowser.Model.Configuration
public bool SyncConnectName { get; set; }
public bool SyncConnectImage { get; set; }
public bool IncludeTrailersInSuggestions { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="UserConfiguration" /> class.
@ -106,6 +107,7 @@ namespace MediaBrowser.Model.Configuration
SyncConnectName = true;
SyncConnectImage = true;
IncludeTrailersInSuggestions = true;
}
}
}

View file

@ -1,11 +1,11 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Progress;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Common.Security;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Configuration;
@ -107,7 +107,7 @@ namespace MediaBrowser.Server.Implementations.Channels
CancellationToken cancellationToken,
IProgress<double> progress)
{
var result = await _manager.GetLatestChannelItems(new AllChannelMediaQuery
var result = await _manager.GetLatestChannelItemsInternal(new AllChannelMediaQuery
{
UserId = userId
@ -127,7 +127,7 @@ namespace MediaBrowser.Server.Implementations.Channels
CancellationToken cancellationToken,
IProgress<double> progress)
{
var result = await _manager.GetAllMedia(new AllChannelMediaQuery
var result = await _manager.GetAllMediaInternal(new AllChannelMediaQuery
{
UserId = userId
@ -143,7 +143,7 @@ namespace MediaBrowser.Server.Implementations.Channels
await DownloadChannelContent(result, path, cancellationToken, innerProgress).ConfigureAwait(false);
}
private async Task DownloadChannelContent(QueryResult<BaseItemDto> result,
private async Task DownloadChannelContent(QueryResult<BaseItem> result,
string path,
CancellationToken cancellationToken,
IProgress<double> progress)
@ -154,7 +154,8 @@ namespace MediaBrowser.Server.Implementations.Channels
foreach (var item in result.Items)
{
if (options.DownloadingChannels.Contains(item.ChannelId))
var channelItem = (IChannelItem)item;
if (options.DownloadingChannels.Contains(channelItem.ChannelId))
{
try
{
@ -164,6 +165,10 @@ namespace MediaBrowser.Server.Implementations.Channels
{
break;
}
catch (ChannelDownloadException)
{
// Logged at lower levels
}
catch (Exception ex)
{
_logger.ErrorException("Error downloading channel content for {0}", ex, item.Name);
@ -191,7 +196,7 @@ namespace MediaBrowser.Server.Implementations.Channels
return channelOptions.DownloadSizeLimit;
}
private async Task DownloadChannelItem(BaseItemDto item,
private async Task DownloadChannelItem(BaseItem item,
ChannelOptions channelOptions,
CancellationToken cancellationToken,
string path)
@ -206,7 +211,8 @@ namespace MediaBrowser.Server.Implementations.Channels
}
}
var sources = await _manager.GetChannelItemMediaSources(item.Id, cancellationToken)
var itemId = item.Id.ToString("N");
var sources = await _manager.GetChannelItemMediaSources(itemId, cancellationToken)
.ConfigureAwait(false);
var list = sources.ToList();
@ -226,58 +232,34 @@ namespace MediaBrowser.Server.Implementations.Channels
return;
}
var options = new HttpRequestOptions
{
CancellationToken = cancellationToken,
Url = source.Path,
Progress = new Progress<double>()
};
var channelItem = (IChannelMediaItem)item;
foreach (var header in source.RequiredHttpHeaders)
{
options.RequestHeaders[header.Key] = header.Value;
}
var destination = Path.Combine(path, channelItem.ChannelId, itemId);
var destination = Path.Combine(path, item.ChannelId, item.Id);
Directory.CreateDirectory(Path.GetDirectoryName(destination));
// Determine output extension
var response = await _httpClient.GetTempFileResponse(options).ConfigureAwait(false);
if (item.IsVideo && response.ContentType.StartsWith("video/", StringComparison.OrdinalIgnoreCase))
{
var extension = response.ContentType.Split('/')
.Last()
.Replace("quicktime", "mov", StringComparison.OrdinalIgnoreCase);
destination += "." + extension;
}
else if (item.IsAudio && response.ContentType.StartsWith("audio/", StringComparison.OrdinalIgnoreCase))
{
var extension = response.ContentType.Replace("audio/mpeg", "audio/mp3", StringComparison.OrdinalIgnoreCase)
.Split('/')
.Last();
destination += "." + extension;
}
else
{
File.Delete(response.TempFilePath);
throw new ApplicationException("Unexpected response type encountered: " + response.ContentType);
}
File.Copy(response.TempFilePath, destination, true);
await _manager.DownloadChannelItem(channelItem, destination, new Progress<double>(), cancellationToken)
.ConfigureAwait(false);
await RefreshMediaSourceItem(destination, cancellationToken).ConfigureAwait(false);
}
try
private async Task RefreshMediaSourceItems(IEnumerable<MediaSourceInfo> items, CancellationToken cancellationToken)
{
foreach (var item in items)
{
File.Delete(response.TempFilePath);
await RefreshMediaSourceItem(item.Path, cancellationToken).ConfigureAwait(false);
}
catch
}
private async Task RefreshMediaSourceItem(string path, CancellationToken cancellationToken)
{
var item = _libraryManager.ResolvePath(new FileInfo(path));
if (item != null)
{
// Get the version from the database
item = _libraryManager.GetItemById(item.Id) ?? item;
await item.RefreshMetadata(cancellationToken).ConfigureAwait(false);
}
}
@ -307,27 +289,6 @@ namespace MediaBrowser.Server.Implementations.Channels
}
}
private async Task RefreshMediaSourceItems(IEnumerable<MediaSourceInfo> items, CancellationToken cancellationToken)
{
foreach (var item in items)
{
await RefreshMediaSourceItem(item.Path, cancellationToken).ConfigureAwait(false);
}
}
private async Task RefreshMediaSourceItem(string path, CancellationToken cancellationToken)
{
var item = _libraryManager.ResolvePath(new FileInfo(path));
if (item != null)
{
// Get the version from the database
item = _libraryManager.GetItemById(item.Id) ?? item;
await item.RefreshMetadata(cancellationToken).ConfigureAwait(false);
}
}
public IEnumerable<ITaskTrigger> GetDefaultTriggers()
{
return new ITaskTrigger[]

View file

@ -1,5 +1,8 @@
using MediaBrowser.Common.Extensions;
using System.Net;
using System.Text;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Dto;
@ -12,6 +15,8 @@ using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Net;
using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Serialization;
using System;
@ -37,13 +42,17 @@ namespace MediaBrowser.Server.Implementations.Channels
private readonly IServerConfigurationManager _config;
private readonly IFileSystem _fileSystem;
private readonly IJsonSerializer _jsonSerializer;
private readonly IHttpClient _httpClient;
private readonly ILocalizationManager _localization;
private readonly ConcurrentDictionary<Guid, bool> _refreshedItems = new ConcurrentDictionary<Guid, bool>();
private Timer _refreshTimer;
private readonly ConcurrentDictionary<string, int> _downloadCounts = new ConcurrentDictionary<string, int>();
public ChannelManager(IUserManager userManager, IDtoService dtoService, ILibraryManager libraryManager, ILogger logger, IServerConfigurationManager config, IFileSystem fileSystem, IUserDataManager userDataManager, IJsonSerializer jsonSerializer, ILocalizationManager localization)
private Timer _refreshTimer;
private Timer _clearDownloadCountsTimer;
public ChannelManager(IUserManager userManager, IDtoService dtoService, ILibraryManager libraryManager, ILogger logger, IServerConfigurationManager config, IFileSystem fileSystem, IUserDataManager userDataManager, IJsonSerializer jsonSerializer, ILocalizationManager localization, IHttpClient httpClient)
{
_userManager = userManager;
_dtoService = dtoService;
@ -54,8 +63,10 @@ namespace MediaBrowser.Server.Implementations.Channels
_userDataManager = userDataManager;
_jsonSerializer = jsonSerializer;
_localization = localization;
_httpClient = httpClient;
_refreshTimer = new Timer(s => _refreshedItems.Clear(), null, TimeSpan.FromHours(3), TimeSpan.FromHours(3));
_clearDownloadCountsTimer = new Timer(s => _downloadCounts.Clear(), null, TimeSpan.FromHours(24), TimeSpan.FromHours(24));
}
private TimeSpan CacheLength
@ -261,7 +272,7 @@ namespace MediaBrowser.Server.Implementations.Channels
sources.InsertRange(0, cachedVersions);
return sources;
return sources.Where(IsValidMediaSource);
}
private readonly ConcurrentDictionary<string, Tuple<DateTime, List<ChannelMediaInfo>>> _channelItemMediaInfo =
@ -522,7 +533,6 @@ namespace MediaBrowser.Server.Implementations.Channels
public ChannelFeatures GetChannelFeatures(string id)
{
var channel = GetChannel(id);
var channelProvider = GetChannelProvider(channel);
return GetChannelFeaturesDto(channel, channelProvider, channelProvider.GetChannelFeatures());
@ -563,6 +573,31 @@ namespace MediaBrowser.Server.Implementations.Channels
}
public async Task<QueryResult<BaseItemDto>> GetLatestChannelItems(AllChannelMediaQuery query, CancellationToken cancellationToken)
{
var user = string.IsNullOrWhiteSpace(query.UserId)
? null
: _userManager.GetUserById(query.UserId);
var internalResult = await GetLatestChannelItemsInternal(query, cancellationToken).ConfigureAwait(false);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields))
.Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
.ToList();
var returnItems = internalResult.Items.Select(i => _dtoService.GetBaseItemDto(i, fields, user))
.ToArray();
var result = new QueryResult<BaseItemDto>
{
Items = returnItems,
TotalRecordCount = internalResult.TotalRecordCount
};
return result;
}
public async Task<QueryResult<BaseItem>> GetLatestChannelItemsInternal(AllChannelMediaQuery query, CancellationToken cancellationToken)
{
var user = string.IsNullOrWhiteSpace(query.UserId)
? null
@ -648,7 +683,7 @@ namespace MediaBrowser.Server.Implementations.Channels
var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false);
internalItems = ApplyFilters(internalItems, query.Filters, user).ToArray();
await RefreshIfNeeded(internalItems, cancellationToken).ConfigureAwait(false);
await RefreshIfNeeded(internalItems, new Progress<double>(), cancellationToken).ConfigureAwait(false);
if (query.StartIndex.HasValue)
{
@ -659,10 +694,9 @@ namespace MediaBrowser.Server.Implementations.Channels
internalItems = internalItems.Take(query.Limit.Value).ToArray();
}
var returnItemArray = internalItems.Select(i => _dtoService.GetBaseItemDto(i, query.Fields, user))
.ToArray();
var returnItemArray = internalItems.ToArray();
return new QueryResult<BaseItemDto>
return new QueryResult<BaseItem>
{
TotalRecordCount = totalCount,
Items = returnItemArray
@ -796,7 +830,6 @@ namespace MediaBrowser.Server.Implementations.Channels
});
var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false);
await RefreshIfNeeded(internalItems, cancellationToken).ConfigureAwait(false);
var returnItemArray = internalItems.ToArray();
@ -815,6 +848,8 @@ namespace MediaBrowser.Server.Implementations.Channels
var internalResult = await GetAllMediaInternal(query, cancellationToken).ConfigureAwait(false);
await RefreshIfNeeded(internalResult.Items, new Progress<double>(), cancellationToken).ConfigureAwait(false);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields))
.Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
@ -834,59 +869,10 @@ namespace MediaBrowser.Server.Implementations.Channels
private async Task<ChannelItemResult> GetAllItems(IIndexableChannel indexable, IChannel channel, InternalAllChannelMediaQuery query, CancellationToken cancellationToken)
{
var cacheLength = CacheLength;
var folderId = _jsonSerializer.SerializeToString(query).GetMD5().ToString("N");
var cachePath = GetChannelDataCachePath(channel, query.UserId, folderId, null, false);
try
{
if (_fileSystem.GetLastWriteTimeUtc(cachePath).Add(cacheLength) > DateTime.UtcNow)
{
return _jsonSerializer.DeserializeFromFile<ChannelItemResult>(cachePath);
}
}
catch (FileNotFoundException)
{
}
catch (DirectoryNotFoundException)
{
}
await _resourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
try
{
try
{
if (_fileSystem.GetLastWriteTimeUtc(cachePath).Add(cacheLength) > DateTime.UtcNow)
{
return _jsonSerializer.DeserializeFromFile<ChannelItemResult>(cachePath);
}
}
catch (FileNotFoundException)
{
}
catch (DirectoryNotFoundException)
{
}
var result = await indexable.GetAllMedia(query, cancellationToken).ConfigureAwait(false);
CacheResponse(result, cachePath);
return result;
}
finally
{
_resourcePool.Release();
}
return await indexable.GetAllMedia(query, cancellationToken).ConfigureAwait(false);
}
public async Task<QueryResult<BaseItem>> GetChannelItemsInternal(ChannelItemQuery query, CancellationToken cancellationToken)
public async Task<QueryResult<BaseItem>> GetChannelItemsInternal(ChannelItemQuery query, IProgress<double> progress, CancellationToken cancellationToken)
{
// Get the internal channel entity
var channel = GetChannel(query.ChannelId);
@ -956,7 +942,7 @@ namespace MediaBrowser.Server.Implementations.Channels
}
}
return await GetReturnItems(internalItems, providerTotalRecordCount, user, query, cancellationToken).ConfigureAwait(false);
return await GetReturnItems(internalItems, providerTotalRecordCount, user, query, progress, cancellationToken).ConfigureAwait(false);
}
public async Task<QueryResult<BaseItemDto>> GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken)
@ -965,7 +951,7 @@ namespace MediaBrowser.Server.Implementations.Channels
? null
: _userManager.GetUserById(query.UserId);
var internalResult = await GetChannelItemsInternal(query, cancellationToken).ConfigureAwait(false);
var internalResult = await GetChannelItemsInternal(query, new Progress<double>(), cancellationToken).ConfigureAwait(false);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields))
@ -1125,7 +1111,12 @@ namespace MediaBrowser.Server.Implementations.Channels
filename + ".json");
}
private async Task<QueryResult<BaseItem>> GetReturnItems(IEnumerable<BaseItem> items, int? totalCountFromProvider, User user, ChannelItemQuery query, CancellationToken cancellationToken)
private async Task<QueryResult<BaseItem>> GetReturnItems(IEnumerable<BaseItem> items,
int? totalCountFromProvider,
User user,
ChannelItemQuery query,
IProgress<double> progress,
CancellationToken cancellationToken)
{
items = ApplyFilters(items, query.Filters, user);
@ -1147,9 +1138,8 @@ namespace MediaBrowser.Server.Implementations.Channels
}
}
await RefreshIfNeeded(all, cancellationToken).ConfigureAwait(false);
var returnItemArray = all.ToArray();
await RefreshIfNeeded(returnItemArray, progress, cancellationToken).ConfigureAwait(false);
return new QueryResult<BaseItem>
{
@ -1272,11 +1262,19 @@ namespace MediaBrowser.Server.Implementations.Channels
return item;
}
private async Task RefreshIfNeeded(IEnumerable<BaseItem> programs, CancellationToken cancellationToken)
private async Task RefreshIfNeeded(BaseItem[] programs, IProgress<double> progress, CancellationToken cancellationToken)
{
var numComplete = 0;
var numItems = programs.Length;
foreach (var program in programs)
{
await RefreshIfNeeded(program, cancellationToken).ConfigureAwait(false);
numComplete++;
double percent = numComplete;
percent /= numItems;
progress.Report(percent * 100);
}
}
@ -1396,8 +1394,220 @@ namespace MediaBrowser.Server.Implementations.Channels
return await _libraryManager.GetNamedView(name, "channels", "zz_" + name, cancellationToken).ConfigureAwait(false);
}
public async Task DownloadChannelItem(IChannelMediaItem item, string destination,
IProgress<double> progress, CancellationToken cancellationToken)
{
var itemId = item.Id.ToString("N");
var sources = await GetChannelItemMediaSources(itemId, cancellationToken)
.ConfigureAwait(false);
var list = sources.Where(i => i.Protocol == MediaProtocol.Http).ToList();
foreach (var source in list)
{
try
{
await TryDownloadChannelItem(source, item, destination, progress, cancellationToken).ConfigureAwait(false);
return;
}
catch (HttpException ex)
{
if (ex.StatusCode.HasValue && ex.StatusCode.Value == HttpStatusCode.NotFound)
{
MarkBadMediaSource(source);
}
}
}
}
private async Task TryDownloadChannelItem(MediaSourceInfo source,
IChannelMediaItem item,
string destination,
IProgress<double> progress,
CancellationToken cancellationToken)
{
var options = new HttpRequestOptions
{
CancellationToken = cancellationToken,
Url = source.Path,
Progress = new Progress<double>()
};
var host = new Uri(source.Path).Host.ToLower();
var channel = GetChannel(item.ChannelId);
var channelProvider = GetChannelProvider(channel);
var limit = channelProvider.GetChannelFeatures().DailyDownloadLimit;
if (!ValidateDownloadLimit(host, limit))
{
_logger.Error(string.Format("Download limit has been reached for {0}", channel.Name));
throw new ChannelDownloadException(string.Format("Download limit has been reached for {0}", channel.Name));
}
foreach (var header in source.RequiredHttpHeaders)
{
options.RequestHeaders[header.Key] = header.Value;
}
Directory.CreateDirectory(Path.GetDirectoryName(destination));
// Determine output extension
var response = await _httpClient.GetTempFileResponse(options).ConfigureAwait(false);
if (response.ContentType.StartsWith("text/html"))
{
throw new HttpException("File not found")
{
StatusCode = HttpStatusCode.NotFound
};
}
IncrementDownloadCount(host, limit);
if (string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase) && response.ContentType.StartsWith("video/", StringComparison.OrdinalIgnoreCase))
{
var extension = response.ContentType.Split('/')
.Last()
.Replace("quicktime", "mov", StringComparison.OrdinalIgnoreCase);
destination += "." + extension;
}
else if (string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) && response.ContentType.StartsWith("audio/", StringComparison.OrdinalIgnoreCase))
{
var extension = response.ContentType.Replace("audio/mpeg", "audio/mp3", StringComparison.OrdinalIgnoreCase)
.Split('/')
.Last();
destination += "." + extension;
}
else
{
File.Delete(response.TempFilePath);
throw new ApplicationException("Unexpected response type encountered: " + response.ContentType);
}
File.Copy(response.TempFilePath, destination, true);
try
{
File.Delete(response.TempFilePath);
}
catch
{
}
}
private readonly ReaderWriterLockSlim _mediaSourceHistoryLock = new ReaderWriterLockSlim();
private bool IsValidMediaSource(MediaSourceInfo source)
{
if (source.Protocol == MediaProtocol.Http)
{
return !GetBadMediaSourceHistory().Contains(source.Path, StringComparer.OrdinalIgnoreCase);
}
return true;
}
private void MarkBadMediaSource(MediaSourceInfo source)
{
var list = GetBadMediaSourceHistory();
list.Add(source.Path);
var path = GetMediaSourceHistoryPath();
Directory.CreateDirectory(Path.GetDirectoryName(path));
if (_mediaSourceHistoryLock.TryEnterWriteLock(TimeSpan.FromSeconds(5)))
{
try
{
File.WriteAllLines(path, list.ToArray(), Encoding.UTF8);
}
catch (Exception ex)
{
_logger.ErrorException("Error saving file", ex);
}
finally
{
_mediaSourceHistoryLock.ExitWriteLock();
}
}
}
private ConcurrentBag<string> _badMediaSources = null;
private ConcurrentBag<string> GetBadMediaSourceHistory()
{
if (_badMediaSources == null)
{
var path = GetMediaSourceHistoryPath();
if (_mediaSourceHistoryLock.TryEnterReadLock(TimeSpan.FromSeconds(1)))
{
if (_badMediaSources == null)
{
try
{
_badMediaSources = new ConcurrentBag<string>(File.ReadAllLines(path, Encoding.UTF8));
}
catch (IOException)
{
_badMediaSources = new ConcurrentBag<string>();
}
catch (Exception ex)
{
_logger.ErrorException("Error reading file", ex);
_badMediaSources = new ConcurrentBag<string>();
}
finally
{
_mediaSourceHistoryLock.ExitReadLock();
}
}
}
}
return _badMediaSources;
}
private string GetMediaSourceHistoryPath()
{
return Path.Combine(_config.ApplicationPaths.DataPath, "channels", "failures.txt");
}
private void IncrementDownloadCount(string key, int? limit)
{
if (!limit.HasValue)
{
return;
}
int current;
_downloadCounts.TryGetValue(key, out current);
current++;
_downloadCounts.AddOrUpdate(key, current, (k, v) => current);
}
private bool ValidateDownloadLimit(string key, int? limit)
{
if (!limit.HasValue)
{
return true;
}
int current;
_downloadCounts.TryGetValue(key, out current);
return current < limit.Value;
}
public void Dispose()
{
if (_clearDownloadCountsTimer != null)
{
_clearDownloadCountsTimer.Dispose();
_clearDownloadCountsTimer = null;
}
if (_refreshTimer != null)
{
_refreshTimer.Dispose();

View file

@ -99,20 +99,22 @@ namespace MediaBrowser.Server.Implementations.Channels
}
progress.Report(100);
}
private async Task GetAllItems(string user, string channelId, string folderId, int currentRefreshLevel, int maxRefreshLevel, IProgress<double> progress, CancellationToken cancellationToken)
{
var folderItems = new List<string>();
var innerProgress = new ActionableProgress<double>();
innerProgress.RegisterAction(p => progress.Report(p / 2));
var result = await _channelManager.GetChannelItemsInternal(new ChannelItemQuery
{
ChannelId = channelId,
UserId = user,
FolderId = folderId
}, cancellationToken);
}, innerProgress, cancellationToken);
folderItems.AddRange(result.Items.Where(i => i.IsFolder).Select(i => i.Id.ToString("N")));
@ -128,7 +130,7 @@ namespace MediaBrowser.Server.Implementations.Channels
StartIndex = totalRetrieved,
FolderId = folderId
}, cancellationToken);
}, new Progress<double>(), cancellationToken);
folderItems.AddRange(result.Items.Where(i => i.IsFolder).Select(i => i.Id.ToString("N")));
@ -142,12 +144,12 @@ namespace MediaBrowser.Server.Implementations.Channels
{
var numComplete = 0;
var numItems = folderItems.Count;
foreach (var folder in folderItems)
{
try
{
var innerProgress = new ActionableProgress<double>();
innerProgress = new ActionableProgress<double>();
var startingNumberComplete = numComplete;
innerProgress.RegisterAction(p =>
@ -157,7 +159,7 @@ namespace MediaBrowser.Server.Implementations.Channels
innerPercent /= numItems;
progress.Report((innerPercent * 50) + 50);
});
await GetAllItems(user, channelId, folder, currentRefreshLevel + 1, maxRefreshLevel, innerProgress, cancellationToken).ConfigureAwait(false);
}
catch (Exception ex)
@ -168,7 +170,7 @@ namespace MediaBrowser.Server.Implementations.Channels
numComplete++;
double percent = numComplete;
percent /= numItems;
progress.Report(percent * 100);
progress.Report((percent * 50) + 50);
}
}

View file

@ -95,14 +95,29 @@ namespace MediaBrowser.Server.Implementations.Intros
}));
}
if (config.EnableIntrosFromUpcomingTrailers && IsSupporter)
var trailerTypes = new List<TrailerType>();
if (config.EnableIntrosFromUpcomingTrailers)
{
trailerTypes.Add(TrailerType.ComingSoonToTheaters);
}
if (config.EnableIntrosFromUpcomingDvdMovies)
{
trailerTypes.Add(TrailerType.ComingSoonToDvd);
}
if (config.EnableIntrosFromUpcomingStreamingMovies)
{
trailerTypes.Add(TrailerType.ComingSoonToStreaming);
}
if (trailerTypes.Count > 0 && IsSupporter)
{
var channelTrailers = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery
{
ContentTypes = new[] { ChannelMediaContentType.MovieExtra },
ExtraTypes = new[] { ExtraType.Trailer },
UserId = user.Id.ToString("N"),
TrailerTypes = new[] { TrailerType.ComingSoonToTheaters }
TrailerTypes = trailerTypes.ToArray()
}, CancellationToken.None);

View file

@ -163,7 +163,14 @@ namespace MediaBrowser.Server.Implementations.Library
throw new ArgumentNullException("key");
}
return _userData.GetOrAdd(GetCacheKey(userId, key), keyName => Repository.GetUserData(userId, key));
return _userData.GetOrAdd(GetCacheKey(userId, key), keyName => GetUserDataFromRepository(userId, key));
}
public UserItemData GetUserDataFromRepository(Guid userId, string key)
{
var data = Repository.GetUserData(userId, key);
return data;
}
/// <summary>

View file

@ -6,29 +6,29 @@
"Administrator": "Administrator",
"Password": "Passwort",
"DeleteImage": "Bild l\u00f6schen",
"DeleteImageConfirmation": "M\u00f6chten Sie das Bild wirklich l\u00f6schen?",
"DeleteImageConfirmation": "M\u00f6chtest du dieses Bild wirklich l\u00f6schen?",
"FileReadCancelled": "Das Einlesen der Datei wurde abgebrochen.",
"FileNotFound": "Datei nicht gefunden",
"FileReadError": "Beim Lesen der Datei ist ein Fehler aufgetreten.",
"DeleteUser": "Benutzer l\u00f6schen",
"DeleteUserConfirmation": "M\u00f6chten Sie {0} wirklich l\u00f6schen?",
"DeleteUserConfirmation": "M\u00f6chtest du {0} wirklich l\u00f6schen?",
"PasswordResetHeader": "Passwort zur\u00fccksetzen",
"PasswordResetComplete": "Das Passwort wurde zur\u00fcckgesetzt.",
"PasswordResetConfirmation": "M\u00f6chten Sie das Passwort wirklich zur\u00fccksetzen?",
"PasswordResetConfirmation": "M\u00f6chtest du das Passwort wirklich zur\u00fccksetzen?",
"PasswordSaved": "Passwort gespeichert",
"PasswordMatchError": "Passwort und Passwortbest\u00e4tigung stimmen nicht \u00fcberein.",
"OptionRelease": "Offizielles Release",
"OptionBeta": "Beta",
"OptionDev": "Entwickler (instabil)",
"UninstallPluginHeader": "Deinstalliere Plugin",
"UninstallPluginConfirmation": "M\u00f6chten Sie {0} wirklich deinstallieren?",
"UninstallPluginConfirmation": "M\u00f6chtest du {0} wirklich deinstallieren?",
"NoPluginConfigurationMessage": "Bei diesem Plugin kann nichts eingestellt werden.",
"NoPluginsInstalledMessage": "Sie haben keine Plugins installiert.",
"BrowsePluginCatalogMessage": "Durchsuchen Sie unsere Bibliothek um alle verf\u00fcgbaren Plugins anzuzeigen.",
"NoPluginsInstalledMessage": "Du hast keine Plugins installiert.",
"BrowsePluginCatalogMessage": "Durchsuche unsere Bibliothek, um alle verf\u00fcgbaren Plugins anzuzeigen.",
"MessageKeyEmailedTo": "E-Mail mit Zugangsschl\u00fcssel an: {0}.",
"MessageKeysLinked": "Schl\u00fcssel verkn\u00fcpft.",
"HeaderConfirmation": "Best\u00e4tigung",
"MessageKeyUpdated": "Danke. Ihr Unterst\u00fctzerschl\u00fcssel wurde aktualisiert.",
"MessageKeyUpdated": "Danke. Dein Unterst\u00fctzerschl\u00fcssel wurde aktualisiert.",
"MessageKeyRemoved": "Danke. Ihr Unterst\u00fctzerschl\u00fcssel wurde entfernt.",
"ErrorLaunchingChromecast": "W\u00e4hrend des startens von Chromecast ist ein Fehler aufgetreten. Bitte stelle sicher, dass dein Ger\u00e4te mit dem WLAN verbunden ist.",
"HeaderSearch": "Suche",
@ -44,8 +44,8 @@
"LabelScheduledTaskLastRan": "Zuletzt ausgef\u00fchrt vor: {0}. Ben\u00f6tigte Zeit: {1}.",
"HeaderDeleteTaskTrigger": "Entferne Aufgabenausl\u00f6ser",
"HeaderTaskTriggers": "Aufgabenausl\u00f6ser",
"MessageDeleteTaskTrigger": "Sind Sie sicher, dass sie diesen Aufgabenausl\u00f6ser entfernen wollen?",
"MessageNoPluginsInstalled": "Sie haben keine Plugins installiert.",
"MessageDeleteTaskTrigger": "Bist du dir sicher, dass du diesen Aufgabenausl\u00f6ser entfernen m\u00f6chtest?",
"MessageNoPluginsInstalled": "Du hast keine Plugins installiert.",
"LabelVersionInstalled": "{0} installiert",
"LabelNumberReviews": "{0} Bewertungen",
"LabelFree": "Frei",
@ -104,7 +104,7 @@
"LabelVersionUpToDate": "Auf dem neuesten Stand!",
"ButtonResetTuner": "Tuner zur\u00fccksetzen",
"HeaderResetTuner": "Tuner zur\u00fccksetzen",
"MessageConfirmResetTuner": "sind Sie sicher, dass Sie diesen Tuner zur\u00fccksetzen wollen? Alle aktiven Wiedergaben und Aufnahmen werden sofort beendet.",
"MessageConfirmResetTuner": "Bist du dir sicher, dass du diesen Tuner zur\u00fccksetzen m\u00f6chtest? Alle aktiven Wiedergaben und Aufnahmen werden sofort beendet.",
"ButtonCancelSeries": "Serien abbrechen",
"HeaderSeriesRecordings": "Aufgezeichnete Serien",
"LabelAnytime": "Jederzeit",
@ -113,7 +113,7 @@
"StatusRecordingProgram": "Aufzeichnung {0}",
"StatusWatchingProgram": "Gesehen {0}",
"HeaderSplitMedia": "Trenne Medien ab",
"MessageConfirmSplitMedia": "Sind Sie sicher, dass Sie die Medienquellen in seperate Elemente aufteilen wollen?",
"MessageConfirmSplitMedia": "Bist du dir sicher, dass du die Medienquellen in separate Elemente aufteilen m\u00f6chtest?",
"HeaderError": "Fehler",
"MessagePleaseSelectOneItem": "Bitte w\u00e4hle mindestens eine Option aus.",
"MessagePleaseSelectTwoItems": "Bitte w\u00e4hle mindestens zwei Optionen aus.",
@ -131,7 +131,7 @@
"HeaderFavoriteGames": "Lieblingsspiele",
"HeaderRatingsDownloads": "Bewertung \/ Downloads",
"HeaderConfirmProfileDeletion": "Best\u00e4tige Profill\u00f6schung",
"MessageConfirmProfileDeletion": "Sind Sie sicher, dass Sie dieses Profil l\u00f6schen wollen?",
"MessageConfirmProfileDeletion": "Bist du dir sicher, dass du dieses Profil l\u00f6schen m\u00f6chtest?",
"HeaderSelectServerCachePath": "W\u00e4hle Server Cache Pfad:",
"HeaderSelectTranscodingPath": "W\u00e4hle Pfad f\u00fcr tempor\u00e4re Transkodierdateien",
"HeaderSelectImagesByNamePath": "W\u00e4hle 'Images By Name' Pfad",
@ -207,7 +207,7 @@
"MessageErrorPlayingVideo": "Es gab einen Fehler bei der Videowiedergabe.",
"MessageEnsureOpenTuner": "Bitte stelle sicher, dass ein freier Empf\u00e4nger verf\u00fcgbar ist.",
"ButtonHome": "Home",
"ButtonDashboard": "Optionsleiste",
"ButtonDashboard": "\u00dcbersicht",
"ButtonReports": "Meldungen",
"ButtonMetadataManager": "Metadaten Manager",
"HeaderTime": "Zeit",
@ -564,24 +564,24 @@
"MediaInfoRefFrames": "Ref Frames",
"TabPlayback": "Wiedergabe",
"HeaderSelectCustomIntrosPath": "W\u00e4hle einen benutzerdefinierten Pfad f\u00fcr Intros",
"HeaderRateAndReview": "Rate and Review",
"HeaderThankYou": "Thank You",
"MessageThankYouForYourReview": "Thank you for your review.",
"LabelYourRating": "Your rating:",
"LabelFullReview": "Full review:",
"LabelShortRatingDescription": "Short rating summary:",
"HeaderRateAndReview": "Bewerten und Kommentieren",
"HeaderThankYou": "Danke",
"MessageThankYouForYourReview": "Vielen Dank f\u00fcr deine Bewertung.",
"LabelYourRating": "Deine Bewertung:",
"LabelFullReview": "Vollst\u00e4ndige Bewertung:",
"LabelShortRatingDescription": "Kurze Zusammenfassung der Bewertung:",
"OptionIRecommendThisItem": "Ich schlage diesen Inhalt vor",
"WebClientTourContent": "Schaue deine zuletzt hinzugef\u00fcgten Medien, n\u00e4chste Episoden und mehr an. Die gr\u00fcnen Kreise zeigen dir an, wie viele ungesehene Inhalte du hast.",
"WebClientTourMovies": "Play movies, trailers and more from any device with a web browser",
"WebClientTourMouseOver": "Hold the mouse over any poster for quick access to important information",
"WebClientTourTapHold": "Tap and hold or right click any poster for a context menu",
"WebClientTourMetadataManager": "Click edit to open the metadata manager",
"WebClientTourPlaylists": "Easily create playlists and instant mixes, and play them on any device",
"WebClientTourCollections": "Create movie collections to group box sets together",
"WebClientTourUserPreferences1": "User preferences allow you to customize the way your library is presented in all of your Media Browser apps",
"WebClientTourUserPreferences2": "Configure your audio and subtitle language settings once, for every Media Browser app",
"WebClientTourUserPreferences3": "Design the web client home page to your liking",
"WebClientTourUserPreferences4": "Configure backdrops, theme songs and external players",
"WebClientTourMovies": "Spiele Filme, Trailer und mehr von jedem Ger\u00e4t mit einem Web-Browser",
"WebClientTourMouseOver": "Halte die Maus \u00fcber ein Plakat f\u00fcr den schnellen Zugriff auf wichtige Informationen",
"WebClientTourTapHold": "Tippe und halte, oder klicke auf ein Plakat f\u00fcr ein Kontextmen\u00fc",
"WebClientTourMetadataManager": "Klicke auf \"Bearbeiten\" um den Metadaten-Manager zu \u00f6ffnen",
"WebClientTourPlaylists": "Erstelle einfach Wiedergabelisten und Schnellmixe und spiele diese auf jedem Ger\u00e4t",
"WebClientTourCollections": "Erstelle Film Sammlungen um Box-Sets zusammenzuf\u00fchren",
"WebClientTourUserPreferences1": "\u00dcber die Benutzereinstellungen kannst du die Art und Weise der Bibliotheksdarstellung auf all deinen Meda Browser App anpassen.",
"WebClientTourUserPreferences2": "Konfiguriere deine Audio- und Untertitelspracheinstellungen einmal f\u00fcr jede Media Browser App",
"WebClientTourUserPreferences3": "Designe die Web-Client-Homepage nach deinen W\u00fcnschen",
"WebClientTourUserPreferences4": "Konfiguriere Hintergr\u00fcnde, Titelsongs und externe Abspieler",
"WebClientTourMobile1": "Der Web-Client funktioniert hervorragend auf Smartphones und Tablets ...",
"WebClientTourMobile2": "und steuert einfach andere Ger\u00e4te und Media Browser Anwendungen",
"MessageEnjoyYourStay": "Genie\u00dfe deinen Aufenthalt"

View file

@ -60,8 +60,8 @@
"ButtonStop": "Stop",
"ButtonNextTrack": "Next Track",
"ButtonPause": "Pause",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonPlay": "Pokreni",
"ButtonEdit": "Izmjeni",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
@ -75,7 +75,7 @@
"ButtonClose": "Close",
"LabelAllPlaysSentToPlayer": "All plays will be sent to the selected player.",
"MessageInvalidUser": "Invalid user or password.",
"HeaderAllRecordings": "All Recordings",
"HeaderAllRecordings": "Sve snimke",
"RecommendationBecauseYouLike": "Because you like {0}",
"RecommendationBecauseYouWatched": "Because you watched {0}",
"RecommendationDirectedBy": "Directed by {0}",
@ -445,7 +445,7 @@
"MessageSupporterMembershipExpiredOn": "Your supporter membership expired on {0}.",
"MessageYouHaveALifetimeMembership": "You have a lifetime supporter membership. You can provide additional donations on a one-time or recurring basis using the options below. Thank you for supporting Media Browser.",
"MessageYouHaveAnActiveRecurringMembership": "You have an active {0} membership. You can upgrade your plan using the options below.",
"ButtonDelete": "Delete",
"ButtonDelete": "Izbri\u0161i",
"HeaderMediaBrowserAccountAdded": "Media Browser Account Added",
"MessageMediaBrowserAccountAdded": "The Media Browser account has been added to this user.",
"MessagePendingMediaBrowserAccountAdded": "The Media Browser account has been added to this user. An email will be sent to the owner of the account. The invitation will need to be confirmed by clicking a link within the email.",

View file

@ -431,10 +431,10 @@
"BirthPlaceValue": "F\u00f8dested: {0}",
"DeathDateValue": "D\u00f8de: {0}",
"BirthDateValue": "F\u00f8dt: {0}",
"HeaderLatestReviews": "Latest Reviews",
"HeaderLatestReviews": "Siste anmeldelser",
"HeaderPluginInstallation": "Programtillegg installasjon",
"MessageAlreadyInstalled": "Denne versjonen er allerede installert.",
"ValueReviewCount": "{0} Reviews",
"ValueReviewCount": "{0} Anmeldelser",
"MessageYouHaveVersionInstalled": "You currently have version {0} installed.",
"MessageTrialExpired": "Pr\u00f8veperioden for denne funksjonen er utl\u00f8pt",
"MessageTrialWillExpireIn": "The trial period for this feature will expire in {0} day(s)",
@ -530,7 +530,7 @@
"HeaderTracks": "Spor",
"HeaderItems": "Elementer",
"HeaderOtherItems": "Andre elementer",
"ButtonFullReview": "Full review",
"ButtonFullReview": "Full anmeldelse",
"ValueAsRole": "som {0}",
"ValueGuestStar": "Guest star",
"MediaInfoSize": "St\u00f8rrelse",
@ -562,13 +562,13 @@
"MediaInfoStreamTypeSubtitle": "Undertekst",
"MediaInfoStreamTypeEmbeddedImage": "Embedded Image",
"MediaInfoRefFrames": "Ref frames",
"TabPlayback": "Playback",
"TabPlayback": "Spill av",
"HeaderSelectCustomIntrosPath": "Select Custom Intros Path",
"HeaderRateAndReview": "Rate and Review",
"HeaderThankYou": "Thank You",
"MessageThankYouForYourReview": "Thank you for your review.",
"HeaderRateAndReview": "Ranger og anmeld",
"HeaderThankYou": "Takk",
"MessageThankYouForYourReview": "Takk for din anmeldelse.",
"LabelYourRating": "Your rating:",
"LabelFullReview": "Full review:",
"LabelFullReview": "Full anmeldelse:",
"LabelShortRatingDescription": "Short rating summary:",
"OptionIRecommendThisItem": "Jeg anbefaler dette elementet",
"WebClientTourContent": "Vis dine nylig tilf\u00f8yde medier, neste episodene og mer. De gr\u00f8nne sirklene viser hvor mange uspilte elementer du har.",

View file

@ -573,16 +573,16 @@
"OptionIRecommendThisItem": "Ik beveel dit item aan",
"WebClientTourContent": "Bekijk de recent toegevoegde media, volgende afleveringen en meer. De groene cirkels tonen hoeveel niet afgespeelde items er zijn.",
"WebClientTourMovies": "Bekijk films, trailers en meer op elk apparaat met een web browser.",
"WebClientTourMouseOver": "Hold the mouse over any poster for quick access to important information",
"WebClientTourTapHold": "Tap and hold or right click any poster for a context menu",
"WebClientTourMetadataManager": "Click edit to open the metadata manager",
"WebClientTourPlaylists": "Easily create playlists and instant mixes, and play them on any device",
"WebClientTourCollections": "Create movie collections to group box sets together",
"WebClientTourUserPreferences1": "User preferences allow you to customize the way your library is presented in all of your Media Browser apps",
"WebClientTourUserPreferences2": "Configure your audio and subtitle language settings once, for every Media Browser app",
"WebClientTourUserPreferences3": "Design the web client home page to your liking",
"WebClientTourUserPreferences4": "Configure backdrops, theme songs and external players",
"WebClientTourMobile1": "The web client works great on smartphones and tablets...",
"WebClientTourMobile2": "and easily controls other devices and Media Browser apps",
"MessageEnjoyYourStay": "Enjoy your stay"
"WebClientTourMouseOver": "Hou de muis over elke poster voor snelle toegang tot belangrijke informatie",
"WebClientTourTapHold": "Klik en houd vast of rechtsklik op elke poster voor een context menu",
"WebClientTourMetadataManager": "Klik wijzigen om de metadata manager te openen",
"WebClientTourPlaylists": "Maak eenvoudig een afspeellijst en mixlijst, en speel deze op elk apparaat",
"WebClientTourCollections": "Maak film verzamelingen door films samen te voegen",
"WebClientTourUserPreferences1": "Gebruikersvoorkeuren stelt je in staat de manier waarop de bibliotheek aan gebruikers getoont wordt aan te passen",
"WebClientTourUserPreferences2": "Configureer je geluids- en ondertitelingsinstellingen eenmalig voor elke Media Browser app",
"WebClientTourUserPreferences3": "Ontwerp de startpagina van de web client zoals jij wilt",
"WebClientTourUserPreferences4": "Configureer achtergronden, theme songs en externe spelers",
"WebClientTourMobile1": "De web client werk perfect op smartphones en tablets...",
"WebClientTourMobile2": "en kan elke andere Media Browser app bedienen",
"MessageEnjoyYourStay": "Geniet van uw verblijf"
}

View file

@ -189,7 +189,7 @@
"HeaderLatestTvRecordings": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438",
"ButtonOk": "\u041e\u041a",
"ButtonCancel": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c",
"ButtonRefresh": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c",
"ButtonRefresh": "\u041f\u043e\u0434\u043d\u043e\u0432\u0438\u0442\u044c",
"LabelCurrentPath": "\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0443\u0442\u044c:",
"HeaderSelectMediaPath": "\u0412\u044b\u0431\u043e\u0440 \u043f\u0443\u0442\u0438 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445",
"ButtonNetwork": "\u0421\u0435\u0442\u044c",
@ -288,7 +288,7 @@
"HeaderAlert": "\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435",
"MessagePleaseRestart": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435.",
"ButtonRestart": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c",
"MessagePleaseRefreshPage": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439\u0442\u0435 \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.",
"MessagePleaseRefreshPage": "\u041f\u043e\u0434\u043d\u043e\u0432\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f c \u0441\u0435\u0440\u0432\u0435\u0440\u0430.",
"ButtonHide": "\u0421\u043a\u0440\u044b\u0442\u044c",
"MessageSettingsSaved": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b.",
"ButtonSignOut": "\u0412\u044b\u0439\u0442\u0438",
@ -379,7 +379,7 @@
"ButtonQueueAllFromHere": "\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0442\u0441\u044e\u0434\u0430",
"ButtonPlayAllFromHere": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u043e\u0442\u0441\u044e\u0434\u0430",
"LabelDynamicExternalId": "{0} Id:",
"HeaderIdentify": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",
"HeaderIdentify": "\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",
"PersonTypePerson": "\u041f\u0435\u0440\u0441\u043e\u043d\u0430",
"LabelTitleDisplayOrder": "\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439:",
"OptionSortName": "\u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",

View file

@ -167,7 +167,7 @@
"LabelParentalRating": "Parental rating:",
"LabelMaxParentalRating": "H\u00f8jst tilladte aldersgr\u00e6nse:",
"LabelCustomRating": "Custom rating:",
"MaxParentalRatingHelp": "Content with a higher rating will be hidden from this user.",
"MaxParentalRatingHelp": "Indhold med en h\u00f8jere gr\u00e6nse, skjules for denne bruger.",
"LabelBudget": "Budget",
"LibraryAccessHelp": "V\u00e6lg hvilke medie mapper der skal deles med denne bruger. Administratorer vil kunne redigere alle mapper ved hj\u00e6lp af metadata administratoren.",
"LabelRevenue": "Revenue ($):",
@ -231,11 +231,11 @@
"OptionYearlySupporterMembership": "Yearly supporter membership",
"HeaderNextUp": "N\u00e6ste",
"OptionMonthlySupporterMembership": "Monthly supporter membership",
"NoNextUpItemsMessage": "None found. Start watching your shows!",
"NoNextUpItemsMessage": "Ingen fundet. Se dine serier!",
"HeaderSupporterBenefit": "A supporter membership provides additional benefits such as access to premium plugins, internet channel content, and more.",
"HeaderLatestEpisodes": "Sidste Episode",
"OptionNoTrailer": "No Trailer",
"HeaderPersonTypes": "Person Types:",
"HeaderPersonTypes": "Person typer:",
"OptionNoThemeSong": "No Theme Song",
"TabSongs": "Sange",
"OptionNoThemeVideo": "No Theme Video",
@ -378,7 +378,7 @@
"HeaderStatus": "Status",
"OptionContinuing": "Fors\u00e6ttes",
"OptionEnded": "F\u00e6rdig",
"HeaderAirDays": "Sende Dage:",
"HeaderAirDays": "Sende Dage",
"OptionSunday": "S\u00f8ndag",
"OptionMonday": "Mandag",
"OptionTuesday": "Tirsdag",
@ -444,9 +444,9 @@
"ButtonSelectDirectory": "V\u00e6lg Mappe",
"LabelCustomPaths": "Angiv brugerdefinerede stier, hvor det \u00f8nskes. Lad felter tomme for at bruge standardindstillingerne.",
"LabelCachePath": "Cache sti:",
"LabelCachePathHelp": "Denne mappe indeholder serverens cache filer, s\u00e5som billeder.",
"LabelCachePathHelp": "Definer en alternativ mappe til serverens cache filer, s\u00e5som billeder.",
"LabelImagesByNamePath": "Billeder efter navn sti:",
"LabelImagesByNamePathHelp": "Denne mappe indeholder skuespiller, artist, genre og studie billeder.",
"LabelImagesByNamePathHelp": "Angiv en alternativ mappe til downloadede informationer om skuespillere, artister, genrer og studie billeder.",
"LabelMetadataPath": "Metadata sti:",
"LabelMetadataPathHelp": "Denne placering indeholder hentede illustrationer og metadata, der ikke er konfigureret til at blive gemt i medie mapperne.",
"LabelTranscodingTempPath": "Transcoding temporary path:",

View file

@ -33,26 +33,26 @@
"LabelRunningTimeValue": "Laufzeit: {0}",
"TitleMediaBrowser": "Media Browser",
"LabelIpAddressValue": "IP Adresse: {0}",
"ThisWizardWillGuideYou": "Dieser Assistent wird Sie durch den Einrichtungsprozess f\u00fchren. Um zu beginnen, w\u00e4hlen Sie bitte ihre bevorzugte Sprache.",
"ThisWizardWillGuideYou": "Dieser Assistent wird dich durch den Einrichtungsprozess f\u00fchren. Um zu beginnen, w\u00e4hle bitte deine bevorzugte Sprache.",
"UserConfigurationUpdatedWithName": "Benutzereinstellungen wurden aktualisiert f\u00fcr {0}",
"TellUsAboutYourself": "Sagen Sie uns etwas \u00fcber sich selbst",
"TellUsAboutYourself": "Sag uns etwas \u00fcber dich selbst",
"UserCreatedWithName": "Benutzer {0} wurde erstellt",
"LabelYourFirstName": "Ihr Vorname:",
"UserPasswordChangedWithName": "Das Passwort f\u00fcr Benutzer {0} wurde ge\u00e4ndert",
"MoreUsersCanBeAddedLater": "Weitere Benutzer k\u00f6nnen Sie sp\u00e4ter \u00fcber die Optionsleiste hinzuf\u00fcgen.",
"MoreUsersCanBeAddedLater": "Weitere Benutzer k\u00f6nnen sp\u00e4ter \u00fcber die Optionsleiste hinzugef\u00fcgt werden.",
"UserDeletedWithName": "Benutzer {0} wurde gel\u00f6scht",
"UserProfilesIntro": "Media Browser verf\u00fcgt \u00fcber integrierte Benutzer Profile. Verwenden Sie diese Profile um Anzeigeeinstellungen, Abspielstatus und Kinder- und Jugendschutzverwaltung pro Benutzer zu speichern und zu verwalten.",
"UserProfilesIntro": "Media Browser verf\u00fcgt \u00fcber integrierte Benutzer Profile. Verwende diese Profile um Anzeigeeinstellungen, Abspielstatus sowie Kinder- und Jugendschutzverwaltungen pro Benutzer zu speichern und zu verwalten.",
"MessageServerConfigurationUpdated": "Server Einstellungen wurden aktualisiert",
"LabelWindowsService": "Windows Service",
"MessageNamedServerConfigurationUpdatedWithValue": "Der Server Einstellungsbereich {0} wurde aktualisiert",
"AWindowsServiceHasBeenInstalled": "Ein Windows Dienst wurde installiert.",
"MessageApplicationUpdated": "Media Browser Server wurde aktualisiert",
"WindowsServiceIntro1": "Media Browser Server l\u00e4uft normalerweise als Desktop Applikation mit einem Symbol im System Tray. Sie k\u00f6nnen den Server aber auch als Hintergrunddienst starten. Verwenden Sie die dazu das Windows Service Control Panel..",
"WindowsServiceIntro1": "Media Browser Server l\u00e4uft normalerweise als Desktop Anwendung mit einem Symbol in der Taskleiste. Du kannst den Server aber auch als Hintergrunddienst starten. Verwende dazu das Windows Service Control Panel (services.msc).",
"AuthenticationSucceededWithUserName": "{0} erfolgreich authentifiziert",
"WindowsServiceIntro2": "Das Service kann nicht zu gleichen Zeit wie die Desktop Applikation laufen. Schliessen Sie daher die Desktop Applikation, bevor Sie das Service starten. Das Service ben\u00f6tigt administrative Privilegien, die Sie \u00fcber die Systemsteuerung einstellen m\u00fcssen. Beachten Sie bitte auch, dass das Service zur Zeit nicht automatisch aktualisiert wird. Neue Versionen m\u00fcssen daher manuell installiert werden.",
"WindowsServiceIntro2": "Der Dienst kann nicht zu gleichen Zeit wie die Desktop Anwendung laufen. Schlie\u00dfe daher die Desktop Anwendung bevor du den Dienst startest. Der Dienst ben\u00f6tigt administrative Rechte, die du \u00fcber die Systemsteuerung einstellen m\u00fcssen. Beachte bitte auch, dass der Dienst zur Zeit nicht automatisch aktualisiert wird. Neue Versionen m\u00fcssen daher manuell installiert werden.",
"FailedLoginAttemptWithUserName": "Fehlgeschlagener Anmeldeversuch von {0}",
"WizardCompleted": "Das war's f\u00fcrs Erste. Media Browser hat gerade mit dem Sammeln von Informationen \u00fcber Ihre Medien Bibliothek begonnen. Probieren Sie auch unsere anderen Programme aus. Klicken Sie danach auf <b>Abschliessen<\/b> um die <b>Optionsleiste<\/b> anzuzeigen.",
"UserStartedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} beendet",
"WizardCompleted": "Das war's f\u00fcrs Erste. Media Browser hat gerade mit dem Sammeln von Informationen \u00fcber deine Medienbibliothek begonnen. Probiere auch unsere anderen Programme aus. Klicke danach auf <b>Ende<\/b> um die <b>\u00dcbersicht<\/b> anzuzeigen.",
"UserStartedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} gestartet",
"LabelConfigureSettings": "Konfiguriere Einstellungen",
"UserStoppedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} beendet",
"LabelEnableVideoImageExtraction": "Aktiviere Videobild-Extrahierung",
@ -62,7 +62,7 @@
"LabelEnableChapterImageExtractionForMovies": "Extrahiere Kapitelbilder f\u00fcr Filme",
"LabelChannelDownloadSizeLimit": "Download Gr\u00f6\u00dfenlimit (GB):",
"LabelChapterImageExtractionForMoviesHelp": "Das Auslesen von Kapitelbildern erlaubt es den Clients grafische Szenenauswahlmen\u00fcs anzuzeigen. Der Prozess kann langsam, prozessorintensiv sein und mehrere Gigabyte an Speicherplatz erfordern. Er wird nachts um 4:00 Uhr als geplante Aufgabe ausgef\u00fchrt, dies l\u00e4sst sich im \"Geplante Aufgaben\" Bereich konfigurieren. Es ist nicht ratsam, diese Aufgabe in der Hauptbelastungszeit auszuf\u00fchren.",
"LabelChannelDownloadSizeLimitHelp": "Beschr\u00e4nkt die Gr\u00f6\u00dfe der Channel Downloadverzeichnisse",
"LabelChannelDownloadSizeLimitHelp": "Beschr\u00e4nkt die Gr\u00f6\u00dfe der Channel Downloadverzeichnisse. Downloadgr\u00f6\u00dfen \u00fcber 500MB ben\u00f6tige eine aktive Unterst\u00fctzer Mitgliedschaft.",
"HeaderRecentActivity": "K\u00fcrzliche Aktivit\u00e4ten",
"LabelEnableAutomaticPortMapping": "Aktiviere automatische Portweiterleitung",
"HeaderPeople": "Personen",
@ -91,7 +91,7 @@
"HeaderPassword": "Passwort",
"LabelSaveLocalMetadata": "Speichere Bildmaterial und Metadaten in den Medienverzeichnissen",
"HeaderLocalAccess": "Lokaler Zugriff",
"LabelSaveLocalMetadataHelp": "Durch die Speicherung von Bildmaterial und Metadaten direkt in den Medienverzeichnissen, befinden sie sich an einem Ort, wo sie sehr leicht bearbeitet werden k\u00f6nnen.",
"LabelSaveLocalMetadataHelp": "Durch die Speicherung von Bildmaterial und Metadaten direkt in den Medienverzeichnissen, befinden sich diese an einem Ort wo sie sehr leicht bearbeitet werden k\u00f6nnen.",
"HeaderViewOrder": "Reihenfolge f\u00fcr Ansichten",
"LabelDownloadInternetMetadata": "Lade Bildmaterial und Metadaten aus dem Internet",
"LabelSelectUserViewOrder": "W\u00e4hle die Reihenfolge in der die Ansichten innerhalb von Media Browser Apps angezeigt werden.",
@ -169,9 +169,9 @@
"LabelCustomRating": "Eigene Bewertung:",
"MaxParentalRatingHelp": "Inhalt mit einer h\u00f6heren Bewertung wird dem User nicht angezeigt.",
"LabelBudget": "Budget",
"LibraryAccessHelp": "W\u00e4hlen Sie die Medienverzeichnisse die Sie mit diesem Benutzer teilen m\u00f6chten. Administratoren k\u00f6nnen den Metadata-Manager verwenden um alle Ordner zu bearbeiten.",
"LibraryAccessHelp": "W\u00e4hle die Medienverzeichnisse die du mit diesem Benutzer teilen m\u00f6chtest. Administratoren k\u00f6nnen den Metadaten-Manager verwenden um alle Ordner zu bearbeiten.",
"LabelRevenue": "Einnahmen ($):",
"ChannelAccessHelp": "W\u00e4hlen Sie die Kan\u00e4le, die mit diesem Benutzer geteilt werden sollen. Administratoren sind in der Lage alle K\u00e4nale \u00fcber den Metadata Manager zu bearbeiten.",
"ChannelAccessHelp": "W\u00e4hle die Kan\u00e4le, die mit diesem Benutzer geteilt werden sollen. Administratoren sind in der Lage alle K\u00e4nale \u00fcber den Metadaten-Manager zu bearbeiten.",
"LabelOriginalAspectRatio": "Originales Seitenverh\u00e4ltnis:",
"ButtonDeleteImage": "L\u00f6sche Bild",
"LabelPlayers": "Schauspieler:",
@ -222,17 +222,17 @@
"OptionGuestStars": "Gaststar",
"HeaderDonationType": "Spendentyp:",
"OptionDirectors": "Regisseur",
"OptionMakeOneTimeDonation": "Mache eine einmalige Spende",
"OptionMakeOneTimeDonation": "Mache eine separate Spende",
"OptionWriters": "Drehbuchautor",
"OptionOneTimeDescription": "Das ist eine zus\u00e4tzliche Spende an das Team, um deine Unterst\u00fctzung zu zeigen. Dies bringt keine zus\u00e4tzlichen Vorteile.",
"OptionOneTimeDescription": "Dies ist eine zus\u00e4tzliche Spende an das Team, um deine Unterst\u00fctzung zu zeigen. Dies bringt dir keine zus\u00e4tzlichen Vorteile.",
"OptionProducers": "Produzent",
"OptionLifeTimeSupporterMembership": "Lebensl\u00e4ngliche Unterst\u00fctzer Mitgliedschaft",
"HeaderResume": "Fortsetzen",
"OptionYearlySupporterMembership": "J\u00e4hrliche Unterst\u00fctzer Mitgliedschaft",
"HeaderNextUp": "Als N\u00e4chstes",
"OptionMonthlySupporterMembership": "Monatliche Unterst\u00fctzer Mitgliedschaft",
"NoNextUpItemsMessage": "Es wurde nichts gefunden. Schauen Sie sich Ihre Shows an!",
"HeaderSupporterBenefit": "Eine Mitgliedschaft im Unterst\u00fctzer Club erm\u00f6glicht den Zugang zu Premium Plugins, Internet Kanalinhalten und mehr.",
"NoNextUpItemsMessage": "Es wurde nichts gefunden. Schau dir deine Shows an!",
"HeaderSupporterBenefit": "Eine Mitgliedschaft im Unterst\u00fctzer Club erm\u00f6glicht Zusatzleistungen wie den Zugang zu Premium Plugins, Internet-Kanalinhalte und mehr.",
"HeaderLatestEpisodes": "Neueste Episoden",
"OptionNoTrailer": "Kein Trailer",
"HeaderPersonTypes": "Personen Typen:",
@ -304,9 +304,9 @@
"OptionVideoBitrate": "Video Bitrate",
"LabelExternalPlayers": "Externe Abspielger\u00e4te:",
"OptionResumable": "Kann fortgesetzt werden",
"LabelExternalPlayersHelp": "Zeige Buttons um Inhalt auf externen Ger\u00e4te abzuspielen. Dies ist nur auf Ger\u00e4ten verf\u00fcgbar, die URL Schemes unterst\u00fctzen (Generell Android und iOS). In Verbindung mit externen Abspielern gibt es generell keine Unterst\u00fctzung f\u00fcr die Fernbedienung, Wiederholung oder die \u00dcbermittlung des \"Gesehen\" Status an den Server.",
"LabelExternalPlayersHelp": "Zeige Buttons um Inhalt auf externen Ger\u00e4te abzuspielen. Dies ist nur auf Ger\u00e4ten verf\u00fcgbar, die URL Schemes unterst\u00fctzen (Generell Android und iOS). In Verbindung mit externen Abspielern gibt es generell keine Unterst\u00fctzung f\u00fcr die Fernbedienung oder die Fortsetzung von gesehenen Inhalten.",
"HeaderSubtitleProfile": "Untertitel Profil",
"ScheduledTasksHelp": "Klicken Sie auf eine Aufgabe um den Zeitplan zu \u00e4ndern.",
"ScheduledTasksHelp": "Klicke auf eine Aufgabe um deren Zeitplan zu \u00e4ndern.",
"ScheduledTasksTitle": "Geplante Aufgaben",
"HeaderSubtitleProfiles": "Untertitel Profile",
"HeaderSubtitleProfilesHelp": "Untertitel Profile beschreiben die vom Ger\u00e4t unterst\u00fctzten Untertitelformate.",
@ -356,15 +356,15 @@
"OptionHasThemeSong": "Titellied",
"LabelEnableIntroParentalControl": "Aktiviere die smarte Kindersicherung",
"OptionHasThemeVideo": "Titelvideo",
"LabelEnableIntroParentalControlHelp": "Trailers will only be selected with a parental rating equal to or less than the content being watched.",
"LabelEnableIntroParentalControlHelp": "Es werden nur Trailer ausgew\u00e4hlt, die der Altersfreigabe des Inhalts entsprechen der angesehen wird.",
"TabMovies": "Filme",
"LabelThisFeatureRequiresSupporterHelp": "This feature requires an active supporter membership.",
"LabelThisFeatureRequiresSupporterHelp": "Diese Funktion ben\u00f6tigt eine aktive Unterst\u00fctzer Mitgliedschaft.",
"TabStudios": "Studios",
"OptionTrailersFromMyMoviesHelp": "Requires setup of local trailers.",
"OptionTrailersFromMyMoviesHelp": "Ben\u00f6tigt die Einrichtung lokaler Trailer.",
"TabTrailers": "Trailer",
"LabelCustomIntrosPath": "Custom intros path:",
"LabelCustomIntrosPath": "Benutzerdefinierter Pfad f\u00fcr Intros:",
"LabelArtists": "Interpreten:",
"LabelCustomIntrosPathHelp": "A folder containing video files. A video will be randomly selected and played after trailers.",
"LabelCustomIntrosPathHelp": "Ein Ordner der Videodateien beinhaltet. Ein Video wird zuf\u00e4llig ausgew\u00e4hlt und nach einem Trailer abgespielt.",
"LabelArtistsHelp": "Trenne mehrere Eintr\u00e4ge durch ;",
"ValueSpecialEpisodeName": "Special - {0}",
"HeaderLatestMovies": "Neueste Filme",
@ -399,7 +399,7 @@
"TabSupporterKey": "Unterst\u00fctzerschl\u00fcssel",
"TabBecomeSupporter": "Werde ein Unterst\u00fctzer",
"MediaBrowserHasCommunity": "Media Browser hat eine gedeihend Gemeinschalft von Nutzern und Unterst\u00fctzern.",
"CheckoutKnowledgeBase": "Verwenden Sie die Knowledge Base als Hilfe, um das Optimum aus Media Browser herauszuholen.",
"CheckoutKnowledgeBase": "Verwende die Knowledge Base als Hilfe, um das Optimum aus Media Browser herauszuholen.",
"SearchKnowledgeBase": "Durchsuche die Knowledge Base",
"VisitTheCommunity": "Besuche die Community",
"VisitMediaBrowserWebsite": "Besuche die Media Browser Website",
@ -426,7 +426,7 @@
"PismoMessage": "Verwendet Pismo File Mount durch eine gespendete Lizenz.",
"TangibleSoftwareMessage": "Verwendung konkreter L\u00f6sungen von Java\/C# Konvertern durch eine gespendete Lizenz.",
"HeaderCredits": "Herausgeber",
"PleaseSupportOtherProduces": "Bitte unterst\u00fctzen Sie andere freie Produkte die wir benutzen:",
"PleaseSupportOtherProduces": "Bitte unterst\u00fctze andere freie Produkte die wir benutzen:",
"VersionNumber": "Version {0}",
"TabPaths": "Pfade",
"TabServer": "Server",
@ -440,7 +440,7 @@
"LabelAllowServerAutoRestartHelp": "Der Server startet nur in benutzerfreien Leerlaufzeiten neu.",
"LabelEnableDebugLogging": "Aktiviere Debug Logging",
"LabelRunServerAtStartup": "Starte Server beim hochfahren.",
"LabelRunServerAtStartupHelp": "Dies wird Media Browser als Anwendung w\u00e4hrend der Windows Anmeldung starten und ihn in der Taskleiste anzeigen. Um Media Browser als Systemdienst zu nutzen, deaktivieren Sie diese Einstellung und starten anschlie\u00dfend den Dienst \u00fcber die Windows Systemsteuerung. Bitte beachten Sie, dass Sie Media Browser nicht zur gleichen Zeit als Systemdienst und als Anwendung nutzen k\u00f6nnen. Bevor Sie den Service starten, m\u00fcssen Sie zuerst die Anwendung schlie\u00dfen.",
"LabelRunServerAtStartupHelp": "Dies wird Media Browser als Anwendung w\u00e4hrend der Windows Anmeldung starten und ihn in der Taskleiste anzeigen. Um Media Browser als Systemdienst zu nutzen, deaktiviere diese Einstellung und starte anschlie\u00dfend den Dienst \u00fcber die Windows Systemsteuerung. Bitte beachte, dass Media Browser nicht zur gleichen Zeit als Systemdienst und als Anwendung genutzt werden kann. Bevor du den Service startest musst du zuerst die Anwendung schlie\u00dfen.",
"ButtonSelectDirectory": "W\u00e4hle Verzeichnis",
"LabelCustomPaths": "Definiere eigene Pfade. Felder leer lassen um die Standardwerte zu nutzen.",
"LabelCachePath": "Cache Pfad:",
@ -448,7 +448,7 @@
"LabelImagesByNamePath": "Images by name Pfad:",
"LabelImagesByNamePathHelp": "W\u00e4hle eine Verzeichnis f\u00fcr Schauspieler, Interpreten, Genre und Studio Bilder.",
"LabelMetadataPath": "Metadata Pfad:",
"LabelMetadataPathHelp": "W\u00e4hle eine Verzeichnis f\u00fcr heruntergeladenes Bildmaterial und Metadaten, falls diese nicht innerhalb der Medienverzeichnisse gespeichert werden sollen.",
"LabelMetadataPathHelp": "W\u00e4hle ein Verzeichnis f\u00fcr heruntergeladenes Bildmaterial und Metadaten, falls diese nicht innerhalb der Medienverzeichnisse gespeichert werden sollen.",
"LabelTranscodingTempPath": "Tempor\u00e4rer Transcoding Pfad:",
"LabelTranscodingTempPathHelp": "Dieses Verzeichnis beinhaltet Dateien die f\u00fcr den Betrieb des Transcoders benutzt werden. W\u00e4hle einen eigenen Pfad oder lasse das Feld frei, um den Standardspeicherort im Server Datenverzeichnis zu nutzen.",
"TabBasics": "Grundlagen",
@ -471,8 +471,8 @@
"LabelMetadataDownloadLanguage": "Bevorzugte Sprache f\u00fcr Downloads:",
"ButtonAutoScroll": "Auto-scroll",
"LabelImageSavingConvention": "Speicherconvention der Bilddatein:",
"LabelImageSavingConventionHelp": "Media Browser erkennt Bilddateien von den meisten gro\u00dfen Medienanwendungen. Die Auswahl ihrer Downloadconvention ist n\u00fctzlich, wenn Sie auch andere Produkte benutzen.",
"OptionImageSavingCompatible": "Kompatibilit\u00e4t - Media Browser\/XBMC\/Plex",
"LabelImageSavingConventionHelp": "Media Browser erkennt Bilddateien von den meisten gro\u00dfen Medienanwendungen. Die Festlegung deiner Download Einstellungen ist n\u00fctzlich, wenn du auch andere Produkte benutzt.",
"OptionImageSavingCompatible": "Kompatibilit\u00e4t - Media Browser\/Kodi\/Plex",
"OptionImageSavingStandard": "Standard - MB2",
"ButtonSignIn": "Einloggen",
"TitleSignIn": "Einloggen",
@ -480,7 +480,7 @@
"LabelUser": "Benutzer:",
"LabelPassword": "Passwort:",
"ButtonManualLogin": "Manuelle Anmeldung",
"PasswordLocalhostMessage": "Passw\u00f6rter werden nich gebraucht, wenn Sie sich vom Localhost aus einloggen.",
"PasswordLocalhostMessage": "Passw\u00f6rter werden nicht gebraucht, wenn du dich vom Localhost aus einloggst.",
"TabGuide": "Programm",
"TabChannels": "Kan\u00e4le",
"TabCollections": "Sammlungen",
@ -500,7 +500,7 @@
"HeaderUpcomingTV": "Bevorstehend",
"TabStatus": "Status",
"TabSettings": "Einstellungen",
"ButtonRefreshGuideData": "Aktualisiere TV-Guide Daten",
"ButtonRefreshGuideData": "Aktualisiere TV-Programmdaten",
"ButtonRefresh": "Aktualisieren",
"ButtonAdvancedRefresh": "Erweiterte Aktualiserung",
"OptionPriority": "Priorit\u00e4t",
@ -520,12 +520,12 @@
"HeaderDetails": "Details",
"TitleLiveTV": "Live-TV",
"LabelNumberOfGuideDays": "Anzahl von Tagen f\u00fcr die Programminformationen geladen werden sollen:",
"LabelNumberOfGuideDaysHelp": "Das laden von zus\u00e4tzlichen Programmdaten bietet einen besseren \u00dcberblick und die M\u00f6glichkeit weiter in die Zukunft zu planen. Aber es wird l\u00e4nger dauern alles herunterzuladen. Auto w\u00e4hlt auf der Grundlage der Anzahl der Kan\u00e4le.",
"LabelNumberOfGuideDaysHelp": "Das laden von zus\u00e4tzlichen Programmdaten bietet einen besseren \u00dcberblick und die M\u00f6glichkeit weiter in die Zukunft zu planen. Aber es wird l\u00e4nger dauern alles herunterzuladen. Auto w\u00e4hlt auf Grundlage der Kanalanzahl.",
"LabelActiveService": "Aktiver Service:",
"LabelActiveServiceHelp": "Mehrere TV Plugins k\u00f6nnen installiert sein, aber nur eines kann aktiv sein.",
"OptionAutomatic": "Auto",
"LiveTvPluginRequired": "Ein Live-TV Serviceproviderplugin ist notwendig um fortzufahren.",
"LiveTvPluginRequiredHelp": "Bitte installieren Sie eines der verf\u00fcgbaren Plugins, wie z.B. Next Pvr oder ServerWmc.",
"LiveTvPluginRequiredHelp": "Bitte installiere eines der verf\u00fcgbaren Plugins, wie z.B. Next Pvr oder ServerWmc.",
"LabelCustomizeOptionsPerMediaType": "Anpassungen f\u00fcr Medientyp:",
"OptionDownloadThumbImage": "Thumb",
"OptionDownloadMenuImage": "Men\u00fc",
@ -589,7 +589,7 @@
"ButtonPlayTrailer": "Trailer",
"LabelMissing": "Fehlend",
"LabelOffline": "Offline",
"PathSubstitutionHelp": "Pfad Substitutionen werden zum Abbilden eines Pfad auf dem Server zu einem Pfad der Clients direkt zugreifen k\u00f6nnen, verwendet. Weil Clients direkten Zugang zu den Medien auf dem Server haben, sind sie in der Lage die Medien direkt \u00fcber das Netzwerk zu spielen und dabei vermeiden sie die nutzung von Server-Ressourcen f\u00fcr streaming transkodieren.",
"PathSubstitutionHelp": "Pfadsubstitutionen werden zum Ersetzen eines Serverpfades durch einen Netzwerkpfad genutzt, auf den die Clients direkt zugreifen k\u00f6nnen. Weil Clients direkten Zugang zu den Medien auf dem Server haben, sind diese in der Lage die Medien direkt \u00fcber das Netzwerk zu spielen und dabei vermeiden sie die Nutzung von Server-Ressourcen f\u00fcr das transkodieren von Streams.",
"HeaderFrom": "Von",
"HeaderTo": "Nach",
"LabelFrom": "Von:",
@ -625,9 +625,9 @@
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Bestimmt die Dauer in Sekunden zwischen SSDP Suchvorg\u00e4ngen die von Media Browser durchgef\u00fchrt wird.",
"HeaderCustomDlnaProfiles": "Benutzerdefinierte Profile",
"HeaderSystemDlnaProfiles": "Systemprofile",
"CustomDlnaProfilesHelp": "Erstellen Sie ein benutzerdefiniertes Profil, um eine neue Zielger\u00e4t oder ein Systemprofil zu \u00fcberschreiben.",
"CustomDlnaProfilesHelp": "Erstelle ein benutzerdefiniertes Profil f\u00fcr ein neues Zielger\u00e4t, oder um ein vorhandenes Systemprofil zu \u00fcberschreiben.",
"SystemDlnaProfilesHelp": "Systemprofile sind schreibgesch\u00fctzt. \u00c4nderungen an einem Systemprofil werden als neues benutzerdefiniertes Profil gespeichert.",
"TitleDashboard": "Optionsleiste",
"TitleDashboard": "\u00dcbersicht",
"TabHome": "Home",
"TabInfo": "Info",
"HeaderLinks": "Links",
@ -639,7 +639,7 @@
"LabelFriendlyServerNameHelp": "Dieser Name wird benutzt um diesen Server zu identifizieren. Wenn leer gelassen, wird der Computername benutzt.",
"LabelPreferredDisplayLanguage": "Bevorzugte Anzeigesprache",
"LabelPreferredDisplayLanguageHelp": "Die \u00dcbersetzung von Media Browser ist ein andauerndes Projekt und noch nicht abgeschlossen.",
"LabelReadHowYouCanContribute": "Lesen Sie wie Sie dazu beitragen k\u00f6nnen.",
"LabelReadHowYouCanContribute": "Lese wie du dazu beitragen kannst.",
"HeaderNewCollection": "Neue Collection",
"HeaderAddToCollection": "Zur Sammlung hinzuf\u00fcgen",
"ButtonSubmit": "Best\u00e4tigen",
@ -648,17 +648,17 @@
"ButtonCreate": "Kreieren",
"LabelHttpServerPortNumber": "HTTP Server Port Nummer:",
"LabelWebSocketPortNumber": "Web Socket Port Nummer:",
"LabelEnableAutomaticPortHelp": "UPnP erlaubt einen automatisierte Router Konfiguration f\u00fcr den Fernzugriff. Das funktioniert vielleicht nicht mit manchen Routermodellen.",
"LabelEnableAutomaticPortHelp": "UPnP erlaubt eine automatisierte Router Konfiguration f\u00fcr den Fernzugriff. Das funktioniert vielleicht nicht mit manchen Routermodellen.",
"LabelExternalDDNS": "Externe DDNS:",
"LabelExternalDDNSHelp": "Wenn Sie eine dynamische DNS besitzen, tragen Sie sie hier ein. Media Browser Apps werden sie verwenden, wenn sie sich verbinden.",
"LabelExternalDDNSHelp": "Wenn du eine dynamische DNS besitzen, trage Sie sie hier ein. Media Browser Apps werden sie verwenden, wenn sie sich verbinden.",
"TabResume": "Fortsetzen",
"TabWeather": "Wetter",
"TitleAppSettings": "App Einstellungen",
"LabelMinResumePercentage": "Minimale Prozent f\u00fcr Wiederaufnahme:",
"LabelMaxResumePercentage": "Maximale Prozent f\u00fcr Wiederaufnahme:",
"LabelMinResumeDuration": "Minimale Dauer f\u00fcr Wiederaufnahme (Sekunden):",
"LabelMinResumePercentageHelp": "Titel werden als nicht abgespielt angenommen, wenn sie vor dieser Zeit gestoppt werden",
"LabelMaxResumePercentageHelp": "Titel werden als komplett abgespielt angenommen, wenn sie nach dieser Zeit gestoppt werden",
"LabelMinResumePercentageHelp": "Titel werden als \"nicht abgespielt\" eingetragen, wenn sie vor dieser Zeit gestoppt werden",
"LabelMaxResumePercentageHelp": "Titel werden als \"vollst\u00e4ndig abgespielt\" eingetragen, wenn sie nach dieser Zeit gestoppt werden",
"LabelMinResumeDurationHelp": "Titel k\u00fcrzer als dies werden nicht fortsetzbar sein",
"TitleAutoOrganize": "automatische Sortierung",
"TabActivityLog": "Aktivit\u00e4tsverlauf",
@ -679,9 +679,9 @@
"LabelEndingEpisodeNumberHelp": "Nur erforderlich f\u00fcr Mehrfachepisoden",
"HeaderSupportTheTeam": "Unterst\u00fcze das Media Browser Team",
"LabelSupportAmount": "Betrag (USD)",
"HeaderSupportTheTeamHelp": "Helfen sie der Weiterentwicklung dieses Projekts indem Sie spenden. Ein Teil der Spenden wird an freie Anwendungen auf die wir angewiesen sind weitergespendet.",
"HeaderSupportTheTeamHelp": "Hilf bei der Weiterentwicklung dieses Projekts indem du spendest. Ein Teil der Spenden wird an freie Anwendungen auf die wir angewiesen sind weiter gespendet.",
"ButtonEnterSupporterKey": "Supporter Key eintragen",
"DonationNextStep": "Sobald abgeschlossen, kehren Sie bitte hierher zur\u00fcck und tragen Sie den Unterst\u00fctzerschl\u00fcssel ein, den Sie per E-Mail erhalten haben.",
"DonationNextStep": "Sobald abgeschlossen, kehre bitte hierher zur\u00fcck und trage den Unterst\u00fctzerschl\u00fcssel ein, den du per E-Mail erhalten hast.",
"AutoOrganizeHelp": "Die \"Auto-Organisation\" \u00fcberpr\u00fcft die Download-Verzeichnisse auf neue Dateien und verschiebt diese in die Medienverzeichnisse.",
"AutoOrganizeTvHelp": "TV Dateien Organisation wird nur Episoden zu bereits vorhandenen Serien hinzuf\u00fcgen. Es werden keine neuen Serien angelegt.",
"OptionEnableEpisodeOrganization": "Aktiviere die Sortierung neuer Episoden",
@ -730,7 +730,7 @@
"LabelOldSupporterKey": "Alter Unterst\u00fctzerschl\u00fcssel",
"LabelNewSupporterKey": "Neuer Unterst\u00fctzerschl\u00fcssel",
"HeaderMultipleKeyLinking": "Mehrere Schl\u00fcssel zusammenf\u00fchren",
"MultipleKeyLinkingHelp": "Wenn Sie mehr als einen Unterst\u00fctzerschl\u00fcssel haben, benutzen Sie dieses Formular, um die alten Schl\u00fcssel mit ihrem neuen zusammen zuf\u00fchren.",
"MultipleKeyLinkingHelp": "Wenn du mehr als einen Unterst\u00fctzerschl\u00fcssel hast, benutze dieses Formular um die alten Schl\u00fcssel mit deinen neuen zusammenzuf\u00fchren.",
"LabelCurrentEmailAddress": "Aktuelle E-Mail Adresse",
"LabelCurrentEmailAddressHelp": "Die aktuelle E-Mail Adresse, an die ihr neuer Schl\u00fcssel gesendet wurde.",
"HeaderForgotKey": "Schl\u00fcssel vergessen",
@ -738,9 +738,9 @@
"LabelSupporterEmailAddress": "Die E-Mail Adresse, die zum Kauf des Schl\u00fcssels benutzt wurde.",
"ButtonRetrieveKey": "Schl\u00fcssel wiederherstellen",
"LabelSupporterKey": "Unterst\u00fctzerschl\u00fcssel (einf\u00fcgen aus E-Mail)",
"LabelSupporterKeyHelp": "Geben Sie ihren Unterst\u00fctzerschl\u00fcssel ein, um zus\u00e4tzliche Vorteile zugenie\u00dfen, die die Community f\u00fcr Media Browser entwickelt hat.",
"LabelSupporterKeyHelp": "Gebe deinen Unterst\u00fctzerschl\u00fcssel ein um zus\u00e4tzliche Vorteile zu genie\u00dfen, die die Community f\u00fcr Media Browser entwickelt hat.",
"MessageInvalidKey": "MB3 Schl\u00fcssel nicht vorhanden oder ung\u00fcltig.",
"ErrorMessageInvalidKey": "Um einen Premiuminhalt zu registrieren, m\u00fcssen sie auch ein MB3 Unters\u00fctzer sein. Bitte spenden sie und unterst\u00fctzen so die Weiterentwicklung des Kernprodukts. Danke.",
"ErrorMessageInvalidKey": "Um einen Premiuminhalt zu registrieren, musst du auch ein Media Browser Unterst\u00fctzer sein. Bitte spende und unterst\u00fctze so die Weiterentwicklung des Kernprodukts. Danke.",
"HeaderDisplaySettings": "Anzeige Einstellungen",
"TabPlayTo": "Spiele an",
"LabelEnableDlnaServer": "Aktiviere DLNA Server",
@ -904,7 +904,7 @@
"LabelModelUrl": "Modell URL",
"LabelSerialNumber": "Seriennummer",
"LabelDeviceDescription": "Ger\u00e4tebeschreibung",
"HeaderIdentificationCriteriaHelp": "Geben sie mindestens ein Identificationskriterium an.",
"HeaderIdentificationCriteriaHelp": "Gebe mindestens ein Identifikationskriterium an.",
"HeaderDirectPlayProfileHelp": "F\u00fcge Direct-Play Profile hinzu um die nativen Abspielm\u00f6glichkeiten von Ger\u00e4ten festzulegen.",
"HeaderTranscodingProfileHelp": "F\u00fcge Transkodierprofile hinzu, um festzulegen welche Formate genutzt werden sollen, falls transkodiert werden muss.",
"HeaderResponseProfileHelp": "Antwortprofile bieten eine M\u00f6glichkeit die Informationen, die w\u00e4hrend dem abspielen diverser Medientypen an die Abspielger\u00e4te gesendet werden, zu personalisieren.",
@ -1006,7 +1006,7 @@
"LabelChannelStreamQualityHelp": "In einer Umgebung mit langsamer Bandbreite kann die Beschr\u00e4nkung der Wiedergabequalit\u00e4t eine fl\u00fcssige Darstellung sichern.",
"OptionBestAvailableStreamQuality": "Die besten verf\u00fcgbaren",
"LabelEnableChannelContentDownloadingFor": "Aktiviere das herunterladen von Channel Inhalten f\u00fcr:",
"LabelEnableChannelContentDownloadingForHelp": "Manche Kan\u00e4le unterst\u00fctzen das herunterladen von Inhalten vor dem eigentlichen ansehen. Aktiviere diese Funktion in Umgebungen mit langsamer Bandbreite um Inhalte herunterzuladen w\u00e4hrend keine aktive Nutzung stattfindet. Die Inhalte werden dabei im Zuge der automatisierten Channel Download Aufgabe heruntergeladen.",
"LabelEnableChannelContentDownloadingForHelp": "Manche Kan\u00e4le unterst\u00fctzen das herunterladen von Inhalten vor dem eigentlichen ansehen. Aktiviere diese Funktion in Umgebungen mit langsamer Bandbreite, um Inhalte herunterzuladen w\u00e4hrend keine aktive Nutzung stattfindet. Die Inhalte werden dabei im Zuge der automatisierten Channel Download Aufgabe heruntergeladen.",
"LabelChannelDownloadPath": "Channel Inhalt Downloadverzeichnis:",
"LabelChannelDownloadPathHelp": "Lege, falls gew\u00fcnscht, einen eigenen Pfad f\u00fcr Downloads fest. Lasse das Feld frei, wenn in den internen Programmdatenordner heruntergeladen werden soll.",
"LabelChannelDownloadAge": "L\u00f6sche Inhalt nach: (Tagen)",
@ -1059,9 +1059,9 @@
"LabelProtocolInfo": "Protokoll Information:",
"LabelProtocolInfoHelp": "Der Wert, der f\u00fcr die Beantwortung von GetProtocolInfo Anfragen durch die Endger\u00e4te benutzt wird.",
"TabKodiMetadata": "Kodi",
"HeaderKodiMetadataHelp": "Media Browser bietet eine native Unterst\u00fctzung f\u00fcr Kodi NFO Metadaten und Bilder. Um Kodi Metadaten zu aktivieren oder zu deaktivieren und um Optionen f\u00fcr Ihre Medientypen zu konfigurieren, verwenden Sie die Registerkarte Erweitert.",
"HeaderKodiMetadataHelp": "Media Browser bietet eine native Unterst\u00fctzung f\u00fcr Kodi NFO Metadaten und Bilder. Um Kodi Metadaten zu aktivieren oder zu deaktivieren und um Optionen f\u00fcr deine Medientypen zu konfigurieren, verwende die Registerkarte Erweitert.",
"LabelKodiMetadataUser": "F\u00fcge \"Gesehen\" Daten von Benutzer in NFO Dateien hinzu f\u00fcr:",
"LabelKodiMetadataUserHelp": "Aktivieren Sie diese Option, um den \"Gesehen\" Status zwischen Media Browser und Kodi synchron zu halten.",
"LabelKodiMetadataUserHelp": "Aktiviere diese Option, um den \"Gesehen\" Status zwischen Media Browser und Kodi synchron zu halten.",
"LabelKodiMetadataDateFormat": "Ver\u00f6ffentlichungsdatum Format:",
"LabelKodiMetadataDateFormatHelp": "Alle Daten in den NFO's werde unter Benutzung dieses Format gelesen und geschrieben.",
"LabelKodiMetadataSaveImagePaths": "Speicher Bildpfade innerhalb der NFO Dateien",
@ -1084,7 +1084,7 @@
"LabelAutomaticallyDonate": "Spende diesen Geldbetrag jeden Monat automatisch",
"LabelAutomaticallyDonateHelp": "Du kannst die Zahlungen jederzeit \u00fcber deinen PayPal Account deaktivieren.",
"OptionList": "List",
"TabDashboard": "Optionsleiste",
"TabDashboard": "\u00dcbersicht",
"TitleServer": "Server:",
"LabelCache": "Cache:",
"LabelLogs": "Logs:",

View file

@ -283,7 +283,7 @@
"LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
"OptionNameSort": "Nazivu",
"HeaderXmlSettings": "Xml Settings",
"OptionFolderSort": "Folders",
"OptionFolderSort": "Mape",
"HeaderXmlDocumentAttributes": "Xml Document Attributes",
"OptionBudget": "Bud\u017eet",
"HeaderXmlDocumentAttribute": "Xml Document Attribute",
@ -500,24 +500,24 @@
"HeaderUpcomingTV": "Sljede\u0107e na TV-u",
"TabStatus": "Status",
"TabSettings": "Postavke",
"ButtonRefreshGuideData": "Refresh Guide Data",
"ButtonRefreshGuideData": "Osvje\u017ei TV vodi\u010d",
"ButtonRefresh": "Refresh",
"ButtonAdvancedRefresh": "Advanced Refresh",
"OptionPriority": "Priority",
"OptionRecordOnAllChannels": "Record program on all channels",
"OptionRecordAnytime": "Record program at any time",
"OptionRecordOnlyNewEpisodes": "Record only new episodes",
"HeaderDays": "Days",
"HeaderActiveRecordings": "Active Recordings",
"HeaderLatestRecordings": "Latest Recordings",
"HeaderAllRecordings": "All Recordings",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonRecord": "Record",
"ButtonDelete": "Delete",
"OptionPriority": "Prioritet",
"OptionRecordOnAllChannels": "Snimi emisiju na svim kanalima",
"OptionRecordAnytime": "Snimi emisiju u bilo koje vrijeme",
"OptionRecordOnlyNewEpisodes": "Snimi samo nove epizode",
"HeaderDays": "Dani",
"HeaderActiveRecordings": "Aktivna snimanja",
"HeaderLatestRecordings": "Zadnje snimke",
"HeaderAllRecordings": "Sve snimke",
"ButtonPlay": "Pokreni",
"ButtonEdit": "Izmjeni",
"ButtonRecord": "Snimi",
"ButtonDelete": "Izbri\u0161i",
"ButtonRemove": "Remove",
"OptionRecordSeries": "Record Series",
"HeaderDetails": "Details",
"OptionRecordSeries": "Snimi serije",
"HeaderDetails": "Detalji",
"TitleLiveTV": "Live TV",
"LabelNumberOfGuideDays": "Number of days of guide data to download:",
"LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.",

View file

@ -97,7 +97,7 @@
"LabelSelectUserViewOrder": "Velg rekkef\u00f8lge dine visninger vil bli vist inn i Media Browser apps",
"LabelDownloadInternetMetadataHelp": "MEdia Browser kan laste ned informasjon om mediet for en rikere presentasjon",
"LabelMetadataRefreshMode": "Metadata oppfrisknings modus:",
"TabPreferences": "Innstillinger",
"TabPreferences": "Preferanser",
"LabelImageRefreshMode": "Bilde oppfrisknings modus:",
"TabPassword": "Passord",
"OptionDownloadMissingImages": "Last ned manglende bilder",
@ -135,7 +135,7 @@
"LabelVoteCount": "Stemme tall:",
"OptionNoSubtitles": "Ingen Undertekster",
"LabelMetascore": "Metascore:",
"OptionDefaultSubtitlesHelp": "Undertekster som matcher spr\u00e5kpreferansene vil bli lastet n\u00e5r lyd er i utenlandsk spr\u00e5k.",
"OptionDefaultSubtitlesHelp": "Undertekster som samsvarer med foretrukket spr\u00e5k vil bli lastet n\u00e5r lyden er p\u00e5 et fremmed spr\u00e5k.",
"LabelCriticRating": "Kritiker anmeldelse:",
"OptionOnlyForcedSubtitlesHelp": "Kun undertekster marker som tvunget vil bli lastet.",
"LabelCriticRatingSummary": "Kritiker anmeldelse sammendrag:",
@ -217,7 +217,7 @@
"LabelLockItemToPreventChanges": "L\u00e5s dette elementet for \u00e5 hindre fremtidige endringer",
"OptionDislikes": "Misliker",
"MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.",
"OptionActors": "Skuespiller",
"OptionActors": "Skuespillere",
"TabDonate": "Doner",
"OptionGuestStars": "Gjeste-opptredelser",
"HeaderDonationType": "Donasjon type:",
@ -272,7 +272,7 @@
"OptionDateAdded": "Dato lagt til",
"MessagePremiumPluginRequiresMembership": "Dette programtillegget vil kreve et aktiv supporter medlemskap for \u00e5 kunne kj\u00f8pe etter 14 dagers gratis pr\u00f8veperiode.",
"OptionAlbumArtist": "Album Artist",
"HeaderReviews": "Reviews",
"HeaderReviews": "Anmeldelser",
"OptionArtist": "Artist",
"HeaderDeveloperInfo": "Utvikler informasjon",
"OptionAlbum": "Album",
@ -315,7 +315,7 @@
"TabCatalog": "Katalog",
"LabelMethod": "Metode:",
"PluginsTitle": "Programtillegg",
"LabelDidlMode": "Didl mode:",
"LabelDidlMode": "Didl modus:",
"HeaderAutomaticUpdates": "Automatiske oppdateringer",
"OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)",
"HeaderNowPlaying": "Spiller n\u00e5",
@ -328,11 +328,11 @@
"OptionHlsSegmentedSubtitles": "Hls segmented subtitles",
"HeaderFrequentlyPlayed": "Ofte avspilt",
"DevBuildWarning": "Dev builds er \u00e5 anses som p\u00e5 kanten. Disse har ikke blitt testet. Dette vil kunne medf\u00f8re til at applikasjonen kan krasje og komplette funksjoner ikke fungerer.",
"LabelSubtitleFormatHelp": "Example: srt",
"LabelSubtitleFormatHelp": "Eksempel: srt",
"LabelVideoType": "Video-type",
"ButtonLearnMore": "L\u00e6re mer",
"OptionBluray": "Bluray",
"TabPlayback": "Playback",
"TabPlayback": "Spill av",
"OptionDvd": "Dvd",
"HeaderTrailersAndExtras": "Trailers & Extras",
"OptionIso": "iso",
@ -579,7 +579,7 @@
"HeaderThemeVideos": "Tema Videoer",
"HeaderThemeSongs": "Tema Sanger",
"HeaderScenes": "Scener",
"HeaderAwardsAndReviews": "Utmerkelser og anmeldsler",
"HeaderAwardsAndReviews": "Priser og anmeldelser",
"HeaderSoundtracks": "Lydspor",
"HeaderMusicVideos": "Musikk Videoer",
"HeaderSpecialFeatures": "Spesielle Funksjoner",
@ -1062,7 +1062,7 @@
"HeaderKodiMetadataHelp": "Media Browser includes native support for Kodi Nfo metadata and images. To enable or disable Kodi metadata, use the Advanced tab to configure options for your media types.",
"LabelKodiMetadataUser": "Add user watch data to nfo's for:",
"LabelKodiMetadataUserHelp": "Enable this to keep watch data in sync between Media Browser and Kodi.",
"LabelKodiMetadataDateFormat": "Release date format:",
"LabelKodiMetadataDateFormat": "Utgivelsesdato format:",
"LabelKodiMetadataDateFormatHelp": "All dates within nfo's will be read and written to using this format.",
"LabelKodiMetadataSaveImagePaths": "Save image paths within nfo files",
"LabelKodiMetadataSaveImagePathsHelp": "This is recommended if you have image file names that don't conform to Kodi guidelines.",

View file

@ -1000,7 +1000,7 @@
"MessageNoPlaylistItemsAvailable": "De afspeellijst is momenteel leeg.",
"HeaderWelcomeToMediaBrowserWebClient": "Welkom op de Media Browser Web Client",
"ButtonDismiss": "Afwijzen",
"ButtonTakeTheTour": "Take the tour",
"ButtonTakeTheTour": "Neem de tour",
"ButtonEditOtherUserPreferences": "Bewerk persoonlijke voorkeuren van deze gebruiker.",
"LabelChannelStreamQuality": "Voorkeurs kwaliteit internet stream:",
"LabelChannelStreamQualityHelp": "Bij weinig beschikbare bandbreedte kan het verminderen van de kwaliteit betere streams opleveren.",
@ -1013,7 +1013,7 @@
"LabelChannelDownloadAgeHelp": "Gedownloade inhoud die ouder is zal worden verwijderd. Afspelen via internet streaming blijft mogelijk.",
"ChannelSettingsFormHelp": "Installeer kanalen zoals Trailers en Vimeo in de Plug-in catalogus.",
"LabelSelectCollection": "Selecteer verzameling:",
"ButtonOptions": "Options",
"ButtonOptions": "Opties",
"ViewTypeMovies": "Films",
"ViewTypeTvShows": "TV",
"ViewTypeGames": "Games",

View file

@ -96,27 +96,27 @@
"LabelDownloadInternetMetadata": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430",
"LabelSelectUserViewOrder": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0440\u0435\u0434\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Media Browser",
"LabelDownloadInternetMetadataHelp": "\u0412 Media Browser \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f.",
"LabelMetadataRefreshMode": "\u0420\u0435\u0436\u0438\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:",
"LabelMetadataRefreshMode": "\u0420\u0435\u0436\u0438\u043c \u043f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:",
"TabPreferences": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
"LabelImageRefreshMode": "\u0420\u0435\u0436\u0438\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432:",
"LabelImageRefreshMode": "\u0420\u0435\u0436\u0438\u043c \u043f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432:",
"TabPassword": "\u041f\u0430\u0440\u043e\u043b\u044c",
"OptionDownloadMissingImages": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u0442\u0441\u0443\u0442-\u0438\u0445 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432",
"TabLibraryAccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435",
"OptionReplaceExistingImages": "\u0417\u0430\u043c\u0435\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442-\u0438\u0445 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432",
"TabImage": "\u0420\u0438\u0441\u0443\u043d\u043e\u043a",
"OptionRefreshAllData": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445",
"OptionRefreshAllData": "\u041f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445",
"TabProfile": "\u041f\u0440\u043e\u0444\u0438\u043b\u044c",
"OptionAddMissingDataOnly": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0441\u0443\u0442-\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445",
"TabMetadata": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435",
"OptionLocalRefreshOnly": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f",
"OptionLocalRefreshOnly": "\u041f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435",
"TabImages": "\u0420\u0438\u0441\u0443\u043d\u043a\u0438",
"HeaderRefreshMetadata": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445",
"HeaderRefreshMetadata": "\u041f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445",
"TabNotifications": "\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f",
"HeaderPersonInfo": "\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0435",
"TabCollectionTitles": "\u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f",
"HeaderIdentifyItem": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",
"HeaderIdentifyItem": "\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",
"LabelDisplayMissingEpisodesWithinSeasons": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0437\u043e\u043d\u043e\u0432",
"HeaderIdentifyItemHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430. \u0414\u043b\u044f \u043f\u0440\u0438\u0440\u043e\u0441\u0442\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439.",
"HeaderIdentifyItemHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043f\u043e\u0438\u0441\u043a\u0430. \u0414\u043b\u044f \u043f\u0440\u0438\u0440\u043e\u0441\u0442\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u0431\u0435\u0440\u0438\u0442\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435.",
"LabelUnairedMissingEpisodesWithinSeasons": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0437\u043e\u043d\u043e\u0432",
"HeaderConfirmDeletion": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f",
"HeaderVideoPlaybackSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435\u043e",
@ -124,7 +124,7 @@
"HeaderPlaybackSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f",
"LabelIfYouWishToContinueWithDeletion": "\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u044d\u0442\u043e, \u0432\u0432\u0435\u0434\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:",
"LabelAudioLanguagePreference": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 \u0430\u0443\u0434\u0438\u043e:",
"ButtonIdentify": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c",
"ButtonIdentify": "\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c",
"LabelSubtitleLanguagePreference": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432:",
"LabelAlbumArtist": "\u0410\u043b\u044c\u0431\u043e\u043c\u043d\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c:",
"OptionDefaultSubtitles": "\u0423\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u0435",
@ -249,7 +249,7 @@
"OptionDirector": "\u0420\u0435\u0436\u0438\u0441\u0441\u0451\u0440",
"ButtonSort": "\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c",
"OptionGuestStar": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0451\u043d\u043d\u044b\u0439 \u0430\u043a\u0442\u0451\u0440",
"HeaderSortBy": "\u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0439:",
"HeaderSortBy": "\u0423\u0441\u043b\u043e\u0432\u0438\u0435:",
"OptionProducer": "\u041f\u0440\u043e\u0434\u044e\u0441\u0435\u0440",
"HeaderSortOrder": "\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435:",
"OptionWriter": "\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0441\u0442",
@ -471,7 +471,7 @@
"LabelMetadataDownloadLanguage": "\u041f\u0440\u0435\u0434\u043f\u043e\u0447-\u044b\u0439 \u044f\u0437\u044b\u043a \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e:",
"ButtonAutoScroll": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443",
"LabelImageSavingConvention": "\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432:",
"LabelImageSavingConventionHelp": "\u0412 Media Browser \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u044e\u0442\u0441\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0439\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0412\u044b\u0431\u043e\u0440 \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0435\u0449\u0451 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b.",
"LabelImageSavingConventionHelp": "\u0412 Media Browser \u043f\u0440\u0438\u0437\u043d\u0430\u044e\u0442\u0441\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0439\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0412\u044b\u0431\u043e\u0440 \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0435\u0449\u0451 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432.",
"OptionImageSavingCompatible": "\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 - Media Browser\/Kodi\/Plex",
"OptionImageSavingStandard": "\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 - MB2",
"ButtonSignIn": "\u0412\u043e\u0439\u0442\u0438",
@ -500,9 +500,9 @@
"HeaderUpcomingTV": "\u0421\u043a\u043e\u0440\u043e",
"TabStatus": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435",
"TabSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b",
"ButtonRefreshGuideData": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0433\u0438\u0434\u0430",
"ButtonRefresh": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c",
"ButtonAdvancedRefresh": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e",
"ButtonRefreshGuideData": "\u041f\u043e\u0434\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0433\u0438\u0434\u0430",
"ButtonRefresh": "\u041f\u043e\u0434\u043d\u043e\u0432\u0438\u0442\u044c",
"ButtonAdvancedRefresh": "\u041f\u043e\u0434\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e",
"OptionPriority": "\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442",
"OptionRecordOnAllChannels": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0441\u043e \u0432\u0441\u0435\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432",
"OptionRecordAnytime": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f",
@ -636,7 +636,7 @@
"LinkGithub": "\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Github",
"LinkApiDocumentation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e API",
"LabelFriendlyServerName": "\u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430:",
"LabelFriendlyServerNameHelp": "\u0414\u0430\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430.",
"LabelFriendlyServerNameHelp": "\u0414\u0430\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430.",
"LabelPreferredDisplayLanguage": "\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:",
"LabelPreferredDisplayLanguageHelp": "\u041f\u0435\u0440\u0435\u0432\u043e\u0434 Media Browser \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 \u0438 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d.",
"LabelReadHowYouCanContribute": "\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434.",
@ -862,8 +862,8 @@
"OptionPlainVideoItems": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0438\u0434\u0435\u043e\u0444\u0430\u0439\u043b\u044b, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0432\u0438\u0434\u0435\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b",
"OptionPlainVideoItemsHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u0432\u0441\u0435 \u0432\u0438\u0434\u0435\u043e\u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 DIDL \u043a\u0430\u043a \u00abobject.item.videoItem\u00bb, \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00abobject.item.videoItem.movie\u00bb.",
"LabelSupportedMediaTypes": "\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445:",
"TabIdentification": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f",
"HeaderIdentification": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f",
"TabIdentification": "\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0438\u0435",
"HeaderIdentification": "\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0438\u0435",
"TabDirectPlay": "\u041f\u0440\u044f\u043c\u043e\u0435 \u0432\u043e\u0441\u043f\u0440-\u0438\u0435",
"TabContainers": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b",
"TabCodecs": "\u041a\u043e\u0434\u0435\u043a\u0438",
@ -904,7 +904,7 @@
"LabelModelUrl": "URL \u043c\u043e\u0434\u0435\u043b\u0438",
"LabelSerialNumber": "\u0421\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440",
"LabelDeviceDescription": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430",
"HeaderIdentificationCriteriaHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439.",
"HeaderIdentificationCriteriaHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0438\u044f.",
"HeaderDirectPlayProfileHelp": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e.",
"HeaderTranscodingProfileHelp": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430.",
"HeaderResponseProfileHelp": "\u041f\u0440\u043e\u0444\u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u0438\u043a\u043e\u0432 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c\u0443\u044e \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0440\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445.",
@ -1106,7 +1106,7 @@
"LabelAppNameExample": "\u041f\u0440\u0438\u043c\u0435\u0440: Sickbeard, NzbDrone",
"HeaderNewApiKeyHelp": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438 \u0441 Media Browser.",
"HeaderHttpHeaders": "HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438",
"HeaderIdentificationHeader": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",
"HeaderIdentificationHeader": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0438\u044f",
"LabelValue": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435:",
"LabelMatchType": "\u0422\u0438\u043f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f:",
"OptionEquals": "\u0420\u0430\u0432\u043d\u043e",
@ -1160,7 +1160,7 @@
"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",
"OptionUnidentified": "\u041d\u0435\u043e\u043f\u043e\u0437\u043d\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",
"HeaderEpisodes": "\u042d\u043f\u0438\u0437\u043e\u0434\u044b:",

View file

@ -839,7 +839,7 @@
"LabelChannelDownloadAgeHelp": "Downloaded content older than this will be deleted. It will remain playable via internet streaming.",
"ChannelSettingsFormHelp": "Install channels such as Trailers and Vimeo in the plugin catalog.",
"LabelSelectCollection": "Select collection:",
"ButtonOptions": "Options",
"ButtonOptions": "Options",
"ViewTypeMovies": "Movies",
"ViewTypeTvShows": "TV",
"ViewTypeGames": "Games",
@ -1194,9 +1194,14 @@
"LabelLimitIntrosToUnwatchedContent": "Only use trailers from unwatched content",
"LabelEnableIntroParentalControl": "Enable smart parental control",
"LabelEnableIntroParentalControlHelp": "Trailers will only be selected with a parental rating equal to or less than the content being watched.",
"LabelThisFeatureRequiresSupporterHelp": "This feature requires an active supporter membership.",
"LabelTheseFeaturesRequireSupporterHelpAndTrailers": "These features require an active supporter membership and installation of the Trailer channel plugin.",
"OptionTrailersFromMyMoviesHelp": "Requires setup of local trailers.",
"LabelCustomIntrosPath": "Custom intros path:",
"LabelCustomIntrosPathHelp": "A folder containing video files. A video will be randomly selected and played after trailers.",
"ValueSpecialEpisodeName": "Special - {0}"
"ValueSpecialEpisodeName": "Special - {0}",
"LabelSelectInternetTrailersForCinemaMode": "Internet trailers:",
"OptionUpcomingDvdMovies": "Include trailers from new and upcoming movies on Dvd & Blu-ray",
"OptionUpcomingStreamingMovies": "Include trailers from new and upcoming movies on Netflix",
"LabelDisplayTrailersWithinMovieSuggestions": "Display trailers within movie suggestions",
"LabelDisplayTrailersWithinMovieSuggestionsHelp": "Requires installation of the Trailer channel."
}

View file

@ -1,11 +1,11 @@
using System.Collections.Generic;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Threading;

View file

@ -1,10 +1,9 @@
using System.Collections.Generic;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Threading;
@ -57,7 +56,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
}
private SqliteShrinkMemoryTimer _shrinkMemoryTimer;
/// <summary>
/// Opens the connection to the database
/// </summary>
@ -241,7 +240,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
cmd.ExecuteNonQuery();
}
cancellationToken.ThrowIfCancellationRequested();
}
@ -302,26 +301,24 @@ namespace MediaBrowser.Server.Implementations.Persistence
using (var cmd = _connection.CreateCommand())
{
cmd.CommandText = "select rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate from userdata where key = @key and userId=@userId";
cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate from userdata where key = @key and userId=@userId";
cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key;
cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
var userData = new UserItemData
{
UserId = userId,
Key = key
};
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
{
if (reader.Read())
{
ReadRow(reader, ref userData);
return ReadRow(reader);
}
}
return userData;
return new UserItemData
{
UserId = userId,
Key = key
};
}
}
@ -339,7 +336,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
using (var cmd = _connection.CreateCommand())
{
cmd.CommandText = "select rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,key from userdata where userId=@userId";
cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate from userdata where userId=@userId";
cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
@ -347,42 +344,39 @@ namespace MediaBrowser.Server.Implementations.Persistence
{
while (reader.Read())
{
var userData = new UserItemData
{
UserId = userId,
};
ReadRow(reader, ref userData);
userData.Key = reader.GetString(6);
yield return userData;
yield return ReadRow(reader);
}
}
}
}
/// <summary>
/// Read a row from the specified reader into the provided userData object
/// </summary>
/// <param name="reader"></param>
/// <param name="userData"></param>
private static void ReadRow(IDataReader reader, ref UserItemData userData)
private UserItemData ReadRow(IDataReader reader)
{
if (!reader.IsDBNull(0))
var userData = new UserItemData();
userData.Key = reader.GetString(0);
userData.UserId = reader.GetGuid(1);
if (!reader.IsDBNull(2))
{
userData.Rating = reader.GetDouble(0);
userData.Rating = reader.GetDouble(2);
}
userData.Played = reader.GetBoolean(1);
userData.PlayCount = reader.GetInt32(2);
userData.IsFavorite = reader.GetBoolean(3);
userData.PlaybackPositionTicks = reader.GetInt64(4);
userData.Played = reader.GetBoolean(3);
userData.PlayCount = reader.GetInt32(4);
userData.IsFavorite = reader.GetBoolean(5);
userData.PlaybackPositionTicks = reader.GetInt64(6);
if (!reader.IsDBNull(5))
if (!reader.IsDBNull(7))
{
userData.LastPlayedDate = reader.GetDateTime(5).ToUniversalTime();
userData.LastPlayedDate = reader.GetDateTime(7).ToUniversalTime();
}
return userData;
}
/// <summary>

View file

@ -472,7 +472,7 @@ namespace MediaBrowser.ServerApplication
progress.Report(15);
ChannelManager = new ChannelManager(UserManager, DtoService, LibraryManager, Logger, ServerConfigurationManager, FileSystemManager, UserDataManager, JsonSerializer, LocalizationManager);
ChannelManager = new ChannelManager(UserManager, DtoService, LibraryManager, Logger, ServerConfigurationManager, FileSystemManager, UserDataManager, JsonSerializer, LocalizationManager, HttpClient);
RegisterSingleInstance(ChannelManager);
TVSeriesManager = new TVSeriesManager(UserManager, UserDataManager, LibraryManager);

View file

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

View file

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

View file

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

View file

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Server.Core</id>
<version>3.0.447</version>
<version>3.0.449</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.447" />
<dependency id="MediaBrowser.Common" version="3.0.449" />
</dependencies>
</metadata>
<files>

View file

@ -12,7 +12,7 @@ We have several client apps released and in production:
- [iPad](https://itunes.apple.com/us/app/media-browser-client/id879475585 "iPad")
- [iPhone](https://itunes.apple.com/us/app/media-browser-for-ios/id705058087?mt=8 "iPhone")
- [Media Portal](http://www.team-mediaportal.com/ "Media Portal")
- [Roku](http://www.roku.com/channels/#!details/34503/media-browser "Roku")
- [Roku](http://www.roku.com/channels/#!details/44191/media-browser-for-roku "Roku")
- Windows 7/8 Desktop
- Windows Media Center
- [Windows Phone](http://www.windowsphone.com/s?appid=f4971ed9-f651-4bf6-84bb-94fd98613b86 "Windows Phone")