diff --git a/db/db.go b/db/db.go index 758a94d..9b721c7 100644 --- a/db/db.go +++ b/db/db.go @@ -552,3 +552,8 @@ func (c *Client) GetMovieDummyEpisode(movieId int) (*ent.Episode, error) { func (c *Client) GetDownloadClient(id int) (*ent.DownloadClients, error) { return c.ent.DownloadClients.Query().Where(downloadclients.ID(id)).First(context.Background()) } + + +func (c *Client) SetEpisodeMonitoring(id int, b bool) error { + return c.ent.Episode.Update().Where(episode.ID(id)).SetMonitored(b).Exec(context.Background()) +} \ No newline at end of file diff --git a/server/server.go b/server/server.go index e7b7974..baad115 100644 --- a/server/server.go +++ b/server/server.go @@ -67,6 +67,7 @@ func (s *Server) Serve() error { setting.GET("/about", HttpHandler(s.About)) setting.POST("/parse/tv", HttpHandler(s.ParseTv)) setting.POST("/parse/movie", HttpHandler(s.ParseMovie)) + setting.POST("/monitoring", HttpHandler(s.ChangeEpisodeMonitoring)) } activity := api.Group("/activity") { diff --git a/server/setting.go b/server/setting.go index fcc336a..432573f 100644 --- a/server/setting.go +++ b/server/setting.go @@ -193,3 +193,17 @@ func (s *Server) DeleteDownloadCLient(c *gin.Context) (interface{}, error) { s.db.DeleteDownloadCLient(id) return "success", nil } + +type episodeMonitoringIn struct { + EpisodeID int `json:"episode_id"` + Monitor bool `json:"monitor"` +} + +func (s *Server) ChangeEpisodeMonitoring(c *gin.Context) (interface{}, error) { + var in episodeMonitoringIn + if err := c.ShouldBindJSON(&in); err != nil { + return nil, errors.Wrap(err, "bind") + } + s.db.SetEpisodeMonitoring(in.EpisodeID, in.Monitor) + return "success", nil +} \ No newline at end of file diff --git a/ui/lib/main.dart b/ui/lib/main.dart index 7629eaa..96ee8c6 100644 --- a/ui/lib/main.dart +++ b/ui/lib/main.dart @@ -35,7 +35,8 @@ CustomTransitionPage buildPageWithDefaultTransition({ reverseTransitionDuration: Duration.zero, key: state.pageKey, child: child, - transitionsBuilder: (context, animation, secondaryAnimation, child) => child, + transitionsBuilder: (context, animation, secondaryAnimation, child) => + child, ); } @@ -123,14 +124,22 @@ class _MyAppState extends ConsumerState { child: MaterialApp.router( title: 'Polaris 影视追踪下载', theme: ThemeData( - fontFamily: "NotoSansSC", - colorScheme: ColorScheme.fromSeed( - seedColor: Colors.blueAccent, - brightness: Brightness.dark, - surface: Colors.black54), - useMaterial3: true, - //scaffoldBackgroundColor: Color.fromARGB(255, 26, 24, 24) - ), + fontFamily: "NotoSansSC", + colorScheme: ColorScheme.fromSeed( + seedColor: Colors.blueAccent, + brightness: Brightness.dark, + surface: Colors.black54), + useMaterial3: true, + //scaffoldBackgroundColor: Color.fromARGB(255, 26, 24, 24) + tooltipTheme: TooltipThemeData( + textStyle: const TextStyle( + color: Colors.grey, + ), + decoration: BoxDecoration( + color: Colors.black54, + borderRadius: BorderRadius.circular(20), + ), + )), routerConfig: router, ), ); diff --git a/ui/lib/providers/APIs.dart b/ui/lib/providers/APIs.dart index 60644bf..18c536c 100644 --- a/ui/lib/providers/APIs.dart +++ b/ui/lib/providers/APIs.dart @@ -33,6 +33,7 @@ class APIs { static final logsBaseUrl = "$_baseUrl/api/v1/logs/"; static final logFilesUrl = "$_baseUrl/api/v1/setting/logfiles"; static final aboutUrl = "$_baseUrl/api/v1/setting/about"; + static final changeMonitoringUrl = "$_baseUrl/api/v1/setting/monitoring"; static final notifierAllUrl = "$_baseUrl/api/v1/notifier/all"; static final notifierDeleteUrl = "$_baseUrl/api/v1/notifier/id/"; diff --git a/ui/lib/providers/series_details.dart b/ui/lib/providers/series_details.dart index 921b62b..cf6e4ec 100644 --- a/ui/lib/providers/series_details.dart +++ b/ui/lib/providers/series_details.dart @@ -48,6 +48,19 @@ class SeriesDetailData var name = (sp.data as Map)["name"]; return name; } + + Future changeMonitoringStatus(int episodeId, bool b) async { + final dio = APIs.getDio(); + var resp = await dio.post(APIs.changeMonitoringUrl, data: { + "episode_id": episodeId, + "monitor": b, + }); + var sp = ServerResponse.fromJson(resp.data); + if (sp.code != 0) { + throw sp.message; + } + ref.invalidateSelf(); + } } class SeriesDetails { diff --git a/ui/lib/tv_details.dart b/ui/lib/tv_details.dart index 3ff36b8..7f7a84a 100644 --- a/ui/lib/tv_details.dart +++ b/ui/lib/tv_details.dart @@ -57,15 +57,33 @@ class _TvDetailsPageState extends ConsumerState { child: Icon(Icons.download_done), ) : (ep.monitored == true - ? const Tooltip( + ? Tooltip( message: "监控中", - child: Icon(Icons.alarm), + child: IconButton( + onPressed: () { + ref + .read(mediaDetailsProvider( + widget.seriesId) + .notifier) + .changeMonitoringStatus( + ep.id!, false); + }, + icon: const Icon(Icons.alarm)), ) - : const Opacity( + : Opacity( opacity: 0.7, child: Tooltip( message: "未监控", - child: Icon(Icons.alarm_off), + child: IconButton( + onPressed: () { + ref + .read(mediaDetailsProvider( + widget.seriesId) + .notifier) + .changeMonitoringStatus( + ep.id!, true); + }, + icon: const Icon(Icons.alarm_off)), ), )))), ), @@ -88,10 +106,10 @@ class _TvDetailsPageState extends ConsumerState { const SizedBox( width: 10, ), - IconButton( + Tooltip(message: "查看可用资源",child: IconButton( onPressed: () => showAvailableTorrents(widget.seriesId, ep.seasonNumber ?? 0, ep.episodeNumber ?? 0), - icon: const Icon(Icons.manage_search)) + icon: const Icon(Icons.manage_search)),) ], )) ]); @@ -136,10 +154,10 @@ class _TvDetailsPageState extends ConsumerState { const SizedBox( width: 10, ), - IconButton( + Tooltip(message: "查看可用资源",child: IconButton( onPressed: () => showAvailableTorrents(widget.seriesId, k, 0), - icon: const Icon(Icons.manage_search)) + icon: const Icon(Icons.manage_search)),) ], )) ], rows: m[k]!), diff --git a/ui/lib/widgets/detail_card.dart b/ui/lib/widgets/detail_card.dart index 87300ea..9baa458 100644 --- a/ui/lib/widgets/detail_card.dart +++ b/ui/lib/widgets/detail_card.dart @@ -68,13 +68,10 @@ class _DetailCardState extends ConsumerState { const SizedBox( width: 30, ), - Text( + Expanded(child: Text( "${widget.details.mediaType == "tv" ? widget.details.storage!.tvPath : widget.details.storage!.moviePath}" - "${widget.details.targetDir}"), - const SizedBox( - width: 30, - ), - ], + "${widget.details.targetDir}"),) + ], ), const Divider(thickness: 1, height: 1), Text(