Merge pull request #2691 from MediaBrowser/dev

Dev
This commit is contained in:
Luke 2017-06-06 02:15:18 -04:00 committed by GitHub
commit a2c9994819
9 changed files with 70 additions and 27 deletions

View File

@ -332,7 +332,13 @@ namespace Emby.Server.Core.IO
NotifyFilters.Attributes; NotifyFilters.Attributes;
newWatcher.Created += watcher_Changed; newWatcher.Created += watcher_Changed;
newWatcher.Deleted += watcher_Changed;
// Seeing mono crashes on background threads we can't catch, testing if this might help
if (_environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows)
{
newWatcher.Deleted += watcher_Changed;
}
newWatcher.Renamed += watcher_Changed; newWatcher.Renamed += watcher_Changed;
newWatcher.Changed += watcher_Changed; newWatcher.Changed += watcher_Changed;

View File

@ -235,10 +235,18 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
} }
else else
{ {
numberString = Path.GetFileNameWithoutExtension(mediaUrl.Split('/').Last()); try
if (!IsValidChannelNumber(numberString))
{ {
numberString = Path.GetFileNameWithoutExtension(mediaUrl.Split('/').Last());
if (!IsValidChannelNumber(numberString))
{
numberString = null;
}
}
catch
{
// Seeing occasional argument exception here
numberString = null; numberString = null;
} }
} }

View File

