parent
ea7af03d69
commit
381834edce
@ -0,0 +1,49 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using NLog;
|
||||||
|
using NzbDrone.Common.Http;
|
||||||
|
using NzbDrone.Core.Configuration;
|
||||||
|
using NzbDrone.Core.Parser;
|
||||||
|
using NzbDrone.Core.ThingiProvider;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.ImportLists.Imdb
|
||||||
|
{
|
||||||
|
public class ImdbListImport : HttpImportListBase<ImdbListSettings>
|
||||||
|
{
|
||||||
|
public override string Name => "IMDb Lists";
|
||||||
|
|
||||||
|
public override ImportListType ListType => ImportListType.Other;
|
||||||
|
|
||||||
|
public ImdbListImport(IHttpClient httpClient,
|
||||||
|
IImportListStatusService importListStatusService,
|
||||||
|
IConfigService configService,
|
||||||
|
IParsingService parsingService,
|
||||||
|
Logger logger)
|
||||||
|
: base(httpClient, importListStatusService, configService, parsingService, logger)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IEnumerable<ProviderDefinition> DefaultDefinitions
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
foreach (var def in base.DefaultDefinitions)
|
||||||
|
{
|
||||||
|
yield return def;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IImportListRequestGenerator GetRequestGenerator()
|
||||||
|
{
|
||||||
|
return new ImdbListRequestGenerator()
|
||||||
|
{
|
||||||
|
Settings = Settings
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IParseImportListResponse GetParser()
|
||||||
|
{
|
||||||
|
return new ImdbListParser();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
|
using NzbDrone.Core.ImportLists.Exceptions;
|
||||||
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.ImportLists.Imdb
|
||||||
|
{
|
||||||
|
public class ImdbListParser : IParseImportListResponse
|
||||||
|
{
|
||||||
|
public IList<ImportListItemInfo> ParseResponse(ImportListResponse importListResponse)
|
||||||
|
{
|
||||||
|
var importResponse = importListResponse;
|
||||||
|
|
||||||
|
var series = new List<ImportListItemInfo>();
|
||||||
|
|
||||||
|
if (!PreProcess(importResponse))
|
||||||
|
{
|
||||||
|
return series;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse TSV response from IMDB export
|
||||||
|
var rows = importResponse.Content.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
|
||||||
|
series = rows.Skip(1).SelectList(m => m.Split(',')).Where(m => m.Length > 1).SelectList(i => new ImportListItemInfo { ImdbId = i[1] });
|
||||||
|
|
||||||
|
return series;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual bool PreProcess(ImportListResponse listResponse)
|
||||||
|
{
|
||||||
|
if (listResponse.HttpResponse.StatusCode != HttpStatusCode.OK)
|
||||||
|
{
|
||||||
|
throw new ImportListException(listResponse,
|
||||||
|
"Imdb call resulted in an unexpected StatusCode [{0}]",
|
||||||
|
listResponse.HttpResponse.StatusCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (listResponse.HttpResponse.Headers.ContentType != null &&
|
||||||
|
listResponse.HttpResponse.Headers.ContentType.Contains("text/json") &&
|
||||||
|
listResponse.HttpRequest.Headers.Accept != null &&
|
||||||
|
!listResponse.HttpRequest.Headers.Accept.Contains("text/json"))
|
||||||
|
{
|
||||||
|
throw new ImportListException(listResponse,
|
||||||
|
"Imdb responded with html content. Site is likely blocked or unavailable.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using NzbDrone.Common.Http;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.ImportLists.Imdb
|
||||||
|
{
|
||||||
|
public class ImdbListRequestGenerator : IImportListRequestGenerator
|
||||||
|
{
|
||||||
|
public ImdbListSettings Settings { get; set; }
|
||||||
|
|
||||||
|
public virtual ImportListPageableRequestChain GetListItems()
|
||||||
|
{
|
||||||
|
var pageableRequests = new ImportListPageableRequestChain();
|
||||||
|
var httpRequest = new HttpRequest($"https://www.imdb.com/list/{Settings.ListId}/export", new HttpAccept("*/*"));
|
||||||
|
var request = new ImportListRequest(httpRequest.Url.ToString(), new HttpAccept(httpRequest.Headers.Accept));
|
||||||
|
|
||||||
|
request.HttpRequest.SuppressHttpError = true;
|
||||||
|
|
||||||
|
pageableRequests.Add(new List<ImportListRequest> { request });
|
||||||
|
|
||||||
|
return pageableRequests;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
using FluentValidation;
|
||||||
|
using NzbDrone.Core.Annotations;
|
||||||
|
using NzbDrone.Core.Validation;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.ImportLists.Imdb
|
||||||
|
{
|
||||||
|
public class ImdbSettingsValidator : AbstractValidator<ImdbListSettings>
|
||||||
|
{
|
||||||
|
public ImdbSettingsValidator()
|
||||||
|
{
|
||||||
|
RuleFor(c => c.ListId)
|
||||||
|
.Matches(@"^ls\d+$")
|
||||||
|
.WithMessage("List ID mist be an IMDb List ID of the form 'ls12345678'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ImdbListSettings : IImportListSettings
|
||||||
|
{
|
||||||
|
private static readonly ImdbSettingsValidator Validator = new ImdbSettingsValidator();
|
||||||
|
|
||||||
|
public ImdbListSettings()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public string BaseUrl { get; set; }
|
||||||
|
|
||||||
|
[FieldDefinition(1, Label = "List ID", HelpText = "IMDb list ID (e.g ls12345678)")]
|
||||||
|
public string ListId { get; set; }
|
||||||
|
|
||||||
|
public NzbDroneValidationResult Validate()
|
||||||
|
{
|
||||||
|
return new NzbDroneValidationResult(Validator.Validate(this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue