package files import ( "log" "path/filepath" "sort" "time" "github.com/gtsteffaniak/filebrowser/settings" ) // UpdateFileMetadata updates the FileInfo for the specified directory in the index. func (si *Index) UpdateMetadata(info *FileInfo) bool { si.mu.Lock() defer si.mu.Unlock() info.CacheTime = time.Now() si.Directories[info.Path] = info return true } // GetMetadataInfo retrieves the FileInfo from the specified directory in the index. func (si *Index) GetReducedMetadata(target string, isDir bool) (*FileInfo, bool) { si.mu.RLock() defer si.mu.RUnlock() checkDir := si.makeIndexPath(target) if !isDir { checkDir = si.makeIndexPath(filepath.Dir(target)) } dir, exists := si.Directories[checkDir] if !exists { return nil, false } if !isDir { if checkDir == "/" { checkDir = "" } baseName := filepath.Base(target) for _, item := range dir.Files { if item.Name == baseName { return &FileInfo{ Name: item.Name, Size: item.Size, ModTime: item.ModTime, Type: item.Type, Path: checkDir + "/" + item.Name, }, true } } return nil, false } cleanedItems := []ReducedItem{} for name, item := range dir.Dirs { cleanedItems = append(cleanedItems, ReducedItem{ Name: name, Size: item.Size, ModTime: item.ModTime, Type: "directory", }) } cleanedItems = append(cleanedItems, dir.Files...) sort.Slice(cleanedItems, func(i, j int) bool { return cleanedItems[i].Name < cleanedItems[j].Name }) dirname := filepath.Base(dir.Path) if dirname == "." { dirname = "/" } // construct file info return &FileInfo{ Name: dirname, Type: "directory", Items: cleanedItems, ModTime: dir.ModTime, Size: dir.Size, }, true } // GetMetadataInfo retrieves the FileInfo from the specified directory in the index. func (si *Index) GetMetadataInfo(target string, isDir bool) (*FileInfo, bool) { si.mu.RLock() defer si.mu.RUnlock() checkDir := si.makeIndexPath(target) if !isDir { checkDir = si.makeIndexPath(filepath.Dir(target)) } dir, exists := si.Directories[checkDir] return dir, exists } func (si *Index) RemoveDirectory(path string) { si.mu.Lock() defer si.mu.Unlock() delete(si.Directories, path) } func (si *Index) UpdateCount(given string) { si.mu.Lock() defer si.mu.Unlock() if given == "files" { si.NumFiles++ } else if given == "dirs" { si.NumDirs++ } else { log.Println("could not update unknown type: ", given) } } func (si *Index) resetCount() { si.mu.Lock() defer si.mu.Unlock() si.NumDirs = 0 si.NumFiles = 0 si.inProgress = true } func GetIndex(root string) *Index { for _, index := range indexes { if index.Root == root { return index } } if settings.Config.Server.Root != "" { rootPath = settings.Config.Server.Root } newIndex := &Index{ Root: rootPath, Directories: map[string]*FileInfo{}, NumDirs: 0, NumFiles: 0, inProgress: false, } newIndex.Directories["/"] = &FileInfo{} indexesMutex.Lock() indexes = append(indexes, newIndex) indexesMutex.Unlock() return newIndex }