private static Notification CreateNotification(IUserIdentifier userIdentifier, ProcessingStatus status,
                                                bool hasError = false, string message = null)
 {
     return(new Notification
     {
         UserIdentifier = userIdentifier,
         Status = status,
         HasError = hasError,
         Message = message
     });
 }
 private ImageProcessedEvent CreateResultsCommand(IUserIdentifier userIdentifier, ProcessedDownloadedFile file)
 {
     return(new ImageProcessedEvent
     {
         UserIdentifier = userIdentifier,
         FileName = file.FileName,
         FileSource = file.FileSource,
         Thumbs = file.Thumbs,
         Path = file.Path,
         FileCreatedOn = file.FileCreatedOn,
         PhotoTakenOn = file.PhotoTakenOn,
         ExifString = file.ExifString,
         Latitude = file.Latitude,
         Longitude = file.Longitude
     });
 }
        public async IAsyncEnumerable <YandexDiskFileInfo> DownloadFilesAsync(
            IUserIdentifier userIdentifier,
            string accessToken,
            [EnumeratorCancellation] CancellationToken cancellationToken,
            StoppingAction stoppingAction)
        {
            var apiClient = new ApiClient(accessToken, Client);

            _data = _yandexDiskDownloadStateService.GetData(userIdentifier.UserId);
            if (_data == null)
            {
                _data = new YandexDiskData {
                    UserId = userIdentifier.UserId, YandexDiskAccessToken = accessToken
                };
            }
            else
            {
                _currentOffset = _data.CurrentIndex;
            }

            var disk = await WrapApiCallAsync(() => apiClient.GetDiskAsync(cancellationToken));

            bool firstIteration = true;

            while (_currentOffset <= _totalFiles || firstIteration)
            {
                var resource =
                    await WrapApiCallAsync(() =>
                                           apiClient.GetResourceAsync(disk.SystemFolders.Photostream, cancellationToken, _currentOffset, Limit));

                _totalFiles = resource.Embedded.Total;

                var items = resource.Embedded.Items;
                if (items != null && items.Length > 0)
                {
                    foreach (var item in items)
                    {
                        if (cancellationToken.IsCancellationRequested || stoppingAction.IsStopRequested)
                        {
                            _logger.LogInformation("Cancellation requested.");
                            yield break;
                        }

                        if (item.MediaType == "video")
                        {
                            _currentOffset++;
                            continue;
                        }

                        var entity = await DownloadAsync(item, disk);

                        if (entity == null)
                        {
                            yield break;
                        }

                        _currentOffset++;

                        _progressReporter.Report(userIdentifier, _currentOffset, _totalFiles);

                        yield return(entity);
                    }
                }

                firstIteration = false;
            }
        }
Beispiel #4
0
        public async IAsyncEnumerable <DropboxFileInfo> DownloadAsync(
            IUserIdentifier userIdentifier,
            string apiToken,
            StoppingAction stoppingAction,
            [EnumeratorCancellation] CancellationToken cancellationToken)
        {
            CreateClient(apiToken);

            var account = await WrapApiCallAsync(_dropboxClient.Users.GetCurrentAccountAsync);

            _state = _stateService.GetState(account.AccountId);
            if (_state != null)
            {
                _lastProcessedFileIndex = _state.LastProcessedFileIndex;
            }
            else
            {
                _state = new DropboxDownloadState {
                    Started = DateTimeOffset.Now, AccountId = account.AccountId
                }
            };

            bool firstIteration = true;
            var  filesMetadata  = new List <Metadata>();

            var listFolderResult = await WrapApiCallAsync(() => _dropboxClient.Files.ListFolderAsync(CameraUploads, limit: Limit));

            while (listFolderResult.HasMore || firstIteration)
            {
                if (!firstIteration)
                {
                    listFolderResult = await WrapApiCallAsync(() =>
                                                              _dropboxClient.Files.ListFolderContinueAsync(listFolderResult.Cursor));
                }

                filesMetadata.AddRange(listFolderResult.Entries.Where(a => a is FileMetadata));

                firstIteration = false;
            }

            _state.TotalFiles = filesMetadata.Count;

            var index = _lastProcessedFileIndex > -1 ? _lastProcessedFileIndex : 0;

            for (int i = index; i < filesMetadata.Count; i++)
            {
                if (cancellationToken.IsCancellationRequested || stoppingAction.IsStopRequested)
                {
                    _logger.LogInformation("Cancellation requested.");
                    yield break;
                }

                var fileMetadata = filesMetadata[i];

                var dropboxFile = await DownloadFileAsync(fileMetadata, account);

                if (dropboxFile == null)
                {
                    yield break;
                }

                _state.LastProcessedFileIndex++;
                _state.LastProcessedFileId = dropboxFile.FileId;

                _progressReporter.Report(userIdentifier, _state.LastProcessedFileIndex, _state.TotalFiles);

                yield return(dropboxFile);
            }
        }