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);