namespace ConfusedPolarBear.Plugin.IntroSkipper; using System; using System.Collections.ObjectModel; using System.IO; using Microsoft.Extensions.Logging; /// /// Update EDL files associated with a list of episodes. /// public static class EdlManager { private static ILogger? _logger; /// /// Initialize EDLManager with a logger. /// /// ILogger. public static void Initialize(ILogger logger) { _logger = logger; } /// /// Logs the configuration that will be used during EDL file creation. /// public static void LogConfiguration() { if (_logger is null) { throw new InvalidOperationException("Logger must not be null"); } var config = Plugin.Instance!.Configuration; if (config.EdlAction == EdlAction.None) { _logger.LogDebug("EDL action: None - taking no further action"); return; } _logger.LogDebug("EDL action: {Action}", config.EdlAction); _logger.LogDebug("Regenerate EDL files: {Regenerate}", config.RegenerateEdlFiles); } /// /// If the EDL action is set to a value other than None, update EDL files for the provided episodes. /// /// Episodes to update EDL files for. public static void UpdateEDLFiles(ReadOnlyCollection episodes) { var regenerate = Plugin.Instance!.Configuration.RegenerateEdlFiles; var action = Plugin.Instance!.Configuration.EdlAction; if (action == EdlAction.None) { _logger?.LogDebug("EDL action is set to none, not updating EDL files"); return; } _logger?.LogDebug("Updating EDL files with action {Action}", action); foreach (var episode in episodes) { var id = episode.EpisodeId; bool hasIntro = Plugin.Instance!.Intros.TryGetValue(id, out var intro) && intro.Valid; bool hasCredit = Plugin.Instance!.Credits.TryGetValue(id, out var credit) && credit.Valid; if (!hasIntro && !hasCredit) { _logger?.LogDebug("Episode {Id} has neither a valid intro nor credit, skipping", id); continue; } var edlPath = GetEdlPath(Plugin.Instance!.GetItemPath(id)); _logger?.LogTrace("Episode {Id} has EDL path {Path}", id, edlPath); if (!regenerate && File.Exists(edlPath)) { _logger?.LogTrace("Refusing to overwrite existing EDL file {Path}", edlPath); continue; } var edlContent = string.Empty; if (hasIntro) { edlContent += intro?.ToEdl(action); } if (hasCredit) { if (edlContent.Length > 0) { edlContent += Environment.NewLine; } if (action == EdlAction.Intro) { edlContent += credit?.ToEdl(EdlAction.Credit); } else { edlContent += credit?.ToEdl(action); } } File.WriteAllText(edlPath, edlContent); } } /// /// Given the path to an episode, return the path to the associated EDL file. /// /// Full path to episode. /// Full path to EDL file. public static string GetEdlPath(string mediaPath) { return Path.ChangeExtension(mediaPath, "edl"); } }