implemented GetAnimeEpProps
This commit is contained in:
parent
4b71c945a9
commit
1d81e01d6c
22
anime_episode_filepath.go
Normal file
22
anime_episode_filepath.go
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.milar.in/nyaanime/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetAnimeEpFilepath(animeEp model.AnimeEpisode, ext string) string {
|
||||||
|
tmplData := AnimePathPatternData{
|
||||||
|
Title: animeEp.Anime.Title,
|
||||||
|
Episode: animeEp.Episode,
|
||||||
|
Ext: ext,
|
||||||
|
}
|
||||||
|
|
||||||
|
b := new(strings.Builder)
|
||||||
|
if err := AnimeEpFilepathPattern.Execute(b, tmplData); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return filepath.Join(AnimePath, b.String())
|
||||||
|
}
|
43
envvars.go
43
envvars.go
@ -1,13 +1,56 @@
|
|||||||
package logic
|
package logic
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"html/template"
|
||||||
|
"math"
|
||||||
|
|
||||||
"git.milar.in/milarin/envvars/v2"
|
"git.milar.in/milarin/envvars/v2"
|
||||||
"git.milar.in/nyaanime/model"
|
"git.milar.in/nyaanime/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
AnimePath = envvars.String("ANIME_PATH", "")
|
||||||
|
|
||||||
|
AnimeEpFilepathPattern = envvars.Object(
|
||||||
|
"EPISODE_FILEPATH_PATTERN",
|
||||||
|
template.Must(template.New("anime-episode-filepath-pattern").Parse(`{{.Title.UserPreferred}}/{{.Title.UserPreferred}} Episode {{.Episode}}.{{.Ext}}`)),
|
||||||
|
template.New("anime-episode-filepath-pattern").Parse,
|
||||||
|
)
|
||||||
|
|
||||||
|
// essential torrent properties
|
||||||
|
|
||||||
|
MaxResolution = envvars.Object("MAX_RESOLUTION", model.Resolution4K, model.ParseResolution)
|
||||||
|
MinResolution = envvars.Object("MIN_RESOLUTION", model.ResolutionHD, model.ParseResolution)
|
||||||
|
|
||||||
|
EssentialLanguages = envvars.StringSlice("ESSENTIAL_LANGUAGES", "|", []string{})
|
||||||
|
EssentialSubtitles = envvars.StringSlice("ESSENTIAL_SUBTITLES", "|", []string{})
|
||||||
|
|
||||||
|
MaxSeeders = envvars.Int("MAX_SEEDERS", math.MaxInt)
|
||||||
|
MinSeeders = envvars.Int("MIN_SEEDERS", 0)
|
||||||
|
|
||||||
|
MaxLeechers = envvars.Int("MAX_LEECHERS", math.MaxInt)
|
||||||
|
MinLeechers = envvars.Int("MIN_LEECHERS", 0)
|
||||||
|
|
||||||
|
MaxDownloads = envvars.Int("MAX_DOWNLOADS", math.MaxInt)
|
||||||
|
MinDownloads = envvars.Int("MIN_DOWNLOADS", 0)
|
||||||
|
|
||||||
|
TrustedOnly = envvars.Bool("TRUSTED_ONLY", false)
|
||||||
|
|
||||||
// preferred torrent properties
|
// preferred torrent properties
|
||||||
PreferredLanguages = ParsePreferredStringProps(envvars.StringSlice("PREFERRED_LANGUAGES", "|", []string{}))
|
PreferredLanguages = ParsePreferredStringProps(envvars.StringSlice("PREFERRED_LANGUAGES", "|", []string{}))
|
||||||
PreferredSubtitles = ParsePreferredStringProps(envvars.StringSlice("PREFERRED_SUBTITLES", "|", []string{}))
|
PreferredSubtitles = ParsePreferredStringProps(envvars.StringSlice("PREFERRED_SUBTITLES", "|", []string{}))
|
||||||
PreferredResolutions = ParsePreferredProps(envvars.StringSlice("PREFERRED_RESOLUTIONS", "|", []string{}), model.ParseResolution)
|
PreferredResolutions = ParsePreferredProps(envvars.StringSlice("PREFERRED_RESOLUTIONS", "|", []string{}), model.ParseResolution)
|
||||||
|
|
||||||
|
/*
|
||||||
|
TODO
|
||||||
|
|
||||||
|
better idea? implementation in torrent_sort.go (sort.Slice)
|
||||||
|
PreferredTorrents = envvars.StringSlice("PREFERRED_TORRENTS", []string{"seeders", "subtitles", "languages", "downloads"})
|
||||||
|
|
||||||
|
old idea?
|
||||||
|
PreferMoreLanguages = envvars.Bool("PREFERER_MORE_LANGUAGES", false)
|
||||||
|
PreferMoreSubtitles = envvars.Bool("PREFERER_MORE_SUBTITLES", false)
|
||||||
|
PreferMoreSeeders = envvars.Bool("PREFERER_MORE_SEEDERS", false)
|
||||||
|
PreferMoreDownloads = envvars.Bool("PREFERER_MORE_DOWNLOADS", false)
|
||||||
|
*/
|
||||||
)
|
)
|
||||||
|
7
errors.go
Normal file
7
errors.go
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import "git.milar.in/milarin/adverr"
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrInvalidGlobSyntax = adverr.NewErrTmpl("ErrInvalidGlobSyntax", "invalid filepath.Glob syntax: '%s'")
|
||||||
|
)
|
21
file_priority.go
Normal file
21
file_priority.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.milar.in/nyaanime/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
type FilePriority struct {
|
||||||
|
Properties model.PropertyHolder
|
||||||
|
Priority int
|
||||||
|
PreferredProperties map[string]int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewFilePriority(props model.PropertyHolder) *FilePriority {
|
||||||
|
priority, preferredProperties := DeterminePriority(props)
|
||||||
|
|
||||||
|
return &FilePriority{
|
||||||
|
Properties: props,
|
||||||
|
Priority: priority,
|
||||||
|
PreferredProperties: preferredProperties,
|
||||||
|
}
|
||||||
|
}
|
65
file_props.go
Normal file
65
file_props.go
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"git.milar.in/milarin/anilist"
|
||||||
|
"git.milar.in/milarin/slices"
|
||||||
|
"git.milar.in/nyaanime/model"
|
||||||
|
"git.milar.in/nyaanime/parsers"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AnimePathPatternData struct {
|
||||||
|
Title anilist.MediaTitle
|
||||||
|
Episode int
|
||||||
|
Ext string
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAnimeEpProps(animeEp model.AnimeEpisode) (*FilePriority, bool) {
|
||||||
|
animeEpPath := GetAnimeEpFilepath(animeEp, "*")
|
||||||
|
files, err := filepath.Glob(animeEpPath)
|
||||||
|
if err != nil {
|
||||||
|
panic(ErrInvalidGlobSyntax.Wrap(err, animeEpPath))
|
||||||
|
}
|
||||||
|
|
||||||
|
var mostPrio *FilePriority
|
||||||
|
|
||||||
|
for _, file := range files {
|
||||||
|
props, err := parsers.AnalyzeFile(file)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if !HasFileEssentialProperties(props) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
fp := NewFilePriority(props)
|
||||||
|
|
||||||
|
if mostPrio == nil || fp.Priority > mostPrio.Priority {
|
||||||
|
mostPrio = fp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mostPrio, mostPrio != nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func HasFileEssentialProperties(props model.PropertyHolder) bool {
|
||||||
|
if props.GetResolution() < MinResolution || props.GetResolution() > MaxResolution {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, essentialLanguage := range EssentialLanguages {
|
||||||
|
if !slices.Contains(props.GetLanguages(), essentialLanguage) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, essentialSubtitle := range EssentialSubtitles {
|
||||||
|
if !slices.Contains(props.GetSubtitles(), essentialSubtitle) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
5
go.mod
5
go.mod
@ -3,10 +3,13 @@ module git.milar.in/nyaanime/logic
|
|||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
git.milar.in/milarin/adverr v0.2.1
|
||||||
|
git.milar.in/milarin/anilist v1.5.0
|
||||||
git.milar.in/milarin/envvars/v2 v2.0.0
|
git.milar.in/milarin/envvars/v2 v2.0.0
|
||||||
git.milar.in/milarin/gmath v0.0.3
|
git.milar.in/milarin/gmath v0.0.3
|
||||||
git.milar.in/milarin/slices v0.0.6
|
git.milar.in/milarin/slices v0.0.6
|
||||||
git.milar.in/nyaanime/model v0.0.0-20221008104642-466e1111ddea
|
git.milar.in/nyaanime/model v0.0.0-20221008104642-466e1111ddea
|
||||||
|
git.milar.in/nyaanime/parsers v0.0.0-20221207192513-e7bce7c418d8
|
||||||
)
|
)
|
||||||
|
|
||||||
require git.milar.in/milarin/anilist v1.5.0 // indirect
|
require gopkg.in/vansante/go-ffprobe.v2 v2.1.1 // indirect
|
||||||
|
6
go.sum
6
go.sum
@ -1,3 +1,5 @@
|
|||||||
|
git.milar.in/milarin/adverr v0.2.1 h1:eyXFGC+Ui/kcNt2+NqP3HiAplwxzqeNr9DfitsUb3c4=
|
||||||
|
git.milar.in/milarin/adverr v0.2.1/go.mod h1:wwfglcey4R3vqjNL/d8mbnvFJGzETRXzAEolIHZY32w=
|
||||||
git.milar.in/milarin/anilist v1.5.0 h1:fSiAXY/topNk4ISEp2QtcG9HHKLJfMc8w05iqc+Paf0=
|
git.milar.in/milarin/anilist v1.5.0 h1:fSiAXY/topNk4ISEp2QtcG9HHKLJfMc8w05iqc+Paf0=
|
||||||
git.milar.in/milarin/anilist v1.5.0/go.mod h1:8PTHXFMA45JpfRFIpcdrKwDHue8fbT/wwV1BuHFn6c0=
|
git.milar.in/milarin/anilist v1.5.0/go.mod h1:8PTHXFMA45JpfRFIpcdrKwDHue8fbT/wwV1BuHFn6c0=
|
||||||
git.milar.in/milarin/envvars/v2 v2.0.0 h1:DWRQCWaHqzDD8NGpSgv5tYLuF9A/dVFPAtTvz3oiIqE=
|
git.milar.in/milarin/envvars/v2 v2.0.0 h1:DWRQCWaHqzDD8NGpSgv5tYLuF9A/dVFPAtTvz3oiIqE=
|
||||||
@ -8,3 +10,7 @@ git.milar.in/milarin/slices v0.0.6 h1:AQoSarZ58WHYol9c6woWJSe8wFpPC2RC4cvIlZpfg9
|
|||||||
git.milar.in/milarin/slices v0.0.6/go.mod h1:NOr53AOeur/qscu/FBj3lsFR262PNYBccLYSTCAXRk4=
|
git.milar.in/milarin/slices v0.0.6/go.mod h1:NOr53AOeur/qscu/FBj3lsFR262PNYBccLYSTCAXRk4=
|
||||||
git.milar.in/nyaanime/model v0.0.0-20221008104642-466e1111ddea h1:iBwxI3vZ+Hix/5HHB3k9f9/R0nkwR0EvVJ3o5RJEKP4=
|
git.milar.in/nyaanime/model v0.0.0-20221008104642-466e1111ddea h1:iBwxI3vZ+Hix/5HHB3k9f9/R0nkwR0EvVJ3o5RJEKP4=
|
||||||
git.milar.in/nyaanime/model v0.0.0-20221008104642-466e1111ddea/go.mod h1:kPWLDvFrhc1Uf77gxsBOxNeJ5JTVF2HhVs1IdVcw0tg=
|
git.milar.in/nyaanime/model v0.0.0-20221008104642-466e1111ddea/go.mod h1:kPWLDvFrhc1Uf77gxsBOxNeJ5JTVF2HhVs1IdVcw0tg=
|
||||||
|
git.milar.in/nyaanime/parsers v0.0.0-20221207192513-e7bce7c418d8 h1:vb7jasvTdan0E8VY5snnRj1Xe+60NA7Lpn+GSYE6pW0=
|
||||||
|
git.milar.in/nyaanime/parsers v0.0.0-20221207192513-e7bce7c418d8/go.mod h1:GG4vtUIfxopZc/+Y8OAa//vWJw/m6aeoGN7fw6SLiEM=
|
||||||
|
gopkg.in/vansante/go-ffprobe.v2 v2.1.1 h1:DIh5fMn+tlBvG7pXyUZdemVmLdERnf2xX6XOFF+0BBU=
|
||||||
|
gopkg.in/vansante/go-ffprobe.v2 v2.1.1/go.mod h1:qF0AlAjk7Nqzqf3y333Ly+KxN3cKF2JqA3JT5ZheUGE=
|
||||||
|
Loading…
Reference in New Issue
Block a user