6ccf002e51
* Recaps and Previews Support * Add draft UI of preview / recap edit * remove intro/credit tasks * Update configPage.html * rename task * Reorganize settings by relation * More standardized formatting * Some additional formatting * fix a typo * Update configPage.html * Allow missing recap / prview data * More risk to corrupt than benefit * Update TimeStamps.cs * Update PluginConfiguration.cs * Update configPage.html * Update PluginConfiguration.cs * Add chapter regex to settings * Move all UI into UI section * Move ending seconds with similar * Add default * fixes * Update SkipIntroController.cs * Autoskip all segments * Check if adjacent segment * Update AutoSkip.cs * Update AutoSkip.cs * Settings apply to all segment types * Update SegmentProvider * Update configPage.html Whoops * Update Plugin.cs * Update AutoSkip.cs * Let’s call it missing instead * Update BaseItemAnalyzerTask.cs * Update BaseItemAnalyzerTask.cs * Update BaseItemAnalyzerTask.cs * Move "select" all below list * Clarify button wording * Update configPage.html * Nope, long client list will hide it * Simplify wording * Update QueuedEpisode.cs * fix unit test for ffmpeg7 * Add migration * Restore DataContract * update * Update configPage.html * remove analyzed status * Update AutoSkip.cs * Update configPage.html typo * Store analyzed items in seasoninfo * Update VisualizationController.cs * update * Update IntroSkipperDbContext.cs * Add preview / recap delete * This keeps changing itself * Update SkipIntroController.cs * Rather add it to be removed --------- Co-authored-by: rlauu <46294892+rlauu@users.noreply.github.com> Co-authored-by: TwistedUmbrellaX <1173913+AbandonedCart@users.noreply.github.com> Co-authored-by: Kilian von Pflugk <github@jumoog.io>
298 lines
11 KiB
C#
298 lines
11 KiB
C#
// Copyright (C) 2024 Intro-Skipper contributors <intro-skipper.org>
|
|
// SPDX-License-Identifier: GPL-3.0-only.
|
|
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using IntroSkipper.Data;
|
|
using MediaBrowser.Model.Plugins;
|
|
|
|
namespace IntroSkipper.Configuration;
|
|
|
|
/// <summary>
|
|
/// Plugin configuration.
|
|
/// </summary>
|
|
public class PluginConfiguration : BasePluginConfiguration
|
|
{
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="PluginConfiguration"/> class.
|
|
/// </summary>
|
|
public PluginConfiguration()
|
|
{
|
|
}
|
|
|
|
// ===== Analysis settings =====
|
|
|
|
/// <summary>
|
|
/// Gets or sets the comma separated list of library names to analyze.
|
|
/// </summary>
|
|
public string SelectedLibraries { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether all libraries should be analyzed.
|
|
/// </summary>
|
|
public bool SelectAllLibraries { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether movies should be analyzed.
|
|
/// </summary>
|
|
public bool AnalyzeMovies { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the list of client to auto skip for.
|
|
/// </summary>
|
|
public string ClientList { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether to automatically scan newly added items.
|
|
/// </summary>
|
|
public bool AutoDetectIntros { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether to analyze season 0.
|
|
/// </summary>
|
|
public bool AnalyzeSeasonZero { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether the episode's fingerprint should be cached to the filesystem.
|
|
/// </summary>
|
|
public bool CacheFingerprints { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether analysis will use Chromaprint to determine fingerprints.
|
|
/// </summary>
|
|
public bool WithChromaprint { get; set; } = true;
|
|
|
|
// ===== Media Segment handling =====
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether to update Media Segments.
|
|
/// </summary>
|
|
public bool UpdateMediaSegments { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether to regenerate all Media Segments during the next scan.
|
|
/// By default, Media Segments are only written for a season if the season had at least one newly analyzed episode.
|
|
/// If this is set, all Media Segments will be regenerated and overwrite any existing Media Segemnts.
|
|
/// </summary>
|
|
public bool RebuildMediaSegments { get; set; } = true;
|
|
|
|
// ===== Custom analysis settings =====
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether Introductions should be analyzed.
|
|
/// </summary>
|
|
public bool ScanIntroduction { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether Credits should be analyzed.
|
|
/// </summary>
|
|
public bool ScanCredits { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether Recaps should be analyzed.
|
|
/// </summary>
|
|
public bool ScanRecap { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether Previews should be analyzed.
|
|
/// </summary>
|
|
public bool ScanPreview { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the percentage of each episode's audio track to analyze.
|
|
/// </summary>
|
|
public int AnalysisPercent { get; set; } = 25;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the upper limit (in minutes) on the length of each episode's audio track that will be analyzed.
|
|
/// </summary>
|
|
public int AnalysisLengthLimit { get; set; } = 10;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the minimum length of similar audio that will be considered an introduction.
|
|
/// </summary>
|
|
public int MinimumIntroDuration { get; set; } = 15;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the maximum length of similar audio that will be considered an introduction.
|
|
/// </summary>
|
|
public int MaximumIntroDuration { get; set; } = 120;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the minimum length of similar audio that will be considered ending credits.
|
|
/// </summary>
|
|
public int MinimumCreditsDuration { get; set; } = 15;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the upper limit (in seconds) on the length of each episode's audio track that will be analyzed when searching for ending credits.
|
|
/// </summary>
|
|
public int MaximumCreditsDuration { get; set; } = 450;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the upper limit (in seconds) on the length of a movie segment that will be analyzed when searching for ending credits.
|
|
/// </summary>
|
|
public int MaximumMovieCreditsDuration { get; set; } = 900;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the minimum percentage of a frame that must consist of black pixels before it is considered a black frame.
|
|
/// </summary>
|
|
public int BlackFrameMinimumPercentage { get; set; } = 85;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the regular expression used to detect introduction chapters.
|
|
/// </summary>
|
|
public string ChapterAnalyzerIntroductionPattern { get; set; } =
|
|
@"(^|\s)(Intro|Introduction|OP|Opening)(?!\sEnd)(\s|$)";
|
|
|
|
/// <summary>
|
|
/// Gets or sets the regular expression used to detect ending credit chapters.
|
|
/// </summary>
|
|
public string ChapterAnalyzerEndCreditsPattern { get; set; } =
|
|
@"(^|\s)(Credits?|ED|Ending|Outro)(?!\sEnd)(\s|$)";
|
|
|
|
/// <summary>
|
|
/// Gets or sets the regular expression used to detect Preview chapters.
|
|
/// </summary>
|
|
public string ChapterAnalyzerPreviewPattern { get; set; } =
|
|
@"(^|\s)(Preview|PV|Sneak\s?Peek|Coming\s?(Up|Soon)|Next\s+(time|on|episode)|Extra|Teaser|Trailer)(?!\sEnd)(\s|:|$)";
|
|
|
|
/// <summary>
|
|
/// Gets or sets the regular expression used to detect Recap chapters.
|
|
/// </summary>
|
|
public string ChapterAnalyzerRecapPattern { get; set; } =
|
|
@"(^|\s)(Re?cap|Sum{1,2}ary|Prev(ious(ly)?)?|(Last|Earlier)(\s\w+)?|Catch[ -]up)(?!\sEnd)(\s|:|$)";
|
|
|
|
// ===== Playback settings =====
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether to show the skip intro button.
|
|
/// </summary>
|
|
public bool SkipButtonEnabled { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets a value indicating whether to show the skip intro warning.
|
|
/// </summary>
|
|
public bool SkipButtonWarning { get => WarningManager.HasFlag(PluginWarning.UnableToAddSkipButton); }
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether introductions should be automatically skipped.
|
|
/// </summary>
|
|
public bool AutoSkip { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the list of segment types to auto skip.
|
|
/// </summary>
|
|
public string TypeList { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether credits should be automatically skipped.
|
|
/// </summary>
|
|
public bool AutoSkipCredits { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether recap should be automatically skipped.
|
|
/// </summary>
|
|
public bool AutoSkipRecap { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether preview should be automatically skipped.
|
|
/// </summary>
|
|
public bool AutoSkipPreview { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the seconds before the intro starts to show the skip prompt at.
|
|
/// </summary>
|
|
public int ShowPromptAdjustment { get; set; } = 5;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the seconds after the intro starts to hide the skip prompt at.
|
|
/// </summary>
|
|
public int HidePromptAdjustment { get; set; } = 10;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether the introduction in the first episode of a season should be ignored.
|
|
/// </summary>
|
|
public bool SkipFirstEpisode { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether the skip button should be displayed for the duration of the intro.
|
|
/// </summary>
|
|
public bool PersistSkipButton { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the amount of intro to play (in seconds).
|
|
/// </summary>
|
|
public int RemainingSecondsOfIntro { get; set; } = 2;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the amount of intro at start to play (in seconds).
|
|
/// </summary>
|
|
public int SecondsOfIntroStartToPlay { get; set; }
|
|
|
|
// ===== Internal algorithm settings =====
|
|
|
|
/// <summary>
|
|
/// Gets or sets the maximum number of bits (out of 32 total) that can be different between two Chromaprint points before they are considered dissimilar.
|
|
/// Defaults to 6 (81% similar).
|
|
/// </summary>
|
|
public int MaximumFingerprintPointDifferences { get; set; } = 6;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the maximum number of seconds that can pass between two similar fingerprint points before a new time range is started.
|
|
/// </summary>
|
|
public double MaximumTimeSkip { get; set; } = 3.5;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the amount to shift inverted indexes by.
|
|
/// </summary>
|
|
public int InvertedIndexShift { get; set; } = 2;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the maximum amount of noise (in dB) that is considered silent.
|
|
/// Lowering this number will increase the filter's sensitivity to noise.
|
|
/// </summary>
|
|
public int SilenceDetectionMaximumNoise { get; set; } = -50;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the minimum duration of audio (in seconds) that is considered silent.
|
|
/// </summary>
|
|
public double SilenceDetectionMinimumDuration { get; set; } = 0.33;
|
|
|
|
// ===== Localization support =====
|
|
|
|
/// <summary>
|
|
/// Gets or sets the text to display in the skip button in introduction mode.
|
|
/// </summary>
|
|
public string SkipButtonIntroText { get; set; } = "Skip Intro";
|
|
|
|
/// <summary>
|
|
/// Gets or sets the text to display in the skip button in end credits mode.
|
|
/// </summary>
|
|
public string SkipButtonEndCreditsText { get; set; } = "Next";
|
|
|
|
/// <summary>
|
|
/// Gets or sets the notification text sent after automatically skipping an introduction.
|
|
/// </summary>
|
|
public string AutoSkipNotificationText { get; set; } = "Segment skipped";
|
|
|
|
/// <summary>
|
|
/// Gets or sets the max degree of parallelism used when analyzing episodes.
|
|
/// </summary>
|
|
public int MaxParallelism { get; set; } = 2;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the number of threads for a ffmpeg process.
|
|
/// </summary>
|
|
public int ProcessThreads { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the relative priority for a ffmpeg process.
|
|
/// </summary>
|
|
public ProcessPriorityClass ProcessPriority { get; set; } = ProcessPriorityClass.BelowNormal;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether the ManifestUrl is self-managed, e.g. for mainland China.
|
|
/// </summary>
|
|
public bool OverrideManifestUrl { get; set; }
|
|
}
|