Makes a loop to fetch everything
This commit is contained in:
123
main.go
123
main.go
@@ -1,14 +1,14 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/csv"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"path/filepath"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"launchpad.net/go-xdg/v0"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Execute executes the job
|
// Execute executes the job
|
||||||
@@ -17,74 +17,87 @@ func Execute() error {
|
|||||||
return fmt.Errorf("Missing mandatory .csv parameter")
|
return fmt.Errorf("Missing mandatory .csv parameter")
|
||||||
}
|
}
|
||||||
|
|
||||||
csvFile, err := os.Open(os.Args[1])
|
albums := make(chan *Album, 1000)
|
||||||
|
errors := make(chan error, 10)
|
||||||
|
parsed := make(chan bool, 1000)
|
||||||
|
cached := make(chan bool, 1000)
|
||||||
|
cacheBase, err := xdg.Cache.Ensure(filepath.Join("org.satellite.satbd", "test"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer csvFile.Close()
|
cacheBase = filepath.Dir(cacheBase)
|
||||||
|
c, err := NewAlbumDescriptionCache(cacheBase, 10, 10*time.Second)
|
||||||
csvReader := csv.NewReader(csvFile)
|
|
||||||
csvReader.Comma = ';'
|
|
||||||
_, err = csvReader.Read()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
start := time.Now()
|
||||||
errorFile, err := os.Create("errors.csv")
|
go func() {
|
||||||
if err != nil {
|
defer close(albums)
|
||||||
return err
|
csvFile, err := os.Open(os.Args[1])
|
||||||
}
|
|
||||||
|
|
||||||
waitUntil := time.Now()
|
|
||||||
for {
|
|
||||||
waitUntil = waitUntil.Add(2 * time.Second)
|
|
||||||
data, err := csvReader.Read()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
errors <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer csvFile.Close()
|
||||||
|
csvReader, err := NewAlbumCsvReader(csvFile)
|
||||||
|
if err != nil {
|
||||||
|
errors <- err
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
a := Album{}
|
for {
|
||||||
// ID
|
a, err := csvReader.Read()
|
||||||
ID, err := strconv.ParseInt(data[0], 0, 64)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
a.ID = AlbumID(ID)
|
|
||||||
// ISBN
|
|
||||||
a.ISBN = data[1]
|
|
||||||
// Series
|
|
||||||
a.Series = data[2]
|
|
||||||
//Num
|
|
||||||
if len(data[3]) == 0 {
|
|
||||||
a.Num = -1
|
|
||||||
} else {
|
|
||||||
Num, err := strconv.ParseInt(data[3], 0, 64)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
errors <- err
|
||||||
}
|
}
|
||||||
a.Num = int(Num)
|
parsed <- true
|
||||||
|
albums <- a
|
||||||
}
|
}
|
||||||
// NumA
|
log.Printf("Done parsing albums in %s", time.Since(start))
|
||||||
a.NumA = data[4]
|
}()
|
||||||
// Titre
|
|
||||||
a.Title = data[5]
|
|
||||||
|
|
||||||
URL := "http://www.bedetheque.com/" + a.GetBedethequeComURI()
|
go func() {
|
||||||
log.Printf("Contacting %s", URL)
|
defer close(errors)
|
||||||
resp, err := http.Get(URL)
|
for {
|
||||||
if err != nil {
|
a, ok := <-albums
|
||||||
return err
|
if ok == false {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
_, err := c.GetDescription(a.ID)
|
||||||
|
cached <- true
|
||||||
|
if err != nil {
|
||||||
|
errors <- err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
log.Printf("DONE caching in %s", time.Since(start))
|
||||||
|
}()
|
||||||
|
|
||||||
log.Printf("Got %d", resp.StatusCode)
|
pCount := 0
|
||||||
if resp.StatusCode >= 400 {
|
cCount := 0
|
||||||
fmt.Fprintf(errorFile, "%s;%d", strings.Join(data, ";"), resp.StatusCode)
|
errCount := 0
|
||||||
|
done := false
|
||||||
|
for done == false {
|
||||||
|
select {
|
||||||
|
case err, ok := <-errors:
|
||||||
|
if ok == false {
|
||||||
|
done = true
|
||||||
|
} else {
|
||||||
|
errCount++
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("\033[1A\033[KGot error: %s\n\n", err)
|
||||||
|
}
|
||||||
|
case <-parsed:
|
||||||
|
pCount++
|
||||||
|
case <-cached:
|
||||||
|
cCount++
|
||||||
}
|
}
|
||||||
|
fmt.Printf("\033[1A\033[K%d/%d (errors:%d)\n", cCount, pCount, errCount)
|
||||||
time.Sleep(waitUntil.Sub(time.Now()))
|
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
Reference in New Issue
Block a user