Merge pull request #7004 from Bond-009/cleanup2

pull/7049/head
Cody Robibero 3 years ago committed by GitHub
commit 251b9a5235
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -17,8 +17,7 @@ namespace Emby.Dlna.Didl
public Filter(string filter) public Filter(string filter)
{ {
_all = string.Equals(filter, "*", StringComparison.OrdinalIgnoreCase); _all = string.Equals(filter, "*", StringComparison.OrdinalIgnoreCase);
_fields = filter.Split(',', StringSplitOptions.RemoveEmptyEntries);
_fields = (filter ?? string.Empty).Split(',', StringSplitOptions.RemoveEmptyEntries);
} }
public bool Contains(string field) public bool Contains(string field)

@ -1179,6 +1179,7 @@ namespace Emby.Dlna.PlayTo
return new Device(deviceProperties, httpClientFactory, logger); return new Device(deviceProperties, httpClientFactory, logger);
} }
#nullable enable
private static DeviceIcon CreateIcon(XElement element) private static DeviceIcon CreateIcon(XElement element)
{ {
if (element == null) if (element == null)
@ -1186,68 +1187,60 @@ namespace Emby.Dlna.PlayTo
throw new ArgumentNullException(nameof(element)); throw new ArgumentNullException(nameof(element));
} }
var mimeType = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("mimetype"));
var width = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("width")); var width = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("width"));
var height = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("height")); var height = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("height"));
var depth = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("depth"));
var url = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("url"));
var widthValue = int.Parse(width, NumberStyles.Integer, CultureInfo.InvariantCulture); _ = int.TryParse(width, NumberStyles.Integer, CultureInfo.InvariantCulture, out var widthValue);
var heightValue = int.Parse(height, NumberStyles.Integer, CultureInfo.InvariantCulture); _ = int.TryParse(height, NumberStyles.Integer, CultureInfo.InvariantCulture, out var heightValue);
return new DeviceIcon return new DeviceIcon
{ {
Depth = depth, Depth = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("depth")) ?? string.Empty,
Height = heightValue, Height = heightValue,
MimeType = mimeType, MimeType = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("mimetype")) ?? string.Empty,
Url = url, Url = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("url")) ?? string.Empty,
Width = widthValue Width = widthValue
}; };
} }
private static DeviceService Create(XElement element) private static DeviceService Create(XElement element)
{ => new DeviceService()
var type = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("serviceType")); {
var id = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("serviceId")); ControlUrl = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("controlURL")) ?? string.Empty,
var scpdUrl = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("SCPDURL")); EventSubUrl = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("eventSubURL")) ?? string.Empty,
var controlURL = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("controlURL")); ScpdUrl = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("SCPDURL")) ?? string.Empty,
var eventSubURL = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("eventSubURL")); ServiceId = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("serviceId")) ?? string.Empty,
ServiceType = element.GetDescendantValue(UPnpNamespaces.Ud.GetName("serviceType")) ?? string.Empty
return new DeviceService
{
ControlUrl = controlURL,
EventSubUrl = eventSubURL,
ScpdUrl = scpdUrl,
ServiceId = id,
ServiceType = type
}; };
}
private void UpdateMediaInfo(UBaseObject mediaInfo, TransportState state) private void UpdateMediaInfo(UBaseObject? mediaInfo, TransportState state)
{ {
TransportState = state; TransportState = state;
var previousMediaInfo = CurrentMediaInfo; var previousMediaInfo = CurrentMediaInfo;
CurrentMediaInfo = mediaInfo; CurrentMediaInfo = mediaInfo;
if (previousMediaInfo == null && mediaInfo != null) if (mediaInfo == null)
{ {
if (state != TransportState.Stopped) if (previousMediaInfo != null)
{ {
OnPlaybackStart(mediaInfo); OnPlaybackStop(previousMediaInfo);
} }
} }
else if (mediaInfo != null && previousMediaInfo != null && !mediaInfo.Equals(previousMediaInfo)) else if (previousMediaInfo == null)
{ {
OnMediaChanged(previousMediaInfo, mediaInfo); if (state != TransportState.Stopped)
{
OnPlaybackStart(mediaInfo);
}
} }
else if (mediaInfo == null && previousMediaInfo != null) else if (mediaInfo.Equals(previousMediaInfo))
{ {
OnPlaybackStop(previousMediaInfo); OnPlaybackProgress(mediaInfo);
} }
else if (mediaInfo != null && mediaInfo.Equals(previousMediaInfo)) else
{ {
OnPlaybackProgress(mediaInfo); OnMediaChanged(previousMediaInfo, mediaInfo);
} }
} }

@ -210,9 +210,9 @@ namespace Emby.Dlna.PlayTo
var mediaSource = await streamInfo.GetMediaSource(CancellationToken.None).ConfigureAwait(false); var mediaSource = await streamInfo.GetMediaSource(CancellationToken.None).ConfigureAwait(false);
var duration = mediaSource == null ? var duration = mediaSource == null
(_device.Duration == null ? (long?)null : _device.Duration.Value.Ticks) : ? _device.Duration?.Ticks
mediaSource.RunTimeTicks; : mediaSource.RunTimeTicks;
var playedToCompletion = positionTicks.HasValue && positionTicks.Value == 0; var playedToCompletion = positionTicks.HasValue && positionTicks.Value == 0;

@ -175,7 +175,7 @@ namespace Emby.Dlna.PlayTo
var sendValue = state.AllowedValues.FirstOrDefault(a => string.Equals(a, commandParameter, StringComparison.OrdinalIgnoreCase)) ?? var sendValue = state.AllowedValues.FirstOrDefault(a => string.Equals(a, commandParameter, StringComparison.OrdinalIgnoreCase)) ??
(state.AllowedValues.Count > 0 ? state.AllowedValues[0] : value); (state.AllowedValues.Count > 0 ? state.AllowedValues[0] : value);
return string.Format(CultureInfo.InvariantCulture, "<{0} xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"{1}\">{2}</{0}>", argument.Name, state.DataType ?? "string", sendValue); return string.Format(CultureInfo.InvariantCulture, "<{0} xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"{1}\">{2}</{0}>", argument.Name, state.DataType, sendValue);
} }
return string.Format(CultureInfo.InvariantCulture, "<{0}>{1}</{0}>", argument.Name, value); return string.Format(CultureInfo.InvariantCulture, "<{0}>{1}</{0}>", argument.Name, value);

