protected override async Task <bool> UploadItem(PendingUpload upload)
        {
            var videoFileName     = DB.SharedSettings.GetMatchVideoPath(upload.DataName);
            var videoFileTempName = Path.ChangeExtension(DB.SharedSettings.GetMatchVideoPath(upload.DataName), ".temp.mp4");

            bool success = false;

            if (File.Exists(videoFileName))
            {
                return(true);
            }

            if (File.Exists(videoFileTempName))
            {
                File.Delete(videoFileTempName);
            }

            try
            {
                var matchData = await DB.GetData <MatchData>(upload.DataName);

                var conversion = await FFmpeg.Conversions.FromSnippet.Concatenate(
                    videoFileTempName,
                    matchData.Rounds.Select( roundName => DB.SharedSettings.GetRoundVideoPath(roundName)).ToArray()
                    );

                Console.WriteLine($"Starting conversion of {matchData.Name} with {matchData.Rounds.Count} rounds");

                var stopwatch = new System.Diagnostics.Stopwatch();

                stopwatch.Start();


                await conversion.Start();

                stopwatch.Stop();

                Console.WriteLine($"Conversion of {matchData.Name} took {stopwatch.Elapsed.Humanize()}");

                success = true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                success = false;
            }

            if (success)
            {
                Console.WriteLine("Applying changes and removing leftover videos...");

                File.Move(videoFileTempName, videoFileName);

                // delete all the video files of the rounds, then set their type as mergedvideolink
                //and set their respective timespan times of when they appear in the videos

                var matchData = await DB.GetData <MatchData>(upload.DataName);

                matchData.VideoType      = VideoType.MergedVideoLink;
                matchData.VideoStartTime = TimeSpan.Zero;
                matchData.VideoEndTime   = matchData.GetDuration();
                await DB.SaveData(matchData);

                TimeSpan currentTime = TimeSpan.Zero;

                foreach (var roundName in matchData.Rounds)
                {
                    var roundVideoFile = DB.SharedSettings.GetRoundVideoPath(roundName);

                    if (File.Exists(roundVideoFile))
                    {
                        File.Delete(roundVideoFile);
                    }

                    var roundData = await DB.GetData <RoundData>(roundName);

                    roundData.VideoType      = VideoType.MergedVideoLink;
                    roundData.VideoStartTime = currentTime;
                    roundData.VideoEndTime   = currentTime + roundData.GetDuration();

                    await DB.SaveData(roundData);

                    currentTime += roundData.GetDuration();
                }

                Console.WriteLine("Done applying changes.");
            }
            else
            {
                File.Delete(videoFileTempName);
            }

            return(success);
        }