diff --git a/server/activity.go b/server/activity.go new file mode 100644 index 0000000..4fad8cc --- /dev/null +++ b/server/activity.go @@ -0,0 +1,7 @@ +package server + +import "github.com/gin-gonic/gin" + +func (s *Server) GetRunningActivities(c *gin.Context) (interface{}, error) { + return nil, nil +} \ No newline at end of file diff --git a/server/server.go b/server/server.go index 1d16fae..1101107 100644 --- a/server/server.go +++ b/server/server.go @@ -57,6 +57,7 @@ func (s *Server) Serve() error { tv.POST("/watchlist", HttpHandler(s.AddWatchlist)) tv.GET("/watchlist", HttpHandler(s.GetWatchlist)) tv.GET("/series/:id", HttpHandler(s.GetTvDetails)) + tv.GET("/resolutions", HttpHandler(s.GetAvailableResolutions)) } indexer := api.Group("/indexer") { diff --git a/server/watchlist.go b/server/watchlist.go index ec56ada..f63b0fd 100644 --- a/server/watchlist.go +++ b/server/watchlist.go @@ -28,8 +28,9 @@ func (s *Server) SearchTvSeries(c *gin.Context) (interface{}, error) { } type addWatchlistIn struct { - TmdbID int `json:"id" binding:"required"` - StorageID int `json:"storage_id"` + TmdbID int `json:"tmdb_id" binding:"required"` + StorageID int `json:"storage_id" binding:"required"` + Resolution db.ResolutionType `json:"resolution" binding:"required"` } func (s *Server) AddWatchlist(c *gin.Context) (interface{}, error) { @@ -99,3 +100,11 @@ func (s *Server) GetTvDetails(c *gin.Context) (interface{}, error) { detail := s.db.GetSeriesDetails(id) return detail, nil } + +func (s *Server) GetAvailableResolutions(c *gin.Context) (interface{}, error) { + return []db.ResolutionType{ + db.R720p, + db.R1080p, + db.R4k, + }, nil +} \ No newline at end of file diff --git a/ui/lib/providers/welcome_data.dart b/ui/lib/providers/welcome_data.dart index db8f6ef..9dfdd20 100644 --- a/ui/lib/providers/welcome_data.dart +++ b/ui/lib/providers/welcome_data.dart @@ -28,10 +28,14 @@ class SearchPageData extends AutoDisposeAsyncNotifier> { return list; } - Future submit2Watchlist(int id) async { + Future submit2Watchlist(int tmdbId, int storageId, String resolution) async { final dio = await APIs.getDio(); var resp = await dio - .post(APIs.watchlistUrl, data: {"id": id, "folder": "/downloads"}); + .post(APIs.watchlistUrl, data: { + "tmdb_id": tmdbId, + "storage_id": storageId, + "resolution": resolution + }); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; diff --git a/ui/lib/search.dart b/ui/lib/search.dart index c58b656..62b1f32 100644 --- a/ui/lib/search.dart +++ b/ui/lib/search.dart @@ -90,9 +90,8 @@ class _SearchPageState extends ConsumerState { } Future _showSubmitDialog(BuildContext context, SearchResult item) { - TextEditingController resolutionController = - TextEditingController(text: "1080p"); - TextEditingController storageController = TextEditingController(); + String _resSelected = "1080p"; + int _storageSelected = 0; var storage = ref.watch(storageSettingProvider); return showDialog( context: context, @@ -104,22 +103,32 @@ class _SearchPageState extends ConsumerState { children: [ DropdownMenu( label: const Text("清晰度"), - controller: resolutionController, + initialSelection: _resSelected, dropdownMenuEntries: const [ DropdownMenuEntry(value: "720p", label: "720p"), DropdownMenuEntry(value: "1080p", label: "1080p"), DropdownMenuEntry(value: "4k", label: "4k"), ], + onSelected: (value) { + setState(() { + _resSelected = value!; + }); + }, ), storage.when( data: (v) { return DropdownMenu( label: const Text("存储位置"), - controller: storageController, + initialSelection: _storageSelected, dropdownMenuEntries: v .map((s) => DropdownMenuEntry(label: s.name!, value: s.id)) .toList(), + onSelected: (value) { + setState(() { + _storageSelected = value!; + }); + }, ); }, error: (err, trace) => Text("$err"), @@ -144,7 +153,7 @@ class _SearchPageState extends ConsumerState { onPressed: () { ref .read(searchPageDataProvider.notifier) - .submit2Watchlist(item.id!); + .submit2Watchlist(item.id!, _storageSelected, _resSelected); Navigator.of(context).pop(); }, ),