mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-17 17:34:09 +02:00
[feature] migrated Anilibria yaml indexer to C# with new domain and API (#16043)
Thank you for your contribution :-)
This commit is contained in:
@@ -1,300 +0,0 @@
|
|||||||
---
|
|
||||||
id: anilibria
|
|
||||||
name: AniLibria
|
|
||||||
description: "AniLibria is a Public torrent tracker for anime, voiced in Russian by AniLibria team"
|
|
||||||
language: ru-RU
|
|
||||||
type: public
|
|
||||||
encoding: UTF-8
|
|
||||||
links:
|
|
||||||
- https://www.anilibria.tv/
|
|
||||||
|
|
||||||
caps:
|
|
||||||
categories:
|
|
||||||
Anime: TV/Anime
|
|
||||||
Movies: Movies/Other
|
|
||||||
|
|
||||||
modes:
|
|
||||||
search: [q]
|
|
||||||
tv-search: [q, season, ep]
|
|
||||||
movie-search: [q]
|
|
||||||
|
|
||||||
settings:
|
|
||||||
- name: stripcyrillic
|
|
||||||
type: checkbox
|
|
||||||
label: Strip Cyrillic Letters
|
|
||||||
default: false
|
|
||||||
- name: sonarr_compatibility
|
|
||||||
type: checkbox
|
|
||||||
label: Improve Sonarr compatibility by trying to better parse Season information in release titles.
|
|
||||||
default: false
|
|
||||||
- name: addrussiantotitle
|
|
||||||
type: checkbox
|
|
||||||
label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
search:
|
|
||||||
paths:
|
|
||||||
# https://github.com/anilibria/docs/blob/master/api_v3.md
|
|
||||||
- path: "https://api.anilibria.tv/v3/title/{{ if .Keywords }}search{{ else }}updates{{ end }}"
|
|
||||||
response:
|
|
||||||
type: json
|
|
||||||
|
|
||||||
inputs:
|
|
||||||
search: "{{ .Keywords }}"
|
|
||||||
filter: "names,posters.small.url,code,torrents.list,season.year,description"
|
|
||||||
limit: 100
|
|
||||||
|
|
||||||
keywordsfilters:
|
|
||||||
# strip season and/or ep
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""]
|
|
||||||
|
|
||||||
rows:
|
|
||||||
selector: list
|
|
||||||
attribute: torrents.list
|
|
||||||
multiple: true
|
|
||||||
|
|
||||||
fields:
|
|
||||||
_episodes:
|
|
||||||
selector: episodes.string
|
|
||||||
optional: true
|
|
||||||
category:
|
|
||||||
text: "{{ if eq .Result._episodes \"Фильм\" }}Movies{{ else }}Anime{{ end }}"
|
|
||||||
title_ru:
|
|
||||||
selector: ..names.ru
|
|
||||||
title_en:
|
|
||||||
selector: ..names.en
|
|
||||||
title_en_parsed:
|
|
||||||
selector: ..names.en
|
|
||||||
filters:
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bPart\\s*1\\b", "Part One"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bPart\\s*2\\b", "Part Two"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bPart\\s*3\\b", "Part Three"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bPart\\s*4\\b", "Part Four"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bPart\\s*5\\b", "Part Five"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bPart\\s*6\\b", "Part Six"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bPart\\s*7\\b", "Part Seven"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bPart\\s*8\\b", "Part Eight"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bPart\\s*9\\b", "Part Nine"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bseason\\s*(\\d+)\\b", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\b(\\d+)(st|nd|rd|th)\\s*season[\\s\\.]*", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\b(\\d+)\\s*season\\b[\\s\\.]*", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bseason\\s*([IVXLCDM]+)\\b", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bI$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bII$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bIII$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bIV$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bV$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bVI$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bVII$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bVIII$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bIX$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bX$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\b(\\d+)(?:st|nd|rd|th)?\\b", ""]
|
|
||||||
- name: trim
|
|
||||||
title_alternative:
|
|
||||||
selector: ..names.alternative
|
|
||||||
optional: true
|
|
||||||
filters:
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["^OVA$", ""]
|
|
||||||
_season_number_en:
|
|
||||||
selector: ..names.en
|
|
||||||
filters:
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bPart\\s*\\d+\\s*$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)(^.*\\bseason\\s*(\\d+)\\b\\s*$)", "S$2"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)(^.*\\b(\\d+)(st|nd|rd|th)\\s*season\\b.*$)", "S$2"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)(^.*\\b(\\d+)\\s*season\\b.*$)", "S$2"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)(^.*\\bseason\\s*([IVXLCDM]+)\\b\\s*$)", "$1"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*X$)", "S10"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*IX$)", "S9"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*VIII$)", "S8"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*VII$)", "S7"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*VI$)", "S6"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*V$)", "S5"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*IV$)", "S4"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*III$)", "S3"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*II$)", "S2"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*I$)", "S1"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)(^.*\\b(\\d+)(?:st|nd|rd|th)?\\b\\s*$)", "S$2"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)^(?!S\\d+).*", ""]
|
|
||||||
_season_number_alternative:
|
|
||||||
selector: ..names.alternative
|
|
||||||
optional: true
|
|
||||||
filters:
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)\\bPart\\s*\\d+\\s*$", ""]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)(^.*\\bseason\\s*(\\d+)\\b\\s*$)", "S$2"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)(^.*\\b(\\d+)(st|nd|rd|th)\\s*season\\b\\s*$)", "S$2"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)(^.*\\b(\\d+)\\s*season\\b\\s*$)", "S$2"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)(^.*\\bseason\\s*([IVXLCDM]+)\\b\\s*$)", "$1"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*X$)", "S10"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*IX$)", "S9"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*VIII$)", "S8"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*VII$)", "S7"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*VI$)", "S6"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*V$)", "S5"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*IV$)", "S4"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*III$)", "S3"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*II$)", "S2"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(^.*I$)", "S1"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)(^.*\\b(\\d+)(?:st|nd|rd|th)?\\b\\s*$)", "S$2"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)^(?!S\\d+).*", ""]
|
|
||||||
_season_number:
|
|
||||||
text: "{{ .Result._season_number_en }}"
|
|
||||||
filters:
|
|
||||||
- name: append
|
|
||||||
args: "{{ .Result._season_number_alternative }}"
|
|
||||||
- name: re_replace
|
|
||||||
args: ["^S1S1$", "S1"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["^S1(.+)$", "$1"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["^(S\\d+).*$", "$1"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["^$", "S1"]
|
|
||||||
year:
|
|
||||||
selector: ..season.year
|
|
||||||
_quality:
|
|
||||||
selector: quality.string
|
|
||||||
_quality_type:
|
|
||||||
selector: quality.type
|
|
||||||
_quality_resolution:
|
|
||||||
selector: quality.resolution
|
|
||||||
_quality_encoder:
|
|
||||||
selector: quality.encoder
|
|
||||||
filters:
|
|
||||||
- name: re_replace
|
|
||||||
args: ["(?i)^h", "x"]
|
|
||||||
title_parsed:
|
|
||||||
text: "{{ if .Config.stripcyrillic }}{{ else }}{{ .Result.title_ru }} / {{ end }}{{ .Result.title_en_parsed }} {{ .Result._season_number}}E{{ .Result._episodes }} [{{ .Result._quality_type }} {{ .Result._quality_resolution }} {{ .Result._quality_encoder }}]"
|
|
||||||
filters:
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bS\\d+EФильм\\b", "({{ .Result.year }}) MOVIE"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bS\\d+EOVA\\b", "({{ .Result.year }}) OVA"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bS\\d+EONA\\b", "({{ .Result.year }}) ONA"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bS\\d+EMovie\\b", "({{ .Result.year }}) MOVIE"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bS\\d+EП/м фильм\\b", "({{ .Result.year }}) MOVIE"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bS\\d+EРекап\\b", "({{ .Result.year }}) RECAP"]
|
|
||||||
- name: re_replace
|
|
||||||
args: ["\\bS\\d+ETV-Special\\b", "({{ .Result.year }}) SPECIAL"]
|
|
||||||
- name: append
|
|
||||||
args: "{{ if .Config.addrussiantotitle }} - RUS{{ else }}{{ end }}"
|
|
||||||
title_original:
|
|
||||||
text: "{{ if .Config.stripcyrillic }}{{ else }}{{ .Result.title_ru }} / {{ end }}{{ .Result.title_en }}{{ if .Result.title_alternative }} / AKA {{ .Result.title_alternative }}{{ else }}{{ end }} ({{ .Result.year }}) [{{ .Result._quality }}]{{ if .Result._episodes }} - E{{ .Result._episodes }}{{ else }}{{ end }}"
|
|
||||||
filters:
|
|
||||||
- name: re_replace
|
|
||||||
args: [" - \\bEФильм\\b", " - MOVIE"]
|
|
||||||
- name: re_replace
|
|
||||||
args: [" - \\bEMovie\\b", " - MOVIE"]
|
|
||||||
- name: re_replace
|
|
||||||
args: [" - \\bEП/м фильм\\b", " - MOVIE"]
|
|
||||||
- name: re_replace
|
|
||||||
args: [" - \\bEOVA\\b", " - OVA"]
|
|
||||||
- name: re_replace
|
|
||||||
args: [" - \\bEONA\\b", " - ONA"]
|
|
||||||
- name: append
|
|
||||||
args: "{{ if .Config.addrussiantotitle }} - RUS{{ else }}{{ end }}"
|
|
||||||
title:
|
|
||||||
text: "{{ if .Config.sonarr_compatibility }}{{ .Result.title_parsed }}{{ else }}{{ .Result.title_original }}{{ end }}"
|
|
||||||
_code:
|
|
||||||
selector: ..code
|
|
||||||
details:
|
|
||||||
text: "{{ .Config.sitelink }}release/{{ .Result._code }}.html"
|
|
||||||
download_url:
|
|
||||||
selector: url
|
|
||||||
download:
|
|
||||||
text: "{{ .Config.sitelink }}{{ .Result.download_url }}"
|
|
||||||
magnet:
|
|
||||||
selector: magnet
|
|
||||||
poster:
|
|
||||||
selector: ..posters.small.url
|
|
||||||
filters:
|
|
||||||
- name: prepend
|
|
||||||
args: "https://static.anilibria.tv"
|
|
||||||
seeders:
|
|
||||||
selector: seeders
|
|
||||||
leechers:
|
|
||||||
selector: leechers
|
|
||||||
grabs:
|
|
||||||
selector: downloads
|
|
||||||
date:
|
|
||||||
# unix
|
|
||||||
selector: uploaded_timestamp
|
|
||||||
size:
|
|
||||||
selector: total_size
|
|
||||||
downloadvolumefactor:
|
|
||||||
text: 0
|
|
||||||
uploadvolumefactor:
|
|
||||||
text: 1
|
|
||||||
description:
|
|
||||||
selector: ..description
|
|
||||||
# json api v3
|
|
138
src/Jackett.Common/Indexers/Definitions/Anilibria.cs
Normal file
138
src/Jackett.Common/Indexers/Definitions/Anilibria.cs
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using AngleSharp;
|
||||||
|
using Jackett.Common.Helpers;
|
||||||
|
using Jackett.Common.Models;
|
||||||
|
using Jackett.Common.Models.DTO.Anilibria;
|
||||||
|
using Jackett.Common.Models.IndexerConfig.Bespoke;
|
||||||
|
using Jackett.Common.Serializer;
|
||||||
|
using Jackett.Common.Services.Interfaces;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using NLog;
|
||||||
|
using WebClient = Jackett.Common.Utils.Clients.WebClient;
|
||||||
|
|
||||||
|
namespace Jackett.Common.Indexers.Definitions
|
||||||
|
{
|
||||||
|
[ExcludeFromCodeCoverage]
|
||||||
|
public class Anilibria : IndexerBase
|
||||||
|
{
|
||||||
|
public override string Id => "anilibria";
|
||||||
|
public override string Name => "Anilibria";
|
||||||
|
public override string Description => "Anilibria is a russian-language anime distribution platform";
|
||||||
|
public override string SiteLink { get; protected set; } = "https://anilibria.top/";
|
||||||
|
public override string[] LegacySiteLinks => new[]
|
||||||
|
{
|
||||||
|
"https://www.anilibria.tv/",
|
||||||
|
}; private string ApiBase => $"{SiteLink}api/v1/";
|
||||||
|
public override string Language => "ru-RU";
|
||||||
|
public override string Type => "public";
|
||||||
|
public override TorznabCapabilities TorznabCaps => SetCapabilities();
|
||||||
|
|
||||||
|
public Anilibria(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps,
|
||||||
|
ICacheService cs) : base(
|
||||||
|
configService: configService, client: wc, logger: l, p: ps, cacheService: cs,
|
||||||
|
configData: new ConfigurationDataAnilibria())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private static TorznabCapabilities SetCapabilities()
|
||||||
|
{
|
||||||
|
var caps = new TorznabCapabilities
|
||||||
|
{
|
||||||
|
TvSearchParams = new List<TvSearchParam> { TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep }
|
||||||
|
};
|
||||||
|
caps.Categories.AddCategoryMapping("TV", TorznabCatType.TVAnime, "Аниме TV");
|
||||||
|
caps.Categories.AddCategoryMapping("MOVIE", TorznabCatType.TVAnime, "Аниме Фильмы");
|
||||||
|
caps.Categories.AddCategoryMapping("OVA", TorznabCatType.TVAnime, "Аниме OVA");
|
||||||
|
caps.Categories.AddCategoryMapping("ONA", TorznabCatType.TVAnime, "Аниме ONA");
|
||||||
|
caps.Categories.AddCategoryMapping("SPECIAL", TorznabCatType.TVAnime, "Аниме Спешл");
|
||||||
|
caps.Categories.AddCategoryMapping("WEB", TorznabCatType.TVAnime, "Аниме WEB");
|
||||||
|
caps.Categories.AddCategoryMapping("OAD", TorznabCatType.TVAnime, "Аниме OAD");
|
||||||
|
caps.Categories.AddCategoryMapping("DORAMA", TorznabCatType.TV, "Дорамы");
|
||||||
|
return caps;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||||
|
{
|
||||||
|
LoadValuesFromJson(configJson);
|
||||||
|
IsConfigured = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var results = await PerformQuery(new TorznabQuery());
|
||||||
|
|
||||||
|
if (!results.Any())
|
||||||
|
{
|
||||||
|
throw new Exception("API unavailable or unknown error");
|
||||||
|
}
|
||||||
|
|
||||||
|
IsConfigured = true;
|
||||||
|
SaveConfig();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new ExceptionWithConfigData(e.Message, configData);
|
||||||
|
}
|
||||||
|
|
||||||
|
return IndexerConfigurationStatus.Completed;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||||
|
{
|
||||||
|
var releases = new List<ReleaseInfo>();
|
||||||
|
var template = Uri.EscapeDataString(query.GetQueryString());
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(template))
|
||||||
|
{
|
||||||
|
template = "*";
|
||||||
|
}
|
||||||
|
|
||||||
|
var responseReleases = await RequestWithCookiesAsync(
|
||||||
|
$"{ApiBase}app/search/releases?query={template}", cookieOverride: string.Empty);
|
||||||
|
var ids = JArray.Parse(responseReleases.ContentString).Select(o => (long?)o["id"]).Where(id => id.HasValue)
|
||||||
|
.Select(id => id.Value).ToList();
|
||||||
|
var torrentsInfo = new List<AnilibriaTorrentInfo>();
|
||||||
|
|
||||||
|
foreach (var id in ids)
|
||||||
|
{
|
||||||
|
var torrents = await RequestWithCookiesAsync(
|
||||||
|
$"{ApiBase}anime/torrents/release/{id}", cookieOverride: string.Empty);
|
||||||
|
torrentsInfo.AddRange(
|
||||||
|
JsonConvert.DeserializeObject<List<AnilibriaTorrentInfo>>(
|
||||||
|
torrents.ContentString, new AnilibriaTopTorrentInfoConverter()));
|
||||||
|
}
|
||||||
|
|
||||||
|
releases.AddRange(
|
||||||
|
torrentsInfo.Select(
|
||||||
|
torrentInfo => new ReleaseInfo
|
||||||
|
{
|
||||||
|
Guid = GetReleaseLink(torrentInfo.Alias),
|
||||||
|
Title = $"{torrentInfo.NameMain} / {torrentInfo.Label}",
|
||||||
|
Details = GetReleaseLink(torrentInfo.Alias),
|
||||||
|
Poster = GetPosterLink(torrentInfo.PosterSrc),
|
||||||
|
Year = torrentInfo.Year,
|
||||||
|
Link = GetDownloadLink(torrentInfo.Hash),
|
||||||
|
Size = torrentInfo.Size,
|
||||||
|
Seeders = torrentInfo.Seeders,
|
||||||
|
Peers = torrentInfo.Seeders + torrentInfo.Leechers,
|
||||||
|
PublishDate = torrentInfo.CreatedAt,
|
||||||
|
InfoHash = torrentInfo.Hash,
|
||||||
|
Grabs = torrentInfo.Grabs,
|
||||||
|
DownloadVolumeFactor = 0,
|
||||||
|
UploadVolumeFactor = 1,
|
||||||
|
Category = MapTrackerCatToNewznab(torrentInfo.Category)
|
||||||
|
}));
|
||||||
|
return releases;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Uri GetReleaseLink(string alias) => new($"{SiteLink}anime/releases/release/{alias}");
|
||||||
|
private Uri GetPosterLink(string posterSrc) => new($"{SiteLink}{posterSrc.TrimStart('/')}");
|
||||||
|
private Uri GetDownloadLink(string hash) => new($"{ApiBase}anime/torrents/{hash}/file");
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Jackett.Common.Models.DTO.Anilibria
|
||||||
|
{
|
||||||
|
public class AnilibriaTorrentInfo
|
||||||
|
{
|
||||||
|
public long Id { get; set; }
|
||||||
|
public string Hash { get; set; }
|
||||||
|
public long Size { get; set; }
|
||||||
|
public string Magnet { get; set; }
|
||||||
|
public long Seeders { get; set; }
|
||||||
|
public long Leechers { get; set; }
|
||||||
|
public string Label { get; set; }
|
||||||
|
public string NameMain { get; set; }
|
||||||
|
public string NameEnglish { get; set; }
|
||||||
|
public string Alias { get; set; }
|
||||||
|
public string PosterSrc { get; set; }
|
||||||
|
public DateTime CreatedAt { get; set; }
|
||||||
|
public int Year { get; set; }
|
||||||
|
public long Grabs { get; set; }
|
||||||
|
public string Category { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,6 @@
|
|||||||
|
namespace Jackett.Common.Models.IndexerConfig.Bespoke
|
||||||
|
{
|
||||||
|
public class ConfigurationDataAnilibria : ConfigurationData
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,36 @@
|
|||||||
|
using System;
|
||||||
|
using Jackett.Common.Models.DTO.Anilibria;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
namespace Jackett.Common.Serializer
|
||||||
|
{
|
||||||
|
public class AnilibriaTopTorrentInfoConverter : JsonConverter<AnilibriaTorrentInfo>
|
||||||
|
{
|
||||||
|
public override AnilibriaTorrentInfo ReadJson(JsonReader reader, Type objectType, AnilibriaTorrentInfo existingValue, bool hasExistingValue, JsonSerializer serializer)
|
||||||
|
{
|
||||||
|
var obj = JObject.Load(reader);
|
||||||
|
|
||||||
|
return new AnilibriaTorrentInfo
|
||||||
|
{
|
||||||
|
Id = (long?)obj["id"] ?? 0,
|
||||||
|
Hash = (string)obj["hash"],
|
||||||
|
Size = (long?)obj["size"] ?? 0,
|
||||||
|
Magnet = (string)obj["magnet"],
|
||||||
|
Seeders = (long?)obj["seeders"] ?? 0,
|
||||||
|
Leechers = (long?)obj["leechers"] ?? 0,
|
||||||
|
Label = (string)obj["label"],
|
||||||
|
NameMain = (string)obj["release"]?["name"]?["main"],
|
||||||
|
NameEnglish = (string)obj["release"]?["name"]?["english"],
|
||||||
|
Alias = (string)obj["release"]?["alias"],
|
||||||
|
PosterSrc = (string)obj["release"]?["poster"]?["src"],
|
||||||
|
CreatedAt = (DateTime?)obj["created_at"] ?? DateTime.MinValue,
|
||||||
|
Year = (int?)obj["year"] ?? 0,
|
||||||
|
Grabs = (long?)obj["completed_times"] ?? 0,
|
||||||
|
Category = (string)obj["release"]?["type"]?["value"],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void WriteJson(JsonWriter writer, AnilibriaTorrentInfo value, JsonSerializer serializer) => throw new NotImplementedException("Serialization not implemented.");
|
||||||
|
}
|
||||||
|
}
|
@@ -275,6 +275,7 @@ namespace Jackett.Updater
|
|||||||
"Definitions/anaschcc.yml",
|
"Definitions/anaschcc.yml",
|
||||||
"Definitions/angietorrents.yml",
|
"Definitions/angietorrents.yml",
|
||||||
"Definitions/anidex.yml", // migrated to C#
|
"Definitions/anidex.yml", // migrated to C#
|
||||||
|
"Definitions/anilibria.yml", // migrated to c# #5762
|
||||||
"Definitions/anime-free.yml",
|
"Definitions/anime-free.yml",
|
||||||
"Definitions/animeclipse.yml",
|
"Definitions/animeclipse.yml",
|
||||||
"Definitions/animeitalia.yml",
|
"Definitions/animeitalia.yml",
|
||||||
|
Reference in New Issue
Block a user