This commit is contained in:
parent
b3e37757a2
commit
907a191bfa
1 changed files with 37 additions and 16 deletions
45
main.go
45
main.go
|
|
@ -41,6 +41,8 @@ type handler struct {
|
||||||
tg *tgbotapi.BotAPI
|
tg *tgbotapi.BotAPI
|
||||||
bsky *bsky.BSky
|
bsky *bsky.BSky
|
||||||
channelAdmins map[int64]bool
|
channelAdmins map[int64]bool
|
||||||
|
openFiles []*os.File
|
||||||
|
tempFiles []string
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -211,38 +213,55 @@ func (h *handler) handleVideo(media bsky.ParsedEmbeds) (tgbotapi.InputMedia, err
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to create video file: %w", err)
|
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 {
|
if _, err := io.Copy(f, resp.Body); err != nil {
|
||||||
|
f.Close()
|
||||||
|
os.Remove(filename)
|
||||||
return nil, fmt.Errorf("failed to write video: %w", err)
|
return nil, fmt.Errorf("failed to write video: %w", err)
|
||||||
}
|
}
|
||||||
if _, err := f.Seek(0, 0); err != nil {
|
if _, err := f.Seek(0, 0); err != nil {
|
||||||
|
f.Close()
|
||||||
|
os.Remove(filename)
|
||||||
return nil, fmt.Errorf("failed to seek video: %w", err)
|
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())
|
metadata, err := getVideoMetadata(f.Name())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
f.Close()
|
||||||
|
os.Remove(filename)
|
||||||
return nil, fmt.Errorf("failed to read video metadata: %w", err)
|
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)
|
frames, _ := metadata.ReadFrames(0)
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
jpeg.Encode(&buf, frames[0], &jpeg.Options{Quality: 90})
|
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()}
|
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
|
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 {
|
func (h *handler) ProcessPost(event *models.Event) error {
|
||||||
ps, _ := h.bsky.ParsePost(event.Commit.Record)
|
ps, _ := h.bsky.ParsePost(event.Commit.Record)
|
||||||
po := ps.GetEmbeds()
|
po := ps.GetEmbeds()
|
||||||
|
|
@ -407,7 +426,9 @@ func (h *handler) ProcessPost(event *models.Event) error {
|
||||||
if isEditedPost {
|
if isEditedPost {
|
||||||
h.tg.Send(tgbotapi.NewEditMessageCaption(telegramRecord.ChannelID, telegramRecord.MessageID[0], captionText))
|
h.tg.Send(tgbotapi.NewEditMessageCaption(telegramRecord.ChannelID, telegramRecord.MessageID[0], captionText))
|
||||||
} else {
|
} 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)
|
uri, postCid := getLink(event)
|
||||||
var messageIDs []int
|
var messageIDs []int
|
||||||
for _, msgID := range resp {
|
for _, msgID := range resp {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue