All checks were successful
		
		
	
	ci/woodpecker/push/woodpecker Pipeline was successful
				
			
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package importer
 | |
| 
 | |
| import (
 | |
| 	"encoding/csv"
 | |
| 	"io"
 | |
| 	"strings"
 | |
| 
 | |
| 	"git.yetaga.in/alazyreader/library/media"
 | |
| )
 | |
| 
 | |
| func CSVToBooks(r io.Reader) ([]media.Book, error) {
 | |
| 	reader := csv.NewReader(r)
 | |
| 	header, err := reader.Read()
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	hmap := parseHeader(header)
 | |
| 	books := []media.Book{}
 | |
| 
 | |
| 	for {
 | |
| 		row, err := reader.Read()
 | |
| 		if err == io.EOF {
 | |
| 			break
 | |
| 		}
 | |
| 		if err != nil {
 | |
| 			return books, err
 | |
| 		}
 | |
| 		b := media.Book{
 | |
| 			Title:       row[hmap["title"]],
 | |
| 			Authors:     parseAuthors(row[hmap["author"]]),
 | |
| 			SortAuthor:  row[hmap["authorlast"]],
 | |
| 			ISBN10:      row[hmap["isbn-10"]],
 | |
| 			ISBN13:      row[hmap["isbn-13"]],
 | |
| 			Format:      row[hmap["format"]],
 | |
| 			Genre:       row[hmap["genre"]],
 | |
| 			Publisher:   row[hmap["publisher"]],
 | |
| 			Series:      row[hmap["series"]],
 | |
| 			Volume:      row[hmap["volume"]],
 | |
| 			Year:        row[hmap["year"]],
 | |
| 			Signed:      row[hmap["signed"]] == "yes", // convert from known string to bool
 | |
| 			Description: row[hmap["description"]],
 | |
| 			Notes:       row[hmap["notes"]],
 | |
| 			CoverURL:    row[hmap["coverurl"]],
 | |
| 		}
 | |
| 		books = append(books, b)
 | |
| 	}
 | |
| 	return books, nil
 | |
| }
 | |
| 
 | |
| func parseHeader(header []string) map[string]int {
 | |
| 	m := make(map[string]int, len(header)-1)
 | |
| 	for i := range header {
 | |
| 		m[strings.TrimSpace(strings.ToLower(header[i]))] = i
 | |
| 	}
 | |
| 	return m
 | |
| }
 | |
| 
 | |
| func parseAuthors(a string) []string {
 | |
| 	as := strings.Split(a, ";")
 | |
| 	for i := range as {
 | |
| 		as[i] = strings.TrimSpace(as[i])
 | |
| 	}
 | |
| 	return as
 | |
| }
 |