Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/archive/iso9660/iso9660.go
1562 views
1
package iso9660
2
3
import (
4
"github.com/alist-org/alist/v3/internal/archive/tool"
5
"github.com/alist-org/alist/v3/internal/errs"
6
"github.com/alist-org/alist/v3/internal/model"
7
"github.com/alist-org/alist/v3/internal/stream"
8
"github.com/kdomanski/iso9660"
9
"io"
10
"os"
11
stdpath "path"
12
)
13
14
type ISO9660 struct {
15
}
16
17
func (ISO9660) AcceptedExtensions() []string {
18
return []string{".iso"}
19
}
20
21
func (ISO9660) AcceptedMultipartExtensions() map[string]tool.MultipartExtension {
22
return map[string]tool.MultipartExtension{}
23
}
24
25
func (ISO9660) GetMeta(ss []*stream.SeekableStream, args model.ArchiveArgs) (model.ArchiveMeta, error) {
26
return &model.ArchiveMetaInfo{
27
Comment: "",
28
Encrypted: false,
29
}, nil
30
}
31
32
func (ISO9660) List(ss []*stream.SeekableStream, args model.ArchiveInnerArgs) ([]model.Obj, error) {
33
img, err := getImage(ss[0])
34
if err != nil {
35
return nil, err
36
}
37
dir, err := getObj(img, args.InnerPath)
38
if err != nil {
39
return nil, err
40
}
41
if !dir.IsDir() {
42
return nil, errs.NotFolder
43
}
44
children, err := dir.GetChildren()
45
if err != nil {
46
return nil, err
47
}
48
ret := make([]model.Obj, 0, len(children))
49
for _, child := range children {
50
ret = append(ret, toModelObj(child))
51
}
52
return ret, nil
53
}
54
55
func (ISO9660) Extract(ss []*stream.SeekableStream, args model.ArchiveInnerArgs) (io.ReadCloser, int64, error) {
56
img, err := getImage(ss[0])
57
if err != nil {
58
return nil, 0, err
59
}
60
obj, err := getObj(img, args.InnerPath)
61
if err != nil {
62
return nil, 0, err
63
}
64
if obj.IsDir() {
65
return nil, 0, errs.NotFile
66
}
67
return io.NopCloser(obj.Reader()), obj.Size(), nil
68
}
69
70
func (ISO9660) Decompress(ss []*stream.SeekableStream, outputPath string, args model.ArchiveInnerArgs, up model.UpdateProgress) error {
71
img, err := getImage(ss[0])
72
if err != nil {
73
return err
74
}
75
obj, err := getObj(img, args.InnerPath)
76
if err != nil {
77
return err
78
}
79
if obj.IsDir() {
80
if args.InnerPath != "/" {
81
outputPath = stdpath.Join(outputPath, obj.Name())
82
if err = os.MkdirAll(outputPath, 0700); err != nil {
83
return err
84
}
85
}
86
var children []*iso9660.File
87
if children, err = obj.GetChildren(); err == nil {
88
err = decompressAll(children, outputPath)
89
}
90
} else {
91
err = decompress(obj, outputPath, up)
92
}
93
return err
94
}
95
96
var _ tool.Tool = (*ISO9660)(nil)
97
98
func init() {
99
tool.RegisterTool(ISO9660{})
100
}
101
102