@ -167,8 +167,7 @@ namespace Emby.Dlna.Profiles
public void AddXmlRootAttribute(string name, string value) public void AddXmlRootAttribute(string name, string value)
{ {
var atts = XmlRootAttributes ?? System.Array.Empty<XmlAttribute>(); var list = XmlRootAttributes.ToList();
var list = atts.ToList();
list.Add(new XmlAttribute list.Add(new XmlAttribute
{ {

@ -189,7 +189,7 @@ namespace Emby.Dlna.Server
builder.Append("<icon>"); builder.Append("<icon>");
builder.Append("<mimetype>") builder.Append("<mimetype>")
.Append(SecurityElement.Escape(icon.MimeType ?? string.Empty)) .Append(SecurityElement.Escape(icon.MimeType))
.Append("</mimetype>"); .Append("</mimetype>");
builder.Append("<width>") builder.Append("<width>")
.Append(SecurityElement.Escape(icon.Width.ToString(CultureInfo.InvariantCulture))) .Append(SecurityElement.Escape(icon.Width.ToString(CultureInfo.InvariantCulture)))
@ -198,7 +198,7 @@ namespace Emby.Dlna.Server
.Append(SecurityElement.Escape(icon.Height.ToString(CultureInfo.InvariantCulture))) .Append(SecurityElement.Escape(icon.Height.ToString(CultureInfo.InvariantCulture)))
.Append("</height>"); .Append("</height>");
builder.Append("<depth>") builder.Append("<depth>")
.Append(SecurityElement.Escape(icon.Depth ?? string.Empty)) .Append(SecurityElement.Escape(icon.Depth))
.Append("</depth>"); .Append("</depth>");
builder.Append("<url>") builder.Append("<url>")
.Append(BuildUrl(icon.Url)) .Append(BuildUrl(icon.Url))
@ -219,10 +219,10 @@ namespace Emby.Dlna.Server
builder.Append("<service>"); builder.Append("<service>");
builder.Append("<serviceType>") builder.Append("<serviceType>")
.Append(SecurityElement.Escape(service.ServiceType ?? string.Empty)) .Append(SecurityElement.Escape(service.ServiceType))
.Append("</serviceType>"); .Append("</serviceType>");
builder.Append("<serviceId>") builder.Append("<serviceId>")
.Append(SecurityElement.Escape(service.ServiceId ?? string.Empty)) .Append(SecurityElement.Escape(service.ServiceId))
.Append("</serviceId>"); .Append("</serviceId>");
builder.Append("<SCPDURL>") builder.Append("<SCPDURL>")
.Append(BuildUrl(service.ScpdUrl)) .Append(BuildUrl(service.ScpdUrl))

@ -38,7 +38,7 @@ namespace Emby.Dlna.Service
builder.Append("<action>"); builder.Append("<action>");
builder.Append("<name>") builder.Append("<name>")
.Append(SecurityElement.Escape(item.Name ?? string.Empty)) .Append(SecurityElement.Escape(item.Name))
.Append("</name>"); .Append("</name>");
builder.Append("<argumentList>"); builder.Append("<argumentList>");
@ -48,13 +48,13 @@ namespace Emby.Dlna.Service
builder.Append("<argument>"); builder.Append("<argument>");
builder.Append("<name>") builder.Append("<name>")
.Append(SecurityElement.Escape(argument.Name ?? string.Empty)) .Append(SecurityElement.Escape(argument.Name))
.Append("</name>"); .Append("</name>");
builder.Append("<direction>") builder.Append("<direction>")
.Append(SecurityElement.Escape(argument.Direction ?? string.Empty)) .Append(SecurityElement.Escape(argument.Direction))
.Append("</direction>"); .Append("</direction>");
builder.Append("<relatedStateVariable>") builder.Append("<relatedStateVariable>")
.Append(SecurityElement.Escape(argument.RelatedStateVariable ?? string.Empty)) .Append(SecurityElement.Escape(argument.RelatedStateVariable))
.Append("</relatedStateVariable>"); .Append("</relatedStateVariable>");
builder.Append("</argument>"); builder.Append("</argument>");
@ -81,10 +81,10 @@ namespace Emby.Dlna.Service
.Append("\">"); .Append("\">");
builder.Append("<name>") builder.Append("<name>")
.Append(SecurityElement.Escape(item.Name ?? string.Empty)) .Append(SecurityElement.Escape(item.Name))
.Append("</name>"); .Append("</name>");
builder.Append("<dataType>") builder.Append("<dataType>")
.Append(SecurityElement.Escape(item.DataType ?? string.Empty)) .Append(SecurityElement.Escape(item.DataType))
.Append("</dataType>"); .Append("</dataType>");
if (item.AllowedValues.Count > 0) if (item.AllowedValues.Count > 0)

@ -242,7 +242,7 @@ namespace Emby.Drawing
return ImageFormat.Jpg; return ImageFormat.Jpg;
} }
private string? GetMimeType(ImageFormat format, string path) private string GetMimeType(ImageFormat format, string path)
=> format switch => format switch
{ {
ImageFormat.Bmp => MimeTypes.GetMimeType("i.bmp"), ImageFormat.Bmp => MimeTypes.GetMimeType("i.bmp"),

@ -50,7 +50,7 @@ namespace Emby.Naming.TV
if (expression.IsNamed) if (expression.IsNamed)
{ {
result.SeriesName = match.Groups["seriesname"].Value; result.SeriesName = match.Groups["seriesname"].Value;
result.Success = !string.IsNullOrEmpty(result.SeriesName) && !string.IsNullOrEmpty(match.Groups["seasonnumber"]?.Value); result.Success = !string.IsNullOrEmpty(result.SeriesName) && !match.Groups["seasonnumber"].ValueSpan.IsEmpty;
} }
} }

@ -24,63 +24,63 @@ namespace Emby.Notifications
{ {
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.ApplicationUpdateInstalled.ToString() Type = nameof(NotificationType.ApplicationUpdateInstalled)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.InstallationFailed.ToString() Type = nameof(NotificationType.InstallationFailed)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.PluginInstalled.ToString() Type = nameof(NotificationType.PluginInstalled)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.PluginError.ToString() Type = nameof(NotificationType.PluginError)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.PluginUninstalled.ToString() Type = nameof(NotificationType.PluginUninstalled)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.PluginUpdateInstalled.ToString() Type = nameof(NotificationType.PluginUpdateInstalled)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.ServerRestartRequired.ToString() Type = nameof(NotificationType.ServerRestartRequired)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.TaskFailed.ToString() Type = nameof(NotificationType.TaskFailed)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.NewLibraryContent.ToString() Type = nameof(NotificationType.NewLibraryContent)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.AudioPlayback.ToString() Type = nameof(NotificationType.AudioPlayback)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.VideoPlayback.ToString() Type = nameof(NotificationType.VideoPlayback)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.AudioPlaybackStopped.ToString() Type = nameof(NotificationType.AudioPlaybackStopped)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.VideoPlaybackStopped.ToString() Type = nameof(NotificationType.VideoPlaybackStopped)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.UserLockedOut.ToString() Type = nameof(NotificationType.UserLockedOut)
}, },
new NotificationTypeInfo new NotificationTypeInfo
{ {
Type = NotificationType.ApplicationUpdateAvailable.ToString() Type = nameof(NotificationType.ApplicationUpdateAvailable)
} }
}; };
@ -98,7 +98,7 @@ namespace Emby.Notifications
private void Update(NotificationTypeInfo note) private void Update(NotificationTypeInfo note)
{ {
note.Name = _localization.GetLocalizedString("NotificationOption" + note.Type) ?? note.Type; note.Name = _localization.GetLocalizedString("NotificationOption" + note.Type);
note.IsBasedOnUserEvent = note.Type.IndexOf("Playback", StringComparison.OrdinalIgnoreCase) != -1; note.IsBasedOnUserEvent = note.Type.IndexOf("Playback", StringComparison.OrdinalIgnoreCase) != -1;

@ -371,7 +371,7 @@ namespace Emby.Server.Implementations.AppBase
NewConfiguration = configuration NewConfiguration = configuration
}); });
_configurations.AddOrUpdate(key, configuration, (k, v) => configuration); _configurations.AddOrUpdate(key, configuration, (_, _) => configuration);
var path = GetConfigurationFile(key); var path = GetConfigurationFile(key);
Directory.CreateDirectory(Path.GetDirectoryName(path)); Directory.CreateDirectory(Path.GetDirectoryName(path));