@ -206,15 +206,16 @@ namespace MediaBrowser.Api
var newLockData = request.LockData ?? false; var newLockData = request.LockData ?? false;
var isLockedChanged = item.IsLocked != newLockData; var isLockedChanged = item.IsLocked != newLockData;
UpdateItem(request, item); // Do this first so that metadata savers can pull the updates from the database.
await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
if (request.People != null) if (request.People != null)
{ {
await _libraryManager.UpdatePeople(item, request.People.Select(x => new PersonInfo { Name = x.Name, Role = x.Role, Type = x.Type }).ToList()); await _libraryManager.UpdatePeople(item, request.People.Select(x => new PersonInfo { Name = x.Name, Role = x.Role, Type = x.Type }).ToList());
} }
UpdateItem(request, item);
await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
if (isLockedChanged && item.IsFolder) if (isLockedChanged && item.IsFolder)
{ {
var folder = (Folder)item; var folder = (Folder)item;

View File

@ -633,14 +633,17 @@ namespace MediaBrowser.Controller.Entities
if (info.Path.StartsWith("Http", StringComparison.OrdinalIgnoreCase)) if (info.Path.StartsWith("Http", StringComparison.OrdinalIgnoreCase))
{ {
info.Protocol = MediaProtocol.Http; info.Protocol = MediaProtocol.Http;
info.SupportsDirectStream = false;
} }
else if (info.Path.StartsWith("Rtmp", StringComparison.OrdinalIgnoreCase)) else if (info.Path.StartsWith("Rtmp", StringComparison.OrdinalIgnoreCase))
{ {
info.Protocol = MediaProtocol.Rtmp; info.Protocol = MediaProtocol.Rtmp;
info.SupportsDirectStream = false;
} }
else if (info.Path.StartsWith("Rtsp", StringComparison.OrdinalIgnoreCase)) else if (info.Path.StartsWith("Rtsp", StringComparison.OrdinalIgnoreCase))
{ {
info.Protocol = MediaProtocol.Rtsp; info.Protocol = MediaProtocol.Rtsp;
info.SupportsDirectStream = false;
} }
else else
{ {

View File

@ -1180,11 +1180,11 @@ namespace MediaBrowser.Model.Dlna
bool isInterlaced; bool isInterlaced;
if (bool.TryParse(value, out isInterlaced)) if (bool.TryParse(value, out isInterlaced))
{ {
if (isInterlaced && condition.Condition == ProfileConditionType.Equals) if (!isInterlaced && condition.Condition == ProfileConditionType.Equals)
{ {
item.DeInterlace = true; item.DeInterlace = true;
} }
else if (!isInterlaced && condition.Condition == ProfileConditionType.NotEquals) else if (isInterlaced && condition.Condition == ProfileConditionType.NotEquals)
{ {
item.DeInterlace = true; item.DeInterlace = true;
} }

View File

@ -13,17 +13,13 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Providers; using MediaBrowser.Model.Providers;
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Serialization;
using Priority_Queue; using Priority_Queue;
@ -69,6 +65,7 @@ namespace MediaBrowser.Providers.Manager
private readonly Func<ILibraryManager> _libraryManagerFactory; private readonly Func<ILibraryManager> _libraryManagerFactory;
private readonly IMemoryStreamFactory _memoryStreamProvider; private readonly IMemoryStreamFactory _memoryStreamProvider;
private CancellationTokenSource _disposeCancellationTokenSource = new CancellationTokenSource();
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="ProviderManager" /> class. /// Initializes a new instance of the <see cref="ProviderManager" /> class.
@ -882,6 +879,13 @@ namespace MediaBrowser.Providers.Manager
Tuple<Guid, MetadataRefreshOptions> refreshItem; Tuple<Guid, MetadataRefreshOptions> refreshItem;
var libraryManager = _libraryManagerFactory(); var libraryManager = _libraryManagerFactory();
if (_disposed)
{
return;
}
var cancellationToken = _disposeCancellationTokenSource.Token;
while (_refreshQueue.TryDequeue(out refreshItem)) while (_refreshQueue.TryDequeue(out refreshItem))
{ {
if (_disposed) if (_disposed)
@ -902,18 +906,22 @@ namespace MediaBrowser.Providers.Manager
var folder = item as Folder; var folder = item as Folder;
if (folder != null) if (folder != null)
{ {
await folder.ValidateChildren(new Progress<double>(), CancellationToken.None).ConfigureAwait(false); await folder.ValidateChildren(new Progress<double>(), cancellationToken).ConfigureAwait(false);
} }
} }
var artist = item as MusicArtist; var artist = item as MusicArtist;
var task = artist == null var task = artist == null
? RefreshItem(item, refreshItem.Item2, CancellationToken.None) ? RefreshItem(item, refreshItem.Item2, cancellationToken)
: RefreshArtist(artist, refreshItem.Item2); : RefreshArtist(artist, refreshItem.Item2, cancellationToken);
await task.ConfigureAwait(false); await task.ConfigureAwait(false);
} }
} }
catch (OperationCanceledException)
{
break;
}
catch (Exception ex) catch (Exception ex)
{ {
_logger.ErrorException("Error refreshing item", ex); _logger.ErrorException("Error refreshing item", ex);
@ -928,14 +936,14 @@ namespace MediaBrowser.Providers.Manager
private async Task RefreshItem(BaseItem item, MetadataRefreshOptions options, CancellationToken cancellationToken) private async Task RefreshItem(BaseItem item, MetadataRefreshOptions options, CancellationToken cancellationToken)
{ {
await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false); await item.RefreshMetadata(options, cancellationToken).ConfigureAwait(false);
// Collection folders don't validate their children so we'll have to simulate that here // Collection folders don't validate their children so we'll have to simulate that here
var collectionFolder = item as CollectionFolder; var collectionFolder = item as CollectionFolder;
if (collectionFolder != null) if (collectionFolder != null)
{ {
await RefreshCollectionFolderChildren(options, collectionFolder).ConfigureAwait(false); await RefreshCollectionFolderChildren(options, collectionFolder, cancellationToken).ConfigureAwait(false);
} }
else else
{ {
@ -948,25 +956,23 @@ namespace MediaBrowser.Providers.Manager
} }
} }
private async Task RefreshCollectionFolderChildren(MetadataRefreshOptions options, CollectionFolder collectionFolder) private async Task RefreshCollectionFolderChildren(MetadataRefreshOptions options, CollectionFolder collectionFolder, CancellationToken cancellationToken)
{ {
foreach (var child in collectionFolder.Children.ToList()) foreach (var child in collectionFolder.Children.ToList())
{ {
await child.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false); await child.RefreshMetadata(options, cancellationToken).ConfigureAwait(false);
if (child.IsFolder) if (child.IsFolder)
{ {
var folder = (Folder)child; var folder = (Folder)child;
await folder.ValidateChildren(new Progress<double>(), CancellationToken.None, options, true).ConfigureAwait(false); await folder.ValidateChildren(new Progress<double>(), cancellationToken, options, true).ConfigureAwait(false);
} }
} }
} }
private async Task RefreshArtist(MusicArtist item, MetadataRefreshOptions options) private async Task RefreshArtist(MusicArtist item, MetadataRefreshOptions options, CancellationToken cancellationToken)
{ {
var cancellationToken = CancellationToken.None;
var albums = _libraryManagerFactory() var albums = _libraryManagerFactory()
.GetItemList(new InternalItemsQuery .GetItemList(new InternalItemsQuery
{ {
@ -991,7 +997,7 @@ namespace MediaBrowser.Providers.Manager
try try
{ {
await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false); await item.RefreshMetadata(options, cancellationToken).ConfigureAwait(false);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -1009,6 +1015,11 @@ namespace MediaBrowser.Providers.Manager
public void Dispose() public void Dispose()
{ {
_disposed = true; _disposed = true;
if (!_disposeCancellationTokenSource.IsCancellationRequested)
{
_disposeCancellationTokenSource.Cancel();
}
} }
} }
} }

View File

@ -8,6 +8,7 @@ using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Drawing;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using Emby.Drawing.Skia;
namespace MediaBrowser.Server.Startup.Common namespace MediaBrowser.Server.Startup.Common
{ {
@ -22,6 +23,15 @@ namespace MediaBrowser.Server.Startup.Common
{ {
if (!startupOptions.ContainsOption("-enablegdi")) if (!startupOptions.ContainsOption("-enablegdi"))
{ {
//try
//{
// return new SkiaEncoder(logManager.GetLogger("Skia"), appPaths, httpClient, fileSystem);
//}
//catch
//{
// logger.Error("Error loading Skia. Will revert to ImageMagick.");
//}
try try
{ {
return new ImageMagickEncoder(logManager.GetLogger("ImageMagick"), appPaths, httpClient, fileSystem); return new ImageMagickEncoder(logManager.GetLogger("ImageMagick"), appPaths, httpClient, fileSystem);

View File

@ -114,6 +114,10 @@
<Project>{6cfee013-6e7c-432b-ac37-cabf0880c69a}</Project> <Project>{6cfee013-6e7c-432b-ac37-cabf0880c69a}</Project>
<Name>Emby.Drawing.ImageMagick</Name> <Name>Emby.Drawing.ImageMagick</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\Emby.Drawing.Skia\Emby.Drawing.Skia.csproj">
<Project>{2312da6d-ff86-4597-9777-bceec32d96dd}</Project>
<Name>Emby.Drawing.Skia</Name>
</ProjectReference>
<ProjectReference Include="..\Emby.Drawing\Emby.Drawing.csproj"> <ProjectReference Include="..\Emby.Drawing\Emby.Drawing.csproj">
<Project>{08fff49b-f175-4807-a2b5-73b0ebd9f716}</Project> <Project>{08fff49b-f175-4807-a2b5-73b0ebd9f716}</Project>
<Name>Emby.Drawing</Name> <Name>Emby.Drawing</Name>

View File

@ -1,3 +1,3 @@
using System.Reflection; using System.Reflection;
[assembly: AssemblyVersion("3.2.19.3")] [assembly: AssemblyVersion("3.2.19.4")]