Example #1
0
        public override void Work()
        {
            var            src    = pmodel.SourceInfo;
            List <AvsNode> chunks = new List <AvsNode>();
            var            tracks = pmodel.MediaTracks.OrderBy(x => x.LeftShiftInSeconds).ToList();

            oldName = pmodel.SourceInfo.FullName;
            newName = Path.Combine(pmodel.SourceInfo.Directory.FullName, Guid.NewGuid().ToString() + ".avi");
            File.Move(oldName, newName);

            double previous = 0;
            int    index    = 0;
            string mode     = "main";

            while (Math.Abs(previous - pmodel.Duration) >= 0.5 && tracks.Count != 0)
            {
                var avs = new AvsPatchChunk();
                if (mode == "main")
                {
                    var endTime = index >= tracks.Count ? pmodel.Duration : tracks[index].StartSecond + tracks[index].LeftShiftInSeconds;
                    avs.Load(newName, previous, endTime);
                    previous = endTime;
                    chunks.Add(avs);
                    mode = "patch";
                    continue;
                }
                var name = tracks[index].IsTutoPatch ? tracks[index].Path.LocalPath : Path.Combine(Model.Locations.TemporalDirectory.FullName, tracks[index].FullName.Name);
                avs.Load(name, tracks[index].StartSecond, tracks[index].EndSecond);
                chunks.Add(avs);
                previous = tracks[index].EndSecond + tracks[index].LeftShiftInSeconds;
                index++;
                mode = "main";
            }

            if (tracks.Count == 0)
            {
                var s = new AvsPatchChunk();
                s.Load(newName, 0, pmodel.Duration);
                chunks.Add(s);
            }

            var final = new AvsConcatList();

            final.Items = chunks;
            var avsContext = new AvsContext();

            AvsNode payload = final;

            if (pmodel.Subtitles.Count > 0)
            {
                var currentSub = new AvsSub();
                foreach (var sub in pmodel.Subtitles)
                {
                    currentSub            = new AvsSub();
                    currentSub.Payload    = payload;
                    currentSub.X          = (int)(sub.Pos.X * pmodel.Width / pmodel.ActualWidth);
                    currentSub.Y          = (int)(sub.Pos.Y * pmodel.Height / pmodel.ActualHeight + sub.HeightShift);
                    currentSub.Start      = sub.LeftShiftInSeconds;
                    currentSub.End        = sub.LeftShiftInSeconds + sub.EndSecond - sub.StartSecond;
                    currentSub.Content    = sub.Content;
                    currentSub.FontSize   = (sub.FontSize * pmodel.FontCoefficent).ToString();
                    currentSub.Stroke     = sub.Stroke;
                    currentSub.Foreground = sub.Foreground;
                    payload = currentSub;
                }
                currentSub.SerializeToContext(avsContext);
            }
            else
            {
                final.SerializeToContext(avsContext);
            }

            var args = @"-i ""{0}"" -q:v 0 -vf ""scale=1280:720, fps=25"" -q:v 0 -acodec libmp3lame -ar 44100 -ab 32k ""{1}"" -y";

            var avsScript = string.Format(@"import(""{0}"")", Model.Locations.AvsLibrary.FullName) + "\r\n" + avsContext.GetContent() + "var_0";

            File.WriteAllText(newName + "test.avs", avsScript, Encoding.GetEncoding("Windows-1251"));

            //Патчер в аутпут все делает
            var scriptFile = newName + "test.avs";
            var path       = Model.Locations.GetFinalOutputFile(pmodel.EpisodeNumber).FullName;

            args = string.Format(args, scriptFile, path);
            RunProcess(args, Model.Videotheque.Locations.FFmpegExecutable.FullName);
            File.Delete(scriptFile);
            OnTaskFinished();
            File.Move(newName, oldName);
        }