Merge pull request #4 from jellyfin/master

updating local master
This commit is contained in:
LogicalPhallacy 2019-03-18 22:58:37 -07:00 committed by GitHub
commit c2667f99f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 69 additions and 41 deletions

View File

@ -770,7 +770,7 @@ namespace Emby.Server.Implementations
var displayPreferencesRepo = new SqliteDisplayPreferencesRepository(LoggerFactory, JsonSerializer, ApplicationPaths, FileSystemManager); var displayPreferencesRepo = new SqliteDisplayPreferencesRepository(LoggerFactory, JsonSerializer, ApplicationPaths, FileSystemManager);
serviceCollection.AddSingleton<IDisplayPreferencesRepository>(displayPreferencesRepo); serviceCollection.AddSingleton<IDisplayPreferencesRepository>(displayPreferencesRepo);
ItemRepository = new SqliteItemRepository(ServerConfigurationManager, this, JsonSerializer, LoggerFactory); ItemRepository = new SqliteItemRepository(ServerConfigurationManager, this, JsonSerializer, LoggerFactory, LocalizationManager);
serviceCollection.AddSingleton<IItemRepository>(ItemRepository); serviceCollection.AddSingleton<IItemRepository>(ItemRepository);
AuthenticationRepository = GetAuthenticationRepository(); AuthenticationRepository = GetAuthenticationRepository();
@ -870,7 +870,8 @@ namespace Emby.Server.Implementations
() => SubtitleEncoder, () => SubtitleEncoder,
() => MediaSourceManager, () => MediaSourceManager,
ProcessFactory, ProcessFactory,
5000); 5000,
LocalizationManager);
serviceCollection.AddSingleton(MediaEncoder); serviceCollection.AddSingleton(MediaEncoder);
EncodingManager = new MediaEncoder.EncodingManager(FileSystemManager, LoggerFactory, MediaEncoder, ChapterManager, LibraryManager); EncodingManager = new MediaEncoder.EncodingManager(FileSystemManager, LoggerFactory, MediaEncoder, ChapterManager, LibraryManager);

View File

@ -22,6 +22,7 @@ using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Playlists; using MediaBrowser.Controller.Playlists;
using MediaBrowser.Model.Dto; using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.LiveTv; using MediaBrowser.Model.LiveTv;
using MediaBrowser.Model.Querying; using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Serialization;
@ -55,6 +56,8 @@ namespace Emby.Server.Implementations.Data
private readonly IServerConfigurationManager _config; private readonly IServerConfigurationManager _config;
private IServerApplicationHost _appHost; private IServerApplicationHost _appHost;
private readonly ILocalizationManager _localization;
public IImageProcessor ImageProcessor { get; set; } public IImageProcessor ImageProcessor { get; set; }
/// <summary> /// <summary>
@ -64,7 +67,8 @@ namespace Emby.Server.Implementations.Data
IServerConfigurationManager config, IServerConfigurationManager config,
IServerApplicationHost appHost, IServerApplicationHost appHost,
IJsonSerializer jsonSerializer, IJsonSerializer jsonSerializer,
ILoggerFactory loggerFactory) ILoggerFactory loggerFactory,
ILocalizationManager localization)
: base(loggerFactory.CreateLogger(nameof(SqliteItemRepository))) : base(loggerFactory.CreateLogger(nameof(SqliteItemRepository)))
{ {
if (config == null) if (config == null)
@ -81,6 +85,7 @@ namespace Emby.Server.Implementations.Data
_config = config; _config = config;
_jsonSerializer = jsonSerializer; _jsonSerializer = jsonSerializer;
_typeMapper = new TypeMapper(); _typeMapper = new TypeMapper();
_localization = localization;
DbFilePath = Path.Combine(_config.ApplicationPaths.DataPath, "library.db"); DbFilePath = Path.Combine(_config.ApplicationPaths.DataPath, "library.db");
} }
@ -6187,6 +6192,12 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
item.ColorTransfer = reader[34].ToString(); item.ColorTransfer = reader[34].ToString();
} }
if (item.Type == MediaStreamType.Subtitle){
item.localizedUndefined = _localization.GetLocalizedString("Undefined");
item.localizedDefault = _localization.GetLocalizedString("Default");
item.localizedForced = _localization.GetLocalizedString("Forced");
}
return item; return item;
} }
} }

View File

