in lambda/go/upload-podcast/main.go [28:79]
func (h *Handler) Handle(ctx context.Context, input workshop.TranscribeStateMachineInput) (
*workshop.TranscribeStateMachineOutput, error,
) {
log.Println("staring upload,", input)
log.Printf("Downloading podcast from: %v", input.Episode.MediaURL)
episode := input.Episode
req, err := http.NewRequest("GET", episode.MediaURL, nil)
if err != nil {
return nil, err
}
resp, err := h.httpClient.Do(req)
if err != nil {
return nil, fmt.Errorf("failed to make request for media, %w", err)
}
defer resp.Body.Close()
respBody := resp.Body
if resp.StatusCode >= 400 {
return nil, fmt.Errorf("failed to get media %v", resp.StatusCode)
}
// Get content type if not already specified on the episode.
if episode.MediaContentType == "" || episode.MediaContentType == "application/octet-stream" {
episode.MediaContentType = resp.Header.Get("Content-Type")
}
// Guess at content type by content of the file.
if episode.MediaContentType == "" {
var buf bytes.Buffer
n, err := io.Copy(&buf, io.LimitReader(resp.Body, 512))
if err != nil {
return nil, fmt.Errorf("failed to read media to detect content-type %w", err)
}
episode.MediaContentType = http.DetectContentType(buf.Bytes()[:n])
// Wrap buffered bytes and remaining response body together to be
// uploaded together.
respBody = ioutil.NopCloser(io.MultiReader(&buf, resp.Body))
}
_ = respBody
episode.MediaKey = workshop.MakeEpisodeRawMediaPath(h.mediaKeyPrefix, episode.ID)
if err := h.uploadMedia(ctx, episode.MediaKey, episode.MediaContentType, respBody); err != nil {
return nil, fmt.Errorf("upload episode media failed, %v", err)
}
return &workshop.TranscribeStateMachineOutput{
Episode: episode,
}, nil
}