diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index df59a9b9..02ddfe9f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,39 +25,39 @@ jobs: id: create_release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - build-cli: - runs-on: ubuntu-latest - needs: [ release ] - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 - with: - go-version: '^1.19' - cache: true - - name: Build - env: - VERSION: ${{ needs.release.outputs.tag_name }} - run: | - mkdir -p dist/zip - goos_arr=(windows darwin linux) - goarch_arr=(386 amd64 arm64) - export CGO_ENABLED=0 - for goos in "${goos_arr[@]}"; do - for goarch in "${goarch_arr[@]}"; do - dir="dist/gopeed-$VERSION-$goos-$goarch/" - (GOOS=$goos GOARCH=$goarch go build -tags nosqlite -ldflags="-s -w" -o $dir github.com/monkeyWie/gopeed/cmd/gopeed \ - && cd $dir \ - && zip -r ../zip/gopeed-cli-$VERSION-$goos-$goarch.zip * \ - && cd ../..) \ - || true - done - done - - name: Upload - uses: shogo82148/actions-upload-release-asset@v1 - with: - upload_url: ${{ needs.release.outputs.upload_url }} - asset_path: dist/zip/* - overwrite: true +# build-cli: +# runs-on: ubuntu-latest +# needs: [ release ] +# steps: +# - uses: actions/checkout@v3 +# - uses: actions/setup-go@v3 +# with: +# go-version: '^1.19' +# cache: true +# - name: Build +# env: +# VERSION: ${{ needs.release.outputs.tag_name }} +# run: | +# mkdir -p dist/zip +# goos_arr=(windows darwin linux) +# goarch_arr=(386 amd64 arm64) +# export CGO_ENABLED=0 +# for goos in "${goos_arr[@]}"; do +# for goarch in "${goarch_arr[@]}"; do +# dir="dist/gopeed-$VERSION-$goos-$goarch/" +# (GOOS=$goos GOARCH=$goarch go build -tags nosqlite -ldflags="-s -w" -o $dir github.com/monkeyWie/gopeed/cmd/gopeed \ +# && cd $dir \ +# && zip -r ../zip/gopeed-cli-$VERSION-$goos-$goarch.zip * \ +# && cd ../..) \ +# || true +# done +# done +# - name: Upload +# uses: shogo82148/actions-upload-release-asset@v1 +# with: +# upload_url: ${{ needs.release.outputs.upload_url }} +# asset_path: dist/zip/* +# overwrite: true build-macos-arm64-lib: runs-on: ubuntu-latest needs: [ release ] @@ -163,7 +163,7 @@ jobs: mkdir ui/flutter/android/app/libs go install golang.org/x/mobile/cmd/gomobile@latest gomobile init - gomobile bind -ldflags="-w -s" -o ui/flutter/android/app/libs/libgopeed.aar -target=android -androidapi 19 -javapkg=com.gopeed github.com/monkeyWie/gopeed/bind/mobile + gomobile bind -tags nosqlite -ldflags="-w -s" -o ui/flutter/android/app/libs/libgopeed.aar -target=android -androidapi 19 -javapkg=com.gopeed github.com/monkeyWie/gopeed/bind/mobile cd ui/flutter flutter build apk mkdir dist @@ -174,3 +174,42 @@ jobs: upload_url: ${{ needs.release.outputs.upload_url }} asset_path: ui/flutter/dist/* overwrite: true + build-web: + runs-on: ubuntu-latest + needs: [ release ] + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v3 + with: + go-version: '^1.19' + cache: true + - uses: subosito/flutter-action@v2 + - name: Build + env: + VERSION: ${{ needs.release.outputs.tag_name }} + run: | + cd ui/flutter + flutter build web + cd ../../ + cp -r ui/flutter/build/web cmd/web/dist + mkdir -p dist/zip + goos_arr=(windows darwin linux) + goarch_arr=(386 amd64 arm64) + export CGO_ENABLED=0 + for goos in "${goos_arr[@]}"; do + for goarch in "${goarch_arr[@]}"; do + dir="dist/gopeed-$VERSION-$goos-$goarch/" + (GOOS=$goos GOARCH=$goarch go build -tags nosqlite -ldflags="-s -w" -o $dir github.com/monkeyWie/gopeed/cmd/web \ + && cd $dir \ + && rename 's/^web/gopeed/' * \ + && zip -r ../zip/gopeed-web-$VERSION-$goos-$goarch.zip * \ + && cd ../..) \ + || true + done + done + - name: Upload + uses: shogo82148/actions-upload-release-asset@v1 + with: + upload_url: ${{ needs.release.outputs.upload_url }} + asset_path: dist/zip/* + overwrite: true diff --git a/.gitignore b/.gitignore index 756e084f..5ae335c1 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,6 @@ bin/ *.data *.db -.DS_Store \ No newline at end of file +.DS_Store + +dist/ \ No newline at end of file diff --git a/cmd/gopeed/flags.go b/cmd/cli/flags.go similarity index 100% rename from cmd/gopeed/flags.go rename to cmd/cli/flags.go diff --git a/cmd/gopeed/main.go b/cmd/cli/main.go similarity index 100% rename from cmd/gopeed/main.go rename to cmd/cli/main.go diff --git a/cmd/server/main.go b/cmd/server/main.go deleted file mode 100644 index 76948b7c..00000000 --- a/cmd/server/main.go +++ /dev/null @@ -1,16 +0,0 @@ -package main - -import ( - "github.com/monkeyWie/gopeed/pkg/rest" - "github.com/monkeyWie/gopeed/pkg/rest/model" -) - -func main() { - if err := rest.StartSync(&model.StartConfig{ - Network: "tcp", - Address: "127.0.0.1:9999", - Storage: model.StorageMem, - }); err != nil { - panic(err) - } -} diff --git a/cmd/web/banner.txt b/cmd/web/banner.txt new file mode 100644 index 00000000..d667ca0f --- /dev/null +++ b/cmd/web/banner.txt @@ -0,0 +1,7 @@ + + _______ ______ .______ _______ _______ _______ + / _____| / __ \ | _ \ | ____|| ____|| \ +| | __ | | | | | |_) | | |__ | |__ | .--. | +| | |_ | | | | | | ___/ | __| | __| | | | | +| |__| | | `--' | | | | |____ | |____ | '--' | + \______| \______/ | _| |_______||_______||_______/ diff --git a/cmd/web/main.go b/cmd/web/main.go new file mode 100644 index 00000000..be7e0ee1 --- /dev/null +++ b/cmd/web/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "embed" + "fmt" + "github.com/monkeyWie/gopeed/pkg/rest" + "github.com/monkeyWie/gopeed/pkg/rest/model" + "io/fs" + "net/http" +) + +//go:embed banner.txt +var banner string + +//go:embed dist/* +var dist embed.FS + +func main() { + sub, err := fs.Sub(dist, "dist") + if err != nil { + panic(err) + } + cfg := &model.StartConfig{ + Network: "tcp", + Address: "127.0.0.1:9999", + Storage: model.StorageMem, + WebEnable: true, + WebFS: sub, + } + fmt.Println(banner) + srv, listener, err := rest.BuildServer(cfg) + if err != nil { + panic(err) + } + fmt.Printf("Server start success on http://%s\n", listener.Addr().String()) + if err := srv.Serve(listener); err != nil && err != http.ErrServerClosed { + panic(err) + } +} diff --git a/internal/controller/controller.go b/internal/controller/controller.go index dfea961e..5912a6cf 100644 --- a/internal/controller/controller.go +++ b/internal/controller/controller.go @@ -1,6 +1,7 @@ package controller import ( + "errors" "os" "path/filepath" ) @@ -11,11 +12,10 @@ type Controller interface { } type DefaultController struct { - Files map[string]*os.File } func NewController() *DefaultController { - return &DefaultController{Files: make(map[string]*os.File)} + return &DefaultController{} } func (c *DefaultController) Touch(name string, size int64) (file *os.File, err error) { @@ -24,15 +24,15 @@ func (c *DefaultController) Touch(name string, size int64) (file *os.File, err e return } file, err = os.Create(name) + if err != nil && !errors.Is(err, os.ErrExist) { + return + } if size > 0 { err = os.Truncate(name, size) if err != nil { return nil, err } } - if err == nil { - c.Files[name] = file - } return } diff --git a/pkg/rest/model/server.go b/pkg/rest/model/server.go index 924f9100..3459ec9e 100644 --- a/pkg/rest/model/server.go +++ b/pkg/rest/model/server.go @@ -1,5 +1,7 @@ package model +import "io/fs" + type Storage string const ( @@ -13,6 +15,9 @@ type StartConfig struct { Storage Storage `json:"storage"` StorageDir string `json:"storageDir"` RefreshInterval int `json:"refreshInterval"` + + WebEnable bool + WebFS fs.FS } func (cfg *StartConfig) Init() *StartConfig { diff --git a/pkg/rest/server.go b/pkg/rest/server.go index cd7c1e6d..43e9bec8 100644 --- a/pkg/rest/server.go +++ b/pkg/rest/server.go @@ -19,7 +19,7 @@ var ( ) func Start(startCfg *model.StartConfig) (int, error) { - srv, listener, err := buildServer(startCfg) + srv, listener, err := BuildServer(startCfg) if err != nil { return 0, err } @@ -38,17 +38,6 @@ func Start(startCfg *model.StartConfig) (int, error) { return port, nil } -func StartSync(startCfg *model.StartConfig) error { - srv, listener, err := buildServer(startCfg) - if err != nil { - return err - } - if err := srv.Serve(listener); err != nil && err != http.ErrServerClosed { - return err - } - return nil -} - func Stop() { if srv != nil { if err := srv.Shutdown(context.TODO()); err != nil { @@ -62,7 +51,7 @@ func Stop() { } } -func buildServer(startCfg *model.StartConfig) (*http.Server, net.Listener, error) { +func BuildServer(startCfg *model.StartConfig) (*http.Server, net.Listener, error) { if startCfg == nil { startCfg = &model.StartConfig{} } @@ -104,6 +93,9 @@ func buildServer(startCfg *model.StartConfig) (*http.Server, net.Listener, error r.Methods(http.MethodGet).Path("/api/v1/tasks").HandlerFunc(GetTasks) r.Methods(http.MethodGet).Path("/api/v1/config").HandlerFunc(GetConfig) r.Methods(http.MethodPut).Path("/api/v1/config").HandlerFunc(PutConfig) + if startCfg.WebEnable { + r.PathPrefix("/").Handler(http.FileServer(http.FS(startCfg.WebFS))) + } srv = &http.Server{Handler: handlers.CORS( handlers.AllowedHeaders([]string{"X-Requested-With", "Content-Type", "Authorization"}), diff --git a/ui/flutter/.gitignore b/ui/flutter/.gitignore index ae709fe0..c6cbb087 100644 --- a/ui/flutter/.gitignore +++ b/ui/flutter/.gitignore @@ -32,7 +32,6 @@ /build/ # Web related -lib/generated_plugin_registrant.dart # Symbolication related app.*.symbols @@ -47,4 +46,4 @@ app.*.map.json android/app/libs/libgopeed.aar android/app/libs/libgopeed-sources.jar macos/Frameworks/libgopeed.h -macos/Frameworks/libgopeed.dylib \ No newline at end of file +macos/Frameworks/libgopeed.dylib diff --git a/ui/flutter/android/app/src/main/AndroidManifest.xml b/ui/flutter/android/app/src/main/AndroidManifest.xml index def48017..f3cc905b 100644 --- a/ui/flutter/android/app/src/main/AndroidManifest.xml +++ b/ui/flutter/android/app/src/main/AndroidManifest.xml @@ -5,7 +5,8 @@ - diff --git a/ui/flutter/lib/pages/task/task_view.dart b/ui/flutter/lib/pages/task/task_view.dart index fcdc2218..c8baf225 100644 --- a/ui/flutter/lib/pages/task/task_view.dart +++ b/ui/flutter/lib/pages/task/task_view.dart @@ -114,8 +114,6 @@ class Item extends StatelessWidget { list.add(IconButton( icon: const Icon(Icons.folder_open), onPressed: () async { - print(Util.buildAbsPath(task.opts.path, task.res.files[0].path, - task.res.files[0].name)); final file = File(Util.buildAbsPath(task.opts.path, task.res.files[0].path, task.res.files[0].name)); await launchUrl(file.parent.uri);