ref: a21cb39658ab419bec6f5af6311e319f02551acd
parent: 7723acd54c4cc96d2784a1c6e1067f0b47fb81ca
author: penny <penny@limitedideas.org>
date: Sat Aug 2 14:52:43 EDT 2025
Add command to download media
--- a/commands.go
+++ b/commands.go
@@ -4,7 +4,7 @@
"strings"
)
-var commands = []string{"examine", "reply", "like", "thread", "open", "preview", "dm", "rt", "parent", "children", "thread", "rm"}+var commands = []string{"examine", "reply", "like", "thread", "open", "preview", "dm", "rt", "parent", "children", "thread", "rm", "download"} func processInput(input string) (command string, arguments string) {--- a/filehandler.go
+++ b/filehandler.go
@@ -1,71 +1,106 @@
package main
import (
- "path"
- "net/url"
+ "fmt"
+ "github.com/mattn/go-mastodon"
+ "io"
"net/http"
+ "net/url"
"os"
- "io"
- "github.com/mattn/go-mastodon"
- "fmt"
- "strings"
"os/exec"
+ "path"
+ "strings"
)
-func downloadPostImages(target *mastodon.Status, commandstring string) (err error){- var files []*os.File
- var pathnames []string
+func previewPostImages(target *mastodon.Status, commandstring 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)- }
- defer os.Remove(mediafile.Name())
- files = append(files, mediafile)
- pathnames = append(pathnames, mediafile.Name())
- }
- //pathargument := strings.Join(pathnames," ")
-
args := strings.Fields(commandstring)
var command string
-
- if(len(args) > 0) {+
+ 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)+
+ 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
- }
-
+ return
+ }
+
+ _, err = io.Copy(file, response.Body)
if err != nil {return
}
-
+
+ if err != nil {+ return
+ }
+
defer response.Body.Close()
return
-
-}
\ No newline at end of file
+
+}
--- a/main.go
+++ b/main.go
@@ -39,7 +39,7 @@
currentUser, err := client.GetAccountCurrentUser(context.Background())
if err != nil {- fmt.Println("Couldn't get our own profile", err)+ fmt.Println("Couldn't get our own profile: %v\n", err)return
}
@@ -138,11 +138,14 @@
cmd := exec.Command("open", url, "-a", "Eldritch Café")cmd.Run()
case "preview":
- err := downloadPostImages(postItem, "qlmanage -p")
+ err := previewPostImages(postItem, "qlmanage -p")
if(err != nil) { fmt.Printf("Image preview failed: %v\n", err)}
-
+ case "download":
+
+ savePostImages(postItem, "/Users/penny/Downloads/")
+
case "reply":
if currentUser.ID == postItem.Account.ID {recentpost, err = postReply(content, account, *client, postItem.Visibility, postItem.ID)
--- a/mastodon.go
+++ b/mastodon.go
@@ -220,7 +220,7 @@
case event, ok := <-eventCh: // Read from the event channel, checking 'ok' for closure
if !ok {// The channel was closed, which indicates the stream has ended.
- fmt.Println("Stream closed.")+ fmt.Println("Stream closed.\n")return // Exit the function
}
--
⑨