From 0c9fd306f198baa141fd80be6823d03e090f745e Mon Sep 17 00:00:00 2001 From: zhudw Date: Sat, 14 Oct 2023 15:50:22 +0800 Subject: [PATCH] =?UTF-8?q?=20[=E6=96=B0=E5=A2=9E]=E8=87=BA=E7=81=A3?= =?UTF-8?q?=E8=8F=AF=E6=96=87=E9=9B=BB=E5=AD=90=E6=9B=B8=E5=BA=AB=20=20[?= =?UTF-8?q?=E6=9B=B4=E6=96=B0]webview=20for=20windows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/cuhk.go | 208 -------------------------------- app/huawen.go | 130 ++++++++++++++++++++ app/ncltw.go | 304 ----------------------------------------------- build.sh | 2 +- config/init.go | 2 +- go.mod | 4 +- go.sum | 9 +- lib/file/file.go | 4 + lib/util/file.go | 4 + lib/util/text.go | 11 ++ router/china.go | 26 ++-- router/init.go | 4 +- 12 files changed, 175 insertions(+), 533 deletions(-) delete mode 100644 app/cuhk.go create mode 100644 app/huawen.go delete mode 100644 app/ncltw.go diff --git a/app/cuhk.go b/app/cuhk.go deleted file mode 100644 index 5b68d7c..0000000 --- a/app/cuhk.go +++ /dev/null @@ -1,208 +0,0 @@ -package app - -import ( - "bookget/config" - "bookget/lib/gohttp" - "bookget/lib/util" - "context" - "encoding/json" - "errors" - "fmt" - "log" - "net/http/cookiejar" - "net/url" - "regexp" - "strings" -) - -type Cuhk struct { - dt *DownloadTask -} -type ResponsePage struct { - ImagePage []ImagePage `json:"pages"` -} - -type ImagePage struct { - Pid string `json:"pid"` - Page string `json:"page"` - Label string `json:"label"` - Width string `json:"width"` - Height string `json:"height"` - Dsid string `json:"dsid"` - Token string `json:"token"` - Identifier string `json:"identifier"` -} - -func (r *Cuhk) Init(iTask int, sUrl string) (msg string, err error) { - r.dt = new(DownloadTask) - r.dt.UrlParsed, err = url.Parse(sUrl) - r.dt.Url = sUrl - r.dt.Index = iTask - r.dt.BookId = getBookId(r.dt.Url) - if r.dt.BookId == "" { - return "requested URL was not found.", err - } - r.dt.Jar, _ = cookiejar.New(nil) - return r.download() -} - -func (r *Cuhk) download() (msg string, err error) { - name := util.GenNumberSorted(r.dt.Index) - log.Printf("Get %s %s\n", name, r.dt.Url) - - respVolume, err := r.getVolumes(r.dt.Url, r.dt.Jar) - if err != nil { - fmt.Println(err) - return "getVolumes", err - } - for i, vol := range respVolume { - if config.Conf.Volume > 0 && config.Conf.Volume != i+1 { - continue - } - vid := util.GenNumberSorted(i + 1) - r.dt.VolumeId = r.dt.BookId + "_vol." + vid - r.dt.SavePath = config.CreateDirectory(r.dt.Url, r.dt.VolumeId) - canvases, err := r.getCanvases(vol, r.dt.Jar) - if err != nil || canvases == nil { - fmt.Println(err) - continue - } - log.Printf(" %d/%d volume, %d pages \n", i+1, len(respVolume), len(canvases)) - r.do(canvases) - } - return "", nil -} - -func (r *Cuhk) do(imgUrls []string) (msg string, err error) { - if imgUrls == nil { - return - } - fmt.Println() - referer := r.dt.Url - size := len(imgUrls) - ctx := context.Background() - for i, uri := range imgUrls { - if uri == "" || !config.PageRange(i, size) { - continue - } - sortId := util.GenNumberSorted(i + 1) - filename := sortId + config.Conf.FileExt - dest := config.GetDestPath(r.dt.Url, r.dt.VolumeId, filename) - if FileExist(dest) { - continue - } - log.Printf("Get %d/%d, URL: %s\n", i+1, size, uri) - opts := gohttp.Options{ - DestFile: dest, - Overwrite: false, - Concurrency: 1, - CookieFile: config.Conf.CookieFile, - CookieJar: r.dt.Jar, - Headers: map[string]interface{}{ - "User-Agent": config.Conf.UserAgent, - "Referer": referer, - //"X-ISLANDORA-TOKEN": v.Token, - }, - } - for k := 0; k < 10; k++ { - resp, err := gohttp.FastGet(ctx, uri, opts) - if err == nil && resp.GetStatusCode() == 200 { - break - } - } - util.PrintSleepTime(config.Conf.Speed) - fmt.Println() - } - fmt.Println() - return "", err -} - -func (r *Cuhk) getVolumes(sUrl string, jar *cookiejar.Jar) (volumes []string, err error) { - bs, err := r.getBody(sUrl, jar) - if err != nil { - return - } - text := string(bs) - subText := util.SubText(text, "id=\"block-islandora-compound-object-compound-navigation-select-list\"", "id=\"book-viewer\">") - matches := regexp.MustCompile(`value=['"]([A-z\d:_-]+)['"]`).FindAllStringSubmatch(subText, -1) - if matches == nil { - volumes = append(volumes, sUrl) - return - } - volumes = make([]string, 0, len(matches)) - for _, m := range matches { - //value='ignore' - if m[1] == "ignore" { - continue - } - id := strings.Replace(m[1], ":", "-", 1) - volumes = append(volumes, fmt.Sprintf("https://repository.lib.cuhk.edu.hk/sc/item/%s#page/1/mode/2up", id)) - } - return volumes, nil -} - -func (r *Cuhk) getCanvases(sUrl string, jar *cookiejar.Jar) (canvases []string, err error) { - bs, err := r.getBody(sUrl, jar) - if err != nil { - return - } - var resp ResponsePage - matches := regexp.MustCompile(`"pages":([^]]+)]`).FindSubmatch(bs) - if matches == nil { - return nil, err - } - data := []byte("{\"pages\":" + string(matches[1]) + "]}") - if err = json.Unmarshal(data, &resp); err != nil { - log.Printf("json.Unmarshal failed: %s\n", err) - } - for _, page := range resp.ImagePage { - var imgUrl string - if config.Conf.FileExt == ".jpg" { - imgUrl = fmt.Sprintf("https://repository.lib.cuhk.edu.hk/iiif/2/%s/full/full/0/default.jpg", page.Identifier) - } else { - imgUrl = fmt.Sprintf("https://repository.lib.cuhk.edu.hk/islandora/object/%s/datastream/JP2", page.Pid) - } - canvases = append(canvases, imgUrl) - } - return canvases, err -} - -func (r *Cuhk) getBody(apiUrl string, jar *cookiejar.Jar) ([]byte, error) { - referer := url.QueryEscape(apiUrl) - ctx := context.Background() - cli := gohttp.NewClient(ctx, gohttp.Options{ - CookieFile: config.Conf.CookieFile, - CookieJar: jar, - Headers: map[string]interface{}{ - "User-Agent": config.Conf.UserAgent, - "Referer": referer, - }, - }) - resp, err := cli.Get(apiUrl) - if err != nil { - return nil, err - } - bs, _ := resp.GetBody() - if resp.GetStatusCode() == 202 || bs == nil { - return nil, errors.New(fmt.Sprintf("ErrCode:%d, %s", resp.GetStatusCode(), resp.GetReasonPhrase())) - } - return bs, nil -} - -func (r *Cuhk) getCanvasesJPEG2000(sUrl string, jar *cookiejar.Jar) (imagePage []ImagePage) { - bs, err := r.getBody(sUrl, jar) - if err != nil { - return - } - var resp ResponsePage - matches := regexp.MustCompile(`"pages":([^]]+)]`).FindSubmatch(bs) - if matches != nil { - data := []byte("{\"pages\":" + string(matches[1]) + "]}") - if err = json.Unmarshal(data, &resp); err != nil { - log.Printf("json.Unmarshal failed: %s\n", err) - } - imagePage = make([]ImagePage, len(resp.ImagePage)) - copy(imagePage, resp.ImagePage) - } - return imagePage -} diff --git a/app/huawen.go b/app/huawen.go new file mode 100644 index 0000000..1221546 --- /dev/null +++ b/app/huawen.go @@ -0,0 +1,130 @@ +package app + +import ( + "bookget/config" + "bookget/lib/gohttp" + "bookget/lib/util" + "context" + "errors" + "fmt" + "log" + "net/http/cookiejar" + "net/url" + "os" + "regexp" + "strings" +) + +type Huawen struct { + dt *DownloadTask +} + +func (r *Huawen) Init(iTask int, sUrl string) (msg string, err error) { + r.dt = new(DownloadTask) + r.dt.UrlParsed, err = url.Parse(sUrl) + r.dt.Url = sUrl + r.dt.Index = iTask + r.dt.BookId = getBookId(r.dt.Url) + if r.dt.BookId == "" { + return "requested URL was not found.", err + } + r.dt.Jar, _ = cookiejar.New(nil) + return r.download() +} + +func (r *Huawen) getBookId(sUrl string) (bookId string) { + //TODO implement me + panic("implement me") +} + +func (r *Huawen) download() (msg string, err error) { + name := util.GenNumberSorted(r.dt.Index) + log.Printf("Get %s %s\n", name, r.dt.Url) + + respVolume, err := r.getVolumes(r.dt.Url, r.dt.Jar) + if err != nil { + fmt.Println(err) + return "getVolumes", err + } + for i, vol := range respVolume { + if config.Conf.Volume > 0 && config.Conf.Volume != i+1 { + continue + } + r.dt.SavePath = config.CreateDirectory(r.dt.Url, r.dt.BookId) + log.Printf(" %d/%d PDFs \n", i+1, len(respVolume)) + r.do(vol) + } + return "", nil +} + +func (r *Huawen) do(pdfUrl string) (msg string, err error) { + filename := util.FileName(pdfUrl) + dest := r.dt.SavePath + string(os.PathSeparator) + filename + if FileExist(dest) { + return "", nil + } + u, err := url.Parse(pdfUrl) + ctx := context.Background() + opts := gohttp.Options{ + DestFile: dest, + Overwrite: false, + Concurrency: config.Conf.Threads, + CookieFile: config.Conf.CookieFile, + CookieJar: r.dt.Jar, + Headers: map[string]interface{}{ + "User-Agent": config.Conf.UserAgent, + "Referer": "https://" + r.dt.UrlParsed.Host + "/pdfjs/web/viewer.html?file=" + u.Path, + }, + } + _, err = gohttp.FastGet(ctx, pdfUrl, opts) + if err != nil { + fmt.Println(err) + } + util.PrintSleepTime(config.Conf.Speed) + fmt.Println() + return "", nil +} + +func (r *Huawen) getVolumes(sUrl string, jar *cookiejar.Jar) (volumes []string, err error) { + bs, err := r.getBody(sUrl, jar) + if err != nil { + return + } + matches := regexp.MustCompile(`viewer.html\?file=([^"]+)"`).FindAllSubmatch(bs, -1) + if matches == nil { + return + } + for _, match := range matches { + sPath := strings.TrimSpace(string(match[1])) + pdfUrl := "https://" + r.dt.UrlParsed.Host + sPath + volumes = append(volumes, pdfUrl) + } + return volumes, nil +} + +func (r *Huawen) getCanvases(sUrl string, jar *cookiejar.Jar) (canvases []string, err error) { + //TODO implement me + panic("implement me") +} + +func (r *Huawen) getBody(apiUrl string, jar *cookiejar.Jar) ([]byte, error) { + referer := url.QueryEscape(apiUrl) + ctx := context.Background() + cli := gohttp.NewClient(ctx, gohttp.Options{ + CookieFile: config.Conf.CookieFile, + CookieJar: jar, + Headers: map[string]interface{}{ + "User-Agent": config.Conf.UserAgent, + "Referer": referer, + }, + }) + resp, err := cli.Get(apiUrl) + if err != nil { + return nil, err + } + bs, _ := resp.GetBody() + if resp.GetStatusCode() != 200 || bs == nil { + return nil, errors.New(fmt.Sprintf("ErrCode:%d, %s", resp.GetStatusCode(), resp.GetReasonPhrase())) + } + return bs, nil +} diff --git a/app/ncltw.go b/app/ncltw.go deleted file mode 100644 index 08d0f7e..0000000 --- a/app/ncltw.go +++ /dev/null @@ -1,304 +0,0 @@ -package app - -import ( - "bookget/config" - "bookget/lib/gohttp" - "bookget/lib/util" - "context" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "log" - "net/http" - "net/http/cookiejar" - "net/url" - "regexp" - "strings" -) - -type NclTw struct { - dt *DownloadTask - requestVerificationToken string - imageKey string - enCodeType int - body []byte -} -type NclTwResponseToken struct { - Token string `json:"token"` -} - -func (r *NclTw) Init(iTask int, sUrl string) (msg string, err error) { - r.dt = new(DownloadTask) - r.dt.UrlParsed, err = url.Parse(sUrl) - r.dt.Url = sUrl - r.dt.Index = iTask - r.dt.BookId = r.getBookId(r.dt.Url) - if r.dt.BookId == "" { - return "requested URL was not found.", err - } - r.dt.Jar, _ = cookiejar.New(nil) - return r.download() -} - -func (r *NclTw) getBookId(sUrl string) (bookId string) { - m := regexp.MustCompile(`item=([A-Za-z0-9]+)`).FindStringSubmatch(sUrl) - if m != nil { - bookId = m[1] - } - return bookId -} - -func (r *NclTw) download() (msg string, err error) { - name := util.GenNumberSorted(r.dt.Index) - log.Printf("Get %s %s\n", name, r.dt.Url) - r.dt.SavePath = config.CreateDirectory(r.dt.Url, r.dt.BookId) - canvases, err := r.getCanvases(r.dt.Url, r.dt.Jar) - if err != nil || canvases == nil { - return "requested URL was not found.", err - } - log.Printf(" %d pages \n", len(canvases)) - r.do(canvases) - return "", err -} - -func (r *NclTw) do(imgUrls []string) (msg string, err error) { - if imgUrls == nil { - return - } - fmt.Println() - size := len(imgUrls) - ctx := context.Background() - for i, uri := range imgUrls { - if uri == "" || !config.PageRange(i, size) { - continue - } - sortId := util.GenNumberSorted(i + 1) - filename := sortId + config.Conf.FileExt - dest := config.GetDestPath(r.dt.Url, r.dt.BookId, filename) - if FileExist(dest) { - continue - } - log.Printf("Get %d/%d page, URL: %s\n", i+1, size, uri) - token, err := r.getToken() - if err != nil { - fmt.Println(err) - break - } - imgUrl := uri + "&token=" + token - opts := gohttp.Options{ - DestFile: dest, - Overwrite: false, - Concurrency: 1, - CookieFile: config.Conf.CookieFile, - CookieJar: r.dt.Jar, - Headers: map[string]interface{}{ - "User-Agent": config.Conf.UserAgent, - "Referer": r.dt.Url, - "authority": "rbook.ncl.edu.tw", - "origin": "https://rbook.ncl.edu.tw", - }, - } - _, err = gohttp.FastGet(ctx, imgUrl, opts) - if err != nil { - fmt.Println(err) - continue - } - util.PrintSleepTime(config.Conf.Speed) - } - fmt.Println() - return "", err -} - -func (r *NclTw) getVolumes(sUrl string, jar *cookiejar.Jar) (volumes []string, err error) { - //TODO implement me - panic("implement me") -} - -func (r *NclTw) getCanvases(sUrl string, jar *cookiejar.Jar) (canvases []string, err error) { - r.body, err = r.getBody(sUrl, jar) - if err != nil { - return nil, err - } - //取页数 - matches := regexp.MustCompile(`name="ImageCheck" value="([^>]+)"`).FindAllSubmatch(r.body, -1) - if matches == nil { - return - } - canvases = make([]string, 0, len(matches)) - for _, v := range matches { - href := strings.Replace(string(v[1]), "&", "&", -1) - imgUrl := r.dt.UrlParsed.Scheme + "://" + r.dt.UrlParsed.Host + href - canvases = append(canvases, imgUrl) - } - return canvases, nil -} - -func (r *NclTw) getBody(apiUrl string, jar *cookiejar.Jar) ([]byte, error) { - ctx := context.Background() - cli := gohttp.NewClient(ctx, gohttp.Options{ - CookieFile: config.Conf.CookieFile, - CookieJar: jar, - Headers: map[string]interface{}{ - "User-Agent": config.Conf.UserAgent, - }, - }) - resp, err := cli.Get(apiUrl) - if err != nil { - return nil, err - } - bs, _ := resp.GetBody() - if resp.GetStatusCode() != http.StatusOK { - return nil, errors.New(fmt.Sprintf("ErrCode:%d, %s", resp.GetStatusCode(), resp.GetReasonPhrase())) - } - return bs, nil -} -func (r *NclTw) getRequestToken() string { - //取请求token - // - m := regexp.MustCompile(`name="__RequestVerificationToken(?:.+)value="(\S+)"`).FindSubmatch(r.body) - if m == nil { - return "" - } - r.requestVerificationToken = string(m[1]) - return r.requestVerificationToken -} - -func (r *NclTw) getToken() (token string, err error) { - apiUrl := "https://rbook.ncl.edu.tw/NCLSearch/Watermark/getToken" - requestVerificationToken := r.getRequestToken() - imgKey, err := r.getImageKey() - ctx := context.Background() - cli := gohttp.NewClient(ctx, gohttp.Options{ - CookieFile: config.Conf.CookieFile, - CookieJar: r.dt.Jar, - Headers: map[string]interface{}{ - "User-Agent": config.Conf.UserAgent, - "authority": "rbook.ncl.edu.tw", - "content-type": "application/x-www-form-urlencoded; charset=UTF-8", - "x-requested-with": "XMLHttpRequest", - "origin": "https://rbook.ncl.edu.tw", - "referer": r.dt.Url, - }, - FormParams: map[string]interface{}{ - imgKey: requestVerificationToken, - }, - }) - resp, err := cli.Post(apiUrl) - if err != nil { - return "", err - } - bs, _ := resp.GetBody() - resToken := new(NclTwResponseToken) - if err = json.Unmarshal(bs, resToken); err != nil { - log.Printf("json.Unmarshal failed: %s\n", err) - return "", err - } - m := strings.Split(resToken.Token, ":") - if len(m) != 2 { - return "", err - } - token = m[0] - r.imageKey = m[1] - return token, nil -} - -func (r *NclTw) getImageKey() (key string, err error) { - if r.imageKey == "" { - for i := 0; i < 100; i++ { - r.body, err = r.getBody(r.dt.Url, r.dt.Jar) - if err != nil { - return "", errors.New("not found") - } - //base64 - m := regexp.MustCompile(`btoa\("([A-z0-9-]+)"\)`).FindSubmatch(r.body) - if m != nil { - r.imageKey = string(m[1]) - r.enCodeType = 1 - break - } - //haveaniceday - m = regexp.MustCompile(`var i="([A-z0-9-]+)"`).FindSubmatch(r.body) - if m != nil { - r.imageKey = string(m[1]) - r.enCodeType = 2 - break - } - //Array[3][$lenght] - m = regexp.MustCompile(`var u="([A-z0-9-]+)"`).FindSubmatch(r.body) - if m != nil { - r.imageKey = string(m[1]) - r.enCodeType = 3 - break - } - } - } - switch r.enCodeType { - case 1: - key = base64.StdEncoding.EncodeToString([]byte(r.imageKey)) - break - case 2: - key = r.getImageKey2(r.imageKey) - break - case 3: - key = r.getImageKey3(r.imageKey) - break - } - //fmt.Printf("\nenCodeType=%d\n", r.enCodeType) - return key, nil -} - -func (r *NclTw) getImageKey2(key string) string { - var sss = "haveaniceday" - var out = "" - var f = 0 - size := len(key) - for i := 0; i < size; i++ { - var e = r.charCodeAt(key, i) - k := f % len(sss) - str := sss[k : k+1] - o := r.charCodeAt(str, 0) - s := fmt.Sprintf("%c", e^o) - out += s - f++ - } - return out -} - -func (r *NclTw) getImageKey3(key string) string { - size := len(key) - var max = 3 - mArr := make([][]string, max) - i := 0 - c := 1 - var out string - for j := 0; j < size; j++ { - s := key[j : j+1] - mArr[i] = append(mArr[i], s) - if i == 0 { - c = 1 - } else if i == (max - 1) { - c = -1 - } - i += c - } - for _, item := range mArr { - for _, s := range item { - if s != "" { - out += s - } - } - } - return out -} - -func (r *NclTw) charCodeAt(text string, n int) rune { - i := 0 - for _, code := range text { - if i == n { - return code - } - i++ - } - return 0 -} diff --git a/build.sh b/build.sh index 53cc67a..61e74cc 100644 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -ver="1.2.2" +ver="1.2.3" mkdir -p target/bookget-${ver}.linux/ mkdir -p target/bookget-${ver}.macOS/ diff --git a/config/init.go b/config/init.go index 0c7d2cc..f40de3d 100644 --- a/config/init.go +++ b/config/init.go @@ -7,7 +7,7 @@ import ( var Conf Input -const version = "1.2.2" +const version = "1.2.3" // initSeq false = 最小值 <= 当前页码 <= 最大值 func initSeq() { diff --git a/go.mod b/go.mod index da07c1d..2413b7a 100644 --- a/go.mod +++ b/go.mod @@ -4,21 +4,19 @@ go 1.19 require ( github.com/andreburgaud/crypt2go v1.3.1 - github.com/jchv/go-webview2 v0.0.0-20221223143126-dc24628cff85 github.com/jzelinskie/whirlpool v0.0.0-20201016144138-0675e54bb004 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.2 github.com/valyala/fasthttp v1.44.0 + github.com/webview/webview_go v0.0.0-20230901181450-5a14030a9070 gopkg.in/ini.v1 v1.67.0 ) require ( github.com/andybalholm/brotli v1.0.5 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/jchv/go-winloader v0.0.0-20200815041850-dec1ee9a7fd5 // indirect github.com/klauspost/compress v1.16.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 7323d7c..366e986 100644 --- a/go.sum +++ b/go.sum @@ -6,10 +6,6 @@ github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/jchv/go-webview2 v0.0.0-20221223143126-dc24628cff85 h1:t6lhRbwURcdWgp8OsJlq6sOfWMOXP21YuiCicjutHv4= -github.com/jchv/go-webview2 v0.0.0-20221223143126-dc24628cff85/go.mod h1:/BNVc0Sw3Wj6Sz9uSxPwhCEUhhWs92hPde75K2YV24A= -github.com/jchv/go-winloader v0.0.0-20200815041850-dec1ee9a7fd5 h1:pdFFlHXY9tZXmJz+tRSm1DzYEH4ebha7cffmm607bMU= -github.com/jchv/go-winloader v0.0.0-20200815041850-dec1ee9a7fd5/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= github.com/jzelinskie/whirlpool v0.0.0-20201016144138-0675e54bb004 h1:G+9t9cEtnC9jFiTxyptEKuNIAbiN5ZCQzX2a74lj3xg= github.com/jzelinskie/whirlpool v0.0.0-20201016144138-0675e54bb004/go.mod h1:KmHnJWQrgEvbuy0vcvj00gtMqbvNn1L+3YUZLK/B92c= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= @@ -31,16 +27,15 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasthttp v1.44.0 h1:R+gLUhldIsfg1HokMuQjdQ5bh9nuXHPIfvkYUu9eR5Q= github.com/valyala/fasthttp v1.44.0/go.mod h1:f6VbjjoI3z1NDOZOv17o6RvtRSWxC77seBFc2uWtgiY= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/webview/webview_go v0.0.0-20230901181450-5a14030a9070 h1:imZLWyo1ondeQjqfb/eHuYgFiOAYg6ugSMCnGfPTPmg= +github.com/webview/webview_go v0.0.0-20230901181450-5a14030a9070/go.mod h1:yE65LFCeWf4kyWD5re+h4XNvOHJEXOCOuJZ4v8l5sgk= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210218145245-beda7e5e158e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/lib/file/file.go b/lib/file/file.go index 453e05c..6c27945 100644 --- a/lib/file/file.go +++ b/lib/file/file.go @@ -32,6 +32,10 @@ func Name(uri string) string { pos := strings.Index(uri, "?") uri = uri[:pos] } + if strings.Contains(uri, "&") { + pos := strings.Index(uri, "&") + uri = uri[:pos] + } name := "" for i := len(uri) - 1; i >= 0; i-- { if uri[i] == '/' { diff --git a/lib/util/file.go b/lib/util/file.go index f1bd984..6f22609 100644 --- a/lib/util/file.go +++ b/lib/util/file.go @@ -75,6 +75,10 @@ func FileName(uri string) string { pos := strings.Index(uri, "?") uri = uri[:pos] } + if strings.Contains(uri, "&") { + pos := strings.Index(uri, "&") + uri = uri[:pos] + } name := "" for i := len(uri) - 1; i >= 0; i-- { if uri[i] == '/' { diff --git a/lib/util/text.go b/lib/util/text.go index 3eef0c7..402762e 100644 --- a/lib/util/text.go +++ b/lib/util/text.go @@ -52,3 +52,14 @@ func GetHostUrl(uri string) string { var hostUrl = fmt.Sprintf("%s://%s/", u.Scheme, u.Host) return hostUrl } + +func RemoveDuplicate(source []string) []string { + mTmp := map[string]string{} + newArray := make([]string, len(source), 0) + for e := range source { + if value, ok := mTmp[source[e]]; !ok { + newArray = append(newArray, value) + } + } + return newArray +} diff --git a/router/china.go b/router/china.go index ca87107..2e7a960 100644 --- a/router/china.go +++ b/router/china.go @@ -29,10 +29,10 @@ func (p ChinaNcl) getRouterInit(sUrl []string) (map[string]interface{}, error) { type RbookNcl struct{} func (p RbookNcl) getRouterInit(sUrl []string) (map[string]interface{}, error) { - for i, s := range sUrl { - var nlc app.NclTw - nlc.Init(i+1, s) - } + //for i, s := range sUrl { + // var nlc app.NclTw + // nlc.Init(i+1, s) + //} return nil, nil } @@ -57,10 +57,10 @@ func (p DigitalarchiveNpmTw) getRouterInit(sUrl []string) (map[string]interface{ type CuHk struct{} func (p CuHk) getRouterInit(sUrl []string) (map[string]interface{}, error) { - for i, s := range sUrl { - var cuhk app.Cuhk - cuhk.Init(i+1, s) - } + //for i, s := range sUrl { + // var cuhk app.Cuhk + // cuhk.Init(i+1, s) + //} return nil, nil } @@ -223,3 +223,13 @@ func (p Szmuseum) getRouterInit(sUrl []string) (map[string]interface{}, error) { } return nil, nil } + +type Huawen struct{} + +func (p Huawen) getRouterInit(sUrl []string) (map[string]interface{}, error) { + for i, s := range sUrl { + var hw app.Huawen + hw.Init(i+1, s) + } + return nil, nil +} diff --git a/router/init.go b/router/init.go index e670750..5dd2b52 100644 --- a/router/init.go +++ b/router/init.go @@ -41,6 +41,8 @@ func FactoryRouter(siteID string, sUrl []string) (map[string]interface{}, error) Router["mylib.nlc.cn"] = new(ChinaNcl) //[中国]台北古籍与特藏文献 //Router["rbook.ncl.edu.tw"] = new(RbookNcl) + //[中国]臺灣華文電子書庫 + Router["taiwanebook.ncl.edu.tw"] = new(Huawen) //[中国]香港中文大学图书馆cuhk.Init Router["repository.lib.cuhk.edu.hk"] = new(CuHk) //[中国]香港科技大学图书馆 usthk.Init @@ -174,7 +176,7 @@ func FactoryRouter(siteID string, sUrl []string) (map[string]interface{}, error) //[韩国] Router["kyudb.snu.ac.kr"] = new(KyudbSnu) Router["sillok.history.go.kr"] = new(Sillokgokr) - Router["lod.nl.go.kr"] = new(DlibGoKr) + //Router["lod.nl.go.kr"] = new(DlibGoKr) //俄罗斯图书馆 Router["viewer.rsl.ru"] = new(RslRu)