From 9c6aa56db053bcac57096eae4a6270882229a4a1 Mon Sep 17 00:00:00 2001 From: DarkFighterLuke Date: Mon, 26 May 2025 23:38:04 +0200 Subject: [PATCH] Fix JFToTubearchivistProgressSyncTask --- .../JFToTubeArchivistProgressSyncTask.cs | 194 +++++++++--------- 1 file changed, 92 insertions(+), 102 deletions(-) diff --git a/Jellyfin.Plugin.TubeArchivistMetadata/Tasks/JFToTubeArchivistProgressSyncTask.cs b/Jellyfin.Plugin.TubeArchivistMetadata/Tasks/JFToTubeArchivistProgressSyncTask.cs index 2e1908b..cc04711 100644 --- a/Jellyfin.Plugin.TubeArchivistMetadata/Tasks/JFToTubeArchivistProgressSyncTask.cs +++ b/Jellyfin.Plugin.TubeArchivistMetadata/Tasks/JFToTubeArchivistProgressSyncTask.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Threading; using System.Threading.Tasks; using Jellyfin.Data.Enums; @@ -45,7 +46,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Tasks public string Name => "JFToTubeArchivistProgressSyncTask"; /// - public string Description => "This tasks syncs TubeArchivist playback progresses to Jellyfin"; + public string Description => "This tasks syncs Jellyfin playback progresses to TubeArchivist"; /// public string Category => "TubeArchivistMetadata"; @@ -63,54 +64,52 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Tasks _logger.LogInformation("Starting Jellyfin->TubeArchivist playback progresses synchronization."); var taApi = TubeArchivistApi.GetInstance(); var videosCount = 0; - foreach (var jfUsername in Plugin.Instance!.Configuration.GetJFUsernamesToArray()) + var jfUsername = Plugin.Instance!.Configuration.JFUsernameFrom; + var user = _userManager.GetUserByName(jfUsername); + if (user == null) { - var user = _userManager.GetUserByName(jfUsername); - if (user == null) - { - _logger.LogInformation("{Message}", $"Jellyfin user with username {jfUsername} not found"); - continue; - } + _logger.LogInformation("{Message}", $"Jellyfin user with username {jfUsername} not found"); + return; + } - var collectionItem = _libraryManager.GetItemList(new InternalItemsQuery - { - Name = Plugin.Instance?.Configuration.CollectionTitle, - IncludeItemTypes = new[] { BaseItemKind.CollectionFolder } - }).FirstOrDefault(); + var collectionItem = _libraryManager.GetItemList(new InternalItemsQuery + { + Name = Plugin.Instance?.Configuration.CollectionTitle, + IncludeItemTypes = new[] { BaseItemKind.CollectionFolder } + }).FirstOrDefault(); - if (collectionItem == null) + if (collectionItem == null) + { + var message = $"Collection '{Plugin.Instance?.Configuration.CollectionTitle}' not found."; + _logger.LogCritical("{Message}", message); + } + else + { + var collection = (CollectionFolder)collectionItem; + var channels = collection.GetChildren(user, false, new InternalItemsQuery { - var message = $"Collection '{Plugin.Instance?.Configuration.CollectionTitle}' not found."; - _logger.LogCritical("{Message}", message); - } - else + IncludeItemTypes = new[] { BaseItemKind.Series } + }); + _logger.LogInformation("Analyzing collection {Id} with name {Name}", collectionItem.Id, collectionItem.Name); + _logger.LogDebug("Found {Message} channels", channels.Count); + + foreach (Series channel in channels) { - var collection = (CollectionFolder)collectionItem; - var channels = collection.GetChildren(user, false, new InternalItemsQuery + var channelYTId = Utils.GetChannelNameFromPath(channel.Path); + var years = channel.GetChildren(user, false, new InternalItemsQuery { - IncludeItemTypes = new[] { BaseItemKind.Series } + IncludeItemTypes = new[] { BaseItemKind.Season } }); - _logger.LogInformation("Analyzing collection {Id} with name {Name}", collectionItem.Id, collectionItem.Name); - _logger.LogDebug("Found {Message} channels", channels.Count); + _logger.LogDebug("Found {Years} years in channel {ChannelName}", years.Count, channel.Name); - foreach (Series channel in channels) + foreach (Season year in years) { - var channelYTId = Utils.GetChannelNameFromPath(channel.Path); - var years = channel.GetChildren(user, false, new InternalItemsQuery + var videos = year.GetChildren(user, false, new InternalItemsQuery { - IncludeItemTypes = new[] { BaseItemKind.Season } + IncludeItemTypes = new[] { BaseItemKind.Episode } }); - _logger.LogDebug("Found {Years} years in channel {ChannelName}", years.Count, channel.Name); - - foreach (Season year in years) - { - var videos = year.GetChildren(user, false, new InternalItemsQuery - { - IncludeItemTypes = new[] { BaseItemKind.Episode } - }); - _logger.LogDebug("Found {Videos} videos in year {YearName} of the channel {ChannelName}", videos.Count, year.Name, channel.Name); - videosCount += videos.Count; - } + _logger.LogDebug("Found {Videos} videos in year {YearName} of the channel {ChannelName}", videos.Count, year.Name, channel.Name); + videosCount += videos.Count; } } } @@ -118,91 +117,82 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Tasks _logger.LogInformation("Found a total of {VideosCount} videos", videosCount); var processedVideosCount = 0; - foreach (var jfUsername in Plugin.Instance!.Configuration.GetJFUsernamesToArray()) + if (collectionItem == null) { - var user = _userManager.GetUserByName(jfUsername); - if (user == null) + var message = $"Collection '{Plugin.Instance?.Configuration.CollectionTitle}' not found."; + _logger.LogCritical("{Message}", message); + } + else + { + var collection = (CollectionFolder)collectionItem; + var channels = collection.GetChildren(user, false, new InternalItemsQuery { - _logger.LogInformation("{Message}", $"Jellyfin user with username {jfUsername} not found"); - continue; - } + IncludeItemTypes = new[] { BaseItemKind.Series } + }); - var collectionItem = _libraryManager.GetItemList(new InternalItemsQuery + foreach (Series channel in channels) { - Name = Plugin.Instance?.Configuration.CollectionTitle, - IncludeItemTypes = new[] { BaseItemKind.CollectionFolder } - }).FirstOrDefault(); - - if (collectionItem == null) - { - var message = $"Collection '{Plugin.Instance?.Configuration.CollectionTitle}' not found."; - _logger.LogCritical("{Message}", message); - } - else - { - var collection = (CollectionFolder)collectionItem; - var channels = collection.GetChildren(user, false, new InternalItemsQuery + var channelYTId = Utils.GetChannelNameFromPath(channel.Path); + var isChannelWatched = false; + var isChannelCheckedForWatched = false; + var years = channel.GetChildren(user, false, new InternalItemsQuery { - IncludeItemTypes = new[] { BaseItemKind.Series } + IncludeItemTypes = new[] { BaseItemKind.Season } }); - foreach (Series channel in channels) + foreach (Season year in years) { - var channelYTId = Utils.GetChannelNameFromPath(channel.Path); - var isChannelWatched = false; - var isChannelCheckedForWatched = false; - var years = channel.GetChildren(user, false, new InternalItemsQuery + var videos = year.GetChildren(user, false, new InternalItemsQuery { - IncludeItemTypes = new[] { BaseItemKind.Season } + IncludeItemTypes = new[] { BaseItemKind.Episode } }); + videosCount += videos.Count; - foreach (Season year in years) + foreach (Episode video in videos) { - var videos = year.GetChildren(user, false, new InternalItemsQuery - { - IncludeItemTypes = new[] { BaseItemKind.Episode } - }); - videosCount += videos.Count; + var videoYTId = Utils.GetVideoNameFromPath(video.Path); + _logger.LogInformation("{VideoYtId}", videoYTId); + HttpStatusCode statusCode; - foreach (Episode video in videos) + if (!isChannelCheckedForWatched && channel.IsPlayed(user)) { - var videoYTId = Utils.GetVideoNameFromPath(video.Path); - var playbackProgress = _userDataManager.GetUserData(user, video).PlaybackPositionTicks / TimeSpan.TicksPerSecond; - var statusCode = await taApi.SetProgress(videoYTId, playbackProgress).ConfigureAwait(true); + var isChannelPlayed = channel.IsPlayed(user); + statusCode = await taApi.SetWatchedStatus(channelYTId, isChannelPlayed).ConfigureAwait(true); if (statusCode != System.Net.HttpStatusCode.OK) { - _logger.LogCritical("{Message}", $"POST /video/{videoYTId}/progress returned {statusCode} for video {video.Name} with progress {progress} seconds"); + _logger.LogCritical("{Message}", $"POST /watched returned {statusCode} for channel {channel.Name} ({channelYTId}) with wacthed status {isChannelPlayed}"); } - - if (!isChannelCheckedForWatched && channel.IsPlayed(user)) + else { - var isChannelPlayed = channel.IsPlayed(user); - statusCode = await taApi.SetWatchedStatus(channelYTId, isChannelPlayed).ConfigureAwait(true); - if (statusCode != System.Net.HttpStatusCode.OK) - { - _logger.LogCritical("{Message}", $"POST /watched returned {statusCode} for channel {channel.Name} ({channelYTId}) with wacthed status {isChannelPlayed}"); - } - else - { - isChannelWatched = true; - } - - isChannelCheckedForWatched = true; + isChannelWatched = true; } - if (!isChannelWatched) - { - var isVideoPlayed = video.IsPlayed(user); - statusCode = await taApi.SetWatchedStatus(videoYTId, isVideoPlayed).ConfigureAwait(true); - if (statusCode != System.Net.HttpStatusCode.OK) - { - _logger.LogCritical("{Message}", $"POST /watched returned {statusCode} for video {video.Name} ({videoYTId}) with wacthed status {isVideoPlayed}"); - } - } - - processedVideosCount++; - progress.Report(processedVideosCount * 100 / videosCount); + isChannelCheckedForWatched = true; } + + if (!isChannelWatched) + { + var isVideoPlayed = video.IsPlayed(user); + statusCode = await taApi.SetWatchedStatus(videoYTId, isVideoPlayed).ConfigureAwait(true); + if (statusCode != System.Net.HttpStatusCode.OK) + { + _logger.LogCritical("{Message}", $"POST /watched returned {statusCode} for video {video.Name} ({videoYTId}) with wacthed status {isVideoPlayed}"); + } + + _logger.LogInformation("{Message}", isVideoPlayed); + if (!isVideoPlayed) + { + var playbackProgress = _userDataManager.GetUserData(user, video).PlaybackPositionTicks / TimeSpan.TicksPerSecond; + statusCode = await taApi.SetProgress(videoYTId, playbackProgress).ConfigureAwait(true); + if (statusCode != System.Net.HttpStatusCode.OK) + { + _logger.LogCritical("{Message}", $"POST /video/{videoYTId}/progress returned {statusCode} for video {video.Name} with progress {progress} seconds"); + } + } + } + + processedVideosCount++; + progress.Report(processedVideosCount * 100 / videosCount); } } }