private void DeleteTrack(string bucket, string trackName)
        {
            //if the image exists we assume the data in the db and track files exist.
            AwsS3Utility.DeleteObject(bucket, trackName + ".jpg", RegionEndpoint.USEast1);
            AwsS3Utility.DeleteObject(bucket, trackName + ".zip", RegionEndpoint.USEast1);
            AwsS3Utility.DeleteObject(bucket, trackName + ".rar", RegionEndpoint.USEast1);

            try
            {
                //Remove from db
                AmazonDynamoDBClient client = new AmazonDynamoDBClient(RegionEndpoint.USEast1);
                string tableName            = "ReflexTracks";
                var    request = new DeleteItemRequest
                {
                    TableName = tableName,
                    Key       = new Dictionary <string, AttributeValue>()
                    {
                        { "TrackName", new AttributeValue {
                              S = trackName
                          } }
                    },
                };

                client.DeleteItemAsync(request).Wait();
            }
            catch (Exception e)
            {
                Console.WriteLine("Error deleting track from database: " + e.Message);
            }
        }
        public void FunctionHandler(SQSEvent sqsEvent, ILambdaContext context)
        {
            if (sqsEvent.Records.Count != 1)
            {
                throw new Exception(string.Format("Recived {0} records to process. Only 1 is supported.", sqsEvent.Records.Count));
            }

            var track = JsonConvert.DeserializeObject <Track>(sqsEvent.Records[0].Body);

            if (track == null)
            {
                throw new Exception("There was an error parsing the lambda input");
            }

            TrackValidator validator  = new TrackValidator();
            MemoryStream   zipStream  = new MemoryStream();
            ZipArchive     zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, true);

            context.Logger.LogLine(string.Format("Beginning to process {0}", track.TrackName));
            track = validator.ValidateTrack(track, (e) =>
            {
                var destFile = zipArchive.CreateEntry(e.Name);

                using (var destStream = destFile.Open())
                    using (var srcStream = e.Open())
                    {
                        var task = srcStream.CopyToAsync(destStream);
                        task.Wait();
                    }
            });
            zipArchive.Dispose();
            zipStream.Position = 0;


            string folderName    = track.TrackName;
            string imageFileName = track.TrackName + ".jpg";
            string trackFileName = track.TrackName + Path.GetExtension(track.SourceTrackUrl);
            bool   googleDrive   = track.SourceTrackUrl.Contains("drive.google.com");

            string bucketName  = track.Valid ? "reflextracks" : "invalidreflextracks";
            string baseDestUrl = string.Format("https://s3.amazonaws.com/{0}/{1}", bucketName, folderName).Replace(" ", "+");

            track.TrackUrl = string.Format("{0}/{1}", baseDestUrl, trackFileName).Replace(" ", "+");
            if (googleDrive)
            {
                track.TrackUrl = track.SourceTrackUrl;
            }
            track.ThumbnailUrl = string.Format("{0}/{1}", baseDestUrl, imageFileName).Replace(" ", "+");


            using (WebClient client = new WebClient())
            {
                context.Logger.LogLine(string.Format("Attempting to load {0}", track.SourceThumbnailUrl));
                using (Stream thumbNailStream = new MemoryStream(client.DownloadData(track.SourceThumbnailUrl)))
                {
                    using (var jpegStream = new MemoryStream())
                    {
                        context.Logger.LogLine(string.Format("Ensuring {0} is a jpg file and resizing it to 640 x 360.", track.SourceThumbnailUrl));
                        MagickImage sourceImage = new MagickImage(thumbNailStream);
                        sourceImage.Resize(640, 360);
                        sourceImage.Write(jpegStream, MagickFormat.Jpg);
                        jpegStream.Position = 0;

                        context.Logger.LogLine(string.Format("Uploading {0} to s3.", track.ThumbnailUrl));
                        var uploadTask = AwsS3Utility.UploadFileAsync(jpegStream, string.Format("{0}/{1}", bucketName, folderName), imageFileName, RegionEndpoint.USEast1);
                        uploadTask.Wait();
                    }
                }

                if (track.Valid)
                {
                    var uploadTask = AwsS3Utility.UploadFileAsync(zipStream, string.Format("{0}/{1}", bucketName, folderName), trackFileName, RegionEndpoint.USEast1);
                    uploadTask.Wait();
                }
                else if (googleDrive == false) //no support for downloading data directly from google drive
                {
                    context.Logger.LogLine(string.Format("Attempting to copy {0} to invalid track bucket.", track.SourceTrackUrl));
                    using (Stream invalidStream = new MemoryStream(client.DownloadData(track.SourceTrackUrl)))
                    {
                        var uploadTask = AwsS3Utility.UploadFileAsync(invalidStream, string.Format("{0}/{1}", bucketName, folderName), trackFileName, RegionEndpoint.USEast1);
                        uploadTask.Wait();
                    }
                }
            }

            track.FixEmptyStrings();
            var dynamoContext = new DynamoDBContext(new AmazonDynamoDBClient(RegionEndpoint.USEast1));

            dynamoContext.SaveAsync(track).Wait();

            context.Logger.LogLine(string.Format("Processing {0} is complete!", track.TrackName));
        }
        public void FunctionHandler(SQSEvent sqsEvent, ILambdaContext context)
        {
            try
            {
                if (sqsEvent.Records.Count != 1)
                {
                    throw new Exception(string.Format("Recived {0} records to process. Only 1 is supported.", sqsEvent.Records.Count));
                }

                var track = JsonConvert.DeserializeObject <Track>(sqsEvent.Records[0].Body);
                if (track == null)
                {
                    throw new Exception("There was an error parsing the lambda input");
                }

                TrackValidator validator  = new TrackValidator();
                MemoryStream   zipStream  = new MemoryStream();
                ZipArchive     zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, true);

                context.Logger.LogLine(string.Format("Beginning to process {0}", track.TrackName));
                track = validator.ValidateTrack(track, (e) =>
                {
                    var destFile = zipArchive.CreateEntry(e.Name);

                    using (var destStream = destFile.Open())
                        using (var srcStream = e.Open())
                        {
                            var task = srcStream.CopyToAsync(destStream);
                            task.Wait();
                        }
                });
                zipArchive.Dispose();
                zipStream.Position = 0;

                string folderName    = Path.GetFileNameWithoutExtension(track.SourceTrackUrl.Replace("%20", " "));
                string imageFileName = Path.GetFileName(track.SourceThumbnailUrl).Replace("%20", " ");
                string trackFileName = Path.GetFileName(track.SourceTrackUrl).Replace("%20", " ");
                string bucketName    = track.Valid ? "reflextracks" : "invalidreflextracks";
                string baseDestUrl   = string.Format("https://s3.amazonaws.com/{0}/{1}", bucketName, folderName).Replace(" ", "+");

                track.TrackUrl     = string.Format("{0}/{1}", baseDestUrl, trackFileName).Replace(" ", "+");
                track.ThumbnailUrl = string.Format("{0}/{1}", baseDestUrl, imageFileName).Replace(" ", "+");

                using (WebClient client = new WebClient())
                {
                    using (Stream thumbNailStream = new MemoryStream(client.DownloadData(track.SourceThumbnailUrl)))
                    {
                        var uploadTask = AwsS3Utility.UploadFileAsync(thumbNailStream, string.Format("{0}/{1}", bucketName, folderName), imageFileName, RegionEndpoint.USEast1);
                        uploadTask.Wait();
                    }

                    if (track.Valid)
                    {
                        var uploadTask = AwsS3Utility.UploadFileAsync(zipStream, string.Format("{0}/{1}", bucketName, folderName), trackFileName, RegionEndpoint.USEast1);
                        uploadTask.Wait();
                    }
                    else
                    {
                        using (Stream invalidStream = new MemoryStream(client.DownloadData(track.SourceTrackUrl)))
                        {
                            var uploadTask = AwsS3Utility.UploadFileAsync(invalidStream, string.Format("{0}/{1}", bucketName, folderName), trackFileName, RegionEndpoint.USEast1);
                            uploadTask.Wait();
                        }
                    }
                }

                track.FixEmptyStrings();
                var success = HttpUtility.Post("https://spptqssmj8.execute-api.us-east-1.amazonaws.com/test/tracks", track);

                context.Logger.LogLine(string.Format("Processing {0} is complete!", track.TrackName));
            }
            catch (Exception e)
            {
                context.Logger.LogLine(e.Message);
            }
        }
        private void ProcessTrack(Track track, string zipFile)
        {
            //Reset to the defaults before re-processing the track
            track.ErrorInfo = string.Empty;
            track.TrackType = TrackType.Unknown;
            track.Valid     = true;
            string thumbnailDownloadPath = track.SourceThumbnailUrl;
            string folderName            = track.TrackName;
            string imageFileName         = track.TrackName + Path.GetExtension(track.SourceThumbnailUrl);
            string trackFileName         = track.TrackName + ".zip"; // we know they are all zip files at this point.

            track.ThumbnailUrl = string.Empty;
            track.TrackUrl     = string.Empty;

            TrackValidator validator  = new TrackValidator();
            MemoryStream   zipStream  = new MemoryStream();
            ZipArchive     zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, true);

            Console.WriteLine(string.Format("Beginning to process {0}", track.TrackName));
            track = validator.ValidateLocalTrack(zipFile, track, (e) =>
            {
                var destFile = zipArchive.CreateEntry(e.Name);

                using (var destStream = destFile.Open())
                    using (var srcStream = e.Open())
                    {
                        var task = srcStream.CopyToAsync(destStream);
                        task.Wait();
                    }
            });
            zipArchive.Dispose();
            zipStream.Position = 0;


            string bucketName  = track.Valid ? "reflextracks" : "invalidreflextracks";
            string baseDestUrl = string.Format("https://s3.amazonaws.com/{0}/{1}", bucketName, folderName).Replace(" ", "+");

            track.TrackUrl     = string.Format("{0}/{1}", baseDestUrl, trackFileName).Replace(" ", "+");
            track.ThumbnailUrl = string.Format("{0}/{1}", baseDestUrl, imageFileName).Replace(" ", "+");

            using (WebClient webClient = new WebClient())
            {
                using (Stream thumbNailStream = new MemoryStream(webClient.DownloadData(thumbnailDownloadPath)))
                {
                    Console.WriteLine(string.Format("Uploading {0} to s3 {1}...", imageFileName, bucketName));
                    var uploadTask = AwsS3Utility.UploadFileAsync(thumbNailStream, string.Format("{0}/{1}", bucketName, folderName), imageFileName, RegionEndpoint.USEast1);
                    uploadTask.Wait();
                }

                Console.WriteLine(string.Format("Uploading {0} to s3 {1}...", trackFileName, bucketName));
                if (track.Valid)
                {
                    var uploadTask = AwsS3Utility.UploadFileAsync(zipStream, string.Format("{0}/{1}", bucketName, folderName), trackFileName, RegionEndpoint.USEast1);
                    uploadTask.Wait();
                }
                else
                {
                    using (var fileStream = new FileStream(zipFile, FileMode.Open))
                    {
                        var uploadTask = AwsS3Utility.UploadFileAsync(fileStream, string.Format("{0}/{1}", bucketName, folderName), trackFileName, RegionEndpoint.USEast1);
                        uploadTask.Wait();
                    }
                }
            }

            track.FixEmptyStrings();
            Console.WriteLine(string.Format("Updating {0} in dynamodb...", track.TrackName));
            var client   = new AmazonDynamoDBClient(RegionEndpoint.USEast1);
            var context  = new DynamoDBContext(client);
            var saveTask = context.SaveAsync(track);

            saveTask.Wait();
            if (track.Valid)
            {
                Console.WriteLine("Deleting {0}", zipFile);
                File.Delete(zipFile);
            }
            else
            {
                Console.WriteLine("[INVALID TRACK DATA] not deleting {0}, due to error ({1}). Please manually inspect..", zipFile, track.ErrorInfo);
            }
            Console.WriteLine(string.Format("Processing {0} is complete!", track.TrackName));
        }