Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        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();
                    }
                }
        }