summaryrefslogtreecommitdiff
path: root/cmd/rescribe/gbook.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/rescribe/gbook.go')
-rw-r--r--cmd/rescribe/gbook.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/cmd/rescribe/gbook.go b/cmd/rescribe/gbook.go
index f0e9e1e..fe2f4b8 100644
--- a/cmd/rescribe/gbook.go
+++ b/cmd/rescribe/gbook.go
@@ -14,6 +14,7 @@ import (
"os"
"os/exec"
"path"
+ "regexp"
"strings"
"unicode"
@@ -206,3 +207,49 @@ func getGoogleBook(ctx context.Context, gbookcmd string, id string, basedir stri
return dir, nil
}
+
+// getBookIdFromUrl returns a 12 character Google Book ID from
+// a Google URL, or an error if one can't be found.
+// Example URLs:
+// https://books.google.it/books?id=QjQepCuN8JYC
+// https://www.google.it/books/edition/_/VJbr-Oe2au0C
+func getBookIdFromUrl(url string) (string, error) {
+ lurl := strings.ToLower(url)
+ if len(url) == 12 && !strings.ContainsAny(url, "?/:") {
+ return url, nil
+ }
+
+ matchUrl, err := regexp.MatchString("https://www.google.[^\\/]*/books/", url)
+ if err != nil {
+ return "", err
+ }
+
+ if strings.HasPrefix(lurl, "https://books.google") {
+ start := strings.Index(lurl, "?id=")
+ if start == -1 {
+ start = strings.Index(lurl, "&id=")
+ }
+
+ if start >= 0 {
+ start += 4
+ if len(url[start:]) < 12 {
+ return "", fmt.Errorf("Could not find book ID in URL")
+ }
+ return url[start : start+12], nil
+ }
+
+ return "", fmt.Errorf("Could not find book ID in URL")
+ }
+ if matchUrl == true {
+ start := strings.Index(lurl, "edition/_/")
+
+ if start >= 0 {
+ start += 10
+ if len(url[start:]) < 12 {
+ return "", fmt.Errorf("Could not find book ID in URL")
+ }
+ return url[start : start+12], nil
+ }
+ }
+ return "", fmt.Errorf("Could not find book ID in URL")
+}