func()

in lambda/go/process-transcription/main.go [32:107]


func (h *Handler) Handle(ctx context.Context, input workshop.TranscribeStateMachineInput) (
	workshop.TranscribeStateMachineOutput, error,
) {
	log.Println("processing transcription,", input)
	episode := input.Episode

	transcribeOutput := manager.NewWriteAtBuffer(make([]byte, 0, 1*1024*1024))
	_, err := h.s3Downloader.Download(ctx, transcribeOutput, &s3.GetObjectInput{
		Bucket: &h.bucketName,
		Key:    &episode.TranscribeMetadataKey,
	})
	if err != nil {
		return workshop.TranscribeStateMachineOutput{},
			fmt.Errorf("failed to download transcribe metadata, %w", err)
	}

	var transcribeMetadata = struct {
		Results struct {
			LanguageCode string `json:"language_code"`
			Transcripts  []struct {
				Transcript string `json:"transcript"`
			} `json:"transcripts"`
		} `json:"results"`
	}{}
	if err = json.Unmarshal(transcribeOutput.Bytes(), &transcribeMetadata); err != nil {
		return workshop.TranscribeStateMachineOutput{},
			fmt.Errorf("failed to decode transcribe metadata, %w", err)
	}
	if len(transcribeMetadata.Results.Transcripts) == 0 {
		return workshop.TranscribeStateMachineOutput{},
			fmt.Errorf("transcribe metadata did not contain transcription, %v", transcribeMetadata)
	}

	// TODO Do some kind of processing on transcription metadata
	var transcriptBuffer bytes.Buffer
	for _, result := range transcribeMetadata.Results.Transcripts {
		transcriptBuffer.WriteString(result.Transcript)
		transcriptBuffer.WriteString("\n\n")
	}

	episode.TranscriptionKey = workshop.MakeEpisodeTranscriptionPath(
		h.mediaKeyPrefix, episode.ID,
	)

	_, err = h.s3Uploader.Upload(ctx, &s3.PutObjectInput{
		Bucket:      &h.bucketName,
		Key:         &episode.TranscriptionKey,
		ContentType: aws.String("text/plain"),
		Body:        bytes.NewReader(transcriptBuffer.Bytes()),
	})
	if err != nil {
		return workshop.TranscribeStateMachineOutput{},
			fmt.Errorf("failed to upload transcription file, %w", err)
	}
	log.Println("uploaded media transcription,", episode.TranscriptionKey)

	av, err := ddbav.MarshalMap(episode)
	if err != nil {
		return workshop.TranscribeStateMachineOutput{},
			fmt.Errorf("failed to marshal episode, %w", err)
	}

	log.Println("updating episode table,", episode)
	_, err = h.ddbClient.PutItem(ctx, &ddb.PutItemInput{
		TableName: &h.episodeTableName,
		Item:      av,
	})
	if err != nil {
		return workshop.TranscribeStateMachineOutput{},
			fmt.Errorf("failed to put episode to metadata table, %w", err)
	}

	return workshop.TranscribeStateMachineOutput{
		Episode: input.Episode,
	}, nil
}