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)); }