mirror of https://github.com/Xhofe/alist
				
				
				
			
		
			
				
	
	
		
			168 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
package github_releases
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"fmt"
 | 
						|
	"net/http"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/alist-org/alist/v3/internal/driver"
 | 
						|
	"github.com/alist-org/alist/v3/internal/errs"
 | 
						|
	"github.com/alist-org/alist/v3/internal/model"
 | 
						|
	"github.com/alist-org/alist/v3/pkg/utils"
 | 
						|
)
 | 
						|
 | 
						|
type GithubReleases struct {
 | 
						|
	model.Storage
 | 
						|
	Addition
 | 
						|
 | 
						|
	points []MountPoint
 | 
						|
}
 | 
						|
 | 
						|
func (d *GithubReleases) Config() driver.Config {
 | 
						|
	return config
 | 
						|
}
 | 
						|
 | 
						|
func (d *GithubReleases) GetAddition() driver.Additional {
 | 
						|
	return &d.Addition
 | 
						|
}
 | 
						|
 | 
						|
func (d *GithubReleases) Init(ctx context.Context) error {
 | 
						|
	d.ParseRepos(d.Addition.RepoStructure)
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (d *GithubReleases) Drop(ctx context.Context) error {
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
 | 
						|
	files := make([]File, 0)
 | 
						|
	path := fmt.Sprintf("/%s", strings.Trim(dir.GetPath(), "/"))
 | 
						|
 | 
						|
	for i := range d.points {
 | 
						|
		point := &d.points[i]
 | 
						|
 | 
						|
		if !d.Addition.ShowAllVersion { // latest
 | 
						|
			point.RequestRelease(d.GetRequest, args.Refresh)
 | 
						|
 | 
						|
			if point.Point == path { // 与仓库路径相同
 | 
						|
				files = append(files, point.GetLatestRelease()...)
 | 
						|
				if d.Addition.ShowReadme {
 | 
						|
					files = append(files, point.GetOtherFile(d.GetRequest, args.Refresh)...)
 | 
						|
				}
 | 
						|
			} else if strings.HasPrefix(point.Point, path) { // 仓库目录的父目录
 | 
						|
				nextDir := GetNextDir(point.Point, path)
 | 
						|
				if nextDir == "" {
 | 
						|
					continue
 | 
						|
				}
 | 
						|
 | 
						|
				hasSameDir := false
 | 
						|
				for index := range files {
 | 
						|
					if files[index].GetName() == nextDir {
 | 
						|
						hasSameDir = true
 | 
						|
						files[index].Size += point.GetLatestSize()
 | 
						|
						break
 | 
						|
					}
 | 
						|
				}
 | 
						|
				if !hasSameDir {
 | 
						|
					files = append(files, File{
 | 
						|
						Path:     path + "/" + nextDir,
 | 
						|
						FileName: nextDir,
 | 
						|
						Size:     point.GetLatestSize(),
 | 
						|
						UpdateAt: point.Release.PublishedAt,
 | 
						|
						CreateAt: point.Release.CreatedAt,
 | 
						|
						Type:     "dir",
 | 
						|
						Url:      "",
 | 
						|
					})
 | 
						|
				}
 | 
						|
			}
 | 
						|
		} else { // all version
 | 
						|
			point.RequestReleases(d.GetRequest, args.Refresh)
 | 
						|
 | 
						|
			if point.Point == path { // 与仓库路径相同
 | 
						|
				files = append(files, point.GetAllVersion()...)
 | 
						|
				if d.Addition.ShowReadme {
 | 
						|
					files = append(files, point.GetOtherFile(d.GetRequest, args.Refresh)...)
 | 
						|
				}
 | 
						|
			} else if strings.HasPrefix(point.Point, path) { // 仓库目录的父目录
 | 
						|
				nextDir := GetNextDir(point.Point, path)
 | 
						|
				if nextDir == "" {
 | 
						|
					continue
 | 
						|
				}
 | 
						|
 | 
						|
				hasSameDir := false
 | 
						|
				for index := range files {
 | 
						|
					if files[index].GetName() == nextDir {
 | 
						|
						hasSameDir = true
 | 
						|
						files[index].Size += point.GetAllVersionSize()
 | 
						|
						break
 | 
						|
					}
 | 
						|
				}
 | 
						|
				if !hasSameDir {
 | 
						|
					files = append(files, File{
 | 
						|
						FileName: nextDir,
 | 
						|
						Path:     path + "/" + nextDir,
 | 
						|
						Size:     point.GetAllVersionSize(),
 | 
						|
						UpdateAt: (*point.Releases)[0].PublishedAt,
 | 
						|
						CreateAt: (*point.Releases)[0].CreatedAt,
 | 
						|
						Type:     "dir",
 | 
						|
						Url:      "",
 | 
						|
					})
 | 
						|
				}
 | 
						|
			} else if strings.HasPrefix(path, point.Point) { // 仓库目录的子目录
 | 
						|
				tagName := GetNextDir(path, point.Point)
 | 
						|
				if tagName == "" {
 | 
						|
					continue
 | 
						|
				}
 | 
						|
 | 
						|
				files = append(files, point.GetReleaseByTagName(tagName)...)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return utils.SliceConvert(files, func(src File) (model.Obj, error) {
 | 
						|
		return src, nil
 | 
						|
	})
 | 
						|
}
 | 
						|
 | 
						|
func (d *GithubReleases) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
 | 
						|
	url := file.GetID()
 | 
						|
	gh_proxy := strings.TrimSpace(d.Addition.GitHubProxy)
 | 
						|
 | 
						|
	if gh_proxy != "" {
 | 
						|
		url = strings.Replace(url, "https://github.com", gh_proxy, 1)
 | 
						|
	}
 | 
						|
 | 
						|
	link := model.Link{
 | 
						|
		URL:    url,
 | 
						|
		Header: http.Header{},
 | 
						|
	}
 | 
						|
	return &link, nil
 | 
						|
}
 | 
						|
 | 
						|
func (d *GithubReleases) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) (model.Obj, error) {
 | 
						|
	// TODO create folder, optional
 | 
						|
	return nil, errs.NotImplement
 | 
						|
}
 | 
						|
 | 
						|
func (d *GithubReleases) Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error) {
 | 
						|
	// TODO move obj, optional
 | 
						|
	return nil, errs.NotImplement
 | 
						|
}
 | 
						|
 | 
						|
func (d *GithubReleases) Rename(ctx context.Context, srcObj model.Obj, newName string) (model.Obj, error) {
 | 
						|
	// TODO rename obj, optional
 | 
						|
	return nil, errs.NotImplement
 | 
						|
}
 | 
						|
 | 
						|
func (d *GithubReleases) Copy(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error) {
 | 
						|
	// TODO copy obj, optional
 | 
						|
	return nil, errs.NotImplement
 | 
						|
}
 | 
						|
 | 
						|
func (d *GithubReleases) Remove(ctx context.Context, obj model.Obj) error {
 | 
						|
	// TODO remove obj, optional
 | 
						|
	return errs.NotImplement
 | 
						|
}
 |