summaryrefslogtreecommitdiff
path: root/files
diff options
context:
space:
mode:
Diffstat (limited to 'files')
-rw-r--r--files/database.go172
-rw-r--r--files/operations.go182
-rw-r--r--files/types.go17
3 files changed, 0 insertions, 371 deletions
diff --git a/files/database.go b/files/database.go
deleted file mode 100644
index 33c2636..0000000
--- a/files/database.go
+++ /dev/null
@@ -1,172 +0,0 @@
-package files
-
-import (
- "context"
- "encoding/json"
- "errors"
- "log"
- "os"
- "strings"
-
- "github.com/rosedblabs/rosedb/v2"
- progressbar "github.com/schollz/progressbar/v3"
- "golang.org/x/sync/errgroup"
-)
-
-func decodeDbInfo(value []byte) (*FileInfo, error) {
- var info FileInfo
- if err := json.Unmarshal(value, &info); err != nil {
- return nil, err
- }
- return &info, nil
-}
-
-func getInfoFromDb(batch *rosedb.Batch, hashsum []byte) (*FileInfo, error) {
- exist, err := batch.Exist(hashsum)
- if err != nil {
- return nil, err
- }
-
- if !exist {
- return nil, rosedb.ErrKeyNotFound
- }
-
- value, err := batch.Get(hashsum)
- if err != nil {
- return nil, err
- }
-
- info, err := decodeDbInfo(value)
- if err != nil {
- return nil, err
- }
- return info, err
-}
-
-func (filedata *FileInfo) evaluateFile(batch *rosedb.Batch, hashsum []byte, encoder string) error {
- info, err := getInfoFromDb(batch, hashsum)
- if err != nil {
- return err
- }
-
- if info.Process {
- return ReencodeNeeded
- }
- if filedata.Encoder != encoder {
- return ReencodeNeeded
- }
- if info.AbsPath != filedata.AbsPath {
- return FileMoved
- }
- return ReencodeNotNeeded
-}
-
-func (filedata *FileInfo) updateFile(batch *rosedb.Batch, hashsum []byte) error {
- encoded, err := json.Marshal(filedata)
- if err != nil {
- return err
- }
- return batch.Put(hashsum, encoded)
-}
-
-func (filedata *FileInfo) IndexFile(ctx context.Context, hashsum []byte, batch *rosedb.Batch) error {
- encoder := ctx.Value("encoder").(string)
- counter := ctx.Value("counter").(*int64)
-
- err := filedata.evaluateFile(batch, hashsum, encoder)
-
- switch err {
- case FileMoved, ReencodeNotNeeded:
- filedata.Process = false
- case ReencodeNeeded, rosedb.ErrKeyNotFound:
- *counter += 1
- default:
- return err
- }
-
- if err := filedata.updateFile(batch, hashsum); err != nil {
- return err
- }
-
- return nil
-}
-
-func ReencodeFlacs(ctx context.Context) error {
- db := ctx.Value("database").(*rosedb.DB)
- bar := progressbar.NewOptions64(
- *ctx.Value("counter").(*int64),
- progressbar.OptionSetDescription("Reencoding..."),
- progressbar.OptionShowCount(),
- )
-
- batch := db.NewBatch(rosedb.DefaultBatchOptions)
-
- wg := new(errgroup.Group)
- wg.SetLimit(4)
-
- iterOpts := rosedb.DefaultIteratorOptions
- iterOpts.ContinueOnError = true
- iter := db.NewIterator(iterOpts)
-
- for iter.Rewind(); iter.Valid(); iter.Next() {
- select {
- case <-ctx.Done():
- wg.Wait()
- if err := batch.Commit(); err != nil {
- return err
- }
- bar.Exit()
- return nil
- default:
- item := iter.Item()
- key := item.Key
- info, err := decodeDbInfo(item.Value)
- if err != nil {
- log.Println(err.Error())
- }
-
- if !strings.Contains(info.AbsPath, ctx.Value("path").(string)) {
- continue
- } else if _, err := os.Stat(info.AbsPath); errors.Is(err, os.ErrNotExist) {
- if err := batch.Delete(key); err != nil {
- log.Println(err.Error())
- }
- } else if err != nil {
- log.Println(err.Error())
- } else {
- if info.Process {
- wg.Go(func() error {
- select {
- case <-ctx.Done():
- return nil
- default:
- if err := info.reencodeFile(ctx); err != nil {
- return err
- }
- if err := batch.Delete(key); err != nil {
- return err
- }
- key, err = getSha256(info.AbsPath)
- if err != nil {
- return err
- }
- if err := info.updateFile(batch, key); err != nil {
- return err
- }
-
- bar.Add64(1)
- return nil
- }
- })
- }
- }
- }
- }
-
- wg.Wait()
- if err := batch.Commit(); err != nil {
- return err
- }
- bar.Close()
- return nil
-}
diff --git a/files/operations.go b/files/operations.go
deleted file mode 100644
index 6f44900..0000000
--- a/files/operations.go
+++ /dev/null
@@ -1,182 +0,0 @@
-package files
-
-import (
- "context"
- "crypto/sha256"
- "fmt"
- "io"
- "io/fs"
- "log"
- "os"
- "os/exec"
- "path/filepath"
- "regexp"
- "strings"
- "time"
-
- "github.com/briandowns/spinner"
- "github.com/rosedblabs/rosedb/v2"
-)
-
-func (file *FileInfo) reencodeFile(ctx context.Context) error {
- select {
- case <-ctx.Done():
- return nil
- default:
- args := ctx.Value("flac").([]string)
- if args != nil {
- args = append(args, file.AbsPath)
- cmd := exec.Command("flac", args...)
- if err := cmd.Run(); err != nil {
- if !strings.Contains(err.Error(), "interrupt") {
- log.Println(err.Error())
- return err
- }
- }
- } else {
- cmd := exec.Command("flac", "-8f", "-j4", file.AbsPath)
- if err := cmd.Run(); err != nil {
- if !strings.Contains(err.Error(), "interrupt") {
- log.Println(err.Error())
- return err
- }
- }
- }
-
- file.Encoder = ctx.Value("encoder").(string)
- file.Process = false
- return nil
- }
-}
-
-func getEncoderVer(path string) (string, error) {
- out, err := exec.Command("metaflac", "--show-vendor-tag", path).Output()
- if err != nil {
- return "", err
- }
-
- r := regexp.MustCompile("libFLAC \\d\\.\\d\\.\\d")
- encoder := r.FindString(string(out))
- switch encoder {
- case "":
- return "", nil
- default:
- return strings.Split(encoder, " ")[1], nil
- }
-}
-
-func getInfoFromFile(path string) (*FileInfo, error) {
- var filedata FileInfo
-
- filedata.Process = true
-
- abspath, err := filepath.Abs(path)
- if err != nil {
- return nil, err
- }
-
- filedata.AbsPath = abspath
-
- encoder, err := getEncoderVer(path)
- if err != nil {
- return nil, err
- }
-
- filedata.Encoder = encoder
-
- return &filedata, nil
-}
-
-func getSha256(path string) ([]byte, error) {
- file, err := os.Open(path)
- if err != nil {
- return nil, err
- }
- defer file.Close()
-
- hash := sha256.New()
- if _, err := io.Copy(hash, file); err != nil {
- return nil, err
- }
- return hash.Sum(nil), nil
-}
-
-func updateSpinner(spin *spinner.Spinner, counter int64) {
- line := fmt.Sprintf(" Indexing flacs...\t %v", counter)
- spin.Suffix = line
-}
-
-func IndexFlacs(ctx context.Context) error {
- counter := ctx.Value("counter").(*int64)
- database := ctx.Value("database").(*rosedb.DB)
-
- batch := database.NewBatch(rosedb.DefaultBatchOptions)
-
- spin := spinner.New(spinner.CharSets[9], 100*time.Millisecond)
-
- updateSpinner(spin, *counter)
-
- spin.Start()
-
- /* wg := new(errgroup.Group)
- wg.SetLimit(100) */
-
- if err := filepath.WalkDir(ctx.Value("path").(string), func(path string, info fs.DirEntry, err error) error {
- select {
- case <-ctx.Done():
- spin.FinalMSG = "Stopping...\n"
- spin.Stop()
- return filepath.SkipAll
- default:
- if !info.IsDir() {
- if filepath.Ext(path) == ".flac" {
- /* wg.Go(func() error {
- select {
- case <-ctx.Done():
- return nil
- default:
- data, err := getInfoFromFile(path)
- if err != nil {
- return err
- }
-
- hashsum, err := getSha256(path)
- if err != nil {
- return err
- }
- updateSpinner(spin, *counter)
- return data.IndexFile(ctx, hashsum, batch)
- }
- }) */
-
- data, err := getInfoFromFile(path)
- if err != nil {
- return err
- }
-
- hashsum, err := getSha256(path)
- if err != nil {
- return err
- }
- updateSpinner(spin, *counter)
- return data.IndexFile(ctx, hashsum, batch)
- }
-
- }
- return nil
- }
-
- }); err != nil {
- return err
- }
-
- /* wg.Wait() */
-
- if err := batch.Commit(); err != nil {
- return err
- }
- spin.FinalMSG = fmt.Sprintf("Done indexing flacs: \t%v to process\n", *counter)
- spin.Stop()
-
- return nil
-}
diff --git a/files/types.go b/files/types.go
deleted file mode 100644
index 7bb2f42..0000000
--- a/files/types.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package files
-
-import (
- "errors"
-)
-
-var (
- ReencodeNotNeeded = errors.New("file is up to date")
- FileMoved = errors.New("file was moved")
- ReencodeNeeded = errors.New("file needs to be reencoded")
-)
-
-type FileInfo struct {
- AbsPath string `json:"abspath"`
- Encoder string `json:"encoder"`
- Process bool `json:"process"`
-}