summaryrefslogtreecommitdiff
path: root/src/pool-import
diff options
context:
space:
mode:
authorChristian Pointner <equinox@helsinki.at>2017-01-25 23:49:54 (GMT)
committerChristian Pointner <equinox@helsinki.at>2017-01-25 23:49:54 (GMT)
commit5624f3ac623ed2caa8c3c3933e66d63aafc09914 (patch)
tree7ee90a92df50e50a4d994001bb9d8751f1f88fa9 /src/pool-import
parent9d1b81e5997ee9ec8cc5bfd16f6c62a40044006a (diff)
file-hasher as seperate binary
Diffstat (limited to 'src/pool-import')
-rw-r--r--src/pool-import/dir-hasher.go148
-rw-r--r--src/pool-import/main.go20
2 files changed, 1 insertions, 167 deletions
diff --git a/src/pool-import/dir-hasher.go b/src/pool-import/dir-hasher.go
deleted file mode 100644
index aa204a0..0000000
--- a/src/pool-import/dir-hasher.go
+++ /dev/null
@@ -1,148 +0,0 @@
-//
-// pool-import
-//
-// Copyright (C) 2016 Christian Pointner <equinox@helsinki.at>
-//
-// This file is part of pool-import.
-//
-// pool-import is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// any later version.
-//
-// pool-import is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with pool-import. If not, see <http://www.gnu.org/licenses/>.
-//
-
-package main
-
-import (
- "encoding/base64"
- "io"
- "log"
- "os"
- "path/filepath"
- "strings"
- "sync"
-
- "golang.org/x/crypto/blake2b"
-)
-
-type FileMap map[string]string
-
-func (m FileMap) Merge(m2 FileMap) {
- for key, value := range m2 {
- m[key] = value
- }
-}
-
-type MusicDir struct {
- root string
- stdlog *log.Logger
- filesMtx sync.Mutex
- Files FileMap
-}
-
-func handleEntry(C chan<- string, path string, info os.FileInfo, err error, stdlog *log.Logger) error {
- if err != nil {
- return err
- }
- if info.IsDir() {
- stdlog.Printf("entering directory: %s", path)
- return nil
- }
- if !info.Mode().IsRegular() {
- stdlog.Printf(" - skipping (special file): %s", info.Name())
- return nil
- }
- switch strings.ToLower(filepath.Ext(path)) {
- case ".flac":
- fallthrough
- case ".ogg":
- fallthrough
- case ".wav":
- fallthrough
- case ".mp3":
- fallthrough
- case ".aac":
- fallthrough
- case ".mp4":
- fallthrough
- case ".m4a":
- C <- path
- default:
- stdlog.Printf(" - skipping (unknown extension): %s", info.Name())
- }
- return nil
-}
-
-func computeHash(path string) (string, error) {
- hash, err := blake2b.New256(nil)
- if err != nil {
- return "", err
- }
- file, err := os.Open(path)
- if err != nil {
- return "", err
- }
- defer file.Close()
- if _, err := io.Copy(hash, file); err != nil {
- return "", err
- }
- return base64.URLEncoding.EncodeToString(hash.Sum(nil)), nil
-}
-
-func (d *MusicDir) collectHashes(C <-chan string, numThreads int) (wg *sync.WaitGroup) {
- wg = &sync.WaitGroup{}
-
- for i := 0; i < numThreads; i++ {
- wg.Add(1)
- go func(num int) {
- defer wg.Done()
- for {
- file, ok := <-C
- if !ok {
- return
- }
- if hash, err := computeHash(file); err != nil {
- d.stdlog.Printf(" - skipping (%v): %s", err, filepath.Base(file))
- } else {
- d.stdlog.Printf(" - hashed: %s", filepath.Base(file))
- d.filesMtx.Lock()
- d.Files[hash] = file
- d.filesMtx.Unlock()
- }
- }
- }(i)
- }
- return
-}
-
-func (d *MusicDir) ComputeHashes() (err error) {
- C := make(chan string, 10)
-
- wg := d.collectHashes(C, 4) // TODO: make number of hashing threads configurable
-
- err = filepath.Walk(d.root, func(path string, info os.FileInfo, err error) error {
- return handleEntry(C, path, info, err, d.stdlog)
- })
- close(C)
-
- if err != nil {
- return
- }
-
- wg.Wait()
- return
-}
-
-func NewMusicDir(root string, stdlog *log.Logger) (dir *MusicDir) {
- dir = &MusicDir{root: root, stdlog: stdlog}
- dir.Files = make(map[string]string)
- return
-}
diff --git a/src/pool-import/main.go b/src/pool-import/main.go
index 10a59ec..0963ed0 100644
--- a/src/pool-import/main.go
+++ b/src/pool-import/main.go
@@ -96,25 +96,7 @@ func main() {
C <- syscall.SIGTERM
}()
- stdlog.Println("********************************************")
- allFiles := make(FileMap)
- for _, root := range directories {
- stdlog.Printf("*** hashing all the files in '%s'", root)
- stdlog.Println("")
- md := NewMusicDir(root, stdlog)
- if err := md.ComputeHashes(); err != nil {
- return
- }
- allFiles.Merge(md.Files)
- stdlog.Println("")
- stdlog.Println("******************************")
- }
- stdlog.Println("")
- for hash, file := range allFiles {
- stdlog.Printf("%s: %s", hash, file)
- }
- stdlog.Println("")
- stdlog.Println("********************************************")
+ // TODO: use file-hasher to get file hashes
}()
<-C