diff --git a/go.mod b/go.mod index 1bd24ed..f9ae0e1 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,8 @@ require ( golang.org/x/net v0.25.0 ) +require github.com/adrg/strutil v0.3.1 // indirect + require ( ariga.io/atlas v0.19.1-0.20240203083654-5948b60a8e43 // indirect github.com/agext/levenshtein v1.2.1 // indirect diff --git a/go.sum b/go.sum index 65ae838..e2b7734 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ entgo.io/ent v0.13.1 h1:uD8QwN1h6SNphdCCzmkMN3feSUzNnVvV/WIkHKMbzOE= entgo.io/ent v0.13.1/go.mod h1:qCEmo+biw3ccBn9OyL4ZK5dfpwg++l1Gxwac5B1206A= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/adrg/strutil v0.3.1 h1:OLvSS7CSJO8lBii4YmBt8jiK9QOtB9CzCzwl4Ic/Fz4= +github.com/adrg/strutil v0.3.1/go.mod h1:8h90y18QLrs11IBffcGX3NW/GFBXCMcNg4M7H6MspPA= github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= diff --git a/server/resources.go b/server/resources.go index 8409bac..92da944 100644 --- a/server/resources.go +++ b/server/resources.go @@ -13,6 +13,8 @@ import ( "strconv" "strings" + "github.com/adrg/strutil" + "github.com/adrg/strutil/metrics" "github.com/gin-gonic/gin" "github.com/pkg/errors" ) @@ -71,7 +73,6 @@ func (s *Server) GetAllIndexers(c *gin.Context) (interface{}, error) { return indexers, nil } - func (s *Server) getDownloadClient() (*transmission.Client, error) { tr := s.db.GetTransmission() trc, err := transmission.NewClient(transmission.Config{ @@ -225,17 +226,17 @@ func (s *Server) SearchAvailableMovies(c *gin.Context) (interface{}, error) { if !strings.Contains(r.Name, strconv.Itoa(year)) && !strings.Contains(r.Name, strconv.Itoa(year+1)) && !strings.Contains(r.Name, strconv.Itoa(year-1)) { continue //not the same movie, if year is not correct } - lowerName := strings.ToLower(r.Name) - lowerEnName := strings.ToLower(movieDetail.NameEn) - if !strings.Contains(lowerName, movieDetail.NameCn) && !strings.Contains(lowerName, lowerEnName) { + distCn := strutil.Similarity(strings.ToLower(r.Name), movieDetail.NameCn, metrics.NewHamming()) + distEn := strutil.Similarity(strings.ToLower(r.Name), strings.ToLower(movieDetail.NameEn), metrics.NewHamming()) + if distCn == 0 && distEn == 0 { continue //name not match } searchResults = append(searchResults, TorznabSearchResult{ - Name: r.Name, - Size: r.Size, + Name: r.Name, + Size: r.Size, Seeders: r.Seeders, - Peers: r.Peers, - Link: r.Magnet, + Peers: r.Peers, + Link: r.Magnet, }) } if len(searchResults) == 0 { @@ -247,9 +248,10 @@ func (s *Server) SearchAvailableMovies(c *gin.Context) (interface{}, error) { } type downloadTorrentIn struct { - MediaID int `json:"media_id" binding:"required"` - Link string `json:"link" binding:"required"` + MediaID int `json:"media_id" binding:"required"` + Link string `json:"link" binding:"required"` } + func (s *Server) DownloadMovieTorrent(c *gin.Context) (interface{}, error) { var in downloadTorrentIn if err := c.ShouldBindJSON(&in); err != nil { @@ -272,7 +274,7 @@ func (s *Server) DownloadMovieTorrent(c *gin.Context) (interface{}, error) { } torrent.Start() - go func () { + go func() { for { if !torrent.Exists() { continue @@ -290,9 +292,9 @@ func (s *Server) DownloadMovieTorrent(c *gin.Context) (interface{}, error) { } s.tasks[history.ID] = &Task{Torrent: torrent} - + break - } + } }() log.Infof("success add %s to download task", media.NameEn)