@ -282,8 +282,6 @@ namespace Emby.Server.Implementations.Data
typeof(AggregateFolder) typeof(AggregateFolder)
}; };
private readonly Dictionary<string, string> _types = GetTypeMapDictionary();
private static readonly Dictionary<BaseItemKind, string> _baseItemKindNames = new() private static readonly Dictionary<BaseItemKind, string> _baseItemKindNames = new()
{ {
{ BaseItemKind.AggregateFolder, typeof(AggregateFolder).FullName }, { BaseItemKind.AggregateFolder, typeof(AggregateFolder).FullName },
@ -3440,11 +3438,6 @@ namespace Emby.Server.Implementations.Data
return true; return true;
} }
private bool IsValidType(string value)
{
return IsAlphaNumeric(value);
}
private bool IsValidMediaType(string value) private bool IsValidMediaType(string value)
{ {
return IsAlphaNumeric(value); return IsAlphaNumeric(value);
@ -4711,7 +4704,7 @@ namespace Emby.Server.Implementations.Data
if (statement == null) if (statement == null)
{ {
int index = 0; int index = 0;
string excludedTags = string.Join(',', query.ExcludeInheritedTags.Select(t => paramName + index++)); string excludedTags = string.Join(',', query.ExcludeInheritedTags.Select(_ => paramName + index++));
whereClauses.Add("((select CleanValue from itemvalues where ItemId=Guid and Type=6 and cleanvalue in (" + excludedTags + ")) is null)"); whereClauses.Add("((select CleanValue from itemvalues where ItemId=Guid and Type=6 and cleanvalue in (" + excludedTags + ")) is null)");
} }
else else
@ -4968,21 +4961,6 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
} }
} }
private static Dictionary<string, string> GetTypeMapDictionary()
{
var dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
foreach (var t in _knownTypes)
{
dict[t.Name] = t.FullName;
}
dict["Program"] = typeof(LiveTvProgram).FullName;
dict["TvChannel"] = typeof(LiveTvChannel).FullName;
return dict;
}
public void DeleteItem(Guid id) public void DeleteItem(Guid id)
{ {
if (id == Guid.Empty) if (id == Guid.Empty)

@ -37,7 +37,7 @@ namespace Emby.Server.Implementations.Devices
{ {
var value = File.ReadAllText(CachePath, Encoding.UTF8); var value = File.ReadAllText(CachePath, Encoding.UTF8);
if (Guid.TryParse(value, out var guid)) if (Guid.TryParse(value, out _))
{ {
return value; return value;
} }

@ -109,7 +109,7 @@ namespace Emby.Server.Implementations.Dto
} }
}); });
SetItemByNameInfo(item, dto, libraryItems, user); SetItemByNameInfo(item, dto, libraryItems);
} }
} }
@ -153,8 +153,7 @@ namespace Emby.Server.Implementations.Dto
new DtoOptions(false) new DtoOptions(false)
{ {
EnableImages = false EnableImages = false
}), }));
user);
} }
return dto; return dto;
@ -311,13 +310,13 @@ namespace Emby.Server.Implementations.Dto
if (taggedItems != null && options.ContainsField(ItemFields.ItemCounts)) if (taggedItems != null && options.ContainsField(ItemFields.ItemCounts))
{ {
SetItemByNameInfo(item, dto, taggedItems, user); SetItemByNameInfo(item, dto, taggedItems);
} }
return dto; return dto;
} }
private static void SetItemByNameInfo(BaseItem item, BaseItemDto dto, IList<BaseItem> taggedItems, User user = null) private static void SetItemByNameInfo(BaseItem item, BaseItemDto dto, IList<BaseItem> taggedItems)
{ {
if (item is MusicArtist) if (item is MusicArtist)
{ {

@ -101,7 +101,7 @@ namespace Emby.Server.Implementations.EntryPoints
} }
} }
_lastProgressMessageTimes.AddOrUpdate(item.Id, key => DateTime.UtcNow, (key, existing) => DateTime.UtcNow); _lastProgressMessageTimes.AddOrUpdate(item.Id, _ => DateTime.UtcNow, (_, _) => DateTime.UtcNow);
var dict = new Dictionary<string, string>(); var dict = new Dictionary<string, string>();
dict["ItemId"] = item.Id.ToString("N", CultureInfo.InvariantCulture); dict["ItemId"] = item.Id.ToString("N", CultureInfo.InvariantCulture);
@ -144,7 +144,7 @@ namespace Emby.Server.Implementations.EntryPoints
{ {
OnProviderRefreshProgress(sender, new GenericEventArgs<Tuple<BaseItem, double>>(new Tuple<BaseItem, double>(e.Argument, 100))); OnProviderRefreshProgress(sender, new GenericEventArgs<Tuple<BaseItem, double>>(new Tuple<BaseItem, double>(e.Argument, 100)));
_lastProgressMessageTimes.TryRemove(e.Argument.Id, out DateTime removed); _lastProgressMessageTimes.TryRemove(e.Argument.Id, out _);
} }
private static bool EnableRefreshMessage(BaseItem item) private static bool EnableRefreshMessage(BaseItem item)
@ -423,7 +423,6 @@ namespace Emby.Server.Implementations.EntryPoints
continue; continue;
} }
var collectionFolders = _libraryManager.GetCollectionFolders(item, allUserRootChildren);
foreach (var folder in allUserRootChildren) foreach (var folder in allUserRootChildren)
{ {
list.Add(folder.Id.ToString("N", CultureInfo.InvariantCulture)); list.Add(folder.Id.ToString("N", CultureInfo.InvariantCulture));

@ -95,7 +95,7 @@ namespace Emby.Server.Implementations.EntryPoints
var changes = _changedItems.ToList(); var changes = _changedItems.ToList();
_changedItems.Clear(); _changedItems.Clear();
var task = SendNotifications(changes, CancellationToken.None); SendNotifications(changes, CancellationToken.None).GetAwaiter().GetResult();
if (_updateTimer != null) if (_updateTimer != null)
{ {

@ -47,7 +47,7 @@ namespace Emby.Server.Implementations.HttpServer.Security
{ {
var session = await GetSession(requestContext).ConfigureAwait(false); var session = await GetSession(requestContext).ConfigureAwait(false);
return session == null || session.UserId.Equals(Guid.Empty) ? null : _userManager.GetUserById(session.UserId); return session.UserId.Equals(Guid.Empty) ? null : _userManager.GetUserById(session.UserId);
} }
public Task<User?> GetUser(object requestContext) public Task<User?> GetUser(object requestContext)

@ -217,8 +217,13 @@ namespace Emby.Server.Implementations.IO
/// <inheritdoc /> /// <inheritdoc />
public void Dispose() public void Dispose()
{ {
_disposed = true; if (_disposed)
{
return;
}
DisposeTimer(); DisposeTimer();
_disposed = true;
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
} }

@ -99,7 +99,7 @@ namespace Emby.Server.Implementations.IO
// But if we make this delay too high, we risk missing legitimate changes, such as user adding a new file, or hand-editing metadata // But if we make this delay too high, we risk missing legitimate changes, such as user adding a new file, or hand-editing metadata
await Task.Delay(45000).ConfigureAwait(false); await Task.Delay(45000).ConfigureAwait(false);
_tempIgnoredPaths.TryRemove(path, out var val); _tempIgnoredPaths.TryRemove(path, out _);
if (refreshPath) if (refreshPath)
{ {

@ -544,16 +544,6 @@ namespace Emby.Server.Implementations.IO
/// <inheritdoc /> /// <inheritdoc />
public virtual bool AreEqual(string path1, string path2) public virtual bool AreEqual(string path1, string path2)
{ {
if (path1 == null && path2 == null)
{
return true;
}
if (path1 == null || path2 == null)
{
return false;
}
return string.Equals( return string.Equals(
NormalizePath(path1), NormalizePath(path1),
NormalizePath(path2), NormalizePath(path2),

@ -16,7 +16,7 @@ using Emby.Naming.TV;
using Emby.Naming.Video; using Emby.Naming.Video;
using Emby.Server.Implementations.Library.Validators; using Emby.Server.Implementations.Library.Validators;
using Emby.Server.Implementations.Playlists; using Emby.Server.Implementations.Playlists;
using Emby.Server.Implementations.ScheduledTasks; using Emby.Server.Implementations.ScheduledTasks.Tasks;
using Jellyfin.Data.Entities; using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums; using Jellyfin.Data.Enums;
using Jellyfin.Extensions; using Jellyfin.Extensions;
@ -2678,7 +2678,7 @@ namespace Emby.Server.Implementations.Library
return new ItemLookupInfo return new ItemLookupInfo
{ {
Name = VideoResolver.TryCleanString(result.Name, namingOptions, out var newName) ? newName.ToString() : result.Name, Name = VideoResolver.TryCleanString(result.Name, namingOptions, out var newName) ? newName : result.Name,
Year = result.Year Year = result.Year
}; };
} }

@ -66,11 +66,8 @@ namespace Emby.Server.Implementations.Library
{ {
var delayMs = mediaSource.AnalyzeDurationMs ?? 0; var delayMs = mediaSource.AnalyzeDurationMs ?? 0;
delayMs = Math.Max(3000, delayMs); delayMs = Math.Max(3000, delayMs);
if (delayMs > 0) _logger.LogInformation("Waiting {0}ms before probing the live stream", delayMs);
{ await Task.Delay(delayMs, cancellationToken).ConfigureAwait(false);
_logger.LogInformation("Waiting {0}ms before probing the live stream", delayMs);
await Task.Delay(delayMs, cancellationToken).ConfigureAwait(false);
}
} }
mediaSource.AnalyzeDurationMs = 3000; mediaSource.AnalyzeDurationMs = 3000;

@ -103,7 +103,7 @@ namespace Emby.Server.Implementations.Library
public List<BaseItem> GetInstantMixFromItem(BaseItem item, User user, DtoOptions dtoOptions) public List<BaseItem> GetInstantMixFromItem(BaseItem item, User user, DtoOptions dtoOptions)
{ {
if (item is MusicGenre genre) if (item is MusicGenre)
{ {
return GetInstantMixFromGenreIds(new[] { item.Id }, user, dtoOptions); return GetInstantMixFromGenreIds(new[] { item.Id }, user, dtoOptions);
} }

@ -112,7 +112,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
/// Determine if the supplied list contains what we should consider music. /// Determine if the supplied list contains what we should consider music.
/// </summary> /// </summary>
private bool ContainsMusic( private bool ContainsMusic(
IEnumerable<FileSystemMetadata> list, ICollection<FileSystemMetadata> list,
bool allowSubfolders, bool allowSubfolders,
IDirectoryService directoryService) IDirectoryService directoryService)
{ {

@ -75,7 +75,7 @@ namespace Emby.Server.Implementations.Library
} }
var cacheKey = GetCacheKey(userId, item.Id); var cacheKey = GetCacheKey(userId, item.Id);
_userData.AddOrUpdate(cacheKey, userData, (k, v) => userData); _userData.AddOrUpdate(cacheKey, userData, (_, _) => userData);
UserDataSaved?.Invoke(this, new UserDataSaveEventArgs UserDataSaved?.Invoke(this, new UserDataSaveEventArgs
{ {
@ -125,7 +125,7 @@ namespace Emby.Server.Implementations.Library
var cacheKey = GetCacheKey(userId, itemId); var cacheKey = GetCacheKey(userId, itemId);
return _userData.GetOrAdd(cacheKey, k => GetUserDataInternal(userId, keys)); return _userData.GetOrAdd(cacheKey, _ => GetUserDataInternal(userId, keys));
} }
private UserItemData GetUserDataInternal(long internalUserId, List<string> keys) private UserItemData GetUserDataInternal(long internalUserId, List<string> keys)

@ -173,7 +173,7 @@ namespace Emby.Server.Implementations.Library
string viewType, string viewType,
string localizationKey, string localizationKey,
string sortName, string sortName,
Jellyfin.Data.Entities.User user, User user,
string[] presetViews) string[] presetViews)
{ {
if (parents.Count == 1 && parents.All(i => string.Equals(i.CollectionType, viewType, StringComparison.OrdinalIgnoreCase))) if (parents.Count == 1 && parents.All(i => string.Equals(i.CollectionType, viewType, StringComparison.OrdinalIgnoreCase)))
@ -359,7 +359,7 @@ namespace Emby.Server.Implementations.Library
(ItemSortBy.SortName, SortOrder.Descending), (ItemSortBy.SortName, SortOrder.Descending),
(ItemSortBy.ProductionYear, SortOrder.Descending) (ItemSortBy.ProductionYear, SortOrder.Descending)
}, },
IsFolder = includeItemTypes.Length == 0 ? false : (bool?)null, IsFolder = includeItemTypes.Length == 0 ? false : null,
ExcludeItemTypes = excludeItemTypes, ExcludeItemTypes = excludeItemTypes,
IsVirtualItem = false, IsVirtualItem = false,
Limit = limit * 5, Limit = limit * 5,

@ -398,7 +398,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
} }
result = new EpgChannelData(channels); result = new EpgChannelData(channels);
_epgChannels.AddOrUpdate(info.Id, result, (k, v) => result); _epgChannels.AddOrUpdate(info.Id, result, (_, _) => result);
} }
return result; return result;
@ -1248,12 +1248,11 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
var remoteMetadata = await FetchInternetMetadata(timer, CancellationToken.None).ConfigureAwait(false); var remoteMetadata = await FetchInternetMetadata(timer, CancellationToken.None).ConfigureAwait(false);
var recordPath = GetRecordingPath(timer, remoteMetadata, out string seriesPath); var recordPath = GetRecordingPath(timer, remoteMetadata, out string seriesPath);
var recordingStatus = RecordingStatus.New;
string liveStreamId = null;
var channelItem = _liveTvManager.GetLiveTvChannel(timer, this); var channelItem = _liveTvManager.GetLiveTvChannel(timer, this);
string liveStreamId = null;
RecordingStatus recordingStatus;
try try
{ {
var allMediaSources = await _mediaSourceManager.GetPlaybackMediaSources(channelItem, null, true, false, CancellationToken.None).ConfigureAwait(false); var allMediaSources = await _mediaSourceManager.GetPlaybackMediaSources(channelItem, null, true, false, CancellationToken.None).ConfigureAwait(false);
@ -1339,7 +1338,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
TriggerRefresh(recordPath); TriggerRefresh(recordPath);
_libraryMonitor.ReportFileSystemChangeComplete(recordPath, false); _libraryMonitor.ReportFileSystemChangeComplete(recordPath, false);
_activeRecordings.TryRemove(timer.Id, out var removed); _activeRecordings.TryRemove(timer.Id, out _);
if (recordingStatus != RecordingStatus.Completed && DateTime.UtcNow < timer.EndDate && timer.RetryCount < 10) if (recordingStatus != RecordingStatus.Completed && DateTime.UtcNow < timer.EndDate && timer.RetryCount < 10)
{ {
@ -1937,7 +1936,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
writer.WriteElementString("title", timer.EpisodeTitle); writer.WriteElementString("title", timer.EpisodeTitle);
} }
var premiereDate = item.PremiereDate ?? (!timer.IsRepeat ? DateTime.UtcNow : (DateTime?)null); var premiereDate = item.PremiereDate ?? (!timer.IsRepeat ? DateTime.UtcNow : null);
if (premiereDate.HasValue) if (premiereDate.HasValue)
{ {
@ -2126,12 +2125,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
private LiveTvProgram GetProgramInfoFromCache(TimerInfo timer) private LiveTvProgram GetProgramInfoFromCache(TimerInfo timer)
{ {
return GetProgramInfoFromCache(timer.ProgramId, timer.ChannelId); return GetProgramInfoFromCache(timer.ProgramId);
}
private LiveTvProgram GetProgramInfoFromCache(string programId, string channelId)
{
return GetProgramInfoFromCache(programId);
} }
private LiveTvProgram GetProgramInfoFromCache(string channelId, DateTime startDateUtc) private LiveTvProgram GetProgramInfoFromCache(string channelId, DateTime startDateUtc)
@ -2277,7 +2271,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
{ {
// Only update if not currently active - test both new timer and existing in case Id's are different // Only update if not currently active - test both new timer and existing in case Id's are different
// Id's could be different if the timer was created manually prior to series timer creation // Id's could be different if the timer was created manually prior to series timer creation
if (!_activeRecordings.TryGetValue(timer.Id, out var activeRecordingInfo) && !_activeRecordings.TryGetValue(existingTimer.Id, out activeRecordingInfo)) if (!_activeRecordings.TryGetValue(timer.Id, out _) && !_activeRecordings.TryGetValue(existingTimer.Id, out _))
{ {
UpdateExistingTimerWithNewMetadata(existingTimer, timer); UpdateExistingTimerWithNewMetadata(existingTimer, timer);
@ -2298,17 +2292,14 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
enabledTimersForSeries.Add(existingTimer); enabledTimersForSeries.Add(existingTimer);
} }
if (updateTimerSettings) existingTimer.KeepUntil = seriesTimer.KeepUntil;
{ existingTimer.IsPostPaddingRequired = seriesTimer.IsPostPaddingRequired;
existingTimer.KeepUntil = seriesTimer.KeepUntil; existingTimer.IsPrePaddingRequired = seriesTimer.IsPrePaddingRequired;
existingTimer.IsPostPaddingRequired = seriesTimer.IsPostPaddingRequired; existingTimer.PostPaddingSeconds = seriesTimer.PostPaddingSeconds;
existingTimer.IsPrePaddingRequired = seriesTimer.IsPrePaddingRequired; existingTimer.PrePaddingSeconds = seriesTimer.PrePaddingSeconds;
existingTimer.PostPaddingSeconds = seriesTimer.PostPaddingSeconds; existingTimer.Priority = seriesTimer.Priority;
existingTimer.PrePaddingSeconds = seriesTimer.PrePaddingSeconds;
existingTimer.Priority = seriesTimer.Priority;
}
existingTimer.SeriesTimerId = seriesTimer.Id; existingTimer.SeriesTimerId = seriesTimer.Id;
_timerProvider.Update(existingTimer); _timerProvider.Update(existingTimer);
} }
} }

@ -62,12 +62,12 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
using var durationToken = new CancellationTokenSource(duration); using var durationToken = new CancellationTokenSource(duration);
using var cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token); using var cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token);
await RecordFromFile(mediaSource, mediaSource.Path, targetFile, duration, onStarted, cancellationTokenSource.Token).ConfigureAwait(false); await RecordFromFile(mediaSource, mediaSource.Path, targetFile, onStarted, cancellationTokenSource.Token).ConfigureAwait(false);
_logger.LogInformation("Recording completed to file {0}", targetFile); _logger.LogInformation("Recording completed to file {0}", targetFile);
} }
private async Task RecordFromFile(MediaSourceInfo mediaSource, string inputFile, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken) private async Task RecordFromFile(MediaSourceInfo mediaSource, string inputFile, string targetFile, Action onStarted, CancellationToken cancellationToken)
{ {
_targetPath = targetFile; _targetPath = targetFile;
Directory.CreateDirectory(Path.GetDirectoryName(targetFile)); Directory.CreateDirectory(Path.GetDirectoryName(targetFile));
@ -81,7 +81,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
RedirectStandardInput = true, RedirectStandardInput = true,
FileName = _mediaEncoder.EncoderPath, FileName = _mediaEncoder.EncoderPath,
Arguments = GetCommandLineArgs(mediaSource, inputFile, targetFile, duration), Arguments = GetCommandLineArgs(mediaSource, inputFile, targetFile),
WindowStyle = ProcessWindowStyle.Hidden, WindowStyle = ProcessWindowStyle.Hidden,
ErrorDialog = false ErrorDialog = false
@ -103,7 +103,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
StartInfo = processStartInfo, StartInfo = processStartInfo,
EnableRaisingEvents = true EnableRaisingEvents = true
}; };
_process.Exited += (sender, args) => OnFfMpegProcessExited(_process); _process.Exited += (_, _) => OnFfMpegProcessExited(_process);
_process.Start(); _process.Start();
@ -117,7 +117,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
_logger.LogInformation("ffmpeg recording process started for {0}", _targetPath); _logger.LogInformation("ffmpeg recording process started for {0}", _targetPath);
} }
private string GetCommandLineArgs(MediaSourceInfo mediaSource, string inputTempFile, string targetFile, TimeSpan duration) private string GetCommandLineArgs(MediaSourceInfo mediaSource, string inputTempFile, string targetFile)
{ {
string videoArgs; string videoArgs;
if (EncodeVideo(mediaSource)) if (EncodeVideo(mediaSource))

@ -159,8 +159,8 @@ namespace Emby.Server.Implementations.LiveTv.Listings
var programEntry = programDict[schedule.ProgramId]; var programEntry = programDict[schedule.ProgramId];
var allImages = images[imageIndex].Data; var allImages = images[imageIndex].Data;
var imagesWithText = allImages.Where(i => string.Equals(i.Text, "yes", StringComparison.OrdinalIgnoreCase)); var imagesWithText = allImages.Where(i => string.Equals(i.Text, "yes", StringComparison.OrdinalIgnoreCase)).ToList();
var imagesWithoutText = allImages.Where(i => string.Equals(i.Text, "no", StringComparison.OrdinalIgnoreCase)); var imagesWithoutText = allImages.Where(i => string.Equals(i.Text, "no", StringComparison.OrdinalIgnoreCase)).ToList();
const double DesiredAspect = 2.0 / 3; const double DesiredAspect = 2.0 / 3;
@ -820,10 +820,5 @@ namespace Emby.Server.Implementations.LiveTv.Listings
return list; return list;
} }
private static string NormalizeName(string value)
{
return value.Replace(" ", string.Empty, StringComparison.Ordinal).Replace("-", string.Empty, StringComparison.Ordinal);
}
} }
} }

