connect updates

pull/702/head
Luke Pulverenti 10 years ago
parent c8a735bcb1
commit d74e3b2dea

@ -107,7 +107,7 @@ namespace MediaBrowser.Api
return ResultFactory.GetStaticFileResult(Request, path);
}
private readonly char[] _dashReplaceChars = { '?', '/' };
private readonly char[] _dashReplaceChars = { '?', '/', '&' };
private const char SlugChar = '-';
protected MusicArtist GetArtist(string name, ILibraryManager libraryManager)

@ -152,7 +152,7 @@ namespace MediaBrowser.Api
private MetadataRefreshOptions GetRefreshOptions(BaseRefreshRequest request)
{
return new MetadataRefreshOptions
return new MetadataRefreshOptions(new DirectoryService())
{
MetadataRefreshMode = request.MetadataRefreshMode,
ImageRefreshMode = request.ImageRefreshMode,

@ -13,7 +13,6 @@ using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.LiveTv;
using MediaBrowser.Model.MediaInfo;
using System;
using System.Collections.Generic;
@ -1545,6 +1544,7 @@ namespace MediaBrowser.Api.Playback
state.InputVideoSync = "-1";
state.InputAudioSync = "1";
state.InputContainer = recording.Container;
state.ReadInputAtNativeFramerate = source.ReadAtNativeFramerate;
}
else if (item is LiveTvChannel)
{
@ -1572,6 +1572,7 @@ namespace MediaBrowser.Api.Playback
state.RemoteHttpHeaders = mediaSource.RequiredHttpHeaders;
state.InputBitrate = mediaSource.Bitrate;
state.InputFileSize = mediaSource.Size;
state.ReadInputAtNativeFramerate = mediaSource.ReadAtNativeFramerate;
mediaStreams = mediaSource.MediaStreams;
}
else
@ -1588,6 +1589,7 @@ namespace MediaBrowser.Api.Playback
state.InputContainer = mediaSource.Container;
state.InputFileSize = mediaSource.Size;
state.InputBitrate = mediaSource.Bitrate;
state.ReadInputAtNativeFramerate = mediaSource.ReadAtNativeFramerate;
var video = item as Video;
@ -1687,6 +1689,7 @@ namespace MediaBrowser.Api.Playback
state.RemoteHttpHeaders = mediaSource.RequiredHttpHeaders;
state.InputBitrate = mediaSource.Bitrate;
state.InputFileSize = mediaSource.Size;
state.ReadInputAtNativeFramerate = mediaSource.ReadAtNativeFramerate;
AttachMediaStreamInfo(state, mediaSource.MediaStreams, videoRequest, requestedUrl);
}

@ -95,15 +95,7 @@ namespace MediaBrowser.Api.Playback
public bool DeInterlace { get; set; }
public bool ReadInputAtNativeFramerate
{
get {
return InputProtocol == MediaProtocol.Rtmp ||
string.Equals(InputContainer, "wtv", StringComparison.OrdinalIgnoreCase) ||
!string.IsNullOrEmpty(LiveTvStreamId);
}
}
public bool ReadInputAtNativeFramerate { get; set; }
public TransportStreamTimestamp InputTimestamp { get; set; }

