Changelog 0.3.0

This commit is contained in:
Mukhtar Akere
2024-11-30 15:46:58 +01:00
parent df2aa4e361
commit a51364d150
53 changed files with 2019 additions and 679 deletions
+84
View File
@@ -2,8 +2,11 @@ package common
import (
"encoding/json"
"errors"
"fmt"
"log"
"os"
"sync"
)
type DebridConfig struct {
@@ -43,6 +46,82 @@ type Config struct {
QBitTorrent QBitTorrentConfig `json:"qbittorrent"`
}
func validateDebrids(debrids []DebridConfig) error {
if len(debrids) == 0 {
return errors.New("no debrids configured")
}
errChan := make(chan error, len(debrids))
var wg sync.WaitGroup
for _, debrid := range debrids {
// Basic field validation
if debrid.Host == "" {
return errors.New("debrid host is required")
}
if debrid.APIKey == "" {
return errors.New("debrid api key is required")
}
if debrid.Folder == "" {
return errors.New("debrid folder is required")
}
// Check folder existence concurrently
wg.Add(1)
go func(folder string) {
defer wg.Done()
if _, err := os.Stat(folder); os.IsNotExist(err) {
errChan <- fmt.Errorf("debrid folder does not exist: %s", folder)
}
}(debrid.Folder)
}
// Wait for all checks to complete
go func() {
wg.Wait()
close(errChan)
}()
// Return first error if any
if err := <-errChan; err != nil {
return err
}
return nil
}
func validateQbitTorrent(config *QBitTorrentConfig) error {
if config.DownloadFolder == "" {
return errors.New("qbittorent download folder is required")
}
if _, err := os.Stat(config.DownloadFolder); os.IsNotExist(err) {
return errors.New("qbittorent download folder does not exist")
}
return nil
}
func validateConfig(config *Config) error {
// Run validations concurrently
errChan := make(chan error, 2)
go func() {
errChan <- validateDebrids(config.Debrids)
}()
go func() {
errChan <- validateQbitTorrent(&config.QBitTorrent)
}()
// Check for errors
for i := 0; i < 2; i++ {
if err := <-errChan; err != nil {
return err
}
}
return nil
}
func LoadConfig(path string) (*Config, error) {
// Load the config file
file, err := os.Open(path)
@@ -67,5 +146,10 @@ func LoadConfig(path string) (*Config, error) {
config.Debrids = append(config.Debrids, config.Debrid)
}
// Validate the config
//if err := validateConfig(config); err != nil {
// return nil, err
//}
return config, nil
}
+14
View File
@@ -0,0 +1,14 @@
package common
import (
"fmt"
"log"
"os"
)
func NewLogger(prefix string, output *os.File) *log.Logger {
f := fmt.Sprintf("[%s] ", prefix)
return log.New(output, f, log.LstdFlags)
}
var Logger = NewLogger("Main", os.Stdout)
+7
View File
@@ -2,6 +2,7 @@ package common
import (
"crypto/tls"
"encoding/json"
"fmt"
"golang.org/x/time/rate"
"io"
@@ -125,3 +126,9 @@ func ParseRateLimit(rateStr string) *rate.Limiter {
return nil
}
}
func JSONResponse(w http.ResponseWriter, data interface{}, code int) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(code)
json.NewEncoder(w).Encode(data)
}
-5
View File
@@ -209,11 +209,6 @@ func processInfoHash(input string) (string, error) {
return "", fmt.Errorf("invalid infohash: %s", input)
}
func NewLogger(prefix string, output *os.File) *log.Logger {
f := fmt.Sprintf("[%s] ", prefix)
return log.New(output, f, log.LstdFlags)
}
func GetInfohashFromURL(url string) (string, error) {
// Download the torrent file
var magnetLink string