Add new config - number_of_hosts
This commit is contained in:
@@ -86,7 +86,7 @@ func MainApp(configPath string) {
|
|||||||
log.Named("unrestrict_client"),
|
log.Named("unrestrict_client"),
|
||||||
)
|
)
|
||||||
|
|
||||||
hosts := repo.GetOptimalHosts(config.ShouldForceIPv6())
|
hosts := repo.GetOptimalHosts(config.GetNumberOfHosts(), config.ShouldForceIPv6())
|
||||||
zurglog.Debugf("Optimal hosts (%d): %v", len(hosts), hosts)
|
zurglog.Debugf("Optimal hosts (%d): %v", len(hosts), hosts)
|
||||||
|
|
||||||
downloadClient := http.NewHTTPClient(
|
downloadClient := http.NewHTTPClient(
|
||||||
@@ -99,7 +99,7 @@ func MainApp(configPath string) {
|
|||||||
log.Named("download_client"),
|
log.Named("download_client"),
|
||||||
)
|
)
|
||||||
|
|
||||||
workerPool, err := ants.NewPool(config.GetNumOfWorkers())
|
workerPool, err := ants.NewPool(config.GetNumberOfWorkers())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
zurglog.Errorf("Failed to create worker pool: %v", err)
|
zurglog.Errorf("Failed to create worker pool: %v", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|||||||
@@ -7,34 +7,35 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type ConfigInterface interface {
|
type ConfigInterface interface {
|
||||||
GetConfig() ZurgConfig
|
|
||||||
GetVersion() string
|
|
||||||
GetToken() string
|
|
||||||
GetNumOfWorkers() int
|
|
||||||
GetRefreshEverySecs() int
|
|
||||||
GetRepairEveryMins() int
|
|
||||||
EnableRepair() bool
|
EnableRepair() bool
|
||||||
GetHost() string
|
|
||||||
GetPort() string
|
|
||||||
GetUsername() string
|
|
||||||
GetPassword() string
|
|
||||||
GetDirectories() []string
|
|
||||||
MeetsConditions(directory, torrentName string, torrentSize int64, torrentIDs, fileNames []string, fileSizes []int64, mediaInfos []*ffprobe.ProbeData) bool
|
|
||||||
GetOnLibraryUpdate() string
|
|
||||||
GetNetworkBufferSize() int
|
|
||||||
EnableRetainFolderNameExtension() bool
|
EnableRetainFolderNameExtension() bool
|
||||||
EnableRetainRDTorrentName() bool
|
EnableRetainRDTorrentName() bool
|
||||||
|
GetApiTimeoutSecs() int
|
||||||
|
GetConfig() ZurgConfig
|
||||||
|
GetDirectories() []string
|
||||||
|
GetDownloadsEveryMins() int
|
||||||
|
GetDownloadTimeoutSecs() int
|
||||||
|
GetDumpTorrentsEveryMins() int
|
||||||
|
GetHost() string
|
||||||
|
GetNetworkBufferSize() int
|
||||||
|
GetNumberOfHosts() int
|
||||||
|
GetNumberOfWorkers() int
|
||||||
|
GetOnLibraryUpdate() string
|
||||||
|
GetPassword() string
|
||||||
|
GetPlayableExtensions() []string
|
||||||
|
GetPort() string
|
||||||
|
GetProxy() string
|
||||||
|
GetRarAction() string
|
||||||
|
GetRefreshEverySecs() int
|
||||||
|
GetRepairEveryMins() int
|
||||||
|
GetRetriesUntilFailed() int
|
||||||
|
GetToken() string
|
||||||
|
GetUsername() string
|
||||||
|
GetVersion() string
|
||||||
|
MeetsConditions(directory, torrentName string, torrentSize int64, torrentIDs, fileNames []string, fileSizes []int64, mediaInfos []*ffprobe.ProbeData) bool
|
||||||
|
ShouldForceIPv6() bool
|
||||||
ShouldIgnoreRenames() bool
|
ShouldIgnoreRenames() bool
|
||||||
ShouldServeFromRclone() bool
|
ShouldServeFromRclone() bool
|
||||||
ShouldForceIPv6() bool
|
|
||||||
GetApiTimeoutSecs() int
|
|
||||||
GetDownloadTimeoutSecs() int
|
|
||||||
GetRetriesUntilFailed() int
|
|
||||||
GetRarAction() string
|
|
||||||
GetDownloadsEveryMins() int
|
|
||||||
GetDumpTorrentsEveryMins() int
|
|
||||||
GetPlayableExtensions() []string
|
|
||||||
GetProxy() string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type ZurgConfig struct {
|
type ZurgConfig struct {
|
||||||
@@ -44,18 +45,20 @@ type ZurgConfig struct {
|
|||||||
ApiTimeoutSecs int `yaml:"api_timeout_secs" json:"api_timeout_secs"`
|
ApiTimeoutSecs int `yaml:"api_timeout_secs" json:"api_timeout_secs"`
|
||||||
CanRepair bool `yaml:"enable_repair" json:"enable_repair"`
|
CanRepair bool `yaml:"enable_repair" json:"enable_repair"`
|
||||||
DownloadsEveryMins int `yaml:"downloads_every_mins" json:"downloads_every_mins"`
|
DownloadsEveryMins int `yaml:"downloads_every_mins" json:"downloads_every_mins"`
|
||||||
DumpTorrentsEveryMins int `yaml:"dump_torrents_every_mins" json:"dump_torrents_every_mins"`
|
|
||||||
DownloadTimeoutSecs int `yaml:"download_timeout_secs" json:"download_timeout_secs"`
|
DownloadTimeoutSecs int `yaml:"download_timeout_secs" json:"download_timeout_secs"`
|
||||||
|
DumpTorrentsEveryMins int `yaml:"dump_torrents_every_mins" json:"dump_torrents_every_mins"`
|
||||||
ForceIPv6 bool `yaml:"force_ipv6" json:"force_ipv6"`
|
ForceIPv6 bool `yaml:"force_ipv6" json:"force_ipv6"`
|
||||||
Host string `yaml:"host" json:"host"`
|
Host string `yaml:"host" json:"host"`
|
||||||
IgnoreRenames bool `yaml:"ignore_renames" json:"ignore_renames"`
|
IgnoreRenames bool `yaml:"ignore_renames" json:"ignore_renames"`
|
||||||
NetworkBufferSize int `yaml:"network_buffer_size" json:"network_buffer_size"`
|
NetworkBufferSize int `yaml:"network_buffer_size" json:"network_buffer_size"`
|
||||||
|
NumberOfHosts int `yaml:"number_of_hosts" json:"number_of_hosts"`
|
||||||
NumOfWorkers int `yaml:"concurrent_workers" json:"concurrent_workers"`
|
NumOfWorkers int `yaml:"concurrent_workers" json:"concurrent_workers"`
|
||||||
OnLibraryUpdate string `yaml:"on_library_update" json:"on_library_update"`
|
OnLibraryUpdate string `yaml:"on_library_update" json:"on_library_update"`
|
||||||
Password string `yaml:"password" json:"password"`
|
Password string `yaml:"password" json:"password"`
|
||||||
PlayableExtensions []string `yaml:"addl_playable_extensions" json:"addl_playable_extensions"`
|
PlayableExtensions []string `yaml:"addl_playable_extensions" json:"addl_playable_extensions"`
|
||||||
Port string `yaml:"port" json:"port"`
|
Port string `yaml:"port" json:"port"`
|
||||||
Proxy string `yaml:"proxy" json:"proxy"`
|
Proxy string `yaml:"proxy" json:"proxy"`
|
||||||
|
RarAction string `yaml:"rar_action" json:"rar_action"`
|
||||||
RefreshEverySecs int `yaml:"check_for_changes_every_secs" json:"check_for_changes_every_secs"`
|
RefreshEverySecs int `yaml:"check_for_changes_every_secs" json:"check_for_changes_every_secs"`
|
||||||
RepairEveryMins int `yaml:"repair_every_mins" json:"repair_every_mins"`
|
RepairEveryMins int `yaml:"repair_every_mins" json:"repair_every_mins"`
|
||||||
RetainFolderNameExtension bool `yaml:"retain_folder_name_extension" json:"retain_folder_name_extension"`
|
RetainFolderNameExtension bool `yaml:"retain_folder_name_extension" json:"retain_folder_name_extension"`
|
||||||
@@ -63,7 +66,6 @@ type ZurgConfig struct {
|
|||||||
RetriesUntilFailed int `yaml:"retries_until_failed" json:"retries_until_failed"`
|
RetriesUntilFailed int `yaml:"retries_until_failed" json:"retries_until_failed"`
|
||||||
ServeFromRclone bool `yaml:"serve_from_rclone" json:"serve_from_rclone"`
|
ServeFromRclone bool `yaml:"serve_from_rclone" json:"serve_from_rclone"`
|
||||||
Username string `yaml:"username" json:"username"`
|
Username string `yaml:"username" json:"username"`
|
||||||
RarAction string `yaml:"rar_action" json:"rar_action"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (z *ZurgConfig) GetConfig() ZurgConfig {
|
func (z *ZurgConfig) GetConfig() ZurgConfig {
|
||||||
@@ -99,7 +101,7 @@ func (z *ZurgConfig) GetPassword() string {
|
|||||||
return z.Password
|
return z.Password
|
||||||
}
|
}
|
||||||
|
|
||||||
func (z *ZurgConfig) GetNumOfWorkers() int {
|
func (z *ZurgConfig) GetNumberOfWorkers() int {
|
||||||
if z.NumOfWorkers == 0 {
|
if z.NumOfWorkers == 0 {
|
||||||
return 20
|
return 20
|
||||||
}
|
}
|
||||||
@@ -211,3 +213,10 @@ func (z *ZurgConfig) GetPlayableExtensions() []string {
|
|||||||
func (z *ZurgConfig) GetProxy() string {
|
func (z *ZurgConfig) GetProxy() string {
|
||||||
return z.Proxy
|
return z.Proxy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (z *ZurgConfig) GetNumberOfHosts() int {
|
||||||
|
if z.NumberOfHosts == 0 {
|
||||||
|
return 20
|
||||||
|
}
|
||||||
|
return z.NumberOfHosts
|
||||||
|
}
|
||||||
|
|||||||
@@ -69,13 +69,12 @@ func (r *IPRepository) NetworkTest(forceRun bool) {
|
|||||||
r.writeLatencyFile(ipv6latencyFile, r.ipv6latencyMap)
|
r.writeLatencyFile(ipv6latencyFile, r.ipv6latencyMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *IPRepository) GetOptimalHosts(ipv6 bool) []string {
|
func (r *IPRepository) GetOptimalHosts(numberOfHosts int, ipv6 bool) []string {
|
||||||
latencyMap := r.ipv4latencyMap
|
latencyMap := r.ipv4latencyMap
|
||||||
if ipv6 {
|
if ipv6 {
|
||||||
latencyMap = r.ipv6latencyMap
|
latencyMap = r.ipv6latencyMap
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert the latency map to a slice of key-value pairs
|
|
||||||
type kv struct {
|
type kv struct {
|
||||||
Key string
|
Key string
|
||||||
Value float64
|
Value float64
|
||||||
@@ -86,20 +85,12 @@ func (r *IPRepository) GetOptimalHosts(ipv6 bool) []string {
|
|||||||
kvList = append(kvList, kv{k, v})
|
kvList = append(kvList, kv{k, v})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort the slice by latency values
|
|
||||||
sort.Slice(kvList, func(i, j int) bool {
|
sort.Slice(kvList, func(i, j int) bool {
|
||||||
return kvList[i].Value < kvList[j].Value
|
return kvList[i].Value < kvList[j].Value
|
||||||
})
|
})
|
||||||
|
|
||||||
// Calculate the number of hosts to return (top 50%)
|
|
||||||
n := len(kvList) / 5
|
|
||||||
if len(kvList)%5 != 0 {
|
|
||||||
n++
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collect the keys of the top 50% hosts
|
|
||||||
var optimalHosts []string
|
var optimalHosts []string
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < numberOfHosts && i < len(kvList); i++ {
|
||||||
optimalHosts = append(optimalHosts, kvList[i].Key)
|
optimalHosts = append(optimalHosts, kvList[i].Key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user