private async Task HandleTorrentStatusUpdates(IReadOnlyList <ITorrentClientTorrent> torrents) { var downloadingMovies = (await _movieService.GetMoviesAsync()) .Where(x => x.Deleted == null && (x.Status == MovieStatusEnum.Downloading || x.Status == MovieStatusEnum.DownloadQueued || x.Status == MovieStatusEnum.DownloadingPaused) ); foreach (var torrent in torrents) { var movieJob = downloadingMovies.Where(x => x.TorrentHash == torrent.Hash).FirstOrDefault(); if (movieJob == null) { continue; } // Update our database status MovieStatusEnum status = movieJob.Status; switch (torrent.Status) { case TorrentStatusEnum.Check: case TorrentStatusEnum.CheckWait: case TorrentStatusEnum.DownloadWait: status = MovieStatusEnum.DownloadQueued; break; case TorrentStatusEnum.Download: status = MovieStatusEnum.Downloading; break; case TorrentStatusEnum.Stopped: status = MovieStatusEnum.DownloadingPaused; break; } if (movieJob.Status != status) { await _movieService.SetMovieStatus(movieJob.Id, status); } if (!torrent.IsFinished) { continue; } var path = Path.Combine(_configuration.MoviesDownloadDir, torrent.Name); if (Directory.Exists(path) || File.Exists(path)) { await _movieService.SetMovieStatus(movieJob.Id, MovieStatusEnum.Downloaded); } } }
public async Task SetMovieStatus(int id, MovieStatusEnum status) { using (var db = _dbContextFactory.CreateDbContext()) { var m = await db.Movies.Where(x => x.Id == id).FirstOrDefaultAsync(); m.Status = status; if (status == MovieStatusEnum.Finished) { m.Deleted = DateTime.Now; } if (status == MovieStatusEnum.TranscodingStarted) { m.TranscodingStarted = DateTime.Now; } await db.SaveChangesAsync(); } }