package services import ( "context" "github.com/fujin/music-agregator/internal/config" "github.com/fujin/music-agregator/internal/torrent" ) type TorrentService struct { client torrent.Client } func NewTorrentService(cfg config.TorrentConfig) (*TorrentService, error) { var client torrent.Client switch cfg.ClientType { case config.TorrentClientQBittorrent: c, err := torrent.NewQBittorrentClient(cfg.URL, cfg.Username, cfg.Password) if err != nil { return nil, err } client = c case config.TorrentClientStub: client = torrent.NewStubClient(cfg.LogPath, cfg.SavePath) default: return &TorrentService{client: nil}, nil } return &TorrentService{client: client}, nil } func (s *TorrentService) Connect(ctx context.Context) error { if s.client == nil { return nil } return s.client.Connect(ctx) } func (s *TorrentService) Disconnect(ctx context.Context) error { if s.client == nil { return nil } return s.client.Disconnect(ctx) } func (s *TorrentService) ListTorrents(ctx context.Context) ([]torrent.TorrentInfo, error) { if s.client == nil { return []torrent.TorrentInfo{}, nil } return s.client.ListTorrents(ctx) } func (s *TorrentService) GetTorrent(ctx context.Context, hash string) (*torrent.TorrentInfo, error) { if s.client == nil { return nil, torrent.ErrTorrentNotFound } return s.client.GetTorrent(ctx, hash) } func (s *TorrentService) AddTorrentURL(ctx context.Context, url string, savePath *string) error { if s.client == nil { return nil } return s.client.AddTorrentURL(ctx, url, savePath) } func (s *TorrentService) AddTorrentFile(ctx context.Context, data []byte, savePath *string) error { if s.client == nil { return nil } return s.client.AddTorrentFile(ctx, data, savePath) } func (s *TorrentService) RemoveTorrent(ctx context.Context, hash string, deleteFiles bool) error { if s.client == nil { return nil } return s.client.RemoveTorrent(ctx, hash, deleteFiles) } func (s *TorrentService) PauseTorrent(ctx context.Context, hash string) error { if s.client == nil { return nil } return s.client.PauseTorrent(ctx, hash) } func (s *TorrentService) ResumeTorrent(ctx context.Context, hash string) error { if s.client == nil { return nil } return s.client.ResumeTorrent(ctx, hash) } func (s *TorrentService) IsConfigured() bool { return s.client != nil } func (s *TorrentService) GetStubClient() *torrent.StubClient { if stub, ok := s.client.(*torrent.StubClient); ok { return stub } return nil }