MCPcopy Index your code
hub / github.com/FloatTech/AnimeAPI / Roll

Method Roll

setu/pool.go:64–124  ·  view source on GitHub ↗

Roll 从缓存池随机挑一张

(typ string)

Source from the content-addressed store, hash-verified

62
63// Roll 从缓存池随机挑一张
64func (p *Pool) Roll(typ string) (string, error) {
65 d := p.folder + typ
66 if p.rolimg == nil {
67 return p.rollLocal(d)
68 }
69 var err error
70 ch := make(chan string, 1)
71 go func() {
72 s := ""
73 s, err = p.rolimg(typ)
74 ch <- s
75 close(ch)
76 }()
77 select {
78 case s := <-ch:
79 if err != nil {
80 logrus.Warnln("[setu.pool] roll img err:", err)
81 return p.rollLocal(d)
82 }
83 ch := make(chan []byte, 1)
84 go func() {
85 var data []byte
86 data, err = p.getdat(s)
87 ch <- data
88 close(ch)
89 }()
90 select {
91 case data := <-ch:
92 if err != nil {
93 logrus.Warnln("[setu.pool] get img err:", err)
94 return p.rollLocal(d)
95 }
96 im, ext, err := image.Decode(bytes.NewReader(data))
97 if err != nil {
98 logrus.Warnln("[setu.pool] decode img err:", err)
99 return p.rollLocal(d)
100 }
101 dh, err := goimagehash.DifferenceHash(im)
102 if err != nil {
103 logrus.Warnln("[setu.pool] hash img err:", err)
104 return p.rollLocal(d)
105 }
106 var buf [8]byte
107 binary.BigEndian.PutUint64(buf[:], dh.GetHash())
108 es := base14.EncodeToString(buf[:])
109 if len(es) != 6*3 {
110 return p.rollLocal(d)
111 }
112 es = es[:5*3] + "." + ext
113 s = d + "/" + es
114 if file.IsExist(s) {
115 return s, nil
116 }
117 return s, os.WriteFile(s, data, 0644)
118 case <-time.After(p.timeout):
119 return p.rollLocal(d)
120 }
121 case <-time.After(p.timeout):

Callers 1

TestPoolFunction · 0.95

Calls 1

rollLocalMethod · 0.95

Tested by 1

TestPoolFunction · 0.76