diff --git a/main.go b/main.go index ba3e404..a305204 100644 --- a/main.go +++ b/main.go @@ -41,13 +41,15 @@ type handler struct { tg *tgbotapi.BotAPI bsky *bsky.BSky channelAdmins map[int64]bool + openFiles []*os.File + tempFiles []string } var ( - post = flag.String("post", "", "URL to a BlueSky post") - delete = flag.Bool("delete", false, "true/false to delete post") - oldPosts = flag.Float64("oldposttime", 1, "Ignore posts if createdAt more than this many hours ago") - botOnly = flag.Bool("bot", false, "Run only the Telegram bot listener, without Jetstream sync") + post = flag.String("post", "", "URL to a BlueSky post") + delete = flag.Bool("delete", false, "true/false to delete post") + oldPosts = flag.Float64("oldposttime", 1, "Ignore posts if createdAt more than this many hours ago") + botOnly = flag.Bool("bot", false, "Run only the Telegram bot listener, without Jetstream sync") ) func main() { @@ -211,38 +213,55 @@ func (h *handler) handleVideo(media bsky.ParsedEmbeds) (tgbotapi.InputMedia, err if err != nil { return nil, fmt.Errorf("failed to create video file: %w", err) } - defer func() { - f.Close() - os.Remove(filename) - }() if _, err := io.Copy(f, resp.Body); err != nil { + f.Close() + os.Remove(filename) return nil, fmt.Errorf("failed to write video: %w", err) } if _, err := f.Seek(0, 0); err != nil { + f.Close() + os.Remove(filename) return nil, fmt.Errorf("failed to seek video: %w", err) } - mediaAdd := tgbotapi.NewInputMediaVideo(tgbotapi.FileReader{Name: "video.mp4", Reader: f}) - metadata, err := getVideoMetadata(f.Name()) if err != nil { + f.Close() + os.Remove(filename) return nil, fmt.Errorf("failed to read video metadata: %w", err) } - mediaAdd.SupportsStreaming = true - mediaAdd.Height = metadata.Height() - mediaAdd.Width = metadata.Width() - mediaAdd.Duration = int(metadata.Duration()) - frames, _ := metadata.ReadFrames(0) var buf bytes.Buffer jpeg.Encode(&buf, frames[0], &jpeg.Options{Quality: 90}) + + // Keep file open for SendMediaGroup to read, cleanup happens in ProcessPost after sending + mediaAdd := tgbotapi.NewInputMediaVideo(tgbotapi.FileReader{Name: "video.mp4", Reader: f}) + mediaAdd.SupportsStreaming = true + mediaAdd.Height = metadata.Height() + mediaAdd.Width = metadata.Width() + mediaAdd.Duration = int(metadata.Duration()) mediaAdd.Thumb = tgbotapi.FileBytes{Name: "thumb.jpg", Bytes: buf.Bytes()} + // Store file reference for cleanup after sending + h.openFiles = append(h.openFiles, f) + h.tempFiles = append(h.tempFiles, filename) + return &mediaAdd, nil } +func (h *handler) cleanupFiles() { + for _, f := range h.openFiles { + f.Close() + } + for _, filename := range h.tempFiles { + os.Remove(filename) + } + h.openFiles = nil + h.tempFiles = nil +} + func (h *handler) ProcessPost(event *models.Event) error { ps, _ := h.bsky.ParsePost(event.Commit.Record) po := ps.GetEmbeds() @@ -407,7 +426,9 @@ func (h *handler) ProcessPost(event *models.Event) error { if isEditedPost { h.tg.Send(tgbotapi.NewEditMessageCaption(telegramRecord.ChannelID, telegramRecord.MessageID[0], captionText)) } else { - resp, _ := h.tg.SendMediaGroup(tgbotapi.NewMediaGroup(cid, mediaGroup)) + resp, err := h.tg.SendMediaGroup(tgbotapi.NewMediaGroup(cid, mediaGroup)) + fmt.Println(err) + h.cleanupFiles() uri, postCid := getLink(event) var messageIDs []int for _, msgID := range resp {