mirror of https://github.com/ErsatzTV/ErsatzTV.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
235 lines
5.8 KiB
235 lines
5.8 KiB
using System.Collections.Concurrent; |
|
using ErsatzTV.Core.Interfaces.Locking; |
|
using ErsatzTV.Core.Notifications; |
|
using MediatR; |
|
|
|
namespace ErsatzTV.Infrastructure.Locking; |
|
|
|
public class EntityLocker(IMediator mediator) : IEntityLocker |
|
{ |
|
private readonly ConcurrentDictionary<int, byte> _lockedLibraries = new(); |
|
private readonly ConcurrentDictionary<int, byte> _lockedPlayouts = new(); |
|
private readonly ConcurrentDictionary<Type, byte> _lockedRemoteMediaSourceTypes = new(); |
|
private bool _embyCollections; |
|
private bool _jellyfinCollections; |
|
private bool _plex; |
|
private bool _plexCollections; |
|
private bool _trakt; |
|
|
|
public event EventHandler OnLibraryChanged; |
|
public event EventHandler OnPlexChanged; |
|
public event EventHandler<Type> OnRemoteMediaSourceChanged; |
|
public event EventHandler OnTraktChanged; |
|
public event EventHandler OnEmbyCollectionsChanged; |
|
public event EventHandler OnJellyfinCollectionsChanged; |
|
public event EventHandler OnPlexCollectionsChanged; |
|
|
|
public bool LockLibrary(int libraryId) |
|
{ |
|
if (!_lockedLibraries.ContainsKey(libraryId) && _lockedLibraries.TryAdd(libraryId, 0)) |
|
{ |
|
OnLibraryChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool UnlockLibrary(int libraryId) |
|
{ |
|
if (_lockedLibraries.TryRemove(libraryId, out byte _)) |
|
{ |
|
OnLibraryChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool IsLibraryLocked(int libraryId) => |
|
_lockedLibraries.ContainsKey(libraryId); |
|
|
|
public bool LockPlex() |
|
{ |
|
if (!_plex) |
|
{ |
|
_plex = true; |
|
OnPlexChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool UnlockPlex() |
|
{ |
|
if (_plex) |
|
{ |
|
_plex = false; |
|
OnPlexChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool IsPlexLocked() => _plex; |
|
|
|
public bool IsRemoteMediaSourceLocked<TMediaSource>() => |
|
_lockedRemoteMediaSourceTypes.ContainsKey(typeof(TMediaSource)); |
|
|
|
public bool LockRemoteMediaSource<TMediaSource>() |
|
{ |
|
Type mediaSourceType = typeof(TMediaSource); |
|
|
|
if (!_lockedRemoteMediaSourceTypes.ContainsKey(mediaSourceType) && |
|
_lockedRemoteMediaSourceTypes.TryAdd(mediaSourceType, 0)) |
|
{ |
|
OnRemoteMediaSourceChanged?.Invoke(this, mediaSourceType); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool UnlockRemoteMediaSource<TMediaSource>() |
|
{ |
|
Type mediaSourceType = typeof(TMediaSource); |
|
|
|
if (_lockedRemoteMediaSourceTypes.TryRemove(mediaSourceType, out byte _)) |
|
{ |
|
OnRemoteMediaSourceChanged?.Invoke(this, mediaSourceType); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool LockTrakt() |
|
{ |
|
if (!_trakt) |
|
{ |
|
_trakt = true; |
|
OnTraktChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool UnlockTrakt() |
|
{ |
|
if (_trakt) |
|
{ |
|
_trakt = false; |
|
OnTraktChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool IsTraktLocked() => _trakt; |
|
|
|
public bool LockEmbyCollections() |
|
{ |
|
if (!_embyCollections) |
|
{ |
|
_embyCollections = true; |
|
OnEmbyCollectionsChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool UnlockEmbyCollections() |
|
{ |
|
if (_embyCollections) |
|
{ |
|
_embyCollections = false; |
|
OnEmbyCollectionsChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool AreEmbyCollectionsLocked() => _embyCollections; |
|
|
|
public bool LockJellyfinCollections() |
|
{ |
|
if (!_jellyfinCollections) |
|
{ |
|
_jellyfinCollections = true; |
|
OnJellyfinCollectionsChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool UnlockJellyfinCollections() |
|
{ |
|
if (_jellyfinCollections) |
|
{ |
|
_jellyfinCollections = false; |
|
OnJellyfinCollectionsChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool AreJellyfinCollectionsLocked() => _jellyfinCollections; |
|
|
|
public bool LockPlexCollections() |
|
{ |
|
if (!_plexCollections) |
|
{ |
|
_plexCollections = true; |
|
OnPlexCollectionsChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool UnlockPlexCollections() |
|
{ |
|
if (_plexCollections) |
|
{ |
|
_plexCollections = false; |
|
OnPlexCollectionsChanged?.Invoke(this, EventArgs.Empty); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool ArePlexCollectionsLocked() => _plexCollections; |
|
|
|
public async Task<bool> LockPlayout(int playoutId) |
|
{ |
|
if (!_lockedPlayouts.ContainsKey(playoutId) && _lockedPlayouts.TryAdd(playoutId, 0)) |
|
{ |
|
await mediator.Publish(new PlayoutUpdatedNotification(playoutId, true)); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public async Task<bool> UnlockPlayout(int playoutId) |
|
{ |
|
if (_lockedPlayouts.TryRemove(playoutId, out byte _)) |
|
{ |
|
await mediator.Publish(new PlayoutUpdatedNotification(playoutId, false)); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool IsPlayoutLocked(int playoutId) => _lockedPlayouts.ContainsKey(playoutId); |
|
}
|
|
|