summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile1
-rw-r--r--src/file-hasher/m3u-walker.go84
-rw-r--r--src/file-hasher/main.go6
3 files changed, 89 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index a6ea748..2a38381 100644
--- a/Makefile
+++ b/Makefile
@@ -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("")