mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-06-03 22:38:30 +01:00
reduce scanning overhead a bit
This commit is contained in:
@@ -664,22 +664,6 @@ namespace MediaBrowser.Controller.Dto
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the library update info.
|
||||
/// </summary>
|
||||
/// <param name="changeEvent">The <see cref="ChildrenChangedEventArgs" /> instance containing the event data.</param>
|
||||
/// <returns>LibraryUpdateInfo.</returns>
|
||||
public static LibraryUpdateInfo GetLibraryUpdateInfo(ChildrenChangedEventArgs changeEvent)
|
||||
{
|
||||
return new LibraryUpdateInfo
|
||||
{
|
||||
Folder = GetBaseItemInfo(changeEvent.Folder),
|
||||
ItemsAdded = changeEvent.ItemsAdded.Select(GetBaseItemInfo),
|
||||
ItemsRemoved = changeEvent.ItemsRemoved.Select(i => i.Id),
|
||||
ItemsUpdated = changeEvent.ItemsUpdated.Select(i => i.Id)
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a UserItemData to a DTOUserItemData
|
||||
/// </summary>
|
||||
|
||||
@@ -659,7 +659,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
|
||||
foreach (var tuple in list)
|
||||
{
|
||||
if (tasks.Count > 50)
|
||||
if (tasks.Count > 5)
|
||||
{
|
||||
await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
@@ -49,8 +49,17 @@ namespace MediaBrowser.Controller.Providers
|
||||
throw new ArgumentNullException();
|
||||
}
|
||||
|
||||
var settings = new XmlReaderSettings
|
||||
{
|
||||
CheckCharacters = false,
|
||||
IgnoreProcessingInstructions = true,
|
||||
IgnoreComments = true,
|
||||
IgnoreWhitespace = true,
|
||||
ValidationType = ValidationType.None
|
||||
};
|
||||
|
||||
// Use XmlReader for best performance
|
||||
using (var reader = XmlReader.Create(metadataFile))
|
||||
using (var reader = XmlReader.Create(metadataFile, settings))
|
||||
{
|
||||
reader.MoveToContent();
|
||||
|
||||
@@ -93,7 +102,7 @@ namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
var type = reader.ReadElementContentAsString();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(type) && !type.Equals("none",StringComparison.OrdinalIgnoreCase))
|
||||
if (!string.IsNullOrWhiteSpace(type) && !type.Equals("none", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
item.DisplayMediaType = type;
|
||||
}
|
||||
|
||||
@@ -31,6 +31,8 @@ namespace MediaBrowser.Controller.Providers
|
||||
/// </summary>
|
||||
protected readonly Guid Id;
|
||||
|
||||
protected static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(5, 5);
|
||||
|
||||
/// <summary>
|
||||
/// Supportses the specified item.
|
||||
/// </summary>
|
||||
|
||||
@@ -58,7 +58,7 @@ namespace MediaBrowser.Controller.Providers
|
||||
/// <returns>Task{System.Boolean}.</returns>
|
||||
public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.Run(() => Fetch(item, cancellationToken));
|
||||
return Fetch(item, cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -67,7 +67,7 @@ namespace MediaBrowser.Controller.Providers
|
||||
/// <param name="item">The item.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
|
||||
private bool Fetch(BaseItem item, CancellationToken cancellationToken)
|
||||
private async Task<bool> Fetch(BaseItem item, CancellationToken cancellationToken)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
@@ -76,7 +76,18 @@ namespace MediaBrowser.Controller.Providers
|
||||
if (metadataFile.HasValue)
|
||||
{
|
||||
var path = metadataFile.Value.Path;
|
||||
new BaseItemXmlParser<Folder>(Logger).Fetch((Folder)item, path, cancellationToken);
|
||||
|
||||
await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||
|
||||
try
|
||||
{
|
||||
new BaseItemXmlParser<Folder>(Logger).Fetch((Folder)item, path, cancellationToken);
|
||||
}
|
||||
finally
|
||||
{
|
||||
XmlParsingResourcePool.Release();
|
||||
}
|
||||
|
||||
SetLastRefreshed(item, DateTime.UtcNow);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
/// <returns>Task{System.Boolean}.</returns>
|
||||
public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.Run(() => Fetch(item, cancellationToken));
|
||||
return Fetch(item, cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -67,7 +67,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
/// <param name="item">The item.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
|
||||
private bool Fetch(BaseItem item, CancellationToken cancellationToken)
|
||||
private async Task<bool> Fetch(BaseItem item, CancellationToken cancellationToken)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
@@ -77,14 +77,25 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
{
|
||||
var path = metadataFile.Value.Path;
|
||||
var boxset = item as BoxSet;
|
||||
if (boxset != null)
|
||||
|
||||
await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||
|
||||
try
|
||||
{
|
||||
new BaseItemXmlParser<BoxSet>(Logger).Fetch(boxset, path, cancellationToken);
|
||||
if (boxset != null)
|
||||
{
|
||||
new BaseItemXmlParser<BoxSet>(Logger).Fetch(boxset, path, cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
new BaseItemXmlParser<Movie>(Logger).Fetch((Movie)item, path, cancellationToken);
|
||||
}
|
||||
}
|
||||
else
|
||||
finally
|
||||
{
|
||||
new BaseItemXmlParser<Movie>(Logger).Fetch((Movie)item, path, cancellationToken);
|
||||
XmlParsingResourcePool.Release();
|
||||
}
|
||||
|
||||
SetLastRefreshed(item, DateTime.UtcNow);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -15,7 +15,8 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
/// </summary>
|
||||
public class EpisodeProviderFromXml : BaseMetadataProvider
|
||||
{
|
||||
public EpisodeProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
|
||||
public EpisodeProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager)
|
||||
: base(logManager, configurationManager)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -55,7 +56,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
/// <returns>Task{System.Boolean}.</returns>
|
||||
public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.Run(() => Fetch(item, cancellationToken));
|
||||
return Fetch(item, cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -84,42 +85,31 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
/// <param name="item">The item.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
|
||||
private bool Fetch(BaseItem item, CancellationToken cancellationToken)
|
||||
private async Task<bool> Fetch(BaseItem item, CancellationToken cancellationToken)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
|
||||
var metadataFile = Path.Combine(item.MetaLocation, Path.ChangeExtension(Path.GetFileName(item.Path), ".xml"));
|
||||
|
||||
var episode = (Episode)item;
|
||||
|
||||
if (!FetchMetadata(episode, item.ResolveArgs.Parent, metadataFile, cancellationToken))
|
||||
{
|
||||
// Don't set last refreshed if we didn't do anything
|
||||
return false;
|
||||
}
|
||||
|
||||
SetLastRefreshed(item, DateTime.UtcNow);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fetches the metadata.
|
||||
/// </summary>
|
||||
/// <param name="item">The item.</param>
|
||||
/// <param name="parent">The parent.</param>
|
||||
/// <param name="metadataFile">The metadata file.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
|
||||
private bool FetchMetadata(Episode item, Folder parent, string metadataFile, CancellationToken cancellationToken)
|
||||
{
|
||||
var file = parent.ResolveArgs.GetMetaFileByPath(metadataFile);
|
||||
var file = item.ResolveArgs.Parent.ResolveArgs.GetMetaFileByPath(metadataFile);
|
||||
|
||||
if (!file.HasValue)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
new EpisodeXmlParser(Logger).Fetch(item, metadataFile, cancellationToken);
|
||||
await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||
|
||||
try
|
||||
{
|
||||
new EpisodeXmlParser(Logger).Fetch((Episode)item, metadataFile, cancellationToken);
|
||||
}
|
||||
finally
|
||||
{
|
||||
XmlParsingResourcePool.Release();
|
||||
}
|
||||
|
||||
SetLastRefreshed(item, DateTime.UtcNow);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
/// <returns>Task{System.Boolean}.</returns>
|
||||
public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.Run(() => Fetch(item, cancellationToken));
|
||||
return Fetch(item, cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -68,7 +68,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
/// <param name="item">The item.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
|
||||
private bool Fetch(BaseItem item, CancellationToken cancellationToken)
|
||||
private async Task<bool> Fetch(BaseItem item, CancellationToken cancellationToken)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
@@ -78,7 +78,17 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
{
|
||||
var path = metadataFile.Value.Path;
|
||||
|
||||
new SeriesXmlParser(Logger).Fetch((Series)item, path, cancellationToken);
|
||||
await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||
|
||||
try
|
||||
{
|
||||
new SeriesXmlParser(Logger).Fetch((Series)item, path, cancellationToken);
|
||||
}
|
||||
finally
|
||||
{
|
||||
XmlParsingResourcePool.Release();
|
||||
}
|
||||
|
||||
SetLastRefreshed(item, DateTime.UtcNow);
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user