/// <summary> /// Builds the current clips stored into a single stream, then removes the clips. /// </summary> /// <param name="sessionUid">UID of the session to proces</param> /// <returns></returns> public async Task <bool> FinishClipAsync(string userUid, DomainModels.BlobUpload upload) { var session = await DbContext.Sessions.Include(x => x.Clips).ThenInclude(x => x.Media) .Include(x => x.Podcast).FirstOrDefaultAsync(x => x.UID == upload.SessionUid); if (session == null) { return(false); } using (var stream = upload.Data.OpenReadStream()) { var url = await MediaStorage.UploadStreamAsync(userUid, upload.SessionUid, upload.ClipUid, stream); var clip = session.Clips.FirstOrDefault(c => c.UID == upload.ClipUid); if (clip == null) { var id = CreateClip(url, session.ID, upload.ClipUid, upload.Name); clip = await DbContext.Clips.FindAsync(id); } var media = new Db.Media { ClipID = clip.ID, MediaUrl = url, UserUID = userUid, UID = Guid.NewGuid() }; DbContext.Media.Add(media); var mediaList = new List <Stream>(); foreach (var entry in clip.Media) { mediaList.Add(await StreamBuilder.GetStreamFromUrlAsync(entry.MediaUrl)); } if (mediaList.Count() > 1) { var concatStream = Audio.AudioConcatUtils.ConcatAudioStreams(mediaList); var concatUrl = await MediaStorage.UploadStreamAsync("concat", upload.SessionUid, upload.ClipUid, stream); clip.MediaUrl = concatUrl; } } await DbContext.SaveChangesAsync(); return(true); }
public async override Task HandleMessageAsync(IEnumerable <Vocalia.ServiceBus.Types.Clip> messages) { using (var scope = ServiceScope.CreateScope()) using (var DbContext = scope.ServiceProvider.GetService <EditorContext>()) { foreach (var message in messages) { //Gets the specified session, or creates it if not available. var session = await DbContext.Sessions.FirstOrDefaultAsync(x => x.UID == message.SessionUID); if (session == null) { var sessionId = await CreateSessionAsync(message); session = await DbContext.Sessions.FindAsync(sessionId); } //Gets the specificed user, or creates it if not available. Db.Clip clip = await DbContext.Clips.FirstOrDefaultAsync(x => x.UID == message.UID && x.Session.UID == message.SessionUID); if (clip == null) { var userId = await CreateClipAsync(message, session.ID); clip = await DbContext.Clips.FindAsync(userId); } foreach (var entry in message.Media) { var userRef = await UserFacade.GetUserInfoAsync(entry.UserUID); var media = new Db.Media { UID = entry.UID, ClipID = clip.ID, Date = entry.Date, MediaUrl = entry.MediaUrl, UserUID = entry.UserUID }; DbContext.Media.Add(media); } await DbContext.SaveChangesAsync(); } } }