@ -448,11 +448,19 @@ namespace Emby.Server.Implementations.Library
user.Policy.InvalidLoginAttemptCount = newValue; user.Policy.InvalidLoginAttemptCount = newValue;
var maxCount = user.Policy.IsAdministrator ? 3 : 5; // Check for users without a value here and then fill in the default value
// also protect from an always lockout if misconfigured
if (user.Policy.LoginAttemptsBeforeLockout == null || user.Policy.LoginAttemptsBeforeLockout == 0)
{
user.Policy.LoginAttemptsBeforeLockout = user.Policy.IsAdministrator ? 5 : 3;
}
var maxCount = user.Policy.LoginAttemptsBeforeLockout;
var fireLockout = false; var fireLockout = false;
if (newValue >= maxCount) // -1 can be used to specify no lockout value
if (maxCount != -1 && newValue >= maxCount)
{ {
_logger.LogDebug("Disabling user {0} due to {1} unsuccessful login attempts.", user.Name, newValue); _logger.LogDebug("Disabling user {0} due to {1} unsuccessful login attempts.", user.Name, newValue);
user.Policy.IsDisabled = true; user.Policy.IsDisabled = true;

View File

@ -10,7 +10,7 @@ namespace MediaBrowser.Controller.MediaEncoding
{ {
public class JobLogger public class JobLogger
{ {
private readonly CultureInfo _usCulture = new CultureInfo("en-US"); private static readonly CultureInfo _usCulture = CultureInfo.ReadOnly(new CultureInfo("en-US"));
private readonly ILogger _logger; private readonly ILogger _logger;
public JobLogger(ILogger logger) public JobLogger(ILogger logger)
@ -24,7 +24,7 @@ namespace MediaBrowser.Controller.MediaEncoding
{ {
using (var reader = new StreamReader(source)) using (var reader = new StreamReader(source))
{ {
while (!reader.EndOfStream) while (!reader.EndOfStream && reader.BaseStream.CanRead)
{ {
var line = await reader.ReadLineAsync().ConfigureAwait(false); var line = await reader.ReadLineAsync().ConfigureAwait(false);
@ -39,6 +39,13 @@ namespace MediaBrowser.Controller.MediaEncoding
} }
await target.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false); await target.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
// Check again, the stream could have been closed
if (!target.CanWrite)
{
break;
}
await target.FlushAsync().ConfigureAwait(false); await target.FlushAsync().ConfigureAwait(false);
} }
} }

View File

@ -16,6 +16,7 @@ using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Diagnostics; using MediaBrowser.Model.Diagnostics;
using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Serialization;
@ -54,6 +55,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
private readonly SemaphoreSlim _thumbnailResourcePool = new SemaphoreSlim(1, 1); private readonly SemaphoreSlim _thumbnailResourcePool = new SemaphoreSlim(1, 1);
private readonly List<ProcessWrapper> _runningProcesses = new List<ProcessWrapper>(); private readonly List<ProcessWrapper> _runningProcesses = new List<ProcessWrapper>();
private readonly ILocalizationManager _localization;
public MediaEncoder( public MediaEncoder(
ILoggerFactory loggerFactory, ILoggerFactory loggerFactory,
@ -64,7 +66,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
Func<ISubtitleEncoder> subtitleEncoder, Func<ISubtitleEncoder> subtitleEncoder,
Func<IMediaSourceManager> mediaSourceManager, Func<IMediaSourceManager> mediaSourceManager,
IProcessFactory processFactory, IProcessFactory processFactory,
int defaultImageExtractionTimeoutMs) int defaultImageExtractionTimeoutMs,
ILocalizationManager localization)
{ {
_logger = loggerFactory.CreateLogger(nameof(MediaEncoder)); _logger = loggerFactory.CreateLogger(nameof(MediaEncoder));
_jsonSerializer = jsonSerializer; _jsonSerializer = jsonSerializer;
@ -74,6 +77,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
SubtitleEncoder = subtitleEncoder; SubtitleEncoder = subtitleEncoder;
_processFactory = processFactory; _processFactory = processFactory;
DefaultImageExtractionTimeoutMs = defaultImageExtractionTimeoutMs; DefaultImageExtractionTimeoutMs = defaultImageExtractionTimeoutMs;
_localization = localization;
} }
/// <summary> /// <summary>
@ -413,7 +417,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
} }
} }
return new ProbeResultNormalizer(_logger, FileSystem).GetMediaInfo(result, videoType, isAudio, primaryPath, protocol); return new ProbeResultNormalizer(_logger, FileSystem, _localization).GetMediaInfo(result, videoType, isAudio, primaryPath, protocol);
} }
} }

View File