@ -630,7 +630,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
} }
catch (HttpRequestException ex) catch (HttpRequestException ex)
{ {
if (ex.StatusCode.HasValue && ex.StatusCode.Value == System.Net.HttpStatusCode.NotFound) if (ex.StatusCode.HasValue && ex.StatusCode.Value == HttpStatusCode.NotFound)
{ {
// HDHR4 doesn't have this api // HDHR4 doesn't have this api
return; return;

@ -122,7 +122,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
if (!TryGetReturnValueOfGetSet(buffer.AsSpan(0, receivedBytes), out _)) if (!TryGetReturnValueOfGetSet(buffer.AsSpan(0, receivedBytes), out _))
{ {
await ReleaseLockkey(_tcpClient, lockKeyValue).ConfigureAwait(false); await ReleaseLockkey(_tcpClient, lockKeyValue).ConfigureAwait(false);
continue;
} }
} }

@ -131,7 +131,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
public async Task Validate(TunerHostInfo info) public async Task Validate(TunerHostInfo info)
{ {
using (var stream = await new M3uParser(Logger, _httpClientFactory).GetListingsStream(info, CancellationToken.None).ConfigureAwait(false)) using (await new M3uParser(Logger, _httpClientFactory).GetListingsStream(info, CancellationToken.None).ConfigureAwait(false))
{ {
} }
} }

@ -19,7 +19,7 @@ namespace Emby.Server.Implementations.Net
throw new ArgumentException("localPort cannot be less than zero.", nameof(localPort)); throw new ArgumentException("localPort cannot be less than zero.", nameof(localPort));
} }
var retVal = new Socket(AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); var retVal = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try try
{ {
retVal.EnableBroadcast = true; retVal.EnableBroadcast = true;
@ -44,7 +44,7 @@ namespace Emby.Server.Implementations.Net
throw new ArgumentException("localPort cannot be less than zero.", nameof(localPort)); throw new ArgumentException("localPort cannot be less than zero.", nameof(localPort));
} }
var retVal = new Socket(AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); var retVal = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try try
{ {
retVal.EnableBroadcast = true; retVal.EnableBroadcast = true;
@ -85,7 +85,7 @@ namespace Emby.Server.Implementations.Net
throw new ArgumentException("localPort cannot be less than zero.", nameof(localPort)); throw new ArgumentException("localPort cannot be less than zero.", nameof(localPort));
} }
var retVal = new Socket(AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); var retVal = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try try
{ {

@ -360,11 +360,6 @@ namespace Emby.Server.Implementations.Plugins
/// <inheritdoc/> /// <inheritdoc/>
public async Task<bool> GenerateManifest(PackageInfo packageInfo, Version version, string path, PluginStatus status) public async Task<bool> GenerateManifest(PackageInfo packageInfo, Version version, string path, PluginStatus status)
{ {
if (packageInfo == null)
{
return false;
}
var versionInfo = packageInfo.Versions.First(v => v.Version == version.ToString()); var versionInfo = packageInfo.Versions.First(v => v.Version == version.ToString());
var imagePath = string.Empty; var imagePath = string.Empty;
@ -617,7 +612,7 @@ namespace Emby.Server.Implementations.Plugins
if (versionIndex != -1) if (versionIndex != -1)
{ {
// Get the version number from the filename if possible. // Get the version number from the filename if possible.
metafile = Path.GetFileName(dir[..versionIndex]) ?? dir[..versionIndex]; metafile = Path.GetFileName(dir[..versionIndex]);
version = Version.TryParse(dir.AsSpan()[(versionIndex + 1)..], out Version? parsedVersion) ? parsedVersion : _appVersion; version = Version.TryParse(dir.AsSpan()[(versionIndex + 1)..], out Version? parsedVersion) ? parsedVersion : _appVersion;
} }
else else
@ -682,7 +677,6 @@ namespace Emby.Server.Implementations.Plugins
continue; continue;
} }
var manifest = entry.Manifest;
var cleaned = false; var cleaned = false;
var path = entry.Path; var path = entry.Path;
if (_config.RemoveOldPlugins) if (_config.RemoveOldPlugins)
@ -707,12 +701,6 @@ namespace Emby.Server.Implementations.Plugins
} }
else else
{ {
if (manifest == null)
{
_logger.LogWarning("Unable to disable plugin {Path}", entry.Path);
continue;
}
ChangePluginState(entry, PluginStatus.Deleted); ChangePluginState(entry, PluginStatus.Deleted);
} }
} }

