diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | src/file-hasher/m3u-walker.go | 84 | ||||
-rw-r--r-- | src/file-hasher/main.go | 6 |
3 files changed, 89 insertions, 2 deletions
@@ -31,6 +31,7 @@ EXECUTEABLE_HASHER := file-hasher LIBS := "code.helsinki.at/rhrd-go/rhimport" \ "code.helsinki.at/rhrd-go/rddb" \ + "github.com/ushis/m3u" \ "golang.org/x/crypto/blake2b" diff --git a/src/file-hasher/m3u-walker.go b/src/file-hasher/m3u-walker.go new file mode 100644 index 0000000..5ecee19 --- /dev/null +++ b/src/file-hasher/m3u-walker.go @@ -0,0 +1,84 @@ +// +// 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 ( + "log" + "os" + "path/filepath" + + "github.com/ushis/m3u" +) + +type M3u struct { + filename string + stdlog *log.Logger +} + +func (m *M3u) Walk(C chan<- string) (err error) { + defer close(C) + + m.stdlog.Printf("loading m3u-playlist: %s", m.filename) + + var file *os.File + if file, err = os.Open(m.filename); err != nil { + return + } + defer file.Close() + + var old_wd string + if old_wd, err = os.Getwd(); err != nil { + return + } + defer func(wd string) { + if err := os.Chdir(wd); err != nil { + m.stdlog.Printf("ERROR: changing back to original working directory: %v", err) + } + }(old_wd) + + if err = os.Chdir(filepath.Dir(m.filename)); err != nil { + m.stdlog.Printf("ERROR: changing to m3u directory: %v", err) + } + + var playlist m3u.Playlist + if playlist, err = m3u.Parse(file); err != nil { + return + } + + for _, track := range playlist { + if checkFileExt(track.Path) { + if absPath, err := filepath.Abs(track.Path); err != nil { + m.stdlog.Printf(" - skipping (%v): %s", err, filepath.Base(track.Path)) + } else { + C <- absPath + } + } else { + m.stdlog.Printf(" - skipping (unknown extension): %s", filepath.Base(track.Path)) + } + } + return nil +} + +func NewM3u(path string, stdlog *log.Logger) (m *M3u) { + m = &M3u{filename: path, stdlog: stdlog} + return +} diff --git a/src/file-hasher/main.go b/src/file-hasher/main.go index 051bb33..3e32b63 100644 --- a/src/file-hasher/main.go +++ b/src/file-hasher/main.go @@ -58,10 +58,12 @@ func main() { stdlog.Println("********************************************") h := NewHasher(4, stdlog) // TODO: make number of threads configurable for _, root := range directories { - d := NewDir(root, stdlog) + src := NewDir(root, stdlog) stdlog.Printf("*** hashing all the files in '%s'", root) stdlog.Println("") - if err := h.ComputeHashes(d); err != nil { + if err := h.ComputeHashes(src); err != nil { + stdlog.Println("") + stdlog.Printf("ERROR: %v", err) return } stdlog.Println("") |