@ -9,6 +9,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Dto; using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Extensions; using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.MediaInfo;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -20,11 +21,13 @@ namespace MediaBrowser.MediaEncoding.Probing
private readonly CultureInfo _usCulture = new CultureInfo("en-US"); private readonly CultureInfo _usCulture = new CultureInfo("en-US");
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly ILocalizationManager _localization;
public ProbeResultNormalizer(ILogger logger, IFileSystem fileSystem) public ProbeResultNormalizer(ILogger logger, IFileSystem fileSystem, ILocalizationManager localization)
{ {
_logger = logger; _logger = logger;
_fileSystem = fileSystem; _fileSystem = fileSystem;
_localization = localization;
} }
public MediaInfo GetMediaInfo(InternalMediaInfoResult data, VideoType? videoType, bool isAudio, string path, MediaProtocol protocol) public MediaInfo GetMediaInfo(InternalMediaInfoResult data, VideoType? videoType, bool isAudio, string path, MediaProtocol protocol)
@ -596,6 +599,9 @@ namespace MediaBrowser.MediaEncoding.Probing
{ {
stream.Type = MediaStreamType.Subtitle; stream.Type = MediaStreamType.Subtitle;
stream.Codec = NormalizeSubtitleCodec(stream.Codec); stream.Codec = NormalizeSubtitleCodec(stream.Codec);
stream.localizedUndefined = _localization.GetLocalizedString("Undefined");
stream.localizedDefault = _localization.GetLocalizedString("Default");
stream.localizedForced = _localization.GetLocalizedString("Forced");
} }
else if (string.Equals(streamInfo.codec_type, "video", StringComparison.OrdinalIgnoreCase)) else if (string.Equals(streamInfo.codec_type, "video", StringComparison.OrdinalIgnoreCase))
{ {

View File

@ -1,6 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq;
using System.Text;
using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Extensions; using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.MediaInfo;
@ -65,6 +67,10 @@ namespace MediaBrowser.Model.Entities
} }
} }
public string localizedUndefined { get; set; }
public string localizedDefault { get; set; }
public string localizedForced { get; set; }
public string DisplayTitle public string DisplayTitle
{ {
get get
@ -128,10 +134,6 @@ namespace MediaBrowser.Model.Entities
if (Type == MediaStreamType.Subtitle) if (Type == MediaStreamType.Subtitle)
{ {
//if (!string.IsNullOrEmpty(Title))
//{
// return AddLanguageIfNeeded(Title);
//}
var attributes = new List<string>(); var attributes = new List<string>();
@ -141,22 +143,30 @@ namespace MediaBrowser.Model.Entities
} }
else else
{ {
attributes.Add("Und"); attributes.Add(string.IsNullOrEmpty(localizedUndefined) ? "Und" : localizedUndefined);
} }
if (IsDefault) if (IsDefault)
{ {
attributes.Add("Default"); attributes.Add(string.IsNullOrEmpty(localizedDefault) ? "Default" : localizedDefault);
} }
if (IsForced) if (IsForced)
{ {
attributes.Add("Forced"); attributes.Add(string.IsNullOrEmpty(localizedForced) ? "Forced" : localizedForced);
} }
string name = string.Join(" ", attributes.ToArray()); if (!string.IsNullOrEmpty(Title))
{
return attributes.AsEnumerable()
// keep Tags that are not already in Title
.Where(tag => Title.IndexOf(tag, StringComparison.OrdinalIgnoreCase) == -1)
// attributes concatenation, starting with Title
.Aggregate(new StringBuilder(Title), (builder, attr) => builder.Append(" - ").Append(attr))
.ToString();
}
return name; return string.Join(" - ", attributes.ToArray());
} }
if (Type == MediaStreamType.Video) if (Type == MediaStreamType.Video)
@ -220,28 +230,6 @@ namespace MediaBrowser.Model.Entities
return null; return null;
} }
private string AddLanguageIfNeeded(string title)
{
if (!string.IsNullOrEmpty(Language) &&
!string.Equals(Language, "und", StringComparison.OrdinalIgnoreCase) &&
!IsLanguageInTitle(title, Language))
{
title = StringHelper.FirstToUpper(Language) + " " + title;
}
return title;
}
private bool IsLanguageInTitle(string title, string language)
{
if (title.IndexOf(Language, StringComparison.OrdinalIgnoreCase) != -1)
{
return true;
}
return false;
}
public string NalLengthSize { get; set; } public string NalLengthSize { get; set; }
/// <summary> /// <summary>

View File

@ -66,6 +66,7 @@ namespace MediaBrowser.Model.Users
public bool EnableAllFolders { get; set; } public bool EnableAllFolders { get; set; }
public int InvalidLoginAttemptCount { get; set; } public int InvalidLoginAttemptCount { get; set; }
public int? LoginAttemptsBeforeLockout { get; set; }
public bool EnablePublicSharing { get; set; } public bool EnablePublicSharing { get; set; }
@ -104,6 +105,8 @@ namespace MediaBrowser.Model.Users
AccessSchedules = Array.Empty<AccessSchedule>(); AccessSchedules = Array.Empty<AccessSchedule>();
LoginAttemptsBeforeLockout = -1;
EnableAllChannels = true; EnableAllChannels = true;
EnabledChannels = Array.Empty<string>(); EnabledChannels = Array.Empty<string>();