コード例 #1
0
        private async ValueTask <EntityEntry <DownloadBeatmapSet> > CreateTask(BeatmapDownloadAddressPrepared @event, DownloadProvider provider)
        {
            var entity = await DownloadDb.AddAsync(new DownloadBeatmapSet()
            {
                BeatmapSetId         = @event.BeatmapSetId,
                BeatmapId            = @event.BeatmapId,
                DownloadProviderId   = provider.Id,
                DownloadProviderName = provider.Name,
                CreatedAt            = DateTime.Now,
            });

            await DownloadDb.SaveChangesAsync();

            return(entity);
        }
コード例 #2
0
        public async ValueTask Handle(BeatmapDownloadAddressPrepared @event)
        {
            var options          = OptionFactory.Create();
            var downloadProvider = Scope.ResolveNamed <IDownloadProvier>(options.DownloadProvider.Id);

            // create download task in db
            var entity = await CreateTask(@event, options.DownloadProvider);

            var eventTask = entity.Entity.Cast <DownloadBeatmapSetTask>();

            entity.Entity.Status = DownloadStatus.NOT_STARTED;
            // start event
            EventBus.Publish(new BeatmapDownloadTaskStarted()
            {
                Task = eventTask,
            });
            Logger.LogInformation($"Start download #{@event.BeatmapSetId} from {@event.DownloadUrl}");

            var targetFile = Path.Combine(OsuGamePath, "Downloads", $"{@event.BeatmapSetId}.osz");

            entity.Entity.FullPath = eventTask.FullPath = targetFile;

            long prevDownloadedBytes = 0;
            // download notify events
            var progressEvent = new BeatmapDownloadTaskProgressUpdated()
            {
                Task = eventTask,
            };

            void handler(int percentage, long current, long total)
            {
                if (current - prevDownloadedBytes < 10240)
                {
                    return;
                }

                prevDownloadedBytes            = current;
                progressEvent.BytesTotal       = total;
                progressEvent.BytesDownloaded  = current;
                progressEvent.PercentCompleted = percentage;
                // download progress event
                EventBus.Publish(progressEvent);
            }

            downloadProvider.DownloadProgressChanged += handler;

            // start download
            entity.Entity.StartedAt = DateTime.Now;
            entity.Entity.Status    = DownloadStatus.DOWNLOADING;
            var suggestFileName = await downloadProvider.Download(targetFile, @event.DownloadUrl);

            entity.Entity.CompletedAt = DateTime.Now;
            entity.Entity.Status      = DownloadStatus.COMPLETED;

            Logger.LogInformation($"Beatmap #{@event.BeatmapSetId} downloaded");

            // adjust downloaded file name by response
            var suggestFilePath = Path.Combine(OsuGamePath, "Downloads", suggestFileName);

            if (suggestFileName != null && suggestFileName.Length > 0 && suggestFileName.EndsWith(".osz"))
            {
                File.Move(targetFile, suggestFilePath);
                targetFile = suggestFilePath;
            }
            entity.Entity.FullPath = eventTask.FullPath = targetFile;
            DownloadDb.Update(entity.Entity);
            await DownloadDb.SaveChangesAsync();

            await OsuDb.OsuDatabaseBeatmap.AddAsync(new OsuDatabaseBeatmap()
            {
                OsuDatabaseId = (await OsuDb.OsuDatabases.FirstAsync()).Id,
                BeatmapId     = @event.BeatmapId,
                BeatmapSetId  = @event.BeatmapSetId,
            });

            await OsuDb.SaveChangesAsync();

            // download completed event
            EventBus.Publish(new BeatmapDownloadTaskCompleted()
            {
                Task = eventTask,
            });

            if (options.AutoOpenDownloadedBeatmap)
            {
                try
                {
                    Logger.LogInformation($"Trying open beatmap {targetFile}");
                    Process.Start(new ProcessStartInfo(targetFile)
                    {
                        UseShellExecute = true
                    });
                }
                catch
                {
                    Logger.LogWarning($"[Auto-Import] Failed to open .osz file, the file association not working.");
                }
            }
        }