shithub: hell

ref: 54273d5c3f777e92905f5248aaab4e1755c9af9d
dir: /filehandler.go/

View raw version
package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
	"os"
	"os/exec"
	"path"
	"strings"

	"github.com/mattn/go-mastodon"
)

func previewPostImages(target *mastodon.Status, commandstring string) (err error) {

	args := strings.Fields(commandstring)
	var command string

	if len(args) > 0 {
		command = args[0]
		args = args[1:]
	}

	_, pathnames, err := downloadPostImages(target)

	for file := range pathnames {
		defer os.Remove(pathnames[file])
	}

	args = append(args, pathnames...)

	cmd := exec.Command(command, args...)
	err = cmd.Run()
	return

}

func savePostImages(target *mastodon.Status, savedir string) (err error) {
	files, pathnames, err := downloadPostImages(target)
	if err != nil {
		fmt.Printf("Failed to download post images:%v", err)
		return
	}
	for file := range pathnames {
		defer os.Remove(pathnames[file])
	}
	var download *os.File
	for file := range files {
		download, err = os.Create(savedir + "/" + path.Base(files[file].Name()))
		filereader, _ := os.Open(files[file].Name())
		if _, err = io.Copy(download, filereader); err != nil {
			fmt.Println("Failed to save %v\n", path.Base(files[file].Name()))
			continue
		}
		fmt.Printf("Downloaded: %v\n", download.Name())

	}
	if err != nil {
		fmt.Printf("Failed to save images:%v\n", err)
	}
	return err
}

func downloadPostImages(target *mastodon.Status) (files []*os.File, pathnames []string, err error) {

	for media := range target.MediaAttachments {
		err, mediafile := downloadImage(target.MediaAttachments[media].URL)
		if err != nil {
			fmt.Printf("Media download error:%v\n", err)
		}
		files = append(files, mediafile)
		pathnames = append(pathnames, mediafile.Name())

	}
	return
}

func downloadImage(target string) (err error, file *os.File) {
	response, err := http.Get(target)
	parsedurl, err := url.Parse(target)
	filename := path.Base(parsedurl.Path)

	file, err = os.CreateTemp("", "*"+filename)
	if err != nil {
		return
	}

	if response.StatusCode != http.StatusOK {
		return
	}

	_, err = io.Copy(file, response.Body)
	if err != nil {
		return
	}

	if err != nil {
		return
	}

	defer response.Body.Close()
	return

}