Files
Scriberr/internal/cli/client.go

72 lines
1.8 KiB
Go

package cli
import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
"path/filepath"
)
// UploadFile uploads a file to the Scriberr server
func UploadFile(filePath string) error {
config := GetConfig()
if config.ServerURL == "" {
return fmt.Errorf("server URL not configured. Please run 'scriberr login' or 'scriberr install'")
}
if config.Token == "" {
return fmt.Errorf("not logged in (token missing). Please run 'scriberr login'")
}
file, err := os.Open(filePath)
if err != nil {
return fmt.Errorf("failed to open file: %w", err)
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("audio", filepath.Base(filePath))
if err != nil {
return fmt.Errorf("failed to create form file: %w", err)
}
if _, err := io.Copy(part, file); err != nil {
return fmt.Errorf("failed to copy file content: %w", err)
}
// Add title as filename
if err := writer.WriteField("title", filepath.Base(filePath)); err != nil {
return fmt.Errorf("failed to write title field: %w", err)
}
err = writer.Close()
if err != nil {
return fmt.Errorf("failed to close writer: %w", err)
}
url := fmt.Sprintf("%s/api/v1/transcription/upload", config.ServerURL)
req, err := http.NewRequest("POST", url, body)
if err != nil {
return fmt.Errorf("failed to create request: %w", err)
}
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("Authorization", "Bearer "+config.Token)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return fmt.Errorf("failed to send request: %w", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
respBody, _ := io.ReadAll(resp.Body)
return fmt.Errorf("upload failed with status %d: %s", resp.StatusCode, string(respBody))
}
return nil
}