From d994d6b91f4c0c7f233358faf424beb6a91cd6b1 Mon Sep 17 00:00:00 2001 From: Las Zenow Date: Mon, 1 Apr 2013 14:05:04 +0200 Subject: [PATCH] Using epubgo to handle epubs --- cover.go | 86 ++++++++++++++++++------------ database.go | 4 +- reader.go | 124 +++++++++++++++++++++++++++++--------------- store.go | 53 +++++++++---------- templates/read.html | 6 +-- upload.go | 2 +- 6 files changed, 167 insertions(+), 108 deletions(-) diff --git a/cover.go b/cover.go index a2b10a2..8fee4d1 100644 --- a/cover.go +++ b/cover.go @@ -2,10 +2,12 @@ package main import ( "bytes" - "git.gitorious.org/go-pkg/epub.git" + "git.gitorious.org/go-pkg/epubgo.git" "github.com/nfnt/resize" "image" "image/jpeg" + "io" + "io/ioutil" "log" "os" "regexp" @@ -13,51 +15,68 @@ import ( "unicode/utf8" ) -func GetCover(e *epub.Epub, title string) (string, string) { - /* Try first common names */ - for _, p := range []string{"cover.jpg", "Images/cover.jpg", "cover.jpeg", "cover1.jpg", "cover1.jpeg"} { - img := e.Data(p) - if len(img) != 0 { - return storeImg(img, title, ".jpg") - } +func GetCover(e *epubgo.Epub, title string) (string, string) { + imgPath, smallPath := searchCommonCoverNames(e, title) + if imgPath != "" { + return imgPath, smallPath } /* search for img on the text */ exp, _ := regexp.Compile(" depth { - c.In = append(c.In, true) - depth++ - } + c.Label = nav.Title() + c.Link = nav.Url() + c.Depth = depth for c.Depth < depth { c.Out = append(c.Out, true) depth-- } chapters = append(chapters, c) - } - /* if is the same chapter check the previous */ - i := activeIndx - 1 - for i >= 0 && strings.Contains(chapters[i].Link, "#") { - i-- + if nav.HasChildren() { + nav.In() + children := listChapters(nav, depth+1) + children[0].In = []bool{true} + children[len(children)-1].Out = []bool{true} + chapters = append(chapters, children...) + nav.Out() + } + err = nav.Next() } - if i >= 0 { - prev = chapters[i].Link - } - i = activeIndx + 1 - for i < len(chapters) && strings.Contains(chapters[i].Link, "#") { - i++ - } - if i < len(chapters) { - next = chapters[i].Link - } - return next, prev, chapters + chapters[0].In = []bool{true} + chapters[len(chapters)-1].Out = []bool{true} + return chapters } func readHandler(w http.ResponseWriter, r *http.Request) { @@ -138,17 +162,25 @@ func readHandler(w http.ResponseWriter, r *http.Request) { data.Back = "/book/" + id bookPath = BOOKS_PATH + data.Book.Path } - e, _ := epub.Open(bookPath, 0) + e, err := epubgo.Open(bookPath) + if err != nil { + http.NotFound(w, r) + return + } defer e.Close() if file == "" { - it := e.Iterator(epub.EITERATOR_LINEAR) - defer it.Close() - http.Redirect(w, r, base+id+"/"+it.CurrUrl(), http.StatusTemporaryRedirect) + it, err := e.Spine() + if err != nil { + http.NotFound(w, r) + return + } + http.Redirect(w, r, base+id+"/"+it.Url(), http.StatusTemporaryRedirect) return } data.S = GetStatus(w, r) - data.Next, data.Prev, data.Chapters = chapterList(e, file, id, base) + data.Next, data.Prev = getNextPrev(e, file, id, base) + data.Chapters = getChapters(e, file, id, base) data.Content = genLink(id, "/content/", file) loadTemplate(w, "read", data) } @@ -172,12 +204,18 @@ func contentHandler(w http.ResponseWriter, r *http.Request) { } else { bookPath = BOOKS_PATH + book.Path } - e, _ := epub.Open(bookPath, 0) + e, _ := epubgo.Open(bookPath) defer e.Close() if file == "" { http.NotFound(w, r) return } - w.Write(e.Data(file)) + html, err := e.OpenFile(file) + if err != nil { + http.NotFound(w, r) + return + } + defer html.Close() + io.Copy(w, html) } diff --git a/store.go b/store.go index efcc2dd..4cc8b7e 100644 --- a/store.go +++ b/store.go @@ -1,7 +1,7 @@ package main import ( - "git.gitorious.org/go-pkg/epub.git" + "git.gitorious.org/go-pkg/epubgo.git" "io" "log" "os" @@ -15,28 +15,35 @@ import ( func ParseFile(path string) (string, error) { book := map[string]interface{}{} - e, err := epub.Open(NEW_PATH+path, 0) + e, err := epubgo.Open(NEW_PATH + path) if err != nil { return "", err } defer e.Close() - title := cleanStr(strings.Join(e.Metadata(epub.EPUB_TITLE), ", ")) - book["title"] = title - book["author"] = parseAuthr(e.Metadata(epub.EPUB_CREATOR)) - book["contributor"] = cleanStr(strings.Join(e.Metadata(epub.EPUB_CONTRIB), ", ")) - book["publisher"] = cleanStr(strings.Join(e.Metadata(epub.EPUB_PUBLISHER), ", ")) - book["description"] = parseDescription(e.Metadata(epub.EPUB_DESCRIPTION)) - book["subject"] = parseSubject(e.Metadata(epub.EPUB_SUBJECT)) - book["date"] = parseDate(e.Metadata(epub.EPUB_DATE)) - book["lang"] = e.Metadata(epub.EPUB_LANG) - book["type"] = strings.Join(e.Metadata(epub.EPUB_TYPE), ", ") - book["format"] = strings.Join(e.Metadata(epub.EPUB_FORMAT), ", ") - book["source"] = strings.Join(e.Metadata(epub.EPUB_SOURCE), ", ") - book["relation"] = strings.Join(e.Metadata(epub.EPUB_RELATION), ", ") - book["coverage"] = strings.Join(e.Metadata(epub.EPUB_COVERAGE), ", ") - book["rights"] = strings.Join(e.Metadata(epub.EPUB_RIGHTS), ", ") - book["meta"] = strings.Join(e.Metadata(epub.EPUB_META), ", ") + for _, m := range e.MetadataFields() { + data, err := e.Metadata(m) + if err != nil { + continue + } + switch m { + case "creator": + book["author"] = parseAuthr(data) + case "description": + book[m] = parseDescription(data) + case "subject": + book[m] = parseSubject(data) + case "date": + book[m] = parseDate(data) + case "language": + book["lang"] = data + case "title", "contributor", "publisher": + book[m] = cleanStr(strings.Join(data, ", ")) + default: + book[m] = strings.Join(data, ", ") + } + } + title, _ := book["title"].(string) book["path"] = path cover, coverSmall := GetCover(e, title) book["cover"] = cover @@ -55,14 +62,8 @@ func StoreNewFile(name string, file io.Reader) (string, error) { } defer fw.Close() - const size = 1024 - var n int = size - buff := make([]byte, size) - for n == size { - n, err = file.Read(buff) - fw.Write(buff) - } - return path, nil + _, err = io.Copy(fw, file) + return path, err } func StoreBook(book Book) (path string, err error) { diff --git a/templates/read.html b/templates/read.html index ef3ebbf..5e3818e 100644 --- a/templates/read.html +++ b/templates/read.html @@ -19,13 +19,13 @@
{{range .Chapters}} -{{range .Out}} - -{{end}} {{range .In}} +{{end}} {{end}} {{if .Chapters}} diff --git a/upload.go b/upload.go index a09f72e..ba74729 100644 --- a/upload.go +++ b/upload.go @@ -44,7 +44,7 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) { title, err := ParseFile(path) if err != nil { os.Remove(NEW_PATH + path) - sess.Notify("Problem uploading!", "The file '"+path+"' is not a well formed epub", "error") + sess.Notify("Problem uploading!", "The file '"+path+"' is not a well formed epub: "+err.Error(), "error") } else { uploaded = uploaded + " '" + title + "'" }