@ -9,6 +9,7 @@ using System.Linq;
using System.Text.Json; using System.Text.Json;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Emby.Server.Implementations.ScheduledTasks.Triggers;
using Jellyfin.Data.Events; using Jellyfin.Data.Events;
using Jellyfin.Extensions.Json; using Jellyfin.Extensions.Json;
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;

@ -17,7 +17,7 @@ using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Tasks;
namespace Emby.Server.Implementations.ScheduledTasks namespace Emby.Server.Implementations.ScheduledTasks.Tasks
{ {
/// <summary> /// <summary>
/// Class ChapterImagesTask. /// Class ChapterImagesTask.

@ -8,7 +8,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Tasks;
namespace Emby.Server.Implementations.ScheduledTasks namespace Emby.Server.Implementations.ScheduledTasks.Tasks
{ {
/// <summary> /// <summary>
/// Class PeopleValidationTask. /// Class PeopleValidationTask.

@ -12,7 +12,7 @@ using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Tasks;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.ScheduledTasks namespace Emby.Server.Implementations.ScheduledTasks.Tasks
{ {
/// <summary> /// <summary>
/// Plugin Update Task. /// Plugin Update Task.

@ -9,7 +9,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Tasks;
namespace Emby.Server.Implementations.ScheduledTasks namespace Emby.Server.Implementations.ScheduledTasks.Tasks
{ {
/// <summary> /// <summary>
/// Class RefreshMediaLibraryTask. /// Class RefreshMediaLibraryTask.

@ -3,7 +3,7 @@ using System.Threading;
using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Tasks;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.ScheduledTasks namespace Emby.Server.Implementations.ScheduledTasks.Triggers
{ {
/// <summary> /// <summary>
/// Represents a task trigger that fires everyday. /// Represents a task trigger that fires everyday.
@ -41,7 +41,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
/// <param name="logger">The logger.</param> /// <param name="logger">The logger.</param>
/// <param name="taskName">The name of the task.</param> /// <param name="taskName">The name of the task.</param>
/// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) public void Start(TaskResult? lastResult, ILogger logger, string taskName, bool isApplicationStartup)
{ {
DisposeTimer(); DisposeTimer();
@ -54,7 +54,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
logger.LogInformation("Daily trigger for {Task} set to fire at {TriggerDate:yyyy-MM-dd HH:mm:ss.fff zzz}, which is {DueTime:c} from now.", taskName, triggerDate, dueTime); logger.LogInformation("Daily trigger for {Task} set to fire at {TriggerDate:yyyy-MM-dd HH:mm:ss.fff zzz}, which is {DueTime:c} from now.", taskName, triggerDate, dueTime);
_timer = new Timer(state => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1)); _timer = new Timer(_ => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1));
} }
/// <summary> /// <summary>

@ -4,7 +4,7 @@ using System.Threading;
using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Tasks;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.ScheduledTasks namespace Emby.Server.Implementations.ScheduledTasks.Triggers
{ {
/// <summary> /// <summary>
/// Represents a task trigger that runs repeatedly on an interval. /// Represents a task trigger that runs repeatedly on an interval.
@ -43,7 +43,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
/// <param name="logger">The logger.</param> /// <param name="logger">The logger.</param>
/// <param name="taskName">The name of the task.</param> /// <param name="taskName">The name of the task.</param>
/// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) public void Start(TaskResult? lastResult, ILogger logger, string taskName, bool isApplicationStartup)
{ {
DisposeTimer(); DisposeTimer();
@ -72,7 +72,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
dueTime = maxDueTime; dueTime = maxDueTime;
} }
_timer = new Timer(state => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1)); _timer = new Timer(_ => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1));
} }
/// <summary> /// <summary>

@ -5,7 +5,7 @@ using System.Threading.Tasks;
using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Tasks;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.ScheduledTasks namespace Emby.Server.Implementations.ScheduledTasks.Triggers
{ {
/// <summary> /// <summary>
/// Class StartupTaskTrigger. /// Class StartupTaskTrigger.
@ -40,7 +40,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
/// <param name="logger">The logger.</param> /// <param name="logger">The logger.</param>
/// <param name="taskName">The name of the task.</param> /// <param name="taskName">The name of the task.</param>
/// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
public async void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) public async void Start(TaskResult? lastResult, ILogger logger, string taskName, bool isApplicationStartup)
{ {
if (isApplicationStartup) if (isApplicationStartup)
{ {

@ -3,7 +3,7 @@ using System.Threading;
using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Tasks;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.ScheduledTasks namespace Emby.Server.Implementations.ScheduledTasks.Triggers
{ {
/// <summary> /// <summary>
/// Represents a task trigger that fires on a weekly basis. /// Represents a task trigger that fires on a weekly basis.
@ -44,13 +44,13 @@ namespace Emby.Server.Implementations.ScheduledTasks
/// <param name="logger">The logger.</param> /// <param name="logger">The logger.</param>
/// <param name="taskName">The name of the task.</param> /// <param name="taskName">The name of the task.</param>
/// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) public void Start(TaskResult? lastResult, ILogger logger, string taskName, bool isApplicationStartup)
{ {
DisposeTimer(); DisposeTimer();
var triggerDate = GetNextTriggerDateTime(); var triggerDate = GetNextTriggerDateTime();
_timer = new Timer(state => OnTriggered(), null, triggerDate - DateTime.Now, TimeSpan.FromMilliseconds(-1)); _timer = new Timer(_ => OnTriggered(), null, triggerDate - DateTime.Now, TimeSpan.FromMilliseconds(-1));
} }
/// <summary> /// <summary>

@ -33,7 +33,7 @@ namespace Emby.Server.Implementations.Sorting
/// </summary> /// </summary>
/// <param name="x">The x.</param> /// <param name="x">The x.</param>
/// <returns>System.String.</returns> /// <returns>System.String.</returns>
private static string? GetValue(BaseItem? x) private static string GetValue(BaseItem? x)
{ {
return x is Audio audio ? audio.Album : string.Empty; return x is Audio audio ? audio.Album : string.Empty;
} }

@ -250,7 +250,6 @@ namespace Emby.Server.Implementations.SyncPlay
var error = new GroupUpdate<string>(Guid.Empty, GroupUpdateType.NotInGroup, string.Empty); var error = new GroupUpdate<string>(Guid.Empty, GroupUpdateType.NotInGroup, string.Empty);
_sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None); _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
return;
} }
} }
} }
@ -365,7 +364,7 @@ namespace Emby.Server.Implementations.SyncPlay
{ {
var session = e.SessionInfo; var session = e.SessionInfo;
if (_sessionToGroupMap.TryGetValue(session.Id, out var group)) if (_sessionToGroupMap.TryGetValue(session.Id, out _))
{ {
var leaveGroupRequest = new LeaveGroupRequest(); var leaveGroupRequest = new LeaveGroupRequest();
LeaveGroup(session, leaveGroupRequest, CancellationToken.None); LeaveGroup(session, leaveGroupRequest, CancellationToken.None);
@ -378,7 +377,7 @@ namespace Emby.Server.Implementations.SyncPlay
var newSessionsCounter = _activeUsers.AddOrUpdate( var newSessionsCounter = _activeUsers.AddOrUpdate(
userId, userId,
1, 1,
(key, sessionsCounter) => sessionsCounter + toAdd); (_, sessionsCounter) => sessionsCounter + toAdd);
// Should never happen. // Should never happen.
if (newSessionsCounter < 0) if (newSessionsCounter < 0)

@ -25,7 +25,7 @@ namespace MediaBrowser.Model.Tasks
/// <param name="logger">The <see cref="ILogger"/>.</param> /// <param name="logger">The <see cref="ILogger"/>.</param>
/// <param name="taskName">The name of the task.</param> /// <param name="taskName">The name of the task.</param>
/// <param name="isApplicationStartup">Wheter or not this is is fired during startup.</param> /// <param name="isApplicationStartup">Wheter or not this is is fired during startup.</param>
void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup); void Start(TaskResult? lastResult, ILogger logger, string taskName, bool isApplicationStartup);
/// <summary> /// <summary>
/// Stops waiting for the trigger action. /// Stops waiting for the trigger action.

Loading…
Cancel
Save