@@ -2,6 +2,7 @@ package model
22
33import (
44 "github.com/Xhofe/alist/conf"
5+ "github.com/Xhofe/alist/utils"
56 log "github.com/sirupsen/logrus"
67 "strings"
78 "sync"
@@ -97,6 +98,7 @@ func RegisterAccount(account Account) {
9798 accountsMap [account .Name ] = account
9899}
99100
101+ // GetAccount 根据名称获取账号(不包含负载均衡账号) 用于定时任务更新账号
100102func GetAccount (name string ) (Account , bool ) {
101103 if len (accountsMap ) == 1 {
102104 for _ , v := range accountsMap {
@@ -107,25 +109,28 @@ func GetAccount(name string) (Account, bool) {
107109 return account , ok
108110}
109111
110- func GetAccountsByName (name string ) []Account {
111- accounts := make ([]Account , 0 )
112- if AccountsCount () == 1 {
113- account , _ := GetAccount ("" )
114- accounts = append (accounts , account )
115- return accounts
116- }
117- for _ , v := range accountsMap {
118- if v .Name == name || strings .HasPrefix (v .Name , name + balance ) {
119- accounts = append (accounts , v )
120- }
121- }
122- return accounts
123- }
112+ // GetAccountsByName 根据名称获取账号(包含负载均衡账号)
113+ //func GetAccountsByName(name string) []Account {
114+ // accounts := make([]Account, 0)
115+ // if AccountsCount() == 1 {
116+ // for _, v := range accountsMap {
117+ // accounts = append(accounts, v)
118+ // }
119+ // return accounts
120+ // }
121+ // for _, v := range accountsMap {
122+ // if v.Name == name || strings.HasPrefix(v.Name, name+balance) {
123+ // accounts = append(accounts, v)
124+ // }
125+ // }
126+ // return accounts
127+ //}
124128
125129var balanceMap sync.Map
126130
131+ // GetBalancedAccount 根据名称获取账号,负载均衡之后的
127132func GetBalancedAccount (name string ) (Account , bool ) {
128- accounts := GetAccountsByName (name )
133+ accounts := GetAccountsByPath (name )
129134 accountNum := len (accounts )
130135 switch accountNum {
131136 case 0 :
@@ -147,6 +152,7 @@ func GetBalancedAccount(name string) (Account, bool) {
147152 }
148153}
149154
155+ // GetAccountById 根据id获取账号,用于更新账号
150156func GetAccountById (id uint ) (* Account , error ) {
151157 var account Account
152158 account .ID = id
@@ -156,31 +162,100 @@ func GetAccountById(id uint) (*Account, error) {
156162 return & account , nil
157163}
158164
159- func GetAccountFiles () ([]File , error ) {
165+ // GetAccountFiles 获取账号虚拟文件(去除负载均衡)
166+ //func GetAccountFiles() ([]File, error) {
167+ // files := make([]File, 0)
168+ // var accounts []Account
169+ // if err := conf.DB.Order(columnName("index")).Find(&accounts).Error; err != nil {
170+ // return nil, err
171+ // }
172+ // for _, v := range accounts {
173+ // if strings.Contains(v.Name, balance) {
174+ // continue
175+ // }
176+ // files = append(files, File{
177+ // Name: v.Name,
178+ // Size: 0,
179+ // Driver: v.Type,
180+ // Type: conf.FOLDER,
181+ // UpdatedAt: v.UpdatedAt,
182+ // })
183+ // }
184+ // return files, nil
185+ //}
186+
187+ // GetAccounts 获取所有账号
188+ func GetAccounts () ([]Account , error ) {
189+ var accounts []Account
190+ if err := conf .DB .Order (columnName ("index" )).Find (& accounts ).Error ; err != nil {
191+ return nil , err
192+ }
193+ return accounts , nil
194+ }
195+
196+ // GetAccountsByPath 根据路径获取账号,最长匹配,未负载均衡
197+ // 如有账号: /a/b,/a/c,/a/d/e,/a/d/e.balance
198+ // GetAccountsByPath(/a/d/e/f) => /a/d/e,/a/d/e.balance
199+ func GetAccountsByPath (path string ) []Account {
200+ accounts := make ([]Account , 0 )
201+ curSlashCount := 0
202+ for _ , v := range accountsMap {
203+ name := utils .ParsePath (v .Name )
204+ bIndex := strings .LastIndex (name , balance )
205+ if bIndex != - 1 {
206+ name = v .Name [:bIndex ]
207+ }
208+ // 不是这个账号
209+ if path != name && ! strings .HasPrefix (path , name + "/" ) {
210+ continue
211+ }
212+ slashCount := strings .Count (name , "/" )
213+ // 不是最长匹配
214+ if slashCount < curSlashCount {
215+ continue
216+ }
217+ if slashCount > curSlashCount {
218+ accounts = accounts [:0 ]
219+ curSlashCount = slashCount
220+ }
221+ accounts = append (accounts , v )
222+ }
223+ return accounts
224+ }
225+
226+ // GetAccountFilesByPath 根据路径获取账号虚拟文件
227+ // 如有账号: /a/b,/a/c,/a/d/e,/a/b.balance1,/av
228+ // GetAccountFilesByPath(/a) => b,c,d
229+ func GetAccountFilesByPath (prefix string ) ([]File , error ) {
160230 files := make ([]File , 0 )
161231 var accounts []Account
162232 if err := conf .DB .Order (columnName ("index" )).Find (& accounts ).Error ; err != nil {
163233 return nil , err
164234 }
235+ prefix = utils .ParsePath (prefix )
236+ set := make (map [string ]interface {})
165237 for _ , v := range accounts {
238+ // 负载均衡账号
166239 if strings .Contains (v .Name , balance ) {
167240 continue
168241 }
242+ full := utils .ParsePath (v .Name )
243+ // 不是以prefix为前缀
244+ if ! strings .HasPrefix (full , prefix + "/" ) && prefix != "/" {
245+ continue
246+ }
247+ name := strings .Split (strings .TrimPrefix (strings .TrimPrefix (full , prefix ), "/" ), "/" )[0 ]
248+ if _ , ok := set [name ]; ok {
249+ continue
250+ }
169251 files = append (files , File {
170- Name : v . Name ,
252+ Name : name ,
171253 Size : 0 ,
172254 Driver : v .Type ,
173255 Type : conf .FOLDER ,
174256 UpdatedAt : v .UpdatedAt ,
175257 })
258+ set [name ] = nil
176259 }
177260 return files , nil
178261}
179-
180- func GetAccounts () ([]Account , error ) {
181- var accounts []Account
182- if err := conf .DB .Order (columnName ("index" )).Find (& accounts ).Error ; err != nil {
183- return nil , err
184- }
185- return accounts , nil
186- }
0 commit comments