@ -254,7 +254,7 @@ namespace MediaBrowser.Api.Subtitles
await _subtitleManager.DownloadSubtitles(video, request.SubtitleId, CancellationToken.None)
.ConfigureAwait(false);
await video.RefreshMetadata(new MetadataRefreshOptions(), CancellationToken.None).ConfigureAwait(false);
await video.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService()), CancellationToken.None).ConfigureAwait(false);
}
catch (Exception ex)
{

@ -375,11 +375,11 @@ namespace MediaBrowser.Api.UserLibrary
if (wasPlayed)
{
await item.MarkPlayed(user, datePlayed, _userDataRepository).ConfigureAwait(false);
await item.MarkPlayed(user, datePlayed, true).ConfigureAwait(false);
}
else
{
await item.MarkUnplayed(user, _userDataRepository).ConfigureAwait(false);
await item.MarkUnplayed(user).ConfigureAwait(false);
}
return _userDataRepository.GetUserDataDto(item, user);

@ -37,6 +37,8 @@ namespace MediaBrowser.Controller.Channels
public string Id { get; set; }
public bool ReadAtNativeFramerate { get; set; }
public ChannelMediaInfo()
{
RequiredHttpHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
@ -59,7 +61,8 @@ namespace MediaBrowser.Controller.Channels
RequiredHttpHeaders = RequiredHttpHeaders,
RunTimeTicks = RunTimeTicks,
Name = id,
Id = id
Id = id,
ReadAtNativeFramerate = ReadAtNativeFramerate
};
var bitrate = (AudioBitrate ?? 0) + (VideoBitrate ?? 0);

@ -766,7 +766,7 @@ namespace MediaBrowser.Controller.Entities
public Task RefreshMetadata(CancellationToken cancellationToken)
{
return RefreshMetadata(new MetadataRefreshOptions(), cancellationToken);
return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService()), cancellationToken);
}
/// <summary>
@ -783,8 +783,6 @@ namespace MediaBrowser.Controller.Entities
if (IsFolder || Parent != null)
{
options.DirectoryService = options.DirectoryService ?? new DirectoryService(Logger);
try
{
var files = locationType != LocationType.Remote && locationType != LocationType.Virtual ?
@ -1360,10 +1358,12 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
/// <param name="user">The user.</param>
/// <param name="datePlayed">The date played.</param>
/// <param name="userManager">The user manager.</param>
/// <param name="resetPosition">if set to <c>true</c> [reset position].</param>
/// <returns>Task.</returns>
/// <exception cref="System.ArgumentNullException"></exception>
public virtual async Task MarkPlayed(User user, DateTime? datePlayed, IUserDataManager userManager)
public virtual async Task MarkPlayed(User user,
DateTime? datePlayed,
bool resetPosition)
{
if (user == null)
{
@ -1372,7 +1372,7 @@ namespace MediaBrowser.Controller.Entities
var key = GetUserDataKey();
var data = userManager.GetUserData(user.Id, key);
var data = UserDataManager.GetUserData(user.Id, key);
if (datePlayed.HasValue)
{
@ -1383,20 +1383,24 @@ namespace MediaBrowser.Controller.Entities
// Ensure it's at least one
data.PlayCount = Math.Max(data.PlayCount, 1);
if (resetPosition)
{
data.PlaybackPositionTicks = 0;
}
data.LastPlayedDate = datePlayed ?? data.LastPlayedDate;
data.Played = true;
await userManager.SaveUserData(user.Id, this, data, UserDataSaveReason.TogglePlayed, CancellationToken.None).ConfigureAwait(false);
await UserDataManager.SaveUserData(user.Id, this, data, UserDataSaveReason.TogglePlayed, CancellationToken.None).ConfigureAwait(false);
}
/// <summary>
/// Marks the unplayed.
/// </summary>
/// <param name="user">The user.</param>
/// <param name="userManager">The user manager.</param>
/// <returns>Task.</returns>
/// <exception cref="System.ArgumentNullException"></exception>
public virtual async Task MarkUnplayed(User user, IUserDataManager userManager)
public virtual async Task MarkUnplayed(User user)
{
if (user == null)
{
@ -1405,7 +1409,7 @@ namespace MediaBrowser.Controller.Entities
var key = GetUserDataKey();
var data = userManager.GetUserData(user.Id, key);
var data = UserDataManager.GetUserData(user.Id, key);
//I think it is okay to do this here.
// if this is only called when a user is manually forcing something to un-played
@ -1415,7 +1419,7 @@ namespace MediaBrowser.Controller.Entities
data.LastPlayedDate = null;
data.Played = false;
await userManager.SaveUserData(user.Id, this, data, UserDataSaveReason.TogglePlayed, CancellationToken.None).ConfigureAwait(false);
await UserDataManager.SaveUserData(user.Id, this, data, UserDataSaveReason.TogglePlayed, CancellationToken.None).ConfigureAwait(false);
}
/// <summary>

@ -319,7 +319,7 @@ namespace MediaBrowser.Controller.Entities
public Task ValidateChildren(IProgress<double> progress, CancellationToken cancellationToken)
{
return ValidateChildren(progress, cancellationToken, new MetadataRefreshOptions());
return ValidateChildren(progress, cancellationToken, new MetadataRefreshOptions(new DirectoryService()));
}
/// <summary>
@ -332,8 +332,6 @@ namespace MediaBrowser.Controller.Entities
/// <returns>Task.</returns>
public Task ValidateChildren(IProgress<double> progress, CancellationToken cancellationToken, MetadataRefreshOptions metadataRefreshOptions, bool recursive = true)
{
metadataRefreshOptions.DirectoryService = metadataRefreshOptions.DirectoryService ?? new DirectoryService(Logger);
return ValidateChildrenWithCancellationSupport(progress, cancellationToken, recursive, true, metadataRefreshOptions, metadataRefreshOptions.DirectoryService);
}
@ -1141,12 +1139,16 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
/// <param name="user">The user.</param>
/// <param name="datePlayed">The date played.</param>
/// <param name="userManager">The user manager.</param>
/// <param name="resetPosition">if set to <c>true</c> [reset position].</param>
/// <returns>Task.</returns>
public override async Task MarkPlayed(User user, DateTime? datePlayed, IUserDataManager userManager)
public override async Task MarkPlayed(User user,
DateTime? datePlayed,
bool resetPosition)
{
// Sweep through recursively and update status
var tasks = GetRecursiveChildren(user, true).Where(i => !i.IsFolder && i.LocationType != LocationType.Virtual).Select(c => c.MarkPlayed(user, datePlayed, userManager));
var tasks = GetRecursiveChildren(user, true)
.Where(i => !i.IsFolder && i.LocationType != LocationType.Virtual)
.Select(c => c.MarkPlayed(user, datePlayed, resetPosition));
await Task.WhenAll(tasks).ConfigureAwait(false);
}
@ -1155,12 +1157,13 @@ namespace MediaBrowser.Controller.Entities
/// Marks the unplayed.
/// </summary>
/// <param name="user">The user.</param>
/// <param name="userManager">The user manager.</param>
/// <returns>Task.</returns>
public override async Task MarkUnplayed(User user, IUserDataManager userManager)
public override async Task MarkUnplayed(User user)
{
// Sweep through recursively and update status
var tasks = GetRecursiveChildren(user, true).Where(i => !i.IsFolder && i.LocationType != LocationType.Virtual).Select(c => c.MarkUnplayed(user, userManager));
var tasks = GetRecursiveChildren(user, true)
.Where(i => !i.IsFolder && i.LocationType != LocationType.Virtual)
.Select(c => c.MarkUnplayed(user));
await Task.WhenAll(tasks).ConfigureAwait(false);
}
@ -1195,14 +1198,14 @@ namespace MediaBrowser.Controller.Entities
public override bool IsPlayed(User user)
{
return GetRecursiveChildren(user).Where(i => !i.IsFolder && i.LocationType != LocationType.Virtual)
return GetRecursiveChildren(user)
.Where(i => !i.IsFolder && i.LocationType != LocationType.Virtual)
.All(i => i.IsPlayed(user));
}
public override bool IsUnplayed(User user)
{
return GetRecursiveChildren(user).Where(i => !i.IsFolder && i.LocationType != LocationType.Virtual)
.All(i => i.IsUnplayed(user));
return !IsPlayed(user);
}
public override void FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, User user)

@ -179,7 +179,7 @@ namespace MediaBrowser.Controller.Entities
Name = newName;
return RefreshMetadata(new MetadataRefreshOptions
return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService())
{
ReplaceAllMetadata = true,
ImageRefreshMode = ImageRefreshMode.FullRefresh,

@ -398,9 +398,8 @@ namespace MediaBrowser.Controller.Entities
var currentImagePath = video.GetImagePath(ImageType.Primary);
var ownerImagePath = this.GetImagePath(ImageType.Primary);
var newOptions = new MetadataRefreshOptions
var newOptions = new MetadataRefreshOptions(options.DirectoryService)
{
DirectoryService = options.DirectoryService,
ImageRefreshMode = options.ImageRefreshMode,
MetadataRefreshMode = options.MetadataRefreshMode,
ReplaceAllMetadata = options.ReplaceAllMetadata

@ -25,7 +25,13 @@ namespace MediaBrowser.Controller.IO
/// <param name="resolveShortcuts">if set to <c>true</c> [resolve shortcuts].</param>
/// <returns>Dictionary{System.StringFileSystemInfo}.</returns>
/// <exception cref="System.ArgumentNullException">path</exception>
public static Dictionary<string, FileSystemInfo> GetFilteredFileSystemEntries(IDirectoryService directoryService, string path, IFileSystem fileSystem, ILogger logger, ItemResolveArgs args, int flattenFolderDepth = 0, bool resolveShortcuts = true)
public static Dictionary<string, FileSystemInfo> GetFilteredFileSystemEntries(IDirectoryService directoryService,
string path,
IFileSystem fileSystem,
ILogger logger,
ItemResolveArgs args,
int flattenFolderDepth = 0,
bool resolveShortcuts = true)
{
if (string.IsNullOrEmpty(path))
{
@ -36,21 +42,13 @@ namespace MediaBrowser.Controller.IO
throw new ArgumentNullException("args");
}
var entries = directoryService.GetFileSystemEntries(path);
if (!resolveShortcuts && flattenFolderDepth == 0)
{
// Seeing dupes on some users file system for some reason
var dictionary = new Dictionary<string, FileSystemInfo>(StringComparer.OrdinalIgnoreCase);
foreach (var info in entries)
{
dictionary[info.FullName] = info;
}
return dictionary;
return directoryService.GetFileSystemDictionary(path);
}
var entries = directoryService.GetFileSystemEntries(path);
var dict = new Dictionary<string, FileSystemInfo>(StringComparer.OrdinalIgnoreCase);
foreach (var entry in entries)

@ -213,38 +213,38 @@ namespace MediaBrowser.Controller.Library
return false;
}
// It's a season folder if it's named as such and does not contain any audio files, apart from theme.mp3
foreach (var fileSystemInfo in directoryService.GetFileSystemEntries(path))
{
var attributes = fileSystemInfo.Attributes;
if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
{
continue;
}
// Can't enforce this because files saved by Bitcasa are always marked System
//if ((attributes & FileAttributes.System) == FileAttributes.System)
//{
// continue;
//}
if ((attributes & FileAttributes.Directory) == FileAttributes.Directory)
{
//if (IsBadFolder(fileSystemInfo.Name))
//{
// return false;
//}
}
else
{
if (EntityResolutionHelper.IsAudioFile(fileSystemInfo.FullName) &&
!string.Equals(fileSystem.GetFileNameWithoutExtension(fileSystemInfo), BaseItem.ThemeSongFilename))
{
return false;
}
}
}
//// It's a season folder if it's named as such and does not contain any audio files, apart from theme.mp3
//foreach (var fileSystemInfo in directoryService.GetFileSystemEntries(path))
//{
// var attributes = fileSystemInfo.Attributes;
// if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
// {
// continue;
// }
// // Can't enforce this because files saved by Bitcasa are always marked System
// //if ((attributes & FileAttributes.System) == FileAttributes.System)
// //{
// // continue;
// //}
// if ((attributes & FileAttributes.Directory) == FileAttributes.Directory)
// {
// //if (IsBadFolder(fileSystemInfo.Name))
// //{
// // return false;
// //}
// }
// else
// {
// if (EntityResolutionHelper.IsAudioFile(fileSystemInfo.FullName) &&
// !string.Equals(fileSystem.GetFileNameWithoutExtension(fileSystemInfo), BaseItem.ThemeSongFilename))
// {
// return false;
// }
// }
//}
return true;
}

@ -9,35 +9,47 @@ namespace MediaBrowser.Controller.Providers
{
public interface IDirectoryService
{
List<FileSystemInfo> GetFileSystemEntries(string path);
IEnumerable<FileSystemInfo> GetFileSystemEntries(string path);
IEnumerable<FileSystemInfo> GetFiles(string path);
IEnumerable<FileSystemInfo> GetFiles(string path, bool clearCache);
FileSystemInfo GetFile(string path);
Dictionary<string, FileSystemInfo> GetFileSystemDictionary(string path);
}
public class DirectoryService : IDirectoryService
{
private readonly ILogger _logger;
private readonly ConcurrentDictionary<string, List<FileSystemInfo>> _cache = new ConcurrentDictionary<string, List<FileSystemInfo>>(StringComparer.OrdinalIgnoreCase);
private readonly ConcurrentDictionary<string, Dictionary<string,FileSystemInfo>> _cache =
new ConcurrentDictionary<string, Dictionary<string, FileSystemInfo>>(StringComparer.OrdinalIgnoreCase);
public DirectoryService(ILogger logger)
{
_logger = logger;
}
public List<FileSystemInfo> GetFileSystemEntries(string path)
public DirectoryService()
: this(new NullLogger())
{
}
public IEnumerable<FileSystemInfo> GetFileSystemEntries(string path)
{
return GetFileSystemEntries(path, false);
}
private List<FileSystemInfo> GetFileSystemEntries(string path, bool clearCache)
public Dictionary<string, FileSystemInfo> GetFileSystemDictionary(string path)
{
return GetFileSystemDictionary(path, false);
}
private Dictionary<string, FileSystemInfo> GetFileSystemDictionary(string path, bool clearCache)
{
List<FileSystemInfo> entries;
Dictionary<string, FileSystemInfo> entries;
if (clearCache)
{
List<FileSystemInfo> removed;
Dictionary<string, FileSystemInfo> removed;
_cache.TryRemove(path, out removed);
}
@ -46,21 +58,36 @@ namespace MediaBrowser.Controller.Providers
{
//_logger.Debug("Getting files for " + path);
entries = new Dictionary<string, FileSystemInfo>(StringComparer.OrdinalIgnoreCase);
try
{
entries = new DirectoryInfo(path).EnumerateFileSystemInfos("*", SearchOption.TopDirectoryOnly).ToList();
var list = new DirectoryInfo(path)
.EnumerateFileSystemInfos("*", SearchOption.TopDirectoryOnly);
// Seeing dupes on some users file system for some reason
foreach (var item in list)
{
entries[item.FullName] = item;
}
}
catch (DirectoryNotFoundException)
{
entries = new List<FileSystemInfo>();
}
//var group = entries.ToLookup(i => Path.GetDirectoryName(i.FullName)).ToList();
_cache.TryAdd(path, entries);
}
return entries;
}
private IEnumerable<FileSystemInfo> GetFileSystemEntries(string path, bool clearCache)
{
return GetFileSystemDictionary(path, clearCache).Values;
}
public IEnumerable<FileSystemInfo> GetFiles(string path)
{
return GetFiles(path, false);
@ -74,9 +101,13 @@ namespace MediaBrowser.Controller.Providers
public FileSystemInfo GetFile(string path)
{
var directory = Path.GetDirectoryName(path);
var filename = Path.GetFileName(path);
return GetFiles(directory).FirstOrDefault(i => string.Equals(i.Name, filename, StringComparison.OrdinalIgnoreCase));
var dict = GetFileSystemDictionary(directory, false);
FileSystemInfo entry;
dict.TryGetValue(path, out entry);
return entry;
}
}
}

@ -17,9 +17,12 @@ namespace MediaBrowser.Controller.Providers
/// Gets the metadata.
/// </summary>
/// <param name="info">The information.</param>
/// <param name="directoryService">The directory service.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{MetadataResult{`0}}.</returns>
Task<LocalMetadataResult<TItemType>> GetMetadata(ItemInfo info, CancellationToken cancellationToken);
Task<LocalMetadataResult<TItemType>> GetMetadata(ItemInfo info,
IDirectoryService directoryService,
CancellationToken cancellationToken);
}
public class ItemInfo

@ -1,5 +1,4 @@
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
@ -17,18 +16,24 @@ namespace MediaBrowser.Controller.Providers
public bool ForceSave { get; set; }
public MetadataRefreshOptions()
: this(new DirectoryService())
{
}
public MetadataRefreshOptions(IDirectoryService directoryService)
: base(directoryService)
{
MetadataRefreshMode = MetadataRefreshMode.Default;
}
public MetadataRefreshOptions(MetadataRefreshOptions copy)
public MetadataRefreshOptions( MetadataRefreshOptions copy)
: base(copy.DirectoryService)
{
MetadataRefreshMode = copy.MetadataRefreshMode;
ForceSave = copy.ForceSave;
ReplaceAllMetadata = copy.ReplaceAllMetadata;
ImageRefreshMode = copy.ImageRefreshMode;
DirectoryService = copy.DirectoryService;
ReplaceAllImages = copy.ReplaceAllImages;
ReplaceImages = copy.ReplaceImages.ToList();
}
@ -37,15 +42,16 @@ namespace MediaBrowser.Controller.Providers
public class ImageRefreshOptions
{
public ImageRefreshMode ImageRefreshMode { get; set; }
public IDirectoryService DirectoryService { get; set; }
public IDirectoryService DirectoryService { get; private set; }
public bool ReplaceAllImages { get; set; }
public List<ImageType> ReplaceImages { get; set; }
public ImageRefreshOptions()
public ImageRefreshOptions(IDirectoryService directoryService)
{
ImageRefreshMode = ImageRefreshMode.Default;
DirectoryService = directoryService;
ReplaceImages = new List<ImageType>();
}

@ -789,11 +789,9 @@ namespace MediaBrowser.Dlna.Didl
}
}
var imageLimit = _profile.DidlAlbumArtLimit ?? 100;
AddImageResElement(item, element, 160, 160, playbackPercentage, "jpg", "JPEG_TN");
if (imageLimit > 1)
if (!_profile.EnableSingleAlbumArtLimit)
{
AddImageResElement(item, element, 4096, 4096, playbackPercentage, "jpg", "JPEG_LRG");
AddImageResElement(item, element, 1024, 768, playbackPercentage, "jpg", "JPEG_MED");

@ -47,7 +47,7 @@ namespace MediaBrowser.Dlna.Profiles
ProtocolInfo =
"http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000";
DidlAlbumArtLimit = 1;
EnableSingleAlbumArtLimit = true;
TranscodingProfiles = new[]
{

@ -44,7 +44,7 @@ namespace MediaBrowser.Dlna.Profiles
Manufacturer = "Microsoft Corporation";
ManufacturerUrl = "http://www.microsoft.com/";
SonyAggregationFlags = "10";
DidlAlbumArtLimit = 1;
EnableSingleAlbumArtLimit = true;
TranscodingProfiles = new[]
{

@ -44,7 +44,7 @@ namespace MediaBrowser.Dlna.Profiles
Manufacturer = "Microsoft Corporation";
ManufacturerUrl = "http://www.microsoft.com/";
SonyAggregationFlags = "10";
DidlAlbumArtLimit = 1;
EnableSingleAlbumArtLimit = true;
TranscodingProfiles = new[]
{

@ -44,7 +44,7 @@ namespace MediaBrowser.Dlna.Profiles
Manufacturer = "Microsoft Corporation";
ManufacturerUrl = "http://www.microsoft.com/";
SonyAggregationFlags = "10";
DidlAlbumArtLimit = 1;
EnableSingleAlbumArtLimit = true;
TranscodingProfiles = new[]
{

@ -37,7 +37,7 @@ namespace MediaBrowser.Dlna.Profiles
SonyAggregationFlags = "10";
XDlnaDoc = "DMS-1.50";
DidlAlbumArtLimit = 1;
EnableSingleAlbumArtLimit = true;
DirectPlayProfiles = new[]
{

@ -10,7 +10,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -10,7 +10,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -15,7 +15,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -16,7 +16,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -17,7 +17,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -16,7 +16,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -14,7 +14,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -16,7 +16,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -17,7 +17,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>
@ -72,7 +72,11 @@
</Conditions>
</CodecProfile>
</CodecProfiles>
<ResponseProfiles />
<ResponseProfiles>
<ResponseProfile container="ts" type="Video" orgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO" mimeType="video/vnd.dlna.mpeg-tts">
<Conditions />
</ResponseProfile>
</ResponseProfiles>
<SubtitleProfiles>
<SubtitleProfile format="srt" method="External" />
</SubtitleProfiles>

@ -10,7 +10,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -16,7 +16,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>true</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -16,7 +16,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -18,7 +18,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -17,7 +17,7 @@
<ModelUrl>http://www.microsoft.com/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit>1</DidlAlbumArtLimit>
<EnableSingleAlbumArtLimit>true</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_TN</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -17,7 +17,7 @@
<ModelUrl>http://www.microsoft.com/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit>1</DidlAlbumArtLimit>
<EnableSingleAlbumArtLimit>true</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_TN</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -17,7 +17,7 @@
<ModelUrl>http://www.microsoft.com/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit>1</DidlAlbumArtLimit>
<EnableSingleAlbumArtLimit>true</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_TN</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -17,7 +17,7 @@
<ModelUrl>http://www.microsoft.com/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit>1</DidlAlbumArtLimit>
<EnableSingleAlbumArtLimit>true</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_TN</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -17,7 +17,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit>1</DidlAlbumArtLimit>
<EnableSingleAlbumArtLimit>true</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_TN</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -17,7 +17,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>true</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -14,7 +14,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -10,7 +10,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -17,7 +17,7 @@
<ModelUrl>http://www.microsoft.com/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -15,7 +15,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -16,7 +16,7 @@
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<DidlAlbumArtLimit xsi:nil="true" />
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
<SupportedMediaTypes>Audio</SupportedMediaTypes>
<AlbumArtPn>JPEG_SM</AlbumArtPn>
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>

@ -1,7 +1,6 @@
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Logging;
using System;
using System.IO;
using System.Threading;
@ -14,11 +13,13 @@ namespace MediaBrowser.LocalMetadata
{
protected IFileSystem FileSystem;
public async Task<LocalMetadataResult<T>> GetMetadata(ItemInfo info, CancellationToken cancellationToken)
public async Task<LocalMetadataResult<T>> GetMetadata(ItemInfo info,
IDirectoryService directoryService,
CancellationToken cancellationToken)
{
var result = new LocalMetadataResult<T>();
var file = GetXmlFile(info, new DirectoryService(new NullLogger()));
var file = GetXmlFile(info, directoryService);
if (file == null)
{

@ -33,7 +33,8 @@ namespace MediaBrowser.LocalMetadata.Images
{
var parentPath = Path.GetDirectoryName(item.Path);
var parentPathFiles = directoryService.GetFileSystemEntries(parentPath);
var parentPathFiles = directoryService.GetFileSystemEntries(parentPath)
.ToList();
var nameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(item.Path);

@ -37,7 +37,7 @@ namespace MediaBrowser.Model.Dlna
public bool IgnoreTranscodeByteRangeRequests { get; set; }
public bool EnableAlbumArtInDidl { get; set; }
public int? DidlAlbumArtLimit { get; set; }
public bool EnableSingleAlbumArtLimit { get; set; }
public string SupportedMediaTypes { get; set; }

@ -21,6 +21,7 @@ namespace MediaBrowser.Model.Dto
public string Name { get; set; }
public long? RunTimeTicks { get; set; }
public bool ReadAtNativeFramerate { get; set; }
public VideoType? VideoType { get; set; }

@ -89,11 +89,6 @@ namespace MediaBrowser.Providers.Manager
public async Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken)
{
if (refreshOptions.DirectoryService == null)
{
refreshOptions.DirectoryService = new DirectoryService(Logger);
}
var itemOfType = (TItemType)item;
var config = ProviderManager.GetMetadataOptions(item);
@ -324,7 +319,12 @@ namespace MediaBrowser.Providers.Manager
return item is TItemType;
}
protected virtual async Task<RefreshResult> RefreshWithProviders(TItemType item, TIdType id, MetadataRefreshOptions options, List<IMetadataProvider> providers, ItemImageProvider imageService, CancellationToken cancellationToken)
protected virtual async Task<RefreshResult> RefreshWithProviders(TItemType item,
TIdType id,
MetadataRefreshOptions options,
List<IMetadataProvider> providers,
ItemImageProvider imageService,
CancellationToken cancellationToken)
{
var refreshResult = new RefreshResult
{
@ -369,7 +369,7 @@ namespace MediaBrowser.Providers.Manager
try
{
var localItem = await provider.GetMetadata(itemInfo, cancellationToken).ConfigureAwait(false);
var localItem = await provider.GetMetadata(itemInfo, options.DirectoryService, cancellationToken).ConfigureAwait(false);
if (localItem.HasMetadata)
{

@ -1,4 +1,5 @@
using MediaBrowser.Common.Configuration;
using System.Net;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
@ -7,6 +8,7 @@ using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Net;
using MediaBrowser.Model.Providers;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Providers.Music;
@ -88,7 +90,18 @@ namespace MediaBrowser.Providers.Movies
if (!string.IsNullOrEmpty(movieId))
{
await EnsureMovieJson(movieId, cancellationToken).ConfigureAwait(false);
// Bad id entered
try
{
await EnsureMovieJson(movieId, cancellationToken).ConfigureAwait(false);
}
catch (HttpException ex)
{
if (!ex.StatusCode.HasValue || ex.StatusCode.Value != HttpStatusCode.NotFound)
{
throw;
}
}
var path = GetFanartJsonPath(movieId);

@ -252,7 +252,7 @@ namespace MediaBrowser.Providers.Subtitles
_monitor.ReportFileSystemChangeComplete(path, false);
}
return _libraryManager.GetItemById(itemId).RefreshMetadata(new MetadataRefreshOptions
return _libraryManager.GetItemById(itemId).RefreshMetadata(new MetadataRefreshOptions(new DirectoryService())
{
ImageRefreshMode = ImageRefreshMode.ValidationOnly,
MetadataRefreshMode = MetadataRefreshMode.ValidationOnly

@ -1,4 +1,5 @@
using MediaBrowser.Common.IO;
using System.Net;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
@ -6,6 +7,7 @@ using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Net;
using MediaBrowser.Model.Providers;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Providers.Music;
@ -72,7 +74,18 @@ namespace MediaBrowser.Providers.TV
if (!string.IsNullOrEmpty(id) && season.IndexNumber.HasValue)
{
await FanartSeriesProvider.Current.EnsureSeriesJson(id, cancellationToken).ConfigureAwait(false);
// Bad id entered
try
{
await FanartSeriesProvider.Current.EnsureSeriesJson(id, cancellationToken).ConfigureAwait(false);
}
catch (HttpException ex)
{
if (!ex.StatusCode.HasValue || ex.StatusCode.Value != HttpStatusCode.NotFound)
{
throw;
}
}
var path = FanartSeriesProvider.Current.GetFanartJsonPath(id);

@ -1,4 +1,5 @@
using MediaBrowser.Common.Configuration;
using System.Net;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
@ -7,6 +8,7 @@ using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Net;
using MediaBrowser.Model.Providers;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Providers.Music;
@ -81,7 +83,18 @@ namespace MediaBrowser.Providers.TV
if (!string.IsNullOrEmpty(id))
{
await EnsureSeriesJson(id, cancellationToken).ConfigureAwait(false);
// Bad id entered
try
{
await EnsureSeriesJson(id, cancellationToken).ConfigureAwait(false);
}
catch (HttpException ex)
{
if (!ex.StatusCode.HasValue || ex.StatusCode.Value != HttpStatusCode.NotFound)
{
throw;
}
}
var path = GetFanartJsonPath(id);

@ -122,11 +122,13 @@ namespace MediaBrowser.Providers.TV
{
foreach (var series in group)
{
await series.RefreshMetadata(new MetadataRefreshOptions
var directoryService = new DirectoryService();
await series.RefreshMetadata(new MetadataRefreshOptions(directoryService)
{
}, cancellationToken).ConfigureAwait(false);
await series.ValidateChildren(new Progress<double>(), cancellationToken, new MetadataRefreshOptions(), true)
await series.ValidateChildren(new Progress<double>(), cancellationToken, new MetadataRefreshOptions(directoryService), true)
.ConfigureAwait(false);
}
}
@ -469,7 +471,9 @@ namespace MediaBrowser.Providers.TV
/// <param name="seasonNumber">The season number.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{Season}.</returns>
private async Task<Season> AddSeason(Series series, int seasonNumber, CancellationToken cancellationToken)
private async Task<Season> AddSeason(Series series,
int seasonNumber,
CancellationToken cancellationToken)
{
_logger.Info("Creating Season {0} entry for {1}", seasonNumber, series.Name);

@ -77,7 +77,7 @@ namespace MediaBrowser.Server.Implementations.Collections
await parentFolder.AddChild(collection, CancellationToken.None).ConfigureAwait(false);
await collection.RefreshMetadata(new MetadataRefreshOptions(), CancellationToken.None)
await collection.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService()), CancellationToken.None)
.ConfigureAwait(false);
if (options.ItemIdList.Count > 0)

@ -530,7 +530,9 @@ namespace MediaBrowser.Server.Implementations.Library
return item;
}
public BaseItem ResolvePath(FileSystemInfo fileInfo, Folder parent = null, string collectionType = null)
public BaseItem ResolvePath(FileSystemInfo fileInfo,
Folder parent = null,
string collectionType = null)
{
return ResolvePath(fileInfo, new DirectoryService(_logger), parent, collectionType);
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Kindersicherung",
"HeaderInvitationSent": "Einladung verschickt",
"MessageInvitationSentToUser": "Eine E-Mail mit der Einladung zum Sharing ist an {0} geschickt worden.",
"MessageInvitationSentToNewUser": "Eine E-Mail mit der Einladung zur Anmeldung am Media Browser ist an {0} geschickt worden."
"MessageInvitationSentToNewUser": "Eine E-Mail mit der Einladung zur Anmeldung am Media Browser ist an {0} geschickt worden.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -600,13 +600,15 @@
"DeviceLastUsedByUserName": "\u00daltimo usado por {0}",
"HeaderDeleteDevice": "Eliminar Dispositivo",
"DeleteDeviceConfirmation": "\u00bfEsta seguro de querer eliminar este dispositivo? Volver\u00e1 a aparecer la siguiente vez que un usuario inicie sesi\u00f3n en \u00e9l.",
"LabelEnableCameraUploadFor": "Habilitar subida desde la c\u00e1mara para:",
"LabelEnableCameraUploadFor": "Habilitar subir desde la c\u00e1mara para:",
"HeaderSelectUploadPath": "Seleccionar ruta de subida",
"LabelEnableCameraUploadForHelp": "La subida ocurrir\u00e1 autom\u00e1ticamente en segundo plano al iniciar sesi\u00f3n en Media Browser.",
"LabelEnableCameraUploadForHelp": "Las subidas ocurrir\u00e1n autom\u00e1ticamente en segundo plano al iniciar sesi\u00f3n en Media Browser.",
"ErrorMessageStartHourGreaterThanEnd": "El horario de fin debe ser mayor al de comienzo.",
"ButtonLibraryAccess": "Acceso a biblioteca",
"ButtonParentalControl": "Control parental",
"HeaderInvitationSent": "Invitaci\u00f3n Enviada",
"MessageInvitationSentToUser": "Se ha enviado un correo electr\u00f3nico a {0}, invit\u00e1ndolo a aceptar tu invitaci\u00f3n para compartir.",
"MessageInvitationSentToNewUser": "Se ha enviado un correo electr\u00f3nico a {0} invit\u00e1ndolo a registrarse con Media Browser."
"MessageInvitationSentToNewUser": "Se ha enviado un correo electr\u00f3nico a {0} invit\u00e1ndolo a registrarse con Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -24,7 +24,7 @@
"UninstallPluginConfirmation": "\u00cates-vous s\u00fbr de vouloir d\u00e9sinstaller {0}?",
"NoPluginConfigurationMessage": "Ce plugin n'a rien \u00e0 configurer.",
"NoPluginsInstalledMessage": "Vous n'avez aucun plugin install\u00e9.",
"BrowsePluginCatalogMessage": "Explorer notre catalogue de Plugins disponibles.",
"BrowsePluginCatalogMessage": "Explorer notre catalogue des plugins pour voir les plugins disponibles.",
"MessageKeyEmailedTo": "Cl\u00e9 envoy\u00e9e par courriel \u00e0 {0}",
"MessageKeysLinked": "Cl\u00e9s associ\u00e9es.",
"HeaderConfirmation": "Confirmation",
@ -573,7 +573,7 @@
"LabelShortRatingDescription": "Evaluation courte:",
"OptionIRecommendThisItem": "Je recommande cet article",
"WebClientTourContent": "Voir les medias ajout\u00e9s r\u00e9cemment, les prochains \u00e9pisodes et bien plus. Les cercles verts indiquent le nombre d'items que vous n'avez pas vu.",
"WebClientTourMovies": "Lire les films, bandes-annonces et plus depuis n'importe quel p\u00e9riph\u00e9rique depuis un navigateur web",
"WebClientTourMovies": "Lire les films, bandes-annonces et plus depuis n'importe quel p\u00e9riph\u00e9rique avec un navigateur Web",
"WebClientTourMouseOver": "Laisser la souris au dessus des posters pour un acc\u00e8s rapide aux informations essentiels",
"WebClientTourTapHold": "Maintenir cliqu\u00e9 ou faire un clic droit sur n'importe quel poster pour le menu contextuel",
"WebClientTourMetadataManager": "Cliquer sur modifier pour ouvrir l'\u00e9diteur de m\u00e9dadonn\u00e9es",
@ -608,5 +608,7 @@
"ButtonParentalControl": "Contr\u00f4le parental",
"HeaderInvitationSent": "Invitation envoy\u00e9",
"MessageInvitationSentToUser": "Un mail a \u00e9t\u00e9 envoy\u00e9 \u00e0 {0} pour les inviter \u00e0 accepter votre invitation de partage.",
"MessageInvitationSentToNewUser": "Un mail a \u00e9t\u00e9 envoy\u00e9 \u00e0 {0} pour les inviter \u00e0 s'inscrire sur Media Browser."
"MessageInvitationSentToNewUser": "Un mail a \u00e9t\u00e9 envoy\u00e9 \u00e0 {0} pour les inviter \u00e0 s'inscrire sur Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -615,6 +615,8 @@
"ButtonLibraryAccess": "Library access",
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "\u041c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b \u0431\u0430\u0441\u049b\u0430\u0440\u0443",
"HeaderInvitationSent": "\u0428\u0430\u049b\u044b\u0440\u0443 \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0434\u0456",
"MessageInvitationSentToUser": "\u041e\u043b\u0430\u0440\u0493\u0430 \u043e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443 \u0448\u0430\u049b\u044b\u0440\u0443\u044b\u04a3\u044b\u0437\u0434\u044b \u049b\u0430\u0431\u044b\u043b\u0434\u0430\u0443 \u04b1\u0441\u044b\u043d\u044b\u0441\u044b\u043c\u0435\u043d, \u044d-\u043f\u043e\u0448\u0442\u0430 {0} \u0430\u0440\u043d\u0430\u043f \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0434\u0456.",
"MessageInvitationSentToNewUser": "\u041e\u043b\u0430\u0440\u0493\u0430 Media Browser \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d \u0436\u0430\u0441\u0430\u0443 \u04b1\u0441\u044b\u043d\u044b\u0441\u044b\u043c\u0435\u043d, \u044d-\u043f\u043e\u0448\u0442\u0430 {0} \u0430\u0440\u043d\u0430\u043f \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0434\u0456."
"MessageInvitationSentToNewUser": "\u041e\u043b\u0430\u0440\u0493\u0430 Media Browser \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d \u0436\u0430\u0441\u0430\u0443 \u04b1\u0441\u044b\u043d\u044b\u0441\u044b\u043c\u0435\u043d, \u044d-\u043f\u043e\u0448\u0442\u0430 {0} \u0430\u0440\u043d\u0430\u043f \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0434\u0456.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -436,7 +436,7 @@
"HeaderPluginInstallation": "Programtillegg installasjon",
"MessageAlreadyInstalled": "Denne versjonen er allerede installert.",
"ValueReviewCount": "{0} Anmeldelser",
"MessageYouHaveVersionInstalled": "You currently have version {0} installed.",
"MessageYouHaveVersionInstalled": "Du har for \u00f8yeblikket versjon {0} installert",
"MessageTrialExpired": "Pr\u00f8veperioden for denne funksjonen er utl\u00f8pt",
"MessageTrialWillExpireIn": "Pr\u00f8veperioden for denne funksjonen utl\u00f8per om {0} dag (er)",
"MessageInstallPluginFromApp": "Dette programtillegget m\u00e5 installeres direkte i appen du har tenkt \u00e5 bruke den i.",
@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Ouderlijk toezicht",
"HeaderInvitationSent": "Uitnodiging verzonden",
"MessageInvitationSentToUser": "Een email is verzonden naar {0} om je uitnodiging om media te delen te accepteren.",
"MessageInvitationSentToNewUser": "Een email is verzonden naar {0} om je uitnodiging aan te melden bij Media Browser"
"MessageInvitationSentToNewUser": "Een email is verzonden naar {0} om je uitnodiging aan te melden bij Media Browser",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -74,8 +74,8 @@
"ButtonMarkTheseRead": "Marcar como lida",
"ButtonClose": "Fechar",
"LabelAllPlaysSentToPlayer": "Todas as reprodu\u00e7\u00f5es ser\u00e3o enviadas para o reprodutor selecionado.",
"MessageInvalidUser": "Invalid username or password. Please try again.",
"HeaderLoginFailure": "Login Failure",
"MessageInvalidUser": "Nome de usu\u00e1rio ou senha inv\u00e1lidos. Por favor, tente novamente.",
"HeaderLoginFailure": "Falha no Login",
"HeaderAllRecordings": "Todas as Grava\u00e7\u00f5es",
"RecommendationBecauseYouLike": "Porque voc\u00ea gosta de {0}",
"RecommendationBecauseYouWatched": "Porque voc\u00ea assistiu {0}",
@ -604,9 +604,11 @@
"HeaderSelectUploadPath": "Selecione o caminho para carga",
"LabelEnableCameraUploadForHelp": "Cargas ser\u00e3o executadas automaticamente em retaguarda quando logar no Media Browser.",
"ErrorMessageStartHourGreaterThanEnd": "O tempo final deve ser maior que o tempo inicial.",
"ButtonLibraryAccess": "Library access",
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"ButtonLibraryAccess": "Acesso \u00e0 biblioteca",
"ButtonParentalControl": "Controle Parental",
"HeaderInvitationSent": "Convite Enviado",
"MessageInvitationSentToUser": "Um email foi enviado para {0}, convidando para aceitar seu convite de compartilhamento.",
"MessageInvitationSentToNewUser": "Um email foi enviado para {0}, convidando para inscrever-se no Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c",
"HeaderInvitationSent": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e",
"MessageInvitationSentToUser": "\u042d-\u043f\u043e\u0447\u0442\u0430 \u0431\u044b\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043a {0}, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044f \u0438\u043c \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043a \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e.",
"MessageInvitationSentToNewUser": "\u042d-\u043f\u043e\u0447\u0442\u0430 \u0431\u044b\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043a {0}, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044f \u0438\u043c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 Media Browser."
"MessageInvitationSentToNewUser": "\u042d-\u043f\u043e\u0447\u0442\u0430 \u0431\u044b\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043a {0}, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044f \u0438\u043c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -608,5 +608,7 @@
"ButtonParentalControl": "Parental control",
"HeaderInvitationSent": "Invitation Sent",
"MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser."
"MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.",
"HeaderConnectionFailure": "Connection Failure",
"MessageUnableToConnectToServer": "We're unable to connect to the selected right now. Please try again later."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel plugin to import a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password?"
"ButtonForgotPassword": "Forgot password?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel plugin to import a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password?"
"ButtonForgotPassword": "Forgot password?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel plugin to import a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password?"
"ButtonForgotPassword": "Forgot password?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel plugin to import a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password?"
"ButtonForgotPassword": "Forgot password?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "Keine Trailer gefunden. Installiere das Trailer Channel Plugin, um eine Bibliothek aus Trailern vom Internet zu importieren.",
"HeaderNewUsers": "Neue Benutzer",
"ButtonSignUp": "Anmeldung",
"ButtonForgotPassword": "Passwort vergessen?"
"ButtonForgotPassword": "Passwort vergessen?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel plugin to import a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password?"
"ButtonForgotPassword": "Forgot password?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel plugin to import a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password?"
"ButtonForgotPassword": "Forgot password?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel plugin to import a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password?"
"ButtonForgotPassword": "Forgot password?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel plugin to import a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password?"
"ButtonForgotPassword": "Forgot password?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -256,7 +256,7 @@
"LabelAllowServerAutoRestartHelp": "El servidor reiniciar\u00e1 \u00fanicamente durante periodos ociosos, cuando no haya usuarios activos.",
"LabelEnableDebugLogging": "Habilitar bit\u00e1coras de depuraci\u00f3n",
"LabelRunServerAtStartup": "Ejecutar el servidor al iniciar",
"LabelRunServerAtStartupHelp": "Esto iniciar\u00e1 el icono den el \u00e1rea de notificaci\u00f3n cuando windows arranque. Para iniciar el servicio de windows, desmarque esta opci\u00f3n y ejecute el servicio desde el panel de control de windows. Por favor tome en cuenta que no puede ejecutar ambos simult\u00e1neamente, por lo que deber\u00e1 finalizar el icono del \u00e1rea de notificaci\u00f3n antes de iniciar el servicio.",
"LabelRunServerAtStartupHelp": "Esto iniciar\u00e1 el icono en el \u00e1rea de notificaci\u00f3n cuando windows arranque. Para iniciar el servicio de windows, desmarque esta opci\u00f3n y ejecute el servicio desde el panel de control de windows. Por favor tome en cuenta que no puede ejecutar ambos simult\u00e1neamente, por lo que deber\u00e1 finalizar el icono del \u00e1rea de notificaci\u00f3n antes de iniciar el servicio.",
"ButtonSelectDirectory": "Seleccionar Carpeta",
"LabelCustomPaths": "Especificar rutas personalizadas cuando se desee. Deje los campos vac\u00edos para usar los valores predeterminados.",
"LabelCachePath": "Ruta para el Cach\u00e9:",
@ -1203,18 +1203,18 @@
"LabelDateAddedBehaviorHelp": "Si se encuentra un valor en los metadados siempre ser\u00e1 empleado antes que cualquiera de estas opciones.",
"LabelNumberTrailerToPlay": "N\u00famero de avances a reproducir:",
"TitleDevices": "Dispositivos",
"TabCameraUpload": "Subida de C\u00e1mara",
"TabCameraUpload": "Subir desde la C\u00e1mara",
"TabDevices": "Dispositivos",
"HeaderCameraUploadHelp": "Suba a Media Broswer fotos y videos tomados desde sus dispositivos m\u00f3viles de forma autom\u00e1tica.",
"MessageNoDevicesSupportCameraUpload": "Actualmente no cuenta con ning\u00fan dispositivo que soporte subida desde c\u00e1mara.",
"LabelCameraUploadPath": "Ruta de subida desde c\u00e1mara:",
"MessageNoDevicesSupportCameraUpload": "Actualmente no cuenta con ning\u00fan dispositivo que soporte subir desde la c\u00e1mara.",
"LabelCameraUploadPath": "Ruta para subir desde la c\u00e1mara:",
"LabelCameraUploadPathHelp": "Seleccione una ruta personalizada. si lo desea. Si no se especifica, se emplear\u00e1 una carpeta por omisi\u00f3n.",
"LabelCreateCameraUploadSubfolder": "Crear una subcarpeta para cada dispositivo",
"LabelCreateCameraUploadSubfolderHelp": "Se pueden especificar carpetas espec\u00edficas para un dispositivo haciendo clic en \u00e9l desde la p\u00e1gina de Dispositivos.",
"LabelCustomDeviceDisplayName": "Nombre a Desplegar:",
"LabelCustomDeviceDisplayNameHelp": "Proporcione un nombre a desplegar personalizado o d\u00e9jelo vac\u00edo para usar el nombre reportado por el dispositivo.",
"HeaderInviteUser": "Invitar Usuario",
"LabelConnectGuestUserNameHelp": "This is the username that your friend uses to sign in to the Media Browser website, or their email address.",
"LabelConnectGuestUserNameHelp": "Este es el nombre de usuario que su amigo utiliza para iniciar sesi\u00f3n en el sitio web de Media Browser, o su cuenta de correo electr\u00f3nico.",
"HeaderInviteUserHelp": "Compartir sus medios con amigos es m\u00e1s f\u00e1cil que nunca con Media Browser Connect.",
"ButtonSendInvitation": "Enviar invitaci\u00f3n",
"HeaderGuests": "Invitados",
@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No se encontraron avances. Instalar el complemento \"Canal trailers\" para importar una biblioteca de avances de internet.",
"HeaderNewUsers": "Nuevos Usuarios",
"ButtonSignUp": "Registrarse",
"ButtonForgotPassword": "\u00bfOlvidaste la contrase\u00f1a?"
"ButtonForgotPassword": "\u00bfOlvidaste la contrase\u00f1a?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -39,7 +39,7 @@
"HeaderSetupLibrary": "Configurer votre biblioth\u00e8que de m\u00e9dia",
"ButtonAddMediaFolder": "Ajouter un r\u00e9pertoire de m\u00e9dia",
"LabelFolderType": "Type de r\u00e9pertoire:",
"MediaFolderHelpPluginRequired": "* Requiert l'utilisation d'un plug-in, Ex: GameBrowser ou MB BookShelf",
"MediaFolderHelpPluginRequired": "* N\u00e9cessite l'utilisation d'un plugin, par exemple : \"GameBrowser\" ou \"MB BookShelf\".",
"ReferToMediaLibraryWiki": "Se r\u00e9f\u00e9rer au wiki des biblioth\u00e8ques de m\u00e9dia",
"LabelCountry": "Pays:",
"LabelLanguage": "Langue:",
@ -726,7 +726,7 @@
"LabelDeviceDescription": "Description du p\u00e9riph\u00e9rique",
"HeaderIdentificationCriteriaHelp": "Entrer au moins un crit\u00e8re d'identification.",
"HeaderDirectPlayProfileHelp": "Ajouter des profils de lecture directe pour indiquer quels formats le p\u00e9riph\u00e9rique peut lire de fa\u00e7on native.",
"HeaderTranscodingProfileHelp": "Ajoutez des profils de transcodage pour sp\u00e9cifier quels formats doit \u00eatre transcod\u00e9.",
"HeaderTranscodingProfileHelp": "Ajoutez des profils de transcodage pour indiquer quels formats devraient \u00eatre utilis\u00e9s quand le transcodage est requis.",
"HeaderResponseProfileHelp": "Les profils de r\u00e9ponse permettent de personnaliser l'information envoy\u00e9e au p\u00e9riph\u00e9rique lors de la lecture de certains types de m\u00e9dia.",
"LabelXDlnaCap": "Cap X-Dlna:",
"LabelXDlnaCapHelp": "D\u00e9termine le contenu des \u00e9l\u00e9ments X_DLNACAP dans l'espace de nom urn:schemas-dlna-org:device-1-0.",
@ -1172,27 +1172,27 @@
"ButtonLearnMore": "Apprendre plus",
"TabPlayback": "Lecture",
"HeaderTrailersAndExtras": "Bandes-annonces et extras",
"OptionFindTrailers": "Trouver automatiquement les bandes-annonces sur Internet",
"OptionFindTrailers": "Rechercher automatiquement les bandes-annonces sur Internet",
"HeaderLanguagePreferences": "Pr\u00e9f\u00e9rences de langue",
"TabCinemaMode": "Mode cin\u00e9ma",
"TitlePlayback": "Lecture",
"LabelEnableCinemaModeFor": "Activer le mode cin\u00e9ma pour :",
"CinemaModeConfigurationHelp": "Le mode cin\u00e9ma apporte l'exp\u00e9rience du cin\u00e9ma directement dans votre salon avec l'abilit\u00e9 de lire les bandes-annonces et les introductions personnalis\u00e9es avant le programme principal.",
"OptionTrailersFromMyMovies": "Inclure les bandes-annonces des films dans la biblioth\u00e8que",
"OptionUpcomingMoviesInTheaters": "Inclure les bandes-annonces des nouveaux et anciens films",
"LabelLimitIntrosToUnwatchedContent": "Utiliser uniquement les bandes-annonces du contenu non visionn\u00e9",
"OptionTrailersFromMyMovies": "Inclure les bandes-annonces des films dans ma biblioth\u00e8que",
"OptionUpcomingMoviesInTheaters": "Inclure les bandes-annonces des nouveaut\u00e9s et des films \u00e0 l'affiche",
"LabelLimitIntrosToUnwatchedContent": "Utiliser seulement les bandes-annonces du contenu non lu",
"LabelEnableIntroParentalControl": "Activer le control parental intelligent",
"LabelEnableIntroParentalControlHelp": "Les bandes-annonces ne pourront \u00eatre s\u00e9lectionn\u00e9es qu'avec un niveau d'acc\u00e8s \u00e9gal ou inf\u00e9rieur \u00e0 celui du contenu \u00e0 visionner.",
"LabelTheseFeaturesRequireSupporterHelpAndTrailers": "Ces fonctionnalit\u00e9s n\u00e9cessitent un compte membre actif et l'installation du plugin Bande annonces.",
"OptionTrailersFromMyMoviesHelp": "Requiert la configuration des bandes-annonces locales.",
"LabelEnableIntroParentalControlHelp": "Les bandes-annonces seront seulement s\u00e9lectionn\u00e9es avec un niveau de contr\u00f4le parental \u00e9gal ou inf\u00e9rieur \u00e0 celui du contenu en cours de lecture.",
"LabelTheseFeaturesRequireSupporterHelpAndTrailers": "Ces fonctionnalit\u00e9s n\u00e9cessitent un abonnement actif comme supporteur et l'installation du plugin \"Trailer channel\".",
"OptionTrailersFromMyMoviesHelp": "N\u00e9cessite la configuration des bandes-annonces locales.",
"LabelCustomIntrosPath": "Chemin des intros personnalis\u00e9es :",
"LabelCustomIntrosPathHelp": "Un r\u00e9pertoire contenant des fichiers vid\u00e9os. Une vid\u00e9o sera s\u00e9lectionn\u00e9e al\u00e9atoirement et jou\u00e9e apr\u00e8s les bandes-annonces.",
"LabelCustomIntrosPathHelp": "Un r\u00e9pertoire contenant des fichiers vid\u00e9os. Une vid\u00e9o sera s\u00e9lectionn\u00e9e al\u00e9atoirement et lue apr\u00e8s les bandes-annonces.",
"ValueSpecialEpisodeName": "Sp\u00e9cial - {0}",
"LabelSelectInternetTrailersForCinemaMode": "Bandes-annonces Internet :",
"OptionUpcomingDvdMovies": "Inclure les bandes annonces des nouveaux et prochains films en DVD et Blu-Ray",
"OptionUpcomingStreamingMovies": "Inclure les bandes annonces des nouveaux et prochains films de NetFlix",
"LabelDisplayTrailersWithinMovieSuggestions": "Afficher les bandes-annonces dans les suggestions de film.",
"LabelDisplayTrailersWithinMovieSuggestionsHelp": "N\u00e9cessite l'installation du plugin Trailer",
"OptionUpcomingDvdMovies": "Inclure les bandes-annonces des nouveaut\u00e9s et des films \u00e0 venir sur DVD et Blu-Ray",
"OptionUpcomingStreamingMovies": "Inclure les bandes-annonces des nouveaut\u00e9s et des films \u00e0 l'affiche sur Netflix",
"LabelDisplayTrailersWithinMovieSuggestions": "Afficher les bandes-annonces dans les suggestions de films.",
"LabelDisplayTrailersWithinMovieSuggestionsHelp": "N\u00e9cessite l'installation du plugin \"Trailer channel\".",
"CinemaModeConfigurationHelp2": "Les utilisateurs ont la possibilit\u00e9 de d\u00e9sactiver le mode cin\u00e9ma dans leurs propres pr\u00e9f\u00e9rences.",
"LabelEnableCinemaMode": "Activer le mode cin\u00e9ma",
"HeaderCinemaMode": "Mode cin\u00e9ma",
@ -1235,10 +1235,14 @@
"HeaderOptionalLinkMediaBrowserAccount": "Optionnel: lier votre compte Media Browser",
"ButtonTrailerReel": "Trailer reel",
"HeaderTrailerReel": "Trailer reel",
"OptionPlayUnwatchedTrailersOnly": "Visionner uniquement les bandes annonces non vues",
"OptionPlayUnwatchedTrailersOnly": "Lire seulement les bandes-annonces non lus.",
"HeaderTrailerReelHelp": "Commencer un \"trailer reel\" pour lire une longue liste de lecture de bandes-annonces.",
"MessageNoTrailersFound": "Aucune bande-annonce trouv\u00e9e. Installer le \"Trailer channel\" plugin pour importer une biblioth\u00e8que de bandes-annonces Internet.",
"MessageNoTrailersFound": "Aucune bande-annonce trouv\u00e9e. Installer le plugin \"Trailer channel\" pour importer une biblioth\u00e8que de bandes-annonces Internet.",
"HeaderNewUsers": "Nouveaux utilisateurs",
"ButtonSignUp": "S'inscrire",
"ButtonForgotPassword": "Mot de passe oubli\u00e9 ?"
"ButtonForgotPassword": "Mot de passe oubli\u00e9 ?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel plugin to import a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password?"
"ButtonForgotPassword": "Forgot password?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel plugin to import a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password?"
"ButtonForgotPassword": "Forgot password?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

@ -1240,5 +1240,9 @@
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel plugin to import a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password?"
"ButtonForgotPassword": "Forgot password?",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to confirm it by clicking the link in the email."
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save