public async Task GenerateEpisodeStills(int seriesDetailsId, int seasonDetailsId) { var episodes = await _context.EpisodeDetails.Where(e => e.SeasonDetailsId == seasonDetailsId && e.StillBlurHash == null).ToListAsync(); if (!episodes.Any()) { return; } var seasonNumber = episodes.First().SeasonNumber; var episodeNumbers = episodes.Select(e => e.EpisodeNumber).ToList(); var paths = await _context.EpisodeFiles .Where(e => e.SeriesDetailsId == seriesDetailsId && e.SeasonNumber == seasonNumber && episodeNumbers.Contains(e.EpisodeNumber)) .ToDictionaryAsync(e => e.EpisodeNumber, e => e.Path); foreach (var episodeDetails in episodes) { if (!paths.TryGetValue(episodeDetails.EpisodeNumber, out var path)) { continue; } var snapshotTempPath = await _dispatcher.Dispatch(new CreateSnapshotCommand(path, 0.2, 260, 200)); await _dispatcher.Dispatch(new SetImageCommand <IStillImageOwner>(episodeDetails, snapshotTempPath, $"{Guid.NewGuid()}.jpg")); } await _context.SaveChangesAsync(); }
public async Task <ActionResult> Login([FromForm, Required] string username, [FromForm, Required] string password, [FromHeader(Name = "User-Agent"), Required] string userAgent) { var session = await _eventDispatcher.Dispatch(new LoginAttemptCommand(username, password, userAgent)); if (session == default) { return(BadRequest("Invalid credentials")); } _sessionService.AttachSessionToken(HttpContext, session.Token, session.Expiry); return(Ok(session.IsAdmin)); }
public async Task <bool> Handle(LogoutCommand command, CancellationToken cancellationToken = default) { await _dispatcher.Dispatch(new RemoveSessionCommand(_operationContext.Session.UserId, _operationContext.SessionId)); _logger.LogInformation("User {UserId} logged out", _operationContext.Session.UserId); return(true); }
public async Task <IActionResult> StreamFile([FromRoute, Required] StreamKind streamKind, [FromRoute, Required] string token, [FromRoute, Required] long id) { string?path; // Console.WriteLine("Lent out from now"); using (var scope = await _eventDispatcher.Dispatch(new SubOperationScopeCommand())) { path = await _eventDispatcher.Dispatch(new FilePathLookupQuery(streamKind, id), scope.ServiceProvider); if (path == null) { return(NotFound()); } } // Response.OnCompleted(() => Task.Delay(TimeSpan.FromSeconds(15)).ContinueWith(() => Task.Run(() => Console.WriteLine("To 5 min from now")))); return(PhysicalFile(path, "video/mp4", "media.mp4", true)); }
public async Task <IActionResult> SetImage( [FromForm, Required] DetailsType detailsType, [FromForm, Required] ImageType imageType, [FromForm, Required] int detailsId, [Required] IFormFile image) { var imageExtension = Path.GetExtension(image.FileName); await using var imageStream = image.OpenReadStream(); var ok = await _eventDispatcher.Dispatch(new ReplaceImageCommand(detailsType, detailsId, imageType, imageExtension, imageStream)); if (!ok) { return(BadRequest()); } return(Ok()); }
public async Task Invoke(HttpContext context, OperationContext operationContext, IRouteSessionTokenExtractor routeSessionTokenExtractor, IApplicationEventDispatcher dispatcher) { var sessionToken = routeSessionTokenExtractor.ExtractSessionToken(context.Request, "token"); if (!string.IsNullOrEmpty(sessionToken)) { var session = await dispatcher.Dispatch(new SessionQuery(sessionToken)); if (session != null) { operationContext.Session = session; operationContext.SessionId = sessionToken; } } await _next(context); }
public async Task OnAuthorizationAsync(AuthorizationFilterContext context) { var sessionToken = _httpSessionService.ExtractSessionToken(context.HttpContext); if (!string.IsNullOrEmpty(sessionToken)) { var session = await _dispatcher.Dispatch(new SessionQuery(sessionToken)); if (session != null) { _operationContext.Session = session; _operationContext.SessionId = sessionToken; return; } } context.Result = new UnauthorizedResult(); }
public async Task <IActionResult> ChangePassword( [FromForm, Required] string oldPassword, [FromForm, Required] string password1, [FromForm, Required] string password2) { var success = await _eventDispatcher.Dispatch(new UpdateUserPasswordCommand(oldPassword, password1, password2)); if (success) { return(Ok()); } return(BadRequest()); }
private async Task <bool> SetSeriesImage(int detailsId, ImageType imageType, string imageExtension, Stream imageStream, CancellationToken cancellationToken) { var series = await _context.SeriesDetails.FirstOrDefaultAsync(sd => sd.Id == detailsId, cancellationToken); if (series == null) { return(false); } var tempFile = await SaveTempImage(imageExtension, imageStream, cancellationToken); var task = imageType switch { ImageType.Poster => _dispatcher.Dispatch(new SetImageCommand <IPosterImageOwner>(series, tempFile, $"{Guid.NewGuid()}.jpg")), ImageType.Backdrop => _dispatcher.Dispatch(new SetImageCommand <IBackdropImageOwner>(series, tempFile, $"{Guid.NewGuid()}.jpg")), _ => throw new ArgumentOutOfRangeException() }; await task; return(true); }
public Task <SeriesDto?> GetSeries([FromRoute, Required] int seriesId, [FromRoute] int?seasonNo = null) => _dispatcher.Dispatch(new SeriesDetailsQuery(seriesId, seasonNo));
public async Task <IEnumerable <string> > List() => await _eventDispatcher.Dispatch(new AdminCommandListRequestQuery());
public Task <List <string> > LanguagesForFileId([FromRoute, Required] MediaFileType kind, [FromRoute, Required] int fileId) => _dispatcher.Dispatch(new AvailableSubtitleLanguageQuery(kind, fileId));
public Task <SessionDto[]> GetSessions() => _dispatcher.Dispatch(new SessionsQuery(_operationContext.Session.UserId));
public async Task <DirectoryEntries> Browse([FromQuery] string?cwd) => await _eventDispatcher.Dispatch(new ListDirectoryEntriesQuery(cwd ?? string.Empty));
public Task <InfoDto> FileInfo([FromRoute, Required] int fileId) => _eventDispatcher.Dispatch(new FilmInfoLookupQuery(fileId));
public Task <IEnumerable <ContinueWatchingDto> > Continue() => _dispatcher.Dispatch(new ContinueWatchingQuery());
private async Task <(string CachePrefix, string CacheOwner, string CacheKey)> CacheKeyGenerator(MediaOverviewQuery _) { var libs = await _dispatcher.Dispatch(new CurrentUserLibraryAccessQuery()); return("overview", "sys", string.Join(',', libs.OrderBy(i => i))); }