115 lines
2.9 KiB
Go
115 lines
2.9 KiB
Go
package transfer
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"m3u8-downloader/pkg/config"
|
|
"m3u8-downloader/pkg/constants"
|
|
"m3u8-downloader/pkg/transfer"
|
|
"m3u8-downloader/pkg/utils"
|
|
"os"
|
|
"os/signal"
|
|
"strconv"
|
|
"strings"
|
|
"syscall"
|
|
"time"
|
|
)
|
|
|
|
func getEventDirs(cfg *config.Config) ([]string, error) {
|
|
dirs, err := os.ReadDir(cfg.Paths.LocalOutput)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to read directory: %w", err)
|
|
}
|
|
var eventDirs []string
|
|
for _, dir := range dirs {
|
|
if dir.IsDir() {
|
|
eventDirs = append(eventDirs, dir.Name())
|
|
}
|
|
}
|
|
return eventDirs, nil
|
|
}
|
|
|
|
func RunTransferOnly(eventName string) {
|
|
cfg := constants.MustGetConfig()
|
|
|
|
// Check if NAS transfer is enabled
|
|
if !cfg.NAS.EnableTransfer {
|
|
log.Fatal("NAS transfer is disabled in configuration. Please enable it to use transfer-only mode.")
|
|
}
|
|
|
|
if eventName == "" {
|
|
events, err := getEventDirs(cfg)
|
|
if err != nil {
|
|
log.Fatalf("Failed to get event directories: %v", err)
|
|
}
|
|
if len(events) == 0 {
|
|
log.Fatal("No events found")
|
|
}
|
|
if len(events) > 1 {
|
|
fmt.Println("Multiple events found, please select one:")
|
|
for i, event := range events {
|
|
fmt.Printf("%d. %s\n", i+1, event)
|
|
}
|
|
reader := bufio.NewReader(os.Stdin)
|
|
input, _ := reader.ReadString('\n')
|
|
input = strings.TrimSpace(input)
|
|
index, err := strconv.Atoi(input)
|
|
if err != nil {
|
|
log.Fatalf("Failed to parse input: %v", err)
|
|
}
|
|
if index < 1 || index > len(events) {
|
|
log.Fatal("Invalid input")
|
|
}
|
|
eventName = events[index-1]
|
|
} else {
|
|
eventName = events[0]
|
|
}
|
|
}
|
|
|
|
log.Printf("Starting transfer-only mode for event: %s", eventName)
|
|
|
|
// Setup context and signal handling
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
|
|
sigChan := make(chan os.Signal, 1)
|
|
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
|
|
go func() {
|
|
<-sigChan
|
|
log.Println("Shutting down transfer service...")
|
|
cancel()
|
|
}()
|
|
|
|
// Verify local event directory exists
|
|
localEventPath := cfg.GetEventPath(eventName)
|
|
if !utils.PathExists(localEventPath) {
|
|
log.Fatalf("Local event directory does not exist: %s", localEventPath)
|
|
}
|
|
|
|
// Create transfer service
|
|
transferService, err := transfer.NewTrasferService(cfg.NAS.OutputPath, eventName)
|
|
if err != nil {
|
|
log.Fatalf("Failed to create transfer service: %v", err)
|
|
}
|
|
|
|
// Find and queue existing files
|
|
if err := transferService.QueueExistingFiles(localEventPath); err != nil {
|
|
log.Fatalf("Failed to queue existing files: %v", err)
|
|
}
|
|
|
|
// Start transfer service
|
|
log.Println("Starting transfer service...")
|
|
if err := transferService.Start(ctx); err != nil && err != context.Canceled {
|
|
log.Printf("Transfer service error: %v", err)
|
|
}
|
|
|
|
// Graceful shutdown
|
|
shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer shutdownCancel()
|
|
transferService.Shutdown(shutdownCtx)
|
|
|
|
log.Println("Transfer-only mode completed.")
|
|
}
|