From 1340305f2de180a4f5ad974ac3efc7401de2afa2 Mon Sep 17 00:00:00 2001 From: Simon Ding Date: Wed, 31 Jul 2024 16:55:01 +0800 Subject: [PATCH] feat: change progress display --- server/watchlist.go | 42 ++++++++++++++++++++---------- ui/lib/providers/welcome_data.dart | 36 +++++++++++++------------ ui/lib/welcome_page.dart | 7 ++--- 3 files changed, 51 insertions(+), 34 deletions(-) diff --git a/server/watchlist.go b/server/watchlist.go index 02d234d..6f51bf6 100644 --- a/server/watchlist.go +++ b/server/watchlist.go @@ -247,7 +247,8 @@ func (s *Server) downloadImage(url string, mediaID int, name string) error { type MediaWithStatus struct { *ent.Media - Status string `json:"status"` + MonitoredNum int `json:"monitored_num"` + DownloadedNum int `json:"downloaded_num"` } //missing: episode aired missing @@ -260,26 +261,38 @@ func (s *Server) GetTvWatchlist(c *gin.Context) (interface{}, error) { res := make([]MediaWithStatus, len(list)) for i, item := range list { var ms = MediaWithStatus{ - Media: item, - Status: "downloaded", + Media: item, + MonitoredNum: 0, + DownloadedNum: 0, } details := s.db.GetMediaDetails(item.ID) + for _, ep := range details.Episodes { + monitored := false if ep.SeasonNumber == 0 { continue } - t, err := time.Parse("2006-01-02", ep.AirDate) - if err != nil { //airdate not exist - ms.Status = "monitoring" + if item.DownloadHistoryEpisodes { + monitored = true } else { - if item.CreatedAt.Sub(t) > 24*time.Hour { //剧集在加入watchlist之前,不去下载 - continue - } - if ep.Status == episode.StatusMissing { - ms.Status = "monitoring" + t, err := time.Parse("2006-01-02", ep.AirDate) + if err != nil { //airdate not exist, maybe airdate not set yet + monitored = true + } else { + if item.CreatedAt.Sub(t) > 24*time.Hour { //剧集在加入watchlist之前,不去下载 + continue + } + monitored = true } } + if monitored { + ms.MonitoredNum++ + if ep.Status == episode.StatusDownloaded { + ms.DownloadedNum++ + } + } + } res[i] = ms } @@ -292,14 +305,15 @@ func (s *Server) GetMovieWatchlist(c *gin.Context) (interface{}, error) { for i, item := range list { var ms = MediaWithStatus{ Media: item, - Status: "monitoring", + MonitoredNum: 1, + DownloadedNum: 0, } dummyEp, err := s.db.GetMovieDummyEpisode(item.ID) if err != nil { log.Errorf("get dummy episode: %v", err) } else { - if dummyEp.Status != episode.StatusMissing { - ms.Status = "downloaded" + if dummyEp.Status == episode.StatusDownloaded { + ms.DownloadedNum++ } } res[i] = ms diff --git a/ui/lib/providers/welcome_data.dart b/ui/lib/providers/welcome_data.dart index 5157022..0625fd8 100644 --- a/ui/lib/providers/welcome_data.dart +++ b/ui/lib/providers/welcome_data.dart @@ -7,7 +7,7 @@ import 'package:ui/providers/APIs.dart'; import 'package:ui/providers/server_response.dart'; final tvWatchlistDataProvider = FutureProvider.autoDispose((ref) async { - final dio = APIs.getDio(); + final dio = APIs.getDio(); var resp = await dio.get(APIs.watchlistTvUrl); var sp = ServerResponse.fromJson(resp.data); List favList = List.empty(growable: true); @@ -155,22 +155,23 @@ class MediaDetail { String? resolution; int? storageId; String? airDate; - String? status; + int? monitoredNum; + int? downloadedNum; - MediaDetail({ - this.id, - this.tmdbId, - this.mediaType, - this.name, - this.originalName, - this.overview, - this.posterPath, - this.createdAt, - this.resolution, - this.storageId, - this.airDate, - this.status, - }); + MediaDetail( + {this.id, + this.tmdbId, + this.mediaType, + this.name, + this.originalName, + this.overview, + this.posterPath, + this.createdAt, + this.resolution, + this.storageId, + this.airDate, + this.monitoredNum, + this.downloadedNum}); MediaDetail.fromJson(Map json) { id = json['id']; @@ -184,7 +185,8 @@ class MediaDetail { resolution = json["resolution"]; storageId = json["storage_id"]; airDate = json["air_date"]; - status = json["status"]; + monitoredNum = json["monitored_num"]??0; + downloadedNum = json["download_num"]??0; } } diff --git a/ui/lib/welcome_page.dart b/ui/lib/welcome_page.dart index 18579d8..4ad31a1 100644 --- a/ui/lib/welcome_page.dart +++ b/ui/lib/welcome_page.dart @@ -40,7 +40,7 @@ class WelcomePage extends ConsumerWidget { )) ] : List.generate(value.length, (i) { - var item = value[i]; + final item = value[i]; return Card( margin: const EdgeInsets.all(4), clipBehavior: Clip.hardEdge, @@ -68,14 +68,15 @@ class WelcomePage extends ConsumerWidget { children: [ LinearProgressIndicator( value: 1, - color: item.status == "downloaded" + color: item.downloadedNum == + item.monitoredNum ? Colors.green : Colors.blue, ), Text( item.name!, overflow: TextOverflow.ellipsis, - style: const TextStyle( + style: const TextStyle( fontSize: 14, fontWeight: FontWeight.bold, height: 2.5),