diff --git a/Makefile b/Makefile index e837f0a..5e86870 100644 --- a/Makefile +++ b/Makefile @@ -2,5 +2,5 @@ windows: @echo "Building for Windows..." - go build -tags c -ldflags="-X polaris/db.Version=$(git describe --tags --long)" -buildmode=c-shared -o ui/windows/libpolaris.dll ./cmd/binding + go build -tags lib -ldflags="-X polaris/db.Version=$(git describe --tags --long)" -buildmode=c-shared -o ui/windows/libpolaris.dll ./cmd/binding cd ui && flutter build windows \ No newline at end of file diff --git a/db/const.go b/db/const.go index 59b7906..82ce09c 100644 --- a/db/const.go +++ b/db/const.go @@ -1,9 +1,12 @@ package db -import "polaris/ent/media" +import ( + "polaris/ent/media" + "polaris/pkg/utils" +) var ( - Version = "undefined" + Version = "undefined" DefaultTmdbApiKey = "" ) @@ -37,9 +40,12 @@ const ( const ( IndexerTorznabImpl = "torznab" - DataPath = "./data" - ImgPath = DataPath + "/img" - LogPath = DataPath + "/logs" +) + +var ( + DataPath = utils.GetUserDataDir() + ImgPath = DataPath + "/img" + LogPath = DataPath + "/logs" ) const ( @@ -49,7 +55,7 @@ const ( const DefaultNamingFormat = "{{.NameCN}} {{.NameEN}} {{if .Year}} ({{.Year}}) {{end}}" -//https://en.wikipedia.org/wiki/Video_file_format +// https://en.wikipedia.org/wiki/Video_file_format var defaultAcceptedVideoFormats = []string{ ".webm", ".mkv", ".flv", ".vob", ".ogv", ".ogg", ".drc", ".mng", ".avi", ".mts", ".m2ts", ".ts", ".mov", ".qt", ".wmv", ".yuv", ".rm", ".rmvb", ".viv", ".amv", ".mp4", ".m4p", ".m4v", diff --git a/log/log.go b/log/log.go index 98b0a4e..f3e5b57 100644 --- a/log/log.go +++ b/log/log.go @@ -3,6 +3,7 @@ package log import ( "os" "path/filepath" + "polaris/pkg/utils" "strings" "github.com/natefinch/lumberjack" @@ -13,9 +14,6 @@ import ( var sugar *zap.SugaredLogger var atom zap.AtomicLevel -const dataPath = "./data" - - func init() { InitLogger(false) } @@ -27,7 +25,7 @@ func InitLogger(toFile bool) { w := zapcore.Lock(os.Stdout) if toFile { w = zapcore.AddSync(&lumberjack.Logger{ - Filename: filepath.Join(dataPath, "logs", "polaris.log"), + Filename: filepath.Join(utils.GetUserDataDir(), "logs", "polaris.log"), MaxSize: 50, // megabytes MaxBackups: 3, MaxAge: 30, // days diff --git a/pkg/utils/dir_lib.go b/pkg/utils/dir_lib.go new file mode 100644 index 0000000..1ad3e39 --- /dev/null +++ b/pkg/utils/dir_lib.go @@ -0,0 +1,21 @@ +//go:build lib + +package utils + +import ( + "os" + "path/filepath" +) + + +func GetUserDataDir() string { + d, err := os.UserHomeDir() + if err != nil { + panic(err) + } + d = filepath.Join(d, ".polaris") + if _, err := os.Stat(d); os.IsNotExist(err) { + os.MkdirAll(d, os.ModePerm) + } + return d +} \ No newline at end of file diff --git a/pkg/utils/dir_other.go b/pkg/utils/dir_other.go new file mode 100644 index 0000000..711d9c0 --- /dev/null +++ b/pkg/utils/dir_other.go @@ -0,0 +1,7 @@ +//go:build !lib + +package utils + +func GetUserDataDir() string { + return "./data" +} \ No newline at end of file diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index e038c58..10bd86a 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -247,7 +247,7 @@ func GetRealLinkAndHash(link string) (string, string, error) { if err != nil { return "", "", errors.Wrap(err, "parse response") } - return link,info.HashInfoBytes().HexString(), nil + return link, info.HashInfoBytes().HexString(), nil } func Link2Magnet(link string) (string, error) { diff --git a/server/server.go b/server/server.go index 9abf117..37d2a6e 100644 --- a/server/server.go +++ b/server/server.go @@ -101,7 +101,7 @@ func (s *Server) setupRoutes() { tv.POST("/tv/watchlist", HttpHandler(s.AddTv2Watchlist)) tv.GET("/tv/watchlist", HttpHandler(s.GetTvWatchlist)) tv.POST("/torrents", HttpHandler(s.SearchAvailableTorrents)) - tv.POST("/torrents/download/", HttpHandler(s.DownloadTorrent)) + tv.POST("/torrents/download", HttpHandler(s.DownloadTorrent)) tv.POST("/movie/watchlist", HttpHandler(s.AddMovie2Watchlist)) tv.GET("/movie/watchlist", HttpHandler(s.GetMovieWatchlist)) tv.GET("/record/:id", HttpHandler(s.GetMediaDetails)) diff --git a/ui/embed.go b/ui/embed.go index e729db2..dcf8a9b 100644 --- a/ui/embed.go +++ b/ui/embed.go @@ -1,4 +1,4 @@ -//go:build !c +//go:build !lib package ui import "embed" diff --git a/ui/embed_c.go b/ui/embed_c.go index 50e8271..473f054 100644 --- a/ui/embed_c.go +++ b/ui/embed_c.go @@ -1,4 +1,4 @@ -//go:build c +//go:build lib package ui import "embed" diff --git a/ui/lib/providers/APIs.dart b/ui/lib/providers/APIs.dart index aafd624..5929e01 100644 --- a/ui/lib/providers/APIs.dart +++ b/ui/lib/providers/APIs.dart @@ -5,7 +5,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:ui/providers/server_response.dart'; -import 'package:ui/widgets/utils.dart'; class APIs { static int port = 8096; @@ -32,7 +31,7 @@ class APIs { static final allDownloadClientsUrl = "$_baseUrl/api/v1/downloader"; static final addDownloadClientUrl = "$_baseUrl/api/v1/downloader/add"; static final delDownloadClientUrl = "$_baseUrl/api/v1/downloader/del/"; - static final storageUrl = "$_baseUrl/api/v1/storage/"; + static final storageUrl = "$_baseUrl/api/v1/storage"; static final loginUrl = "$_baseUrl/api/login"; static final logoutUrl = "$_baseUrl/api/v1/setting/logout"; static final loginSettingUrl = "$_baseUrl/api/v1/setting/auth"; @@ -46,12 +45,12 @@ class APIs { static final changeMonitoringUrl = "$_baseUrl/api/v1/setting/monitoring"; static final addImportlistUrl = "$_baseUrl/api/v1/importlist/add"; static final deleteImportlistUrl = "$_baseUrl/api/v1/importlist/delete"; - static final getAllImportlists = "$_baseUrl/api/v1/importlist/"; + static final getAllImportlists = "$_baseUrl/api/v1/importlist"; static final prowlarrUrl = "$_baseUrl/api/v1/setting/prowlarr"; static final notifierAllUrl = "$_baseUrl/api/v1/notifier/all"; static final notifierDeleteUrl = "$_baseUrl/api/v1/notifier/id/"; - static final notifierAddUrl = "$_baseUrl/api/v1/notifier/add/"; + static final notifierAddUrl = "$_baseUrl/api/v1/notifier/add"; static final tmdbImgBaseUrl = "$_baseUrl/api/v1/posters"; @@ -85,14 +84,21 @@ class APIs { var dio = Dio(); dio.options.followRedirects = true; dio.interceptors.add(InterceptorsWrapper( - onError: (error, handler) { + onError: (error, handler) async { if (error.response?.statusCode != null && error.response?.statusCode! == 403) { + //not login final context = navigatorKey.currentContext; if (context != null) { context.go('/login'); } } + + if (error.response?.statusCode == 307) { + final redirectUrl = error.response!.headers['Location']!.first; + final newResponse = await dio.get(_baseUrl+redirectUrl); + return handler.resolve(newResponse); // 返回修正后的响应 + } return handler.next(error); }, )); diff --git a/ui/lib/providers/activity.dart b/ui/lib/providers/activity.dart index e84f4e4..51ae63c 100644 --- a/ui/lib/providers/activity.dart +++ b/ui/lib/providers/activity.dart @@ -111,8 +111,8 @@ class Activity { final String? saved; final int? progress; final int? size; - final double? seedRatio; - final double? uploadProgress; + final num? seedRatio; + final num? uploadProgress; factory Activity.fromJson(Map json) { return Activity( diff --git a/ui/lib/providers/series_details.dart b/ui/lib/providers/series_details.dart index 8b9b354..ed56721 100644 --- a/ui/lib/providers/series_details.dart +++ b/ui/lib/providers/series_details.dart @@ -251,7 +251,7 @@ class MediaTorrentResource extends AutoDisposeFamilyAsyncNotifier< "season": arg.seasonNumber, "episode": arg.episodeNumber }); - final dio = await APIs.getDio(); + final dio = APIs.getDio(); var resp = await dio.post(APIs.downloadTorrentUrl, data: data); var rsp = ServerResponse.fromJson(resp.data); if (rsp.code != 0) { diff --git a/ui/lib/providers/settings.dart b/ui/lib/providers/settings.dart index a3d6d63..cb13318 100644 --- a/ui/lib/providers/settings.dart +++ b/ui/lib/providers/settings.dart @@ -315,7 +315,7 @@ class StorageSettingData extends AutoDisposeAsyncNotifier> { Future deleteStorage(int id) async { final dio = await APIs.getDio(); - var resp = await dio.delete("${APIs.storageUrl}$id"); + var resp = await dio.delete("${APIs.storageUrl}/$id"); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; diff --git a/ui/lib/system_page.dart b/ui/lib/system_page.dart index 8bf457c..688fb33 100644 --- a/ui/lib/system_page.dart +++ b/ui/lib/system_page.dart @@ -93,7 +93,7 @@ class _SystemPageState extends ConsumerState { ]), DataRow(cells: [ const DataCell(Text("更新监控列表")), - const DataCell(Text("每小时")), + const DataCell(Text("每20分钟")), DataCell(IconButton( icon: const Icon(Icons.not_started), onPressed: () =>