From b5b44f8ac44a43a84ec0603de4fa6dc0025f6ed3 Mon Sep 17 00:00:00 2001 From: cxfksword <718792+cxfksword@users.noreply.github.com> Date: Wed, 3 Jul 2024 21:46:39 +0800 Subject: [PATCH] fix: new episode not auto download danmu. close #45 --- .../LibraryManagerEventsHelper.cs | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/Jellyfin.Plugin.Danmu/LibraryManagerEventsHelper.cs b/Jellyfin.Plugin.Danmu/LibraryManagerEventsHelper.cs index 880e03c..4ca6d0e 100644 --- a/Jellyfin.Plugin.Danmu/LibraryManagerEventsHelper.cs +++ b/Jellyfin.Plugin.Danmu/LibraryManagerEventsHelper.cs @@ -647,8 +647,63 @@ public class LibraryManagerEventsHelper : IDisposable // 判断epid,有的话刷新弹幕文件 if (eventType == EventType.Update) { + var queueUpdateMeta = new List(); foreach (var item in episodes) { + // 如果 Episode 没有弹幕元数据,但 Season 有弹幕元数据,表示该集是刮削完成后再新增的,需要重新匹配获取 + var scrapers = this._scraperManager.All(); + var season = item.Season; + var allDanmuProviderIds = scrapers.Select(x => x.ProviderId).ToList(); + var episodeFirstProviderId = allDanmuProviderIds.FirstOrDefault(x => !string.IsNullOrEmpty(item.GetProviderId(x))); + var seasonFirstProviderId = allDanmuProviderIds.FirstOrDefault(x => !string.IsNullOrEmpty(season.GetProviderId(x))); + if (string.IsNullOrEmpty(episodeFirstProviderId) && !string.IsNullOrEmpty(seasonFirstProviderId) && item.IndexNumber.HasValue) + { + var scraper = scrapers.First(x => x.ProviderId == seasonFirstProviderId); + var providerVal = season.GetProviderId(seasonFirstProviderId); + var media = await scraper.GetMedia(season, providerVal); + if (media != null) + { + var fileName = Path.GetFileName(item.Path); + var indexNumber = item.IndexNumber ?? 0; + if (indexNumber <= 0) + { + this._logger.LogInformation("[{0}]匹配失败,缺少集号. [{1}]{2}", scraper.Name, season.Name, fileName); + continue; + } + + if (indexNumber > media.Episodes.Count) + { + this._logger.LogInformation("[{0}]匹配失败,集号超过总集数,可能识别集号错误. [{1}]{2} indexNumber: {3}", scraper.Name, season.Name, fileName, indexNumber); + continue; + } + + if (this.Config.DownloadOption.EnableEpisodeCountSame && media.Episodes.Count != episodes.Count) + { + this._logger.LogInformation("[{0}]刷新弹幕失败, 集数不一致。video: {1}.{2} 弹幕数:{3} 集数:{4}", scraper.Name, indexNumber, item.Name, media.Episodes.Count, episodes.Count); + continue; + } + + var idx = indexNumber - 1; + var epId = media.Episodes[idx].Id; + var commentId = media.Episodes[idx].CommentId; + this._logger.LogInformation("[{0}]成功匹配. {1}.{2} -> epId: {3} cid: {4}", scraper.Name, item.IndexNumber, item.Name, epId, commentId); + + // 更新 eposide 元数据 + var episodeProviderVal = item.GetProviderId(scraper.ProviderId); + if (!string.IsNullOrEmpty(epId) && episodeProviderVal != epId) + { + item.SetProviderId(scraper.ProviderId, epId); + queueUpdateMeta.Add(item); + } + + // 下载弹幕 + await this.DownloadDanmu(scraper, item, commentId).ConfigureAwait(false); + continue; + } + } + + + // 刷新弹幕 foreach (var scraper in _scraperManager.All()) { try @@ -678,6 +733,8 @@ public class LibraryManagerEventsHelper : IDisposable } } + // 保存元数据 + await ProcessQueuedUpdateMeta(queueUpdateMeta).ConfigureAwait(false); } @@ -776,7 +833,6 @@ public class LibraryManagerEventsHelper : IDisposable item.ProviderIds[pair.Key] = pair.Value; } - // Console.WriteLine(JsonSerializer.Serialize(item)); await item.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); } }