private async Task <IReadOnlyCollection <bool> > UpdateMoviesAsync(ISpinWheelService spinWheelService,
                                                                           IReadOnlyCollection <IPlexMovieMetadata> plexMovieMetadataItems,
                                                                           IReadOnlyCollection <IMovieIdentifier> embyMovieIdentifiers)
        {
            var cts = new CancellationTokenSource();
            IEmbyImportMovieLogic embyImportMovieLogic = null;

            try
            {
                embyImportMovieLogic = _logicFactory.CreateLogic <IEmbyImportMovieLogic>();
                embyImportMovieLogic.ItemProcessed += spinWheelService.OnItemProcessed;

                await spinWheelService.StartSpinWheelAsync(cts.Token);

                var updateTasks = plexMovieMetadataItems
                                  .Select(plexMovieMetaDataItem =>
                {
                    var embyMovieIdentifier = embyMovieIdentifiers.First(x => plexMovieMetaDataItem.Filenames.Contains(x.Filename));
                    return(embyImportMovieLogic.RunAsync(plexMovieMetaDataItem, embyMovieIdentifier));
                })
                                  .ToArray();

                return(await Task.WhenAll(updateTasks));
            }
            finally
            {
                if (embyImportMovieLogic != null)
                {
                    embyImportMovieLogic.ItemProcessed -= spinWheelService.OnItemProcessed;
                }
                spinWheelService.StopSpinWheel(cts);
                cts.Dispose();
            }
        }
        private static async Task <ILibraryIdentifier> GetLibraryIdentifierAsync(IEmbyService embyService,
                                                                                 ISpinWheelService spinWheelService,
                                                                                 string libraryName)
        {
            var cts = new CancellationTokenSource();

            try
            {
                await spinWheelService.StartSpinWheelAsync(cts.Token);

                return(await embyService.GetLibraryIdentifierAsync(libraryName));
            }
            finally
            {
                spinWheelService.StopSpinWheel(cts);
                cts.Dispose();
            }
        }
        private static async Task <IReadOnlyCollection <IMovieIdentifier> > GetMovieIdentifiersAsync(IEmbyService embyService,
                                                                                                     ISpinWheelService spinWheelService,
                                                                                                     ILibraryIdentifier libraryIdentifier)
        {
            var cts = new CancellationTokenSource();

            try
            {
                await spinWheelService.StartSpinWheelAsync(cts.Token);

                return(await embyService.GetMovieIdentifiersAsync(libraryIdentifier));
            }
            finally
            {
                spinWheelService.StopSpinWheel(cts);
                cts.Dispose();
            }
        }