From f37a8eeb5f6d925e5a09c9f36b0f13913d7c5a59 Mon Sep 17 00:00:00 2001 From: Simon Ding Date: Mon, 15 Jul 2024 10:30:41 +0800 Subject: [PATCH] fix: moving file after complete --- pkg/storage/local.go | 2 +- pkg/storage/webdav.go | 8 +++++--- server/scheduler.go | 32 ++++++++++++++++---------------- ui/lib/main.dart | 32 ++++++++++++++++---------------- 4 files changed, 38 insertions(+), 36 deletions(-) diff --git a/pkg/storage/local.go b/pkg/storage/local.go index a1346f3..86776c5 100644 --- a/pkg/storage/local.go +++ b/pkg/storage/local.go @@ -73,5 +73,5 @@ func (l *LocalStorage) Move(src, dest string) error { func (l *LocalStorage) ReadDir(dir string) ([]fs.FileInfo, error) { - return ioutil.ReadDir(dir) + return ioutil.ReadDir(filepath.Join(l.dir, dir)) } \ No newline at end of file diff --git a/pkg/storage/webdav.go b/pkg/storage/webdav.go index 09fef26..95cbd28 100644 --- a/pkg/storage/webdav.go +++ b/pkg/storage/webdav.go @@ -14,21 +14,23 @@ import ( type WebdavStorage struct { fs *gowebdav.Client + dir string } -func NewWebdavStorage(url, user, password string) (*WebdavStorage, error) { +func NewWebdavStorage(url, user, password, path string) (*WebdavStorage, error) { c := gowebdav.NewClient(url, user, password) if err := c.Connect(); err != nil { return nil, errors.Wrap(err, "connect webdav") } return &WebdavStorage{ fs: c, + dir: path, }, nil } func (w *WebdavStorage) Move(local, remote string) error { baseLocal := filepath.Base(local) - remoteBase := filepath.Join(remote, baseLocal) + remoteBase := filepath.Join(w.dir,remote, baseLocal) log.Infof("remove all content in %s", remoteBase) w.fs.RemoveAll(remoteBase) @@ -79,5 +81,5 @@ func (w *WebdavStorage) Move(local, remote string) error { } func (w *WebdavStorage) ReadDir(dir string) ([]fs.FileInfo, error) { - return w.fs.ReadDir(dir) + return w.fs.ReadDir(filepath.Join(w.dir, dir)) } diff --git a/server/scheduler.go b/server/scheduler.go index 99377df..d8eb6f6 100644 --- a/server/scheduler.go +++ b/server/scheduler.go @@ -61,27 +61,28 @@ func (s *Server) moveCompletedTask(id int) error { } st := s.db.GetStorage(series.StorageID) log.Infof("move task files to target dir: %v", r.TargetDir) + var stImpl storage.Storage if st.Implementation == storage1.ImplementationWebdav { ws := st.ToWebDavSetting() - storageImpl, err := storage.NewWebdavStorage(ws.Path, ws.User, ws.Password) + storageImpl, err := storage.NewWebdavStorage(ws.URL, ws.User, ws.Password, ws.Path) if err != nil { return errors.Wrap(err, "new webdav") } - if err := storageImpl.Move(filepath.Join(s.db.GetDownloadDir(), torrent.Name()), r.TargetDir); err != nil { - return errors.Wrap(err, "move webdav") - } + stImpl = storageImpl + } else if st.Implementation == storage1.ImplementationLocal { ls := st.ToLocalSetting() storageImpl, err := storage.NewLocalStorage(ls.Path) if err != nil { return errors.Wrap(err, "new storage") } - - if err := storageImpl.Move(filepath.Join(s.db.GetDownloadDir(), torrent.Name()), r.TargetDir); err != nil { - return errors.Wrap(err, "move webdav") - } + stImpl = storageImpl } + if err := stImpl.Move(filepath.Join(s.db.GetDownloadDir(), torrent.Name()), r.TargetDir); err != nil { + return errors.Wrap(err, "move file") + } + log.Infof("move downloaded files to target dir success, file: %v, target dir: %v", torrent.Name(), r.TargetDir) torrent.Remove() delete(s.tasks, r.ID) @@ -102,11 +103,10 @@ func (s *Server) checkAllFiles() { } } -func (s *Server) checkFileExists(series *ent.Series) error{ +func (s *Server) checkFileExists(series *ent.Series) error { log.Infof("check files in directory: %s", series.TargetDir) st := s.db.GetStorage(series.StorageID) - targetDir := filepath.Join(st.GetPath(), series.TargetDir) var storageImpl storage.Storage switch st.Implementation { @@ -120,20 +120,20 @@ func (s *Server) checkFileExists(series *ent.Series) error{ case storage1.ImplementationWebdav: ws := st.ToWebDavSetting() - storageImpl1, err := storage.NewWebdavStorage(ws.Path, ws.User, ws.Password) + storageImpl1, err := storage.NewWebdavStorage(ws.URL, ws.User, ws.Password, ws.Path) if err != nil { return errors.Wrap(err, "new webdav") } storageImpl = storageImpl1 - } - files, err := storageImpl.ReadDir(targetDir) + } + files, err := storageImpl.ReadDir(series.TargetDir) if err != nil { - return errors.Wrapf(err, "read dir %s", targetDir) + return errors.Wrapf(err, "read dir %s", series.TargetDir) } numRe := regexp.MustCompile("[0-9]+") epRe := regexp.MustCompile("E[0-9]+") for _, in := range files { - if !in.IsDir() {//season dir, ignore file + if !in.IsDir() { //season dir, ignore file continue } nums := numRe.FindAllString(in.Name(), -1) @@ -170,4 +170,4 @@ func (s *Server) checkFileExists(series *ent.Series) error{ type Task struct { Processing bool pkg.Torrent -} \ No newline at end of file +} diff --git a/ui/lib/main.dart b/ui/lib/main.dart index 32732b8..818c78d 100644 --- a/ui/lib/main.dart +++ b/ui/lib/main.dart @@ -55,7 +55,9 @@ class MyApp extends StatelessWidget { final SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.remove('token'); - context.go(LoginScreen.route); + if (context.mounted) { + context.go(LoginScreen.route); + } }, icon: const Icon(Icons.exit_to_app)) : Container() @@ -115,22 +117,20 @@ class MyApp extends StatelessWidget { return ProviderScope( child: MaterialApp.router( title: 'Polaris', - theme: ThemeData( - - // Define the default TextTheme. Use this to specify the default - // text styling for headlines, titles, bodies of text, and more. - // textTheme: const TextTheme( - // bodyLarge: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), - // bodyMedium: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), - // bodySmall: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), - // titleLarge: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), - // titleMedium: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), - // titleSmall: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), - // labelLarge: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), - // labelMedium: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), - // labelSmall: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), - // ), + // Define the default TextTheme. Use this to specify the default + // text styling for headlines, titles, bodies of text, and more. + // textTheme: const TextTheme( + // bodyLarge: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), + // bodyMedium: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), + // bodySmall: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), + // titleLarge: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), + // titleMedium: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), + // titleSmall: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), + // labelLarge: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), + // labelMedium: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), + // labelSmall: TextStyle(fontFamilyFallback: ["PingFang SC", "Heiti SC"]), + // ), colorScheme: ColorScheme.fromSeed( seedColor: Colors.blue, brightness: Brightness.dark),