mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-17 17:34:09 +02:00
Merge branch 'master' of https://github.com/Jackett/Jackett
This commit is contained in:
@@ -28,6 +28,11 @@ namespace JackettTest
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IWebIndexer GetWebIndexer(string name)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
public void InitIndexers()
|
public void InitIndexers()
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
|
@@ -96,11 +96,25 @@ Global
|
|||||||
$2.SpacesBeforeBrackets = False
|
$2.SpacesBeforeBrackets = False
|
||||||
$2.scope = text/x-csharp
|
$2.scope = text/x-csharp
|
||||||
$2.IndentSwitchSection = True
|
$2.IndentSwitchSection = True
|
||||||
|
$2.NewLinesForBracesInProperties = True
|
||||||
|
$2.NewLinesForBracesInAccessors = True
|
||||||
|
$2.NewLinesForBracesInAnonymousMethods = True
|
||||||
|
$2.NewLinesForBracesInControlBlocks = True
|
||||||
|
$2.NewLinesForBracesInAnonymousTypes = True
|
||||||
|
$2.NewLinesForBracesInObjectCollectionArrayInitializers = True
|
||||||
|
$2.NewLinesForBracesInLambdaExpressionBody = True
|
||||||
|
$2.NewLineForElse = True
|
||||||
|
$2.NewLineForCatch = True
|
||||||
|
$2.NewLineForFinally = True
|
||||||
|
$2.NewLineForMembersInObjectInit = True
|
||||||
|
$2.NewLineForMembersInAnonymousTypes = True
|
||||||
|
$2.NewLineForClausesInQuery = True
|
||||||
$2.SpacingAfterMethodDeclarationName = False
|
$2.SpacingAfterMethodDeclarationName = False
|
||||||
$2.SpaceAfterMethodCallName = False
|
$2.SpaceAfterMethodCallName = False
|
||||||
$2.SpaceBeforeOpenSquareBracket = False
|
$2.SpaceBeforeOpenSquareBracket = False
|
||||||
$0.DotNetNamingPolicy = $3
|
$0.TextStylePolicy = $3
|
||||||
$3.DirectoryNamespaceAssociation = PrefixedHierarchical
|
$3.FileWidth = 80
|
||||||
$0.StandardHeader = $4
|
$3.TabsToSpaces = True
|
||||||
|
$3.scope = text/plain
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
@@ -39,24 +39,24 @@
|
|||||||
page: "search"
|
page: "search"
|
||||||
q: "{{ .Query.Keywords}}"
|
q: "{{ .Query.Keywords}}"
|
||||||
rows:
|
rows:
|
||||||
selector: tr.tlistrow
|
selector: tr.torrent-info
|
||||||
fields:
|
fields:
|
||||||
title:
|
title:
|
||||||
selector: td.tlistname a
|
selector: td.tr-name a
|
||||||
category:
|
category:
|
||||||
selector: td.tlisticon a
|
selector: td.tr-cat div.nyaa-cat a
|
||||||
attribute: href
|
attribute: href
|
||||||
filters:
|
filters:
|
||||||
- name: split
|
- name: split
|
||||||
args: [ "=", -1 ]
|
args: [ "=", -1 ]
|
||||||
details:
|
details:
|
||||||
selector: td.tlistname a
|
selector: td.tr-name a
|
||||||
attribute: href
|
attribute: href
|
||||||
download:
|
download:
|
||||||
selector: a[title="Magnet Download"]
|
selector: a[title="Magnet Link"]
|
||||||
attribute: href
|
attribute: href
|
||||||
size:
|
size:
|
||||||
selector: td.tlistsize
|
selector: td.tr-size
|
||||||
# seeders:
|
# seeders:
|
||||||
# text: 0
|
# text: 0
|
||||||
# seeders:
|
# seeders:
|
||||||
|
@@ -12,6 +12,7 @@ using Jackett.Utils.Clients;
|
|||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
using Jackett.Models.IndexerConfig;
|
using Jackett.Models.IndexerConfig;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace Jackett.Indexers
|
namespace Jackett.Indexers
|
||||||
{
|
{
|
||||||
@@ -691,6 +692,8 @@ namespace Jackett.Indexers
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override TorznabCapabilities TorznabCaps { get; protected set; }
|
public override TorznabCapabilities TorznabCaps { get; protected set; }
|
||||||
|
|
||||||
|
[JsonConverter(typeof(EncodingJsonConverter))]
|
||||||
public Encoding Encoding { get; protected set; }
|
public Encoding Encoding { get; protected set; }
|
||||||
|
|
||||||
private List<CategoryMapping> categoryMapping = new List<CategoryMapping>();
|
private List<CategoryMapping> categoryMapping = new List<CategoryMapping>();
|
||||||
|
@@ -377,6 +377,7 @@
|
|||||||
<Compile Include="Indexers\Meta\ResultFilters.cs" />
|
<Compile Include="Indexers\Meta\ResultFilters.cs" />
|
||||||
<Compile Include="Services\ImdbResolver.cs" />
|
<Compile Include="Services\ImdbResolver.cs" />
|
||||||
<Compile Include="Utils\Extensions.cs" />
|
<Compile Include="Utils\Extensions.cs" />
|
||||||
|
<Compile Include="Utils\JsonUtil.cs" />
|
||||||
<Compile Include="Services\IndexerConfigurationService.cs" />
|
<Compile Include="Services\IndexerConfigurationService.cs" />
|
||||||
<Compile Include="Models\IndexerDefinition.cs" />
|
<Compile Include="Models\IndexerDefinition.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@@ -18,68 +18,79 @@ namespace Jackett
|
|||||||
{
|
{
|
||||||
public class JackettModule : Autofac.Module
|
public class JackettModule : Autofac.Module
|
||||||
{
|
{
|
||||||
protected override void Load (ContainerBuilder builder)
|
protected override void Load(ContainerBuilder builder)
|
||||||
{
|
{
|
||||||
// Just register everything!
|
// Just register everything!
|
||||||
var thisAssembly = typeof (JackettModule).Assembly;
|
var thisAssembly = typeof(JackettModule).Assembly;
|
||||||
builder.RegisterAssemblyTypes (thisAssembly)
|
builder.RegisterAssemblyTypes(thisAssembly)
|
||||||
.Except<IIndexer> ()
|
.Except<IIndexer>()
|
||||||
.Except<IImdbResolver> ()
|
.Except<IImdbResolver>()
|
||||||
.Except<OmdbResolver> ()
|
.Except<OmdbResolver>()
|
||||||
.Except<IFallbackStrategyProvider> ()
|
.Except<IFallbackStrategyProvider>()
|
||||||
.Except<ImdbFallbackStrategyProvider> ()
|
.Except<ImdbFallbackStrategyProvider>()
|
||||||
.Except<IFallbackStrategy> ()
|
.Except<IFallbackStrategy>()
|
||||||
.Except<ImdbFallbackStrategy> ()
|
.Except<ImdbFallbackStrategy>()
|
||||||
.Except<IResultFilterProvider> ()
|
.Except<IResultFilterProvider>()
|
||||||
.Except<ImdbTitleResultFilterProvider> ()
|
.Except<ImdbTitleResultFilterProvider>()
|
||||||
.Except<IResultFilter> ()
|
.Except<IResultFilter>()
|
||||||
.Except<ImdbTitleResultFilterProvider> ()
|
.Except<ImdbTitleResultFilterProvider>()
|
||||||
.Except<BaseMetaIndexer> ()
|
.Except<BaseMetaIndexer>()
|
||||||
.Except<AggregateIndexer> ()
|
.Except<AggregateIndexer>()
|
||||||
.Except<CardigannIndexer>()
|
.Except<CardigannIndexer>()
|
||||||
.AsImplementedInterfaces ().SingleInstance ();
|
.AsImplementedInterfaces().SingleInstance();
|
||||||
builder.RegisterApiControllers (thisAssembly).InstancePerRequest ();
|
builder.RegisterApiControllers(thisAssembly).InstancePerRequest();
|
||||||
builder.RegisterType<HttpWebClient> ();
|
builder.RegisterType<HttpWebClient>();
|
||||||
|
|
||||||
// Register the best web client for the platform or the override
|
// Register the best web client for the platform or the override
|
||||||
switch (Startup.ClientOverride) {
|
switch (Startup.ClientOverride)
|
||||||
case "httpclient":
|
{
|
||||||
builder.RegisterType<HttpWebClient> ().As<IWebClient> ();
|
case "httpclient":
|
||||||
break;
|
builder.RegisterType<HttpWebClient>().As<IWebClient>();
|
||||||
case "httpclient2":
|
break;
|
||||||
builder.RegisterType<HttpWebClient2> ().As<IWebClient> ();
|
case "httpclient2":
|
||||||
break;
|
builder.RegisterType<HttpWebClient2>().As<IWebClient>();
|
||||||
case "safecurl":
|
break;
|
||||||
builder.RegisterType<UnixSafeCurlWebClient> ().As<IWebClient> ();
|
case "safecurl":
|
||||||
break;
|
builder.RegisterType<UnixSafeCurlWebClient>().As<IWebClient>();
|
||||||
case "libcurl":
|
break;
|
||||||
builder.RegisterType<UnixLibCurlWebClient> ().As<IWebClient> ();
|
case "libcurl":
|
||||||
break;
|
builder.RegisterType<UnixLibCurlWebClient>().As<IWebClient>();
|
||||||
case "automatic":
|
break;
|
||||||
default:
|
case "automatic":
|
||||||
if (System.Environment.OSVersion.Platform == PlatformID.Unix) {
|
default:
|
||||||
var usehttpclient = false;
|
if (System.Environment.OSVersion.Platform == PlatformID.Unix)
|
||||||
try {
|
{
|
||||||
Type monotype = Type.GetType ("Mono.Runtime");
|
var usehttpclient = false;
|
||||||
if (monotype != null) {
|
try
|
||||||
MethodInfo displayName = monotype.GetMethod ("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
|
{
|
||||||
if (displayName != null) {
|
Type monotype = Type.GetType("Mono.Runtime");
|
||||||
var monoVersion = displayName.Invoke (null, null).ToString ();
|
if (monotype != null)
|
||||||
var monoVersionO = new Version (monoVersion.Split (' ') [0]);
|
{
|
||||||
if ((monoVersionO.Major >= 4 && monoVersionO.Minor >= 8) || monoVersionO.Major >= 5) {
|
MethodInfo displayName = monotype.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
|
||||||
// check if btls is supported
|
if (displayName != null)
|
||||||
var monoSecurity = Assembly.Load ("Mono.Security");
|
{
|
||||||
Type monoTlsProviderFactory = monoSecurity.GetType ("Mono.Security.Interface.MonoTlsProviderFactory");
|
var monoVersion = displayName.Invoke(null, null).ToString();
|
||||||
if (monoTlsProviderFactory != null) {
|
var monoVersionO = new Version(monoVersion.Split(' ')[0]);
|
||||||
MethodInfo isProviderSupported = monoTlsProviderFactory.GetMethod ("IsProviderSupported");
|
if ((monoVersionO.Major >= 4 && monoVersionO.Minor >= 8) || monoVersionO.Major >= 5)
|
||||||
if (isProviderSupported != null) {
|
{
|
||||||
var btlsSupported = (bool)isProviderSupported.Invoke (null, new string [] { "btls" });
|
// check if btls is supported
|
||||||
if (btlsSupported) {
|
var monoSecurity = Assembly.Load("Mono.Security");
|
||||||
// initialize btls
|
Type monoTlsProviderFactory = monoSecurity.GetType("Mono.Security.Interface.MonoTlsProviderFactory");
|
||||||
MethodInfo initialize = monoTlsProviderFactory.GetMethod ("Initialize", new [] { typeof (string) });
|
if (monoTlsProviderFactory != null)
|
||||||
if (initialize != null) {
|
{
|
||||||
initialize.Invoke (null, new string [] { "btls" });
|
MethodInfo isProviderSupported = monoTlsProviderFactory.GetMethod("IsProviderSupported");
|
||||||
usehttpclient = true;
|
if (isProviderSupported != null)
|
||||||
|
{
|
||||||
|
var btlsSupported = (bool)isProviderSupported.Invoke(null, new string[] { "btls" });
|
||||||
|
if (btlsSupported)
|
||||||
|
{
|
||||||
|
// initialize btls
|
||||||
|
MethodInfo initialize = monoTlsProviderFactory.GetMethod("Initialize", new[] { typeof(string) });
|
||||||
|
if (initialize != null)
|
||||||
|
{
|
||||||
|
initialize.Invoke(null, new string[] { "btls" });
|
||||||
|
usehttpclient = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -87,45 +98,60 @@ namespace Jackett
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
catch (Exception e)
|
||||||
Console.Out.WriteLine ("Error while deciding which HttpWebClient to use: " + e);
|
{
|
||||||
}
|
Console.Out.WriteLine("Error while deciding which HttpWebClient to use: " + e);
|
||||||
|
}
|
||||||
|
|
||||||
if (usehttpclient)
|
if (usehttpclient)
|
||||||
builder.RegisterType<HttpWebClient> ().As<IWebClient> ();
|
builder.RegisterType<HttpWebClient>().As<IWebClient>();
|
||||||
|
else
|
||||||
|
builder.RegisterType<UnixLibCurlWebClient>().As<IWebClient>();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
builder.RegisterType<UnixLibCurlWebClient> ().As<IWebClient> ();
|
{
|
||||||
} else {
|
builder.RegisterType<HttpWebClient>().As<IWebClient>();
|
||||||
builder.RegisterType<HttpWebClient> ().As<IWebClient> ();
|
}
|
||||||
}
|
break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register indexers
|
// Register indexers
|
||||||
var indexerTypes = thisAssembly.GetTypes ().Where (p => typeof (IIndexer).IsAssignableFrom (p) && !p.IsInterface && !p.IsInNamespace ("Jackett.Indexers.Meta"));
|
var allTypes = thisAssembly.GetTypes();
|
||||||
foreach (var indexer in indexerTypes) {
|
var allIndexerTypes = allTypes.Where(p => typeof(IIndexer).IsAssignableFrom(p));
|
||||||
builder.RegisterType (indexer).Named<IIndexer> (BaseIndexer.GetIndexerID (indexer));
|
var allInstantiatableIndexerTypes = allIndexerTypes.Where(p => !p.IsInterface && !p.IsAbstract);
|
||||||
|
var allNonMetaInstantiatableIndexerTypes = allInstantiatableIndexerTypes.Where(p => !typeof(BaseMetaIndexer).IsAssignableFrom(p));
|
||||||
|
var indexerTypes = allNonMetaInstantiatableIndexerTypes.Where(p => p.Name != "CardigannIndexer");
|
||||||
|
foreach (var indexer in indexerTypes)
|
||||||
|
{
|
||||||
|
builder.RegisterType(indexer).Named<IIndexer>(BaseIndexer.GetIndexerID(indexer));
|
||||||
}
|
}
|
||||||
|
|
||||||
Mapper.CreateMap<WebClientByteResult, WebClientStringResult> ().ForMember (x => x.Content, opt => opt.Ignore ()).AfterMap ((be, str) => {
|
Mapper.CreateMap<WebClientByteResult, WebClientStringResult>().ForMember(x => x.Content, opt => opt.Ignore()).AfterMap((be, str) =>
|
||||||
str.Content = Encoding.UTF8.GetString (be.Content);
|
{
|
||||||
|
str.Content = Encoding.UTF8.GetString(be.Content);
|
||||||
});
|
});
|
||||||
|
|
||||||
Mapper.CreateMap<WebClientStringResult, WebClientByteResult> ().ForMember (x => x.Content, opt => opt.Ignore ()).AfterMap ((str, be) => {
|
Mapper.CreateMap<WebClientStringResult, WebClientByteResult>().ForMember(x => x.Content, opt => opt.Ignore()).AfterMap((str, be) =>
|
||||||
if (!string.IsNullOrEmpty (str.Content)) {
|
{
|
||||||
be.Content = Encoding.UTF8.GetBytes (str.Content);
|
if (!string.IsNullOrEmpty(str.Content))
|
||||||
|
{
|
||||||
|
be.Content = Encoding.UTF8.GetBytes(str.Content);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Mapper.CreateMap<WebClientStringResult, WebClientStringResult> ();
|
Mapper.CreateMap<WebClientStringResult, WebClientStringResult>();
|
||||||
Mapper.CreateMap<WebClientByteResult, WebClientByteResult> ();
|
Mapper.CreateMap<WebClientByteResult, WebClientByteResult>();
|
||||||
Mapper.CreateMap<ReleaseInfo, ReleaseInfo> ();
|
Mapper.CreateMap<ReleaseInfo, ReleaseInfo>();
|
||||||
|
|
||||||
Mapper.CreateMap<ReleaseInfo, TrackerCacheResult> ().AfterMap ((r, t) => {
|
Mapper.CreateMap<ReleaseInfo, TrackerCacheResult>().AfterMap((r, t) =>
|
||||||
if (r.Category != null) {
|
{
|
||||||
var CategoryDesc = string.Join (", ", r.Category.Select (x => TorznabCatType.GetCatDesc (x)).Where (x => !string.IsNullOrEmpty (x)));
|
if (r.Category != null)
|
||||||
|
{
|
||||||
|
var CategoryDesc = string.Join(", ", r.Category.Select(x => TorznabCatType.GetCatDesc(x)).Where(x => !string.IsNullOrEmpty(x)));
|
||||||
t.CategoryDesc = CategoryDesc;
|
t.CategoryDesc = CategoryDesc;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
t.CategoryDesc = "";
|
t.CategoryDesc = "";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
30
src/Jackett/Utils/JsonUtil.cs
Normal file
30
src/Jackett/Utils/JsonUtil.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Jackett.Utils
|
||||||
|
{
|
||||||
|
public class EncodingJsonConverter : JsonConverter
|
||||||
|
{
|
||||||
|
public override bool CanConvert(Type objectType)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||||
|
{
|
||||||
|
var obj = value as Encoding;
|
||||||
|
writer.WriteValue(obj.WebName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool CanRead
|
||||||
|
{
|
||||||
|
get { return false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user