Added additional filtering capability by Media airing status.

Note: Anilist currently does not support this type of filtering at the query level, so this is done as a post-processing step.
This commit is contained in:
Carl Lewis 2023-07-29 12:45:13 -04:00
parent ddf3a208b4
commit d4c063df56
5 changed files with 103 additions and 15 deletions

View File

@ -47,11 +47,6 @@ namespace NzbDrone.Core.ImportLists.AniList
public Dictionary<int, MediaMapping> Mappings => _cache.Get(_cacheKey, GetMappingData, _cacheInterval);
public override AniListParser GetParser()
{
return new AniListParser(_logger, Mappings);
}
public override object RequestAction(string action, IDictionary<string, string> query)
{
if (action == "startOAuth")

View File

@ -39,6 +39,34 @@ namespace NzbDrone.Core.ImportLists.AniList
public const string Repeating = "REPEATING";
}
public static class MediaStatus
{
/// <summary>
/// Anime series has finished airing
/// </summary>
public const string Finished = "FINISHED";
/// <summary>
/// Anime series is currently airing
/// </summary>
public const string Releasing = "RELEASING";
/// <summary>
/// Anime series had not yet begun airing
/// </summary>
public const string Unreleased = "NOT_YET_RELEASED";
/// <summary>
/// Anime series was cancelled
/// </summary>
public const string Cancelled = "CANCELLED";
/// <summary>
/// Anime series is currently on hiatus
/// </summary>
public const string Hiatus = "HIATUS";
}
/// <summary>
/// Data during token refresh cycles
/// </summary>

View File

@ -39,6 +39,11 @@ namespace NzbDrone.Core.ImportLists.AniList.List
};
}
public override AniListParser GetParser()
{
return new AniListParser(_logger, Settings, Mappings);
}
/// <summary>
/// Anilist caps the result list to 50 items at maximum per query, so the data must be pulled in batches.
///

View File

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using System.Net;
using NLog;
using NzbDrone.Common.Extensions;
@ -6,17 +7,19 @@ using NzbDrone.Common.Serializer;
using NzbDrone.Core.ImportLists.Exceptions;
using NzbDrone.Core.Parser.Model;
namespace NzbDrone.Core.ImportLists.AniList
namespace NzbDrone.Core.ImportLists.AniList.List
{
public class AniListParser : IParseImportListResponse
{
private readonly Dictionary<int, MediaMapping> _mappings;
private readonly Logger _logger;
private readonly AniListSettings _settings;
public AniListParser(Logger logger, Dictionary<int, MediaMapping> mappings)
public AniListParser(Logger logger, AniListSettings settings, Dictionary<int, MediaMapping> mappings)
{
_mappings = mappings;
_logger = logger;
_settings = settings;
}
public virtual IList<ImportListItemInfo> ParseResponse(ImportListResponse importListResponse)
@ -42,7 +45,11 @@ namespace NzbDrone.Core.ImportLists.AniList
return result;
}
foreach (var item in jsonResponse.Data.Page.MediaList)
// Filter out unwanted series status types
var filtered = jsonResponse.Data.Page.MediaList
.Where(x => ValidateMediaStatus(x.Media));
foreach (var item in filtered)
{
var media = item.Media;
@ -85,6 +92,41 @@ namespace NzbDrone.Core.ImportLists.AniList
return result;
}
/// <summary>
/// Filter by media status, based on user settings.
///
/// Anilist currently does not support filtering this at the query level, so it must be done in post.
/// </summary>
private bool ValidateMediaStatus(MediaInfo media)
{
if (media.Status == MediaStatus.Finished && _settings.ImportFinished)
{
return true;
}
if (media.Status == MediaStatus.Releasing && _settings.ImportReleasing)
{
return true;
}
if (media.Status == MediaStatus.Unreleased && _settings.ImportUnreleased)
{
return true;
}
if (media.Status == MediaStatus.Cancelled && _settings.ImportCancelled)
{
return true;
}
if (media.Status == MediaStatus.Hiatus && _settings.ImportHiatus)
{
return true;
}
return false;
}
protected virtual bool PreProcess(ImportListResponse netImportResponse)
{
if (netImportResponse.HttpResponse.StatusCode != HttpStatusCode.OK)

View File

@ -19,13 +19,16 @@ namespace NzbDrone.Core.ImportLists.AniList.List
public class AniListSettings : AniListSettingsBase<AniListSettings>
{
public const string sectionImport = "Import List Status";
public const string unitStatusType = "Status Type";
public const string unitListStatus = "List Status";
public const string unitMediaStatus = "Media Status";
public AniListSettings()
: base()
{
ImportCurrent = true;
ImportPlanning = true;
ImportReleasing = true;
ImportFinished = true;
}
protected override AbstractValidator<AniListSettings> Validator => new AniListSettingsValidator();
@ -33,22 +36,37 @@ namespace NzbDrone.Core.ImportLists.AniList.List
[FieldDefinition(1, Label = "Username", HelpText = "Username for the List to import from")]
public string Username { get; set; }
[FieldDefinition(0, Label = "Import Watching", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitStatusType)]
[FieldDefinition(0, Label = "Import Watching", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitListStatus)]
public bool ImportCurrent { get; set; }
[FieldDefinition(0, Label = "Import Planning", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitStatusType)]
[FieldDefinition(0, Label = "Import Planning", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitListStatus)]
public bool ImportPlanning { get; set; }
[FieldDefinition(0, Label = "Import Completed", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitStatusType)]
[FieldDefinition(0, Label = "Import Completed", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitListStatus)]
public bool ImportCompleted { get; set; }
[FieldDefinition(0, Label = "Import Dropped", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitStatusType)]
[FieldDefinition(0, Label = "Import Dropped", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitListStatus)]
public bool ImportDropped { get; set; }
[FieldDefinition(0, Label = "Import Paused", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitStatusType)]
[FieldDefinition(0, Label = "Import Paused", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitListStatus)]
public bool ImportPaused { get; set; }
[FieldDefinition(0, Label = "Import Repeating", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitStatusType)]
[FieldDefinition(0, Label = "Import Repeating", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitListStatus)]
public bool ImportRepeating { get; set; }
[FieldDefinition(0, Label = "Import Finished Airing Series", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitMediaStatus)]
public bool ImportFinished { get; set; }
[FieldDefinition(0, Label = "Import Currently Airing Series", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitMediaStatus)]
public bool ImportReleasing { get; set; }
[FieldDefinition(0, Label = "Import Not Yet Airing Series", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitMediaStatus)]
public bool ImportUnreleased { get; set; }
[FieldDefinition(0, Label = "Import Cancelled Series", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitMediaStatus)]
public bool ImportCancelled { get; set; }
[FieldDefinition(0, Label = "Import Series on Hiatus", Type = FieldType.Checkbox, Section = sectionImport, Unit = unitMediaStatus)]
public bool ImportHiatus { get; set; }
}
}