diff --git a/drivers/all.go b/drivers/all.go index cd7aa7b1..2eb17b9e 100644 --- a/drivers/all.go +++ b/drivers/all.go @@ -63,7 +63,6 @@ import ( _ "github.com/OpenListTeam/OpenList/v4/drivers/thunder" _ "github.com/OpenListTeam/OpenList/v4/drivers/thunder_browser" _ "github.com/OpenListTeam/OpenList/v4/drivers/thunderx" - _ "github.com/OpenListTeam/OpenList/v4/drivers/trainbit" _ "github.com/OpenListTeam/OpenList/v4/drivers/url_tree" _ "github.com/OpenListTeam/OpenList/v4/drivers/uss" _ "github.com/OpenListTeam/OpenList/v4/drivers/virtual" diff --git a/drivers/trainbit/driver.go b/drivers/trainbit/driver.go deleted file mode 100644 index eb86b6e9..00000000 --- a/drivers/trainbit/driver.go +++ /dev/null @@ -1,137 +0,0 @@ -package trainbit - -import ( - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strings" - - "github.com/OpenListTeam/OpenList/v4/drivers/base" - "github.com/OpenListTeam/OpenList/v4/internal/driver" - "github.com/OpenListTeam/OpenList/v4/internal/errs" - "github.com/OpenListTeam/OpenList/v4/internal/model" -) - -type Trainbit struct { - model.Storage - Addition -} - -var apiExpiredate, guid string - -func (d *Trainbit) Config() driver.Config { - return config -} - -func (d *Trainbit) GetAddition() driver.Additional { - return &d.Addition -} - -func (d *Trainbit) Init(ctx context.Context) error { - base.HttpClient.CheckRedirect = func(req *http.Request, via []*http.Request) error { - return http.ErrUseLastResponse - } - var err error - apiExpiredate, guid, err = getToken(d.ApiKey, d.AUSHELLPORTAL) - if err != nil { - return err - } - return nil -} - -func (d *Trainbit) Drop(ctx context.Context) error { - return nil -} - -func (d *Trainbit) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) { - form := make(url.Values) - form.Set("parentid", strings.Split(dir.GetID(), "_")[0]) - res, err := postForm("https://trainbit.com/lib/api/v1/listoffiles", form, apiExpiredate, d.ApiKey, d.AUSHELLPORTAL) - if err != nil { - return nil, err - } - data, err := io.ReadAll(res.Body) - if err != nil { - return nil, err - } - var jsonData any - err = json.Unmarshal(data, &jsonData) - if err != nil { - return nil, err - } - object, err := parseRawFileObject(jsonData.(map[string]any)["items"].([]any)) - if err != nil { - return nil, err - } - return object, nil -} - -func (d *Trainbit) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) { - res, err := get(fmt.Sprintf("https://trainbit.com/files/%s/", strings.Split(file.GetID(), "_")[0]), d.ApiKey, d.AUSHELLPORTAL) - if err != nil { - return nil, err - } - return &model.Link{ - URL: res.Header.Get("Location"), - }, nil -} - -func (d *Trainbit) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error { - form := make(url.Values) - form.Set("name", local2provider(dirName, true)) - form.Set("parentid", strings.Split(parentDir.GetID(), "_")[0]) - _, err := postForm("https://trainbit.com/lib/api/v1/createfolder", form, apiExpiredate, d.ApiKey, d.AUSHELLPORTAL) - return err -} - -func (d *Trainbit) Move(ctx context.Context, srcObj, dstDir model.Obj) error { - form := make(url.Values) - form.Set("sourceid", strings.Split(srcObj.GetID(), "_")[0]) - form.Set("destinationid", strings.Split(dstDir.GetID(), "_")[0]) - _, err := postForm("https://trainbit.com/lib/api/v1/move", form, apiExpiredate, d.ApiKey, d.AUSHELLPORTAL) - return err -} - -func (d *Trainbit) Rename(ctx context.Context, srcObj model.Obj, newName string) error { - form := make(url.Values) - form.Set("id", strings.Split(srcObj.GetID(), "_")[0]) - form.Set("name", local2provider(newName, srcObj.IsDir())) - _, err := postForm("https://trainbit.com/lib/api/v1/edit", form, apiExpiredate, d.ApiKey, d.AUSHELLPORTAL) - return err -} - -func (d *Trainbit) Copy(ctx context.Context, srcObj, dstDir model.Obj) error { - return errs.NotImplement -} - -func (d *Trainbit) Remove(ctx context.Context, obj model.Obj) error { - form := make(url.Values) - form.Set("id", strings.Split(obj.GetID(), "_")[0]) - _, err := postForm("https://trainbit.com/lib/api/v1/delete", form, apiExpiredate, d.ApiKey, d.AUSHELLPORTAL) - return err -} - -func (d *Trainbit) Put(ctx context.Context, dstDir model.Obj, s model.FileStreamer, up driver.UpdateProgress) error { - endpoint, _ := url.Parse("https://tb28.trainbit.com/api/upload/send_raw/") - query := &url.Values{} - query.Add("q", strings.Split(dstDir.GetID(), "_")[1]) - query.Add("guid", guid) - query.Add("name", url.QueryEscape(local2provider(s.GetName(), false)+".")) - endpoint.RawQuery = query.Encode() - progressReader := driver.NewLimitedUploadStream(ctx, &driver.ReaderUpdatingProgress{ - Reader: s, - UpdateProgress: up, - }) - req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint.String(), progressReader) - if err != nil { - return err - } - req.Header.Set("Content-Type", "text/json; charset=UTF-8") - _, err = base.HttpClient.Do(req) - return err -} - -var _ driver.Driver = (*Trainbit)(nil) diff --git a/drivers/trainbit/meta.go b/drivers/trainbit/meta.go deleted file mode 100644 index d64a3de3..00000000 --- a/drivers/trainbit/meta.go +++ /dev/null @@ -1,29 +0,0 @@ -package trainbit - -import ( - "github.com/OpenListTeam/OpenList/v4/internal/driver" - "github.com/OpenListTeam/OpenList/v4/internal/op" -) - -type Addition struct { - driver.RootID - AUSHELLPORTAL string `json:"AUSHELLPORTAL" required:"true"` - ApiKey string `json:"apikey" required:"true"` -} - -var config = driver.Config{ - Name: "Trainbit", - LocalSort: false, - OnlyLocal: false, - OnlyProxy: false, - NoCache: false, - NoUpload: false, - NeedMs: false, - DefaultRoot: "0_000", -} - -func init() { - op.RegisterDriver(func() driver.Driver { - return &Trainbit{} - }) -} diff --git a/drivers/trainbit/types.go b/drivers/trainbit/types.go deleted file mode 100644 index 4de1a0ab..00000000 --- a/drivers/trainbit/types.go +++ /dev/null @@ -1 +0,0 @@ -package trainbit \ No newline at end of file diff --git a/drivers/trainbit/util.go b/drivers/trainbit/util.go deleted file mode 100644 index fae492df..00000000 --- a/drivers/trainbit/util.go +++ /dev/null @@ -1,124 +0,0 @@ -package trainbit - -import ( - "html" - "io" - "net/http" - "net/url" - "regexp" - "strings" - "time" - - "github.com/OpenListTeam/OpenList/v4/drivers/base" - "github.com/OpenListTeam/OpenList/v4/internal/model" -) - -func get(url string, apiKey string, AUSHELLPORTAL string) (*http.Response, error) { - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - return nil, err - } - req.AddCookie(&http.Cookie{ - Name: ".AUSHELLPORTAL", - Value: AUSHELLPORTAL, - MaxAge: 2 * 60, - }) - req.AddCookie(&http.Cookie{ - Name: "retkeyapi", - Value: apiKey, - MaxAge: 2 * 60, - }) - res, err := base.HttpClient.Do(req) - return res, err -} - -func postForm(endpoint string, data url.Values, apiExpiredate string, apiKey string, AUSHELLPORTAL string) (*http.Response, error) { - extData := make(url.Values) - for key, value := range data { - extData[key] = make([]string, len(value)) - copy(extData[key], value) - } - extData.Set("apikey", apiKey) - extData.Set("expiredate", apiExpiredate) - req, err := http.NewRequest(http.MethodPost, endpoint, strings.NewReader(extData.Encode())) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - req.AddCookie(&http.Cookie{ - Name: ".AUSHELLPORTAL", - Value: AUSHELLPORTAL, - MaxAge: 2 * 60, - }) - req.AddCookie(&http.Cookie{ - Name: "retkeyapi", - Value: apiKey, - MaxAge: 2 * 60, - }) - res, err := base.HttpClient.Do(req) - return res, err -} - -func getToken(apiKey string, AUSHELLPORTAL string) (string, string, error) { - res, err := get("https://trainbit.com/files/", apiKey, AUSHELLPORTAL) - if err != nil { - return "", "", err - } - data, err := io.ReadAll(res.Body) - if err != nil { - return "", "", err - } - text := string(data) - apiExpiredateReg := regexp.MustCompile(`core.api.expiredate = '([^']*)';`) - result := apiExpiredateReg.FindAllStringSubmatch(text, -1) - apiExpiredate := result[0][1] - guidReg := regexp.MustCompile(`app.vars.upload.guid = '([^']*)';`) - result = guidReg.FindAllStringSubmatch(text, -1) - guid := result[0][1] - return apiExpiredate, guid, nil -} - -func local2provider(filename string, isFolder bool) string { - if isFolder { - return filename - } - return filename + ".delete_suffix" -} - -func provider2local(filename string) string { - filename = html.UnescapeString(filename) - index := strings.LastIndex(filename, ".delete_suffix") - if index != -1 { - filename = filename[:index] - } - return filename -} - -func parseRawFileObject(rawObject []any) ([]model.Obj, error) { - objectList := make([]model.Obj, 0) - for _, each := range rawObject { - object := each.(map[string]any) - if object["id"].(string) == "0" { - continue - } - isFolder := int64(object["ty"].(float64)) == 1 - var name string - if object["ext"].(string) != "" { - name = strings.Join([]string{object["name"].(string), object["ext"].(string)}, ".") - } else { - name = object["name"].(string) - } - modified, err := time.Parse("2006/01/02 15:04:05", object["modified"].(string)) - if err != nil { - return nil, err - } - objectList = append(objectList, model.Obj(&model.Object{ - ID: strings.Join([]string{object["id"].(string), strings.Split(object["uploadurl"].(string), "=")[1]}, "_"), - Name: provider2local(name), - Size: int64(object["byte"].(float64)), - Modified: modified.Add(-210 * time.Minute), - IsFolder: isFolder, - })) - } - return objectList, nil -} diff --git a/go.mod b/go.mod index 358e6059..7bef5bf1 100644 --- a/go.mod +++ b/go.mod @@ -117,7 +117,6 @@ require ( github.com/nwaples/rardecode/v2 v2.1.0 github.com/sorairolake/lzip-go v0.3.5 // indirect github.com/taruti/bytepool v0.0.0-20160310082835-5e3a9ea56543 // indirect - github.com/therootcompany/xz v1.0.1 // indirect github.com/ulikunitz/xz v0.5.12 // indirect github.com/yuin/goldmark v1.7.8 go4.org v0.0.0-20230225012048-214862532bf5 diff --git a/go.sum b/go.sum index 67cd4cb4..45c6dd9b 100644 --- a/go.sum +++ b/go.sum @@ -69,8 +69,6 @@ github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9 github.com/andreburgaud/crypt2go v1.8.0 h1:J73vGTb1P6XL69SSuumbKs0DWn3ulbl9L92ZXBjw6pc= github.com/andreburgaud/crypt2go v1.8.0/go.mod h1:L5nfShQ91W78hOWhUH2tlGRPO+POAPJAF5fKOLB9SXg= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= -github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= github.com/andybalholm/brotli v1.1.2-0.20250424173009-453214e765f3 h1:8PmGpDEZl9yDpcdEr6Odf23feCxK3LNUNMxjXg41pZQ= github.com/andybalholm/brotli v1.1.2-0.20250424173009-453214e765f3/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= @@ -158,8 +156,6 @@ github.com/blevesearch/zapx/v16 v16.1.5 h1:b0sMcarqNFxuXvjoXsF8WtwVahnxyhEvBSRJi github.com/blevesearch/zapx/v16 v16.1.5/go.mod h1:J4mSF39w1QELc11EWRSBFkPeZuO7r/NPKkHzDCoiaI8= github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU= github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs= -github.com/bodgit/sevenzip v1.6.0 h1:a4R0Wu6/P1o1pP/3VV++aEOcyeBxeO/xE2Y9NSTrr6A= -github.com/bodgit/sevenzip v1.6.0/go.mod h1:zOBh9nJUof7tcrlqJFv1koWRrhz3LbDbUNngkuZxLMc= github.com/bodgit/sevenzip v1.6.1 h1:kikg2pUMYC9ljU7W9SaqHXhym5HyKm8/M/jd31fYan4= github.com/bodgit/sevenzip v1.6.1/go.mod h1:GVoYQbEVbOGT8n2pfqCIMRUaRjQ8F9oSqoBEqZh5fQ8= github.com/bodgit/windows v1.0.1 h1:tF7K6KOluPYygXa3Z2594zxlkbKPAOvqr97etrGNIz4= @@ -470,8 +466,6 @@ github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/meilisearch/meilisearch-go v0.27.2 h1:3G21dJ5i208shnLPDsIEZ0L0Geg/5oeXABFV7nlK94k= github.com/meilisearch/meilisearch-go v0.27.2/go.mod h1:SxuSqDcPBIykjWz1PX+KzsYzArNLSCadQodWs8extS0= -github.com/mholt/archives v0.1.0 h1:FacgJyrjiuyomTuNA92X5GyRBRZjE43Y/lrzKIlF35Q= -github.com/mholt/archives v0.1.0/go.mod h1:j/Ire/jm42GN7h90F5kzj6hf6ZFzEH66de+hmjEKu+I= github.com/mholt/archives v0.1.3 h1:aEAaOtNra78G+TvV5ohmXrJOAzf++dIlYeDW3N9q458= github.com/mholt/archives v0.1.3/go.mod h1:LUCGp++/IbV/I0Xq4SzcIR6uwgeh2yjnQWamjRQfLTU= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= @@ -525,8 +519,6 @@ github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4 github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= github.com/ncw/swift/v2 v2.0.3 h1:8R9dmgFIWs+RiVlisCEfiQiik1hjuR0JnOkLxaP9ihg= github.com/ncw/swift/v2 v2.0.3/go.mod h1:cbAO76/ZwcFrFlHdXPjaqWZ9R7Hdar7HpjRXBfbjigk= -github.com/nwaples/rardecode/v2 v2.0.0-beta.4.0.20241112120701-034e449c6e78 h1:MYzLheyVx1tJVDqfu3YnN4jtnyALNzLvwl+f58TcvQY= -github.com/nwaples/rardecode/v2 v2.0.0-beta.4.0.20241112120701-034e449c6e78/go.mod h1:yntwv/HfMc/Hbvtq9I19D1n58te3h6KsqCf3GxyfBGY= github.com/nwaples/rardecode/v2 v2.1.0 h1:JQl9ZoBPDy+nIZGb1mx8+anfHp/LV3NE2MjMiv0ct/U= github.com/nwaples/rardecode/v2 v2.1.0/go.mod h1:7uz379lSxPe6j9nvzxUZ+n7mnJNgjsRNb6IbvGVHRmw= github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= @@ -536,8 +528,6 @@ github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAq github.com/panjf2000/ants/v2 v2.4.2/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= @@ -614,6 +604,7 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -632,8 +623,6 @@ github.com/t3rm1n4l/go-mega v0.0.0-20241213151442-a19cff0ec7b5 h1:Sa+sR8aaAMFwxh github.com/t3rm1n4l/go-mega v0.0.0-20241213151442-a19cff0ec7b5/go.mod h1:UdZiFUFu6e2WjjtjxivwXWcwc1N/8zgbkBR9QNucUOY= github.com/taruti/bytepool v0.0.0-20160310082835-5e3a9ea56543 h1:6Y51mutOvRGRx6KqyMNo//xk8B8o6zW9/RVmy1VamOs= github.com/taruti/bytepool v0.0.0-20160310082835-5e3a9ea56543/go.mod h1:jpwqYA8KUVEvSUJHkCXsnBRJCSKP1BMa81QZ6kvRpow= -github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw= -github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0=