From 0650bbfdbadf138d11f3c15a449817625dab7e52 Mon Sep 17 00:00:00 2001 From: nite Date: Thu, 16 Jul 2026 19:01:55 +0800 Subject: [PATCH] fix: upgrade playwright-go and fix file:// resource loading - Upgrade playwright-go v0.5200.1 -> v0.6100.0 (module path changed from playwright-community to mxschmitt). The old Azure CDN driver download endpoint returns 404 for all versions; v0.6100.0 switches to npm registry which works correctly. - Fix file:// resource loading: replace absolute path src="/..." and href="/..." with full URLs so browser can fetch remote resources (chapterlog.js) when loading local HTML files. - Replace removed Devtools field with Args --auto-open-devtools-for-tabs. - Include error details in playwright install failure log. - Fix nil pointer in tests: check err before calling SetTextOnly. - Update all dependencies: goquery, templ, resty, cobra, pflag, etc. - Bump go toolchain 1.24.2 -> 1.25.0 --- cmd/download.go | 4 +-- downloader/bilinovel/bilinovel.go | 15 ++++++++--- go.mod | 18 +++++++------- go.sum | 41 +++++++++++++++---------------- test/bilinovel_test.go | 6 ++--- 5 files changed, 45 insertions(+), 39 deletions(-) diff --git a/cmd/download.go b/cmd/download.go index 01ad03a..6ac31a4 100644 --- a/cmd/download.go +++ b/cmd/download.go @@ -13,7 +13,7 @@ import ( "os" "path/filepath" - "github.com/playwright-community/playwright-go" + "github.com/mxschmitt/playwright-go" "github.com/spf13/cobra" ) @@ -28,7 +28,7 @@ var downloadCmd = &cobra.Command{ Stdout: io.Discard, }) if err != nil { - slog.Error("failed to install playwright") + slog.Error("failed to install playwright", slog.Any("error", err)) return } diff --git a/downloader/bilinovel/bilinovel.go b/downloader/bilinovel/bilinovel.go index 805bc56..854b150 100644 --- a/downloader/bilinovel/bilinovel.go +++ b/downloader/bilinovel/bilinovel.go @@ -20,7 +20,7 @@ import ( mapper "git.nite07.com/nite/font-mapper" "github.com/PuerkitoBio/goquery" - "github.com/playwright-community/playwright-go" + "github.com/mxschmitt/playwright-go" ) //go:embed read.ttf @@ -101,10 +101,13 @@ func (b *Bilinovel) initBrowser(debug bool) error { return fmt.Errorf("could not start playwright: %w", err) } - b.browser, err = pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{ + launchOpts := playwright.BrowserTypeLaunchOptions{ Headless: playwright.Bool(!debug), - Devtools: playwright.Bool(debug), - }) + } + if debug { + launchOpts.Args = []string{"--auto-open-devtools-for-tabs"} + } + b.browser, err = pw.Chromium.Launch(launchOpts) if err != nil { return fmt.Errorf("could not launch browser: %w", err) } @@ -530,6 +533,10 @@ func (b *Bilinovel) processContentWithPlaywright(page playwright.Page, htmlConte // 替换 window.location.replace,防止页面跳转 htmlContent = strings.ReplaceAll(htmlContent, "window.location.replace", "console.log") + // 将绝对路径的资源引用替换为完整 URL,以便从 file:// 加载时能正确请求远程资源 + htmlContent = strings.ReplaceAll(htmlContent, `src="/`, `src="https://www.bilinovel.com/`) + htmlContent = strings.ReplaceAll(htmlContent, `href="/`, `href="https://www.bilinovel.com/`) + tempPath := filepath.Join(os.TempDir(), "bilinovel-downloader") err := os.MkdirAll(tempPath, 0755) if err != nil { diff --git a/go.mod b/go.mod index d7ddd64..8b251a4 100644 --- a/go.mod +++ b/go.mod @@ -1,25 +1,25 @@ module bilinovel-downloader -go 1.24.2 +go 1.25.0 require ( git.nite07.com/nite/font-mapper v0.0.0-20251029075022-4bbc206d648b - github.com/PuerkitoBio/goquery v1.10.3 - github.com/a-h/templ v0.3.943 - github.com/go-resty/resty/v2 v2.16.5 + github.com/PuerkitoBio/goquery v1.12.0 + github.com/a-h/templ v0.3.1020 + github.com/go-resty/resty/v2 v2.17.2 github.com/google/uuid v1.6.0 - github.com/playwright-community/playwright-go v0.5200.1 - github.com/spf13/cobra v1.9.1 + github.com/mxschmitt/playwright-go v0.6100.0 + github.com/spf13/cobra v1.10.2 ) require ( github.com/andybalholm/cascadia v1.3.3 // indirect github.com/deckarep/golang-set/v2 v2.8.0 // indirect - github.com/go-jose/go-jose/v3 v3.0.4 // indirect + github.com/go-jose/go-jose/v3 v3.0.5 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/spf13/pflag v1.0.7 // indirect + github.com/spf13/pflag v1.0.10 // indirect golang.org/x/image v0.30.0 // indirect - golang.org/x/net v0.43.0 // indirect + golang.org/x/net v0.52.0 // indirect ) diff --git a/go.sum b/go.sum index aea8663..4c401c5 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,9 @@ git.nite07.com/nite/font-mapper v0.0.0-20251029075022-4bbc206d648b h1:hK/0jdxebP97k2kDrUxPhWc5NBcS4syGmyBS9Ei8nYQ= git.nite07.com/nite/font-mapper v0.0.0-20251029075022-4bbc206d648b/go.mod h1:RSjujtYGm7TmkJBJewhvCmfjj9FyYdDWoJyremwMxfU= -github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo= -github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y= -github.com/a-h/templ v0.3.943 h1:o+mT/4yqhZ33F3ootBiHwaY4HM5EVaOJfIshvd5UNTY= -github.com/a-h/templ v0.3.943/go.mod h1:oCZcnKRf5jjsGpf2yELzQfodLphd2mwecwG4Crk5HBo= +github.com/PuerkitoBio/goquery v1.12.0 h1:pAcL4g3WRXekcB9AU/y1mbKez2dbY2AajVhtkO8RIBo= +github.com/PuerkitoBio/goquery v1.12.0/go.mod h1:802ej+gV2y7bbIhOIoPY5sT183ZW0YFofScC4q/hIpQ= +github.com/a-h/templ v0.3.1020 h1:ypAT/L5ySWEnZ6Zft/5yfoWXYYkhFNvEFOeeqecg4tw= +github.com/a-h/templ v0.3.1020/go.mod h1:A2DlK61v+K+NRoGnhmYbNYVmtYHcFO5/AisMvBdDxTM= github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= @@ -12,10 +12,10 @@ 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/deckarep/golang-set/v2 v2.8.0 h1:swm0rlPCmdWn9mESxKOjWk8hXSqoxOp+ZlfuyaAdFlQ= github.com/deckarep/golang-set/v2 v2.8.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/go-jose/go-jose/v3 v3.0.4 h1:Wp5HA7bLQcKnf6YYao/4kpRpVMp/yf6+pJKV8WFSaNY= -github.com/go-jose/go-jose/v3 v3.0.4/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= -github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM= -github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= +github.com/go-jose/go-jose/v3 v3.0.5 h1:BLLJWbC4nMZOfuPVxoZIxeYsn6Nl2r1fITaJ78UQlVQ= +github.com/go-jose/go-jose/v3 v3.0.5/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-resty/resty/v2 v2.17.2 h1:FQW5oHYcIlkCNrMD2lloGScxcHJ0gkjshV3qcQAyHQk= +github.com/go-resty/resty/v2 v2.17.2/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= @@ -27,23 +27,22 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/playwright-community/playwright-go v0.5200.1 h1:Sm2oOuhqt0M5Y4kUi/Qh9w4cyyi3ZIWTBeGKImc2UVo= -github.com/playwright-community/playwright-go v0.5200.1/go.mod h1:UnnyQZaqUOO5ywAZu60+N4EiWReUqX1MQBBA3Oofvf8= +github.com/mxschmitt/playwright-go v0.6100.0 h1:HYNnbGZsTHz8veJyDGe4fU1iPxfvXqzmwKchzuvGCsY= +github.com/mxschmitt/playwright-go v0.6100.0/go.mod h1:A7VtrS3j/c8ToGnSVUaOfNtQQVxi6JotUS0jeuus6r4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= -github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= @@ -66,8 +65,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -104,8 +103,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/test/bilinovel_test.go b/test/bilinovel_test.go index 024e51b..3826f75 100644 --- a/test/bilinovel_test.go +++ b/test/bilinovel_test.go @@ -9,10 +9,10 @@ import ( func TestBilinovel_GetNovel(t *testing.T) { bilinovel, err := bilinovel.New(bilinovel.BilinovelNewOption{Concurrency: 5}) - bilinovel.SetTextOnly(true) if err != nil { t.Fatalf("failed to create bilinovel: %v", err) } + bilinovel.SetTextOnly(true) novel, err := bilinovel.GetNovel(2727, false, nil) if err != nil { t.Fatalf("failed to get novel: %v", err) @@ -26,10 +26,10 @@ func TestBilinovel_GetNovel(t *testing.T) { func TestBilinovel_GetVolume(t *testing.T) { bilinovel, err := bilinovel.New(bilinovel.BilinovelNewOption{Concurrency: 1}) - bilinovel.SetTextOnly(true) if err != nil { t.Fatalf("failed to create bilinovel: %v", err) } + bilinovel.SetTextOnly(true) volume, err := bilinovel.GetVolume(2727, 129092, false) if err != nil { t.Fatalf("failed to get volume: %v", err) @@ -43,10 +43,10 @@ func TestBilinovel_GetVolume(t *testing.T) { func TestBilinovel_GetChapter(t *testing.T) { bilinovel, err := bilinovel.New(bilinovel.BilinovelNewOption{Concurrency: 1}) - bilinovel.SetTextOnly(true) if err != nil { t.Fatalf("failed to create bilinovel: %v", err) } + bilinovel.SetTextOnly(true) chapter, err := bilinovel.GetChapter(2727, 129092, 129094) if err != nil { t.Fatalf("failed to get chapter: %v", err)