Share single torrent client across all services, eliminate triple qBittorrent login on startup

This commit is contained in:
Alexander
2026-05-09 21:42:53 +02:00
parent 758a4b909a
commit ef75b9bfba
5 changed files with 19 additions and 46 deletions
+11 -8
View File
@@ -82,12 +82,12 @@ type riverSetup struct {
cacheRefreshWorker *indexer.CacheRefreshWorker cacheRefreshWorker *indexer.CacheRefreshWorker
} }
func setupRiver(ctx context.Context, cfg config.Config, db *database.DB) *riverSetup { func setupRiver(ctx context.Context, cfg config.Config, db *database.DB, torrentClient torrent.TorrentClient) *riverSetup {
cacheWorker := &indexer.CacheRefreshWorker{} cacheWorker := &indexer.CacheRefreshWorker{}
pollWorker := &workers.PollDownloadWorker{ pollWorker := &workers.PollDownloadWorker{
Downloads: database.NewDownloadRepository(db.Pool), Downloads: database.NewDownloadRepository(db.Pool),
DownloadFiles: database.NewDownloadFileRepository(db.Pool), DownloadFiles: database.NewDownloadFileRepository(db.Pool),
TorrentClient: torrent.MustNewTorrentClient(cfg), TorrentClient: torrentClient,
} }
riverWorkers := river.NewWorkers() riverWorkers := river.NewWorkers()
@@ -155,9 +155,15 @@ func serveGrpc(config config.Config) {
ctx := context.Background() ctx := context.Background()
db := setupDatabase(ctx, config) db := setupDatabase(ctx, config)
defer db.Close() defer db.Close()
rs := setupRiver(ctx, config, db)
musiscAgregatorSeerver, err := internal.NewMusicAgregatorServer(config, rs.client, db) torrentClient, err := torrent.NewTorrentClient(config)
if err != nil {
log.Fatal().Err(err).Msg("failed to create torrent client")
}
rs := setupRiver(ctx, config, db, torrentClient)
musiscAgregatorSeerver, err := internal.NewMusicAgregatorServer(config, rs.client, torrentClient, db)
if err != nil { if err != nil {
log.Fatal().Err(err).Msg("failed to create MusicAgregatorServer") log.Fatal().Err(err).Msg("failed to create MusicAgregatorServer")
} }
@@ -165,10 +171,7 @@ func serveGrpc(config config.Config) {
if err != nil { if err != nil {
log.Fatal().Err(err).Msg("failed to create IndexerServer") log.Fatal().Err(err).Msg("failed to create IndexerServer")
} }
torrentServer, err := torrent.NewTorrentServer(config) torrentServer := torrent.NewTorrentServer(torrentClient)
if err != nil {
log.Fatal().Err(err).Msg("failed to create TorrentServer")
}
metadataServer, err := metadata.NewMetadataServer(config) metadataServer, err := metadata.NewMetadataServer(config)
if err != nil { if err != nil {
log.Fatal().Err(err).Msg("failed to create MetadataServer") log.Fatal().Err(err).Msg("failed to create MetadataServer")
+3 -2
View File
@@ -11,6 +11,7 @@ import (
pb "homelab.lan/music-agregator/gen/music_agregator/v1" pb "homelab.lan/music-agregator/gen/music_agregator/v1"
"homelab.lan/music-agregator/internal/config" "homelab.lan/music-agregator/internal/config"
"homelab.lan/music-agregator/internal/database" "homelab.lan/music-agregator/internal/database"
"homelab.lan/music-agregator/internal/torrent"
) )
type MusicAgregatorServer struct { type MusicAgregatorServer struct {
@@ -18,8 +19,8 @@ type MusicAgregatorServer struct {
pb.UnimplementedMusicAgregatorServiceServer pb.UnimplementedMusicAgregatorServiceServer
} }
func NewMusicAgregatorServer(cfg config.Config, riverClient *river.Client[pgx.Tx], db *database.DB) (*MusicAgregatorServer, error) { func NewMusicAgregatorServer(cfg config.Config, riverClient *river.Client[pgx.Tx], torrentClient torrent.TorrentClient, db *database.DB) (*MusicAgregatorServer, error) {
service, err := NewMusicAgregatorService(cfg, riverClient, db) service, err := NewMusicAgregatorService(cfg, riverClient, torrentClient, db)
if err != nil { if err != nil {
log.Err(err).Msg("failed to create MusicAgregatorService") log.Err(err).Msg("failed to create MusicAgregatorService")
return nil, err return nil, err
+1 -7
View File
@@ -44,7 +44,7 @@ type MusicAgregatorService struct {
downloadFiles *database.DownloadFileRepository downloadFiles *database.DownloadFileRepository
} }
func NewMusicAgregatorService(cfg config.Config, riverClient *river.Client[pgx.Tx], db *database.DB) (*MusicAgregatorService, error) { func NewMusicAgregatorService(cfg config.Config, riverClient *river.Client[pgx.Tx], torrentClient torrent.TorrentClient, db *database.DB) (*MusicAgregatorService, error) {
idx, err := indexer.NewIndexerService(cfg, riverClient, nil) idx, err := indexer.NewIndexerService(cfg, riverClient, nil)
if err != nil { if err != nil {
log.Err(err).Msg("failed to create IndexerService") log.Err(err).Msg("failed to create IndexerService")
@@ -63,12 +63,6 @@ func NewMusicAgregatorService(cfg config.Config, riverClient *river.Client[pgx.T
return nil, err return nil, err
} }
torrentClient, err := torrent.NewTorrentClient(cfg)
if err != nil {
log.Err(err).Msg("failed to create torrent client")
return nil, err
}
return &MusicAgregatorService{ return &MusicAgregatorService{
config: cfg, config: cfg,
metadata: metadata.NewMetadataService(metadataClient, db), metadata: metadata.NewMetadataService(metadataClient, db),
+2 -9
View File
@@ -7,7 +7,6 @@ import (
"google.golang.org/grpc" "google.golang.org/grpc"
pb "homelab.lan/music-agregator/gen/music_agregator/torrent/v1" pb "homelab.lan/music-agregator/gen/music_agregator/torrent/v1"
"homelab.lan/music-agregator/internal/config"
) )
type TorrentServer struct { type TorrentServer struct {
@@ -15,14 +14,8 @@ type TorrentServer struct {
pb.UnimplementedTorrentServiceServer pb.UnimplementedTorrentServiceServer
} }
func NewTorrentServer(cfg config.Config) (*TorrentServer, error) { func NewTorrentServer(client TorrentClient) *TorrentServer {
service, err := NewTorrentService(cfg) return &TorrentServer{service: NewTorrentService(client)}
if err != nil {
log.Err(err).Msg("failed to initialize TorrentService")
return nil, err
}
return &TorrentServer{service: service}, nil
} }
func (server *TorrentServer) List(ctx context.Context, req *pb.ListRequest) (*pb.ListResponse, error) { func (server *TorrentServer) List(ctx context.Context, req *pb.ListRequest) (*pb.ListResponse, error) {
+2 -20
View File
@@ -11,7 +11,6 @@ import (
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
pb "homelab.lan/music-agregator/gen/music_agregator/torrent/v1" pb "homelab.lan/music-agregator/gen/music_agregator/torrent/v1"
"homelab.lan/music-agregator/internal/config"
) )
type TorrentService struct { type TorrentService struct {
@@ -19,27 +18,10 @@ type TorrentService struct {
token string token string
} }
func NewTorrentService(cfg config.Config) (*TorrentService, error) { func NewTorrentService(client TorrentClient) *TorrentService {
var client TorrentClient
switch cfg.Torrent.ClientType {
case config.TorrentClientQbittorrent:
client = NewQbittorrentClient(cfg.Torrent.Url)
default:
return nil, fmt.Errorf("unknown torrent client type: %s", cfg.Torrent.ClientType)
}
token, err := client.Login(cfg.Torrent.Username, cfg.Torrent.Password)
if err != nil {
return nil, fmt.Errorf("torrent client login failed: %w", err)
}
log.Info().Str("client", string(cfg.Torrent.ClientType)).Msg("torrent client connected")
return &TorrentService{ return &TorrentService{
client: client, client: client,
token: token, }
}, nil
} }
func (service *TorrentService) List(req *pb.ListRequest) (*pb.ListResponse, error) { func (service *TorrentService) List(req *pb.ListRequest) (*pb.ListResponse, error) {