shithub: hell

Download patch

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
 			}
 
--