diff --git a/files/file.go b/files/file.go index 51ed7a72..e0fdb162 100644 --- a/files/file.go +++ b/files/file.go @@ -29,20 +29,21 @@ const PermDir = 0755 // FileInfo describes a file. type FileInfo struct { *Listing - Fs afero.Fs `json:"-"` - Path string `json:"path"` - Name string `json:"name"` - Size int64 `json:"size"` - Extension string `json:"extension"` - ModTime time.Time `json:"modified"` - Mode os.FileMode `json:"mode"` - IsDir bool `json:"isDir"` - IsSymlink bool `json:"isSymlink"` - Type string `json:"type"` - Subtitles []string `json:"subtitles,omitempty"` - Content string `json:"content,omitempty"` - Checksums map[string]string `json:"checksums,omitempty"` - Token string `json:"token,omitempty"` + Fs afero.Fs `json:"-"` + Path string `json:"path"` + Name string `json:"name"` + Size int64 `json:"size"` + Extension string `json:"extension"` + ModTime time.Time `json:"modified"` + Mode os.FileMode `json:"mode"` + IsDir bool `json:"isDir"` + IsSymlink bool `json:"isSymlink"` + Type string `json:"type"` + Subtitles []string `json:"subtitles,omitempty"` + Content string `json:"content,omitempty"` + Checksums map[string]string `json:"checksums,omitempty"` + Token string `json:"token,omitempty"` + currentDir []os.FileInfo `json:"-"` } // FileOptions are the options when getting a file info. @@ -294,13 +295,21 @@ func (i *FileInfo) detectSubtitles() { // detect multiple languages. Base*.vtt // TODO: give subtitles descriptive names (lang) and track attributes parentDir := strings.TrimRight(i.Path, i.Name) - dir, err := afero.ReadDir(i.Fs, parentDir) - if err == nil { - base := strings.TrimSuffix(i.Name, ext) - for _, f := range dir { - if !f.IsDir() && strings.HasPrefix(f.Name(), base) && strings.HasSuffix(f.Name(), ".vtt") { - i.Subtitles = append(i.Subtitles, path.Join(parentDir, f.Name())) - } + var dir []os.FileInfo + if len(i.currentDir) > 0 { + dir = i.currentDir + } else { + var err error + dir, err = afero.ReadDir(i.Fs, parentDir) + if err != nil { + return + } + } + + base := strings.TrimSuffix(i.Name, ext) + for _, f := range dir { + if !f.IsDir() && strings.HasPrefix(f.Name(), base) && strings.HasSuffix(f.Name(), ".vtt") { + i.Subtitles = append(i.Subtitles, path.Join(parentDir, f.Name())) } } } @@ -340,15 +349,16 @@ func (i *FileInfo) readListing(checker rules.Checker, readHeader bool) error { } file := &FileInfo{ - Fs: i.Fs, - Name: name, - Size: f.Size(), - ModTime: f.ModTime(), - Mode: f.Mode(), - IsDir: f.IsDir(), - IsSymlink: isSymlink, - Extension: filepath.Ext(name), - Path: fPath, + Fs: i.Fs, + Name: name, + Size: f.Size(), + ModTime: f.ModTime(), + Mode: f.Mode(), + IsDir: f.IsDir(), + IsSymlink: isSymlink, + Extension: filepath.Ext(name), + Path: fPath, + currentDir: dir, } if file.IsDir {