summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authormorpheus65535 <[email protected]>2024-04-15 08:17:55 -0400
committermorpheus65535 <[email protected]>2024-04-15 08:17:55 -0400
commit77a157f0ddcc51f8a66464c6d8e530a33c981df0 (patch)
tree70ae1cf64f78c0ed78da6b3aeb74a837ddf48a8f
parent8037ec033f72485bc8f223ff11a81fbce39a0e03 (diff)
parent77ebd036f210ec30529ea5419d7a91ac3c0ece13 (diff)
downloadbazarr-77a157f0ddcc51f8a66464c6d8e530a33c981df0.tar.gz
bazarr-77a157f0ddcc51f8a66464c6d8e530a33c981df0.zip
Merge remote-tracking branch 'origin/development' into development
-rw-r--r--README.md1
-rw-r--r--bazarr/app/config.py11
-rw-r--r--bazarr/app/get_providers.py3
-rw-r--r--bazarr/subtitles/refiners/__init__.py2
-rw-r--r--bazarr/subtitles/refiners/anidb.py140
-rw-r--r--custom_libs/subliminal/video.py6
-rw-r--r--custom_libs/subliminal_patch/extensions.py1
-rw-r--r--custom_libs/subliminal_patch/providers/animetosho.py164
-rw-r--r--custom_libs/subliminal_patch/video.py4
-rw-r--r--frontend/src/pages/Settings/Providers/components.tsx59
-rw-r--r--frontend/src/pages/Settings/Providers/index.tsx12
-rw-r--r--frontend/src/pages/Settings/Providers/list.ts35
-rw-r--r--tests/conftest.py2
-rw-r--r--tests/subliminal_patch/data/animetosho_episode_response.json756
-rw-r--r--tests/subliminal_patch/data/animetosho_series_response.json232
-rw-r--r--tests/subliminal_patch/test_animetosho.py59
16 files changed, 1465 insertions, 22 deletions
diff --git a/README.md b/README.md
index c244d7b47..0114bbff5 100644
--- a/README.md
+++ b/README.md
@@ -48,6 +48,7 @@ If you need something that is not already part of Bazarr, feel free to create a
## Supported subtitles providers:
- Addic7ed
+- Animetosho (requires AniDb HTTP API client described [here](https://wiki.anidb.net/HTTP_API_Definition))
- Assrt
- BetaSeries
- BSplayer
diff --git a/bazarr/app/config.py b/bazarr/app/config.py
index cda51d0ef..49ae4cf32 100644
--- a/bazarr/app/config.py
+++ b/bazarr/app/config.py
@@ -109,6 +109,7 @@ validators = [
Validator('general.adaptive_searching_delta', must_exist=True, default='1w', is_type_of=str,
is_in=['3d', '1w', '2w', '3w', '4w']),
Validator('general.enabled_providers', must_exist=True, default=[], is_type_of=list),
+ Validator('general.enabled_integrations', must_exist=True, default=[], is_type_of=list),
Validator('general.multithreading', must_exist=True, default=True, is_type_of=bool),
Validator('general.chmod_enabled', must_exist=True, default=False, is_type_of=bool),
Validator('general.chmod', must_exist=True, default='0640', is_type_of=str),
@@ -234,6 +235,11 @@ validators = [
Validator('addic7ed.user_agent', must_exist=True, default='', is_type_of=str),
Validator('addic7ed.vip', must_exist=True, default=False, is_type_of=bool),
+ # animetosho section
+ Validator('animetosho.search_threshold', must_exist=True, default=6, is_type_of=int, gte=1, lte=15),
+ Validator('animetosho.anidb_api_client', must_exist=True, default='', is_type_of=str, cast=str),
+ Validator('animetosho.anidb_api_client_ver', must_exist=True, default=1, is_type_of=int, gte=1, lte=9),
+
# avistaz section
Validator('avistaz.cookies', must_exist=True, default='', is_type_of=str),
Validator('avistaz.user_agent', must_exist=True, default='', is_type_of=str),
@@ -369,6 +375,10 @@ validators = [
Validator('postgresql.database', must_exist=True, default='', is_type_of=str),
Validator('postgresql.username', must_exist=True, default='', is_type_of=str, cast=str),
Validator('postgresql.password', must_exist=True, default='', is_type_of=str, cast=str),
+
+ # anidb section
+ Validator('anidb.api_client', must_exist=True, default='', is_type_of=str),
+ Validator('anidb.api_client_ver', must_exist=True, default=1, is_type_of=int),
]
@@ -442,6 +452,7 @@ array_keys = ['excluded_tags',
'subzero_mods',
'excluded_series_types',
'enabled_providers',
+ 'enabled_integrations',
'path_mappings',
'path_mappings_movie',
'language_equals',
diff --git a/bazarr/app/get_providers.py b/bazarr/app/get_providers.py
index bb78f29d9..7df6b8742 100644
--- a/bazarr/app/get_providers.py
+++ b/bazarr/app/get_providers.py
@@ -324,6 +324,9 @@ def get_providers_auth():
'timeout': settings.whisperai.timeout,
'ffmpeg_path': _FFMPEG_BINARY,
'loglevel': settings.whisperai.loglevel,
+ },
+ "animetosho": {
+ 'search_threshold': settings.animetosho.search_threshold,
}
}
diff --git a/bazarr/subtitles/refiners/__init__.py b/bazarr/subtitles/refiners/__init__.py
index 750fa4f18..ff1e715a0 100644
--- a/bazarr/subtitles/refiners/__init__.py
+++ b/bazarr/subtitles/refiners/__init__.py
@@ -3,9 +3,11 @@
from .ffprobe import refine_from_ffprobe
from .database import refine_from_db
from .arr_history import refine_from_arr_history
+from .anidb import refine_from_anidb
registered = {
"database": refine_from_db,
"ffprobe": refine_from_ffprobe,
"arr_history": refine_from_arr_history,
+ "anidb": refine_from_anidb,
}
diff --git a/bazarr/subtitles/refiners/anidb.py b/bazarr/subtitles/refiners/anidb.py
new file mode 100644
index 000000000..2174e0f7c
--- /dev/null
+++ b/bazarr/subtitles/refiners/anidb.py
@@ -0,0 +1,140 @@
+# coding=utf-8
+# fmt: off
+
+import logging
+import requests
+from collections import namedtuple
+from datetime import timedelta
+from requests.exceptions import HTTPError
+
+from app.config import settings
+from subliminal import Episode, region
+
+try:
+ from lxml import etree
+except ImportError:
+ try:
+ import xml.etree.cElementTree as etree
+ except ImportError:
+ import xml.etree.ElementTree as etree
+
+refined_providers = {'animetosho'}
+
+api_url = 'http://api.anidb.net:9001/httpapi'
+
+
+class AniDBClient(object):
+ def __init__(self, api_client_key=None, api_client_ver=1, session=None):
+ self.session = session or requests.Session()
+ self.api_client_key = api_client_key
+ self.api_client_ver = api_client_ver
+
+ AnimeInfo = namedtuple('AnimeInfo', ['anime', 'episode_offset'])
+
+ @region.cache_on_arguments(expiration_time=timedelta(days=1).total_seconds())
+ def get_series_mappings(self):
+ r = self.session.get(
+ 'https://raw.githubusercontent.com/Anime-Lists/anime-lists/master/anime-list.xml',
+ timeout=10
+ )
+
+ r.raise_for_status()
+
+ return r.content
+
+ @region.cache_on_arguments(expiration_time=timedelta(days=1).total_seconds())
+ def get_series_id(self, mappings, tvdb_series_season, tvdb_series_id, episode):
+ # Enrich the collection of anime with the episode offset
+ animes = [
+ self.AnimeInfo(anime, int(anime.attrib.get('episodeoffset', 0)))
+ for anime in mappings.findall(
+ f".//anime[@tvdbid='{tvdb_series_id}'][@defaulttvdbseason='{tvdb_series_season}']"
+ )
+ ]
+
+ if not animes:
+ return None
+
+ # Sort the anime by offset in ascending order
+ animes.sort(key=lambda a: a.episode_offset)
+
+ # Different from Tvdb, Anidb have different ids for the Parts of a season
+ anidb_id = None
+ offset = 0
+
+ for index, anime_info in enumerate(animes):
+ anime, episode_offset = anime_info
+ anidb_id = int(anime.attrib.get('anidbid'))
+ if episode > episode_offset:
+ anidb_id = anidb_id
+ offset = episode_offset
+
+ return anidb_id, episode - offset
+
+ @region.cache_on_arguments(expiration_time=timedelta(days=1).total_seconds())
+ def get_series_episodes_ids(self, tvdb_series_id, season, episode):
+ mappings = etree.fromstring(self.get_series_mappings())
+
+ series_id, episode_no = self.get_series_id(mappings, season, tvdb_series_id, episode)
+
+ if not series_id:
+ return None, None
+
+ episodes = etree.fromstring(self.get_episodes(series_id))
+
+ return series_id, int(episodes.find(f".//episode[epno='{episode_no}']").attrib.get('id'))
+
+ @region.cache_on_arguments(expiration_time=timedelta(days=1).total_seconds())
+ def get_episodes(self, series_id):
+ r = self.session.get(
+ api_url,
+ params={
+ 'request': 'anime',
+ 'client': self.api_client_key,
+ 'clientver': self.api_client_ver,
+ 'protover': 1,
+ 'aid': series_id
+ },
+ timeout=10)
+ r.raise_for_status()
+
+ xml_root = etree.fromstring(r.content)
+
+ response_code = xml_root.attrib.get('code')
+ if response_code == '500':
+ raise HTTPError('AniDB API Abuse detected. Banned status.')
+ elif response_code == '302':
+ raise HTTPError('AniDB API Client error. Client is disabled or does not exists.')
+
+ episode_elements = xml_root.find('episodes')
+
+ if not episode_elements:
+ raise ValueError
+
+ return etree.tostring(episode_elements, encoding='utf8', method='xml')
+
+
+def refine_from_anidb(path, video):
+ if refined_providers.intersection(settings.general.enabled_providers) and video.series_anidb_id is None:
+ refine_anidb_ids(video)
+
+
+def refine_anidb_ids(video):
+ if not isinstance(video, Episode) and not video.series_tvdb_id:
+ logging.debug(f'Video is not an Anime TV series, skipping refinement for {video}')
+
+ return video
+
+ anidb_client = AniDBClient(settings.anidb.api_client, settings.anidb.api_client_ver)
+
+ season = video.season if video.season else 0
+
+ anidb_series_id, anidb_episode_id = anidb_client.get_series_episodes_ids(video.series_tvdb_id, season, video.episode)
+
+ if not anidb_episode_id:
+ logging.error(f'Could not find anime series {video.series}')
+
+ return video
+
+ video.series_anidb_id = anidb_series_id
+ video.series_anidb_episode_id = anidb_episode_id
diff --git a/custom_libs/subliminal/video.py b/custom_libs/subliminal/video.py
index 1264d0b84..12aeba5f5 100644
--- a/custom_libs/subliminal/video.py
+++ b/custom_libs/subliminal/video.py
@@ -129,7 +129,8 @@ class Episode(Video):
"""
def __init__(self, name, series, season, episode, title=None, year=None, original_series=True, tvdb_id=None,
- series_tvdb_id=None, series_imdb_id=None, alternative_series=None, **kwargs):
+ series_tvdb_id=None, series_imdb_id=None, alternative_series=None, series_anidb_id=None,
+ series_anidb_episode_id=None, **kwargs):
super(Episode, self).__init__(name, **kwargs)
#: Series of the episode
@@ -162,6 +163,9 @@ class Episode(Video):
#: Alternative names of the series
self.alternative_series = alternative_series or []
+ self.series_anidb_episode_id = series_anidb_episode_id
+ self.series_anidb_id = series_anidb_id
+
@classmethod
def fromguess(cls, name, guess):
if guess['type'] != 'episode':
diff --git a/custom_libs/subliminal_patch/extensions.py b/custom_libs/subliminal_patch/extensions.py
index eeb2ee4cb..800a1d547 100644
--- a/custom_libs/subliminal_patch/extensions.py
+++ b/custom_libs/subliminal_patch/extensions.py
@@ -64,4 +64,3 @@ subliminal.refiner_manager.register('drone = subliminal_patch.refiners.drone:ref
subliminal.refiner_manager.register('filebot = subliminal_patch.refiners.filebot:refine')
subliminal.refiner_manager.register('file_info_file = subliminal_patch.refiners.file_info_file:refine')
subliminal.refiner_manager.register('symlinks = subliminal_patch.refiners.symlinks:refine')
-
diff --git a/custom_libs/subliminal_patch/providers/animetosho.py b/custom_libs/subliminal_patch/providers/animetosho.py
new file mode 100644
index 000000000..d9c078503
--- /dev/null
+++ b/custom_libs/subliminal_patch/providers/animetosho.py
@@ -0,0 +1,164 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+import logging
+import lzma
+
+from guessit import guessit
+from requests import Session
+from subzero.language import Language
+
+
+from subliminal.exceptions import ConfigurationError, ProviderError
+from subliminal_patch.providers import Provider
+from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin
+from subliminal_patch.subtitle import Subtitle, guess_matches
+from subliminal.video import Episode
+
+try:
+ from lxml import etree
+except ImportError:
+ try:
+ import xml.etree.cElementTree as etree
+ except ImportError:
+ import xml.etree.ElementTree as etree
+
+logger = logging.getLogger(__name__)
+
+# TODO: Test and Support Other Languages
+supported_languages = [
+ "eng", # English
+ "ita", # Italian
+]
+
+
+class AnimeToshoSubtitle(Subtitle):
+ """AnimeTosho.org Subtitle."""
+ provider_name = 'animetosho'
+
+ def __init__(self, language, download_link, meta):
+ super(AnimeToshoSubtitle, self).__init__(language, page_link=download_link)
+ self.meta = meta
+ self.download_link = download_link
+
+ @property
+ def id(self):
+ return self.download_link
+
+ def get_matches(self, video):
+ matches = set()
+ matches |= guess_matches(video, guessit(self.meta['filename']))
+
+ # Add these data are explicit extracted from the API and they always have to match otherwise they wouldn't
+ # arrive at this point and would stop on list_subtitles.
+ matches.update(['title', 'series', 'tvdb_id', 'season', 'episode'])
+
+ return matches
+
+
+class AnimeToshoProvider(Provider, ProviderSubtitleArchiveMixin):
+ """AnimeTosho.org Provider."""
+ subtitle_class = AnimeToshoSubtitle
+ languages = {Language('por', 'BR')} | {Language(sl) for sl in supported_languages}
+ video_types = Episode
+
+ def __init__(self, search_threshold=None):
+ self.session = None
+
+ if not all([search_threshold]):
+ raise ConfigurationError("Search threshold, Api Client and Version must be specified!")
+
+ self.search_threshold = search_threshold
+
+ def initialize(self):
+ self.session = Session()
+
+ def terminate(self):
+ self.session.close()
+
+ def list_subtitles(self, video, languages):
+ if not video.series_anidb_episode_id:
+ raise ProviderError("Video does not have an AnimeTosho Episode ID!")
+
+ return [s for s in self._get_series(video.series_anidb_episode_id) if s.language in languages]
+
+ def download_subtitle(self, subtitle):
+ logger.info('Downloading subtitle %r', subtitle)
+
+ r = self.session.get(subtitle.page_link, timeout=10)
+ r.raise_for_status()
+
+ # Check if the bytes content starts with the xz magic number of the xz archives
+ if not self._is_xz_file(r.content):
+ raise ProviderError('Unidentified archive type')
+
+ subtitle.content = lzma.decompress(r.content)
+
+ return subtitle
+
+ @staticmethod
+ def _is_xz_file(content):
+ return content.startswith(b'\xFD\x37\x7A\x58\x5A\x00')
+
+ def _get_series(self, episode_id):
+ storage_download_url = 'https://animetosho.org/storage/attach/'
+ feed_api_url = 'https://feed.animetosho.org/json'
+
+ subtitles = []
+
+ entries = self._get_series_entries(episode_id)
+
+ for entry in entries:
+ r = self.session.get(
+ feed_api_url,
+ params={
+ 'show': 'torrent',
+ 'id': entry['id'],
+ },
+ timeout=10
+ )
+ r.raise_for_status()
+
+ for file in r.json()['files']:
+ if 'attachments' not in file:
+ continue
+
+ subtitle_files = list(filter(lambda f: f['type'] == 'subtitle', file['attachments']))
+
+ for subtitle_file in subtitle_files:
+ hex_id = format(subtitle_file['id'], '08x')
+
+ subtitle = self.subtitle_class(
+ Language.fromalpha3b(subtitle_file['info']['lang']),
+ storage_download_url + '{}/{}.xz'.format(hex_id, subtitle_file['id']),
+ meta=file,
+ )
+
+ logger.debug('Found subtitle %r', subtitle)
+
+ subtitles.append(subtitle)
+
+ return subtitles
+
+ def _get_series_entries(self, episode_id):
+ api_url = 'https://feed.animetosho.org/json'
+
+ r = self.session.get(
+ api_url,
+ params={
+ 'eid': episode_id,
+ },
+ timeout=10
+ )
+
+ r.raise_for_status()
+
+ j = r.json()
+
+ # Ignore records that are not yet ready or has been abandoned by AnimeTosho.
+ entries = list(filter(lambda t: t['status'] == 'complete', j))[:self.search_threshold]
+
+ # Return the latest entries that have been added as it is used to cutoff via the user configuration threshold
+ entries.sort(key=lambda t: t['timestamp'], reverse=True)
+
+ return entries
diff --git a/custom_libs/subliminal_patch/video.py b/custom_libs/subliminal_patch/video.py
index 0d613bb94..f5df0c92e 100644
--- a/custom_libs/subliminal_patch/video.py
+++ b/custom_libs/subliminal_patch/video.py
@@ -33,6 +33,8 @@ class Video(Video_):
edition=None,
other=None,
info_url=None,
+ series_anidb_id=None,
+ series_anidb_episode_id=None,
**kwargs
):
super(Video, self).__init__(
@@ -57,3 +59,5 @@ class Video(Video_):
self.original_path = name
self.other = other
self.info_url = info_url
+ self.series_anidb_series_id = series_anidb_id,
+ self.series_anidb_episode_id = series_anidb_episode_id,
diff --git a/frontend/src/pages/Settings/Providers/components.tsx b/frontend/src/pages/Settings/Providers/components.tsx
index 87abe7571..91076d7de 100644
--- a/frontend/src/pages/Settings/Providers/components.tsx
+++ b/frontend/src/pages/Settings/Providers/components.tsx
@@ -39,14 +39,24 @@ import {
} from "../utilities/FormValues";
import { SettingsProvider, useSettings } from "../utilities/SettingsProvider";
import { useSettingValue } from "../utilities/hooks";
-import { ProviderInfo, ProviderList } from "./list";
+import { ProviderInfo } from "./list";
-const ProviderKey = "settings-general-enabled_providers";
+type SettingsKey =
+ | "settings-general-enabled_providers"
+ | "settings-general-enabled_integrations";
-export const ProviderView: FunctionComponent = () => {
+interface ProviderViewProps {
+ availableOptions: Readonly<ProviderInfo[]>;
+ settingsKey: SettingsKey;
+}
+
+export const ProviderView: FunctionComponent<ProviderViewProps> = ({
+ availableOptions,
+ settingsKey,
+}) => {
const settings = useSettings();
const staged = useStagedValues();
- const providers = useSettingValue<string[]>(ProviderKey);
+ const providers = useSettingValue<string[]>(settingsKey);
const { update } = useFormActions();
@@ -61,17 +71,27 @@ export const ProviderView: FunctionComponent = () => {
staged,
settings,
onChange: update,
+ availableOptions: availableOptions,
+ settingsKey: settingsKey,
});
}
},
- [modals, providers, settings, staged, update],
+ [
+ modals,
+ providers,
+ settings,
+ staged,
+ update,
+ availableOptions,
+ settingsKey,
+ ],
);
const cards = useMemo(() => {
if (providers) {
return providers
.flatMap((v) => {
- const item = ProviderList.find((inn) => inn.key === v);
+ const item = availableOptions.find((inn) => inn.key === v);
if (item) {
return item;
} else {
@@ -89,7 +109,7 @@ export const ProviderView: FunctionComponent = () => {
} else {
return [];
}
- }, [providers, select]);
+ }, [providers, select, availableOptions]);
return (
<SimpleGrid cols={3}>
@@ -106,6 +126,8 @@ interface ProviderToolProps {
staged: LooseObject;
settings: Settings;
onChange: (v: LooseObject) => void;
+ availableOptions: Readonly<ProviderInfo[]>;
+ settingsKey: Readonly<SettingsKey>;
}
const SelectItem = forwardRef<
@@ -126,6 +148,8 @@ const ProviderTool: FunctionComponent<ProviderToolProps> = ({
staged,
settings,
onChange,
+ availableOptions,
+ settingsKey,
}) => {
const modals = useModals();
@@ -147,11 +171,11 @@ const ProviderTool: FunctionComponent<ProviderToolProps> = ({
if (idx !== -1) {
const newProviders = [...enabledProviders];
newProviders.splice(idx, 1);
- onChangeRef.current({ [ProviderKey]: newProviders });
+ onChangeRef.current({ [settingsKey]: newProviders });
modals.closeAll();
}
}
- }, [payload, enabledProviders, modals]);
+ }, [payload, enabledProviders, modals, settingsKey]);
const submit = useCallback(
(values: FormValues) => {
@@ -161,8 +185,7 @@ const ProviderTool: FunctionComponent<ProviderToolProps> = ({
// Add this provider if not exist
if (enabledProviders.find((v) => v === info.key) === undefined) {
- const newProviders = [...enabledProviders, info.key];
- changes[ProviderKey] = newProviders;
+ changes[settingsKey] = [...enabledProviders, info.key];
}
// Apply submit hooks
@@ -172,7 +195,7 @@ const ProviderTool: FunctionComponent<ProviderToolProps> = ({
modals.closeAll();
}
},
- [info, enabledProviders, modals],
+ [info, enabledProviders, modals, settingsKey],
);
const canSave = info !== null;
@@ -188,18 +211,18 @@ const ProviderTool: FunctionComponent<ProviderToolProps> = ({
}
}, []);
- const availableOptions = useMemo(
+ const options = useMemo(
() =>
- ProviderList.filter(
+ availableOptions.filter(
(v) =>
enabledProviders?.find((p) => p === v.key && p !== info?.key) ===
undefined,
),
- [info?.key, enabledProviders],
+ [info?.key, enabledProviders, availableOptions],
);
- const options = useSelectorOptions(
- availableOptions,
+ const selectorOptions = useSelectorOptions(
+ options,
(v) => v.name ?? capitalize(v.key),
);
@@ -289,7 +312,7 @@ const ProviderTool: FunctionComponent<ProviderToolProps> = ({
placeholder="Click to Select a Provider"
itemComponent={SelectItem}
disabled={payload !== null}
- {...options}
+ {...selectorOptions}
value={info}
onChange={onSelect}
></Selector>
diff --git a/frontend/src/pages/Settings/Providers/index.tsx b/frontend/src/pages/Settings/Providers/index.tsx
index bd8b648ff..ce855c4ee 100644
--- a/frontend/src/pages/Settings/Providers/index.tsx
+++ b/frontend/src/pages/Settings/Providers/index.tsx
@@ -11,12 +11,16 @@ import {
Text,
} from "../components";
import { ProviderView } from "./components";
+import { IntegrationList, ProviderList } from "./list";
const SettingsProvidersView: FunctionComponent = () => {
return (
<Layout name="Providers">
<Section header="Providers">
- <ProviderView></ProviderView>
+ <ProviderView
+ availableOptions={ProviderList}
+ settingsKey="settings-general-enabled_providers"
+ ></ProviderView>
</Section>
<Section header="Anti-Captcha Options">
<Selector
@@ -58,6 +62,12 @@ const SettingsProvidersView: FunctionComponent = () => {
<Message>Link to subscribe</Message>
</CollapseBox>
</Section>
+ <Section header="Integrations">
+ <ProviderView
+ availableOptions={IntegrationList}
+ settingsKey="settings-general-enabled_integrations"
+ ></ProviderView>
+ </Section>
</Layout>
);
};
diff --git a/frontend/src/pages/Settings/Providers/list.ts b/frontend/src/pages/Settings/Providers/list.ts
index 967526187..eff9ea4e9 100644
--- a/frontend/src/pages/Settings/Providers/list.ts
+++ b/frontend/src/pages/Settings/Providers/list.ts
@@ -65,6 +65,20 @@ export const ProviderList: Readonly<ProviderInfo[]> = [
],
},
{
+ key: "animetosho",
+ name: "Anime Tosho",
+ description:
+ "Anime Tosho is a free, completely automated service which mirrors most torrents posted on TokyoTosho's anime category, Nyaa.si's English translated anime category and AniDex's anime category.",
+ inputs: [
+ {
+ type: "text",
+ key: "search_threshold",
+ defaultValue: 6,
+ name: "Search Threshold. Increase if you often cannot find subtitles for your Anime. Note that increasing the value will decrease the performance of the search for each Episode.",
+ },
+ ],
+ },
+ {
key: "argenteam_dump",
name: "Argenteam Dump",
description: "Subtitles dump of the now extinct Argenteam",
@@ -538,3 +552,24 @@ export const ProviderList: Readonly<ProviderInfo[]> = [
description: "Chinese Subtitles Provider. Anti-captcha required.",
},
];
+
+export const IntegrationList: Readonly<ProviderInfo[]> = [
+ {
+ key: "anidb",
+ name: "AniDB",
+ description:
+ "AniDB is non-profit database of anime information that is freely open to the public.",
+ inputs: [
+ {
+ type: "text",
+ key: "api_client",
+ name: "API Client",
+ },
+ {
+ type: "text",
+ key: "api_client_ver",
+ name: "API Client Version",
+ },
+ ],
+ },
+];
diff --git a/tests/conftest.py b/tests/conftest.py
index 46d8fc4a0..c7fbdea07 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -7,7 +7,7 @@ import pkg_resources
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../libs/"))
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../bazarr/"))
-
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../custom_libs/"))
def pytest_report_header(config):
conflicting_packages = _get_conflicting("libs")
diff --git a/tests/subliminal_patch/data/animetosho_episode_response.json b/tests/subliminal_patch/data/animetosho_episode_response.json
new file mode 100644
index 000000000..3f7a898d3
--- /dev/null
+++ b/tests/subliminal_patch/data/animetosho_episode_response.json
@@ -0,0 +1,756 @@
+[
+ {
+ "id": 608526,
+ "title": "[EMBER] Ore dake Level Up na Ken S01E12 [1080p] [HEVC WEBRip] (Solo Leveling)",
+ "link": "https://animetosho.org/view/ember-ore-dake-level-up-na-ken-s01e12.n1796835",
+ "timestamp": 1711853493,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796835,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/f9670720a5142ec31aa8e3715745f1392e3ffd5b/%5BEMBER%5D%20Solo%20Leveling%20-%2012.torrent",
+ "torrent_name": "[EMBER] Solo Leveling - 12.mkv",
+ "info_hash": "f9670720a5142ec31aa8e3715745f1392e3ffd5b",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:7FTQOIFFCQXMGGVI4NYVORPRHEXD77K3&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&dn=%5BEMBER%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20S01E12%20%5B1080p%5D%20%5BHEVC%20WEBRip%5D%20%28Solo%20Leveling%29",
+ "seeders": 316,
+ "leechers": 24,
+ "torrent_downloaded_count": 1164,
+ "tracker_updated": 1711872554,
+ "nzb_url": "https://animetosho.org/storage/nzbs/0009490e/%5BEMBER%5D%20Solo%20Leveling%20-%2012.nzb",
+ "total_size": 369572311,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": null
+ },
+ {
+ "id": 608516,
+ "title": "[Anime Time] Solo Leveling - 12 [1080p][HEVC 10bit x265][AAC][Multi Sub] [Weekly] Ore dake Level Up na Ken",
+ "link": "https://animetosho.org/view/anime-time-solo-leveling-12-1080p-hevc-10bit.n1796824",
+ "timestamp": 1711851382,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796824,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/db16234b7aba70d2d901bde30fb0aa899589da47/%5BAnime%20Time%5D%20Solo%20Leveling%20-%2012%20%5B1080p%5D%5BHEVC%2010bit%20x265%5D%5BAAC%5D%5BMulti%20Sub%5D.torrent",
+ "torrent_name": "[Anime Time] Solo Leveling - 12 [1080p][HEVC 10bit x265][AAC][Multi Sub].mkv",
+ "info_hash": "db16234b7aba70d2d901bde30fb0aa899589da47",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:3MLCGS32XJYNFWIBXXRQ7MFKRGKYTWSH&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=http%3A%2F%2Fanidex.moe%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&dn=%5BAnime%20Time%5D%20Solo%20Leveling%20-%2012%20%5B1080p%5D%5BHEVC%2010bit%20x265%5D%5BAAC%5D%5BMulti%20Sub%5D%20%5BWeekly%5D%20Ore%20dake%20Level%20Up%20na%20Ken",
+ "seeders": 85,
+ "leechers": 11,
+ "torrent_downloaded_count": 436,
+ "tracker_updated": 1711892085,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094904/%5BAnime%20Time%5D%20Solo%20Leveling%20-%2012%20%5B1080p%5D%5BHEVC%2010bit%20x265%5D%5BAAC%5D%5BMulti%20Sub%5D.nzb",
+ "total_size": 588022366,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "http://animetime.cc/"
+ },
+ {
+ "id": 608491,
+ "title": "Solo Leveling - 12 (WEB 4K | 2160p AV1 AAC).mkv",
+ "link": "https://animetosho.org/view/solo-leveling-12-web-4k-2160p-av1-aac-mkv.d595164",
+ "timestamp": 1711845852,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": null,
+ "nyaa_subdom": null,
+ "anidex_id": 595164,
+ "torrent_url": "https://animetosho.org/storage/torrent/cfc631026a1837ef70ff6993aa9c1b1304e0d75b/Solo%20Leveling%20-%2012%20%28WEB%204K%20AV1%20AAC%29.torrent",
+ "torrent_name": "Solo Leveling - 12 (WEB 4K AV1 AAC).mkv",
+ "info_hash": "cfc631026a1837ef70ff6993aa9c1b1304e0d75b",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:Z7DDCATKDA3664H7NGJ2VHA3CMCOBV23&tr=http%3A%2F%2Fanidex.moe%3A6969%2Fannounce&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=http%3A%2F%2Ftracker.anirena.com%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker-udp.anirena.com%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&dn=Solo%20Leveling%20-%2012%20%28WEB%204K%20%7C%202160p%20AV1%20AAC%29.mkv",
+ "seeders": 11,
+ "leechers": 0,
+ "torrent_downloaded_count": 118,
+ "tracker_updated": 1712027991,
+ "nzb_url": "https://animetosho.org/storage/nzbs/000948eb/Solo%20Leveling%20-%2012%20%28WEB%204K%20AV1%20AAC%29.nzb",
+ "total_size": 586875995,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": null
+ },
+ {
+ "id": 608439,
+ "title": "[SanKyuu] Ore dake Level Up na Ken (Solo Leveling) - 12 [WEB 1080p][AV1][AAC E-AC3][Multi-Sub]",
+ "link": "https://animetosho.org/view/sankyuu-ore-dake-level-up-na-ken-solo.n1796722",
+ "timestamp": 1711836670,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796722,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/fb8193f9da38b06a444e2a50966c3fbefdb7dcde/%5BSanKyuu%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20%28Solo%20Leveling%29%20-%2012%20%5BWEB%201080p%20AV1%20AAC%20E-AC3%5D%20%5B325A372A%5D.torrent",
+ "torrent_name": "[SanKyuu] Ore dake Level Up na Ken (Solo Leveling) - 12 [WEB 1080p AV1 AAC E-AC3] [325A372A].mkv",
+ "info_hash": "fb8193f9da38b06a444e2a50966c3fbefdb7dcde",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:7OAZH6O2HCYGURCOFJIJM3B7X363PXG6&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=http%3A%2F%2Fanidex.moe%3A6969%2Fannounce&tr=http%3A%2F%2Ftracker.anirena.com%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker-udp.anirena.com%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&dn=%5BSanKyuu%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20%28Solo%20Leveling%29%20-%2012%20%5BWEB%201080p%5D%5BAV1%5D%5BAAC%20E-AC3%5D%5BMulti-Sub%5D",
+ "seeders": 51,
+ "leechers": 2,
+ "torrent_downloaded_count": 522,
+ "tracker_updated": 1711939563,
+ "nzb_url": "https://animetosho.org/storage/nzbs/000948b7/%5BSanKyuu%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20%28Solo%20Leveling%29%20-%2012%20%5BWEB%201080p%20AV1%20AAC%20E-AC3%5D%20%5B325A372A%5D.nzb",
+ "total_size": 477160034,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": null
+ },
+ {
+ "id": 608407,
+ "title": "[NeoLX] Solo Leveling - S01E12 [END][1080p x264 10bits AAC][Multiple Subtitles].mkv",
+ "link": "https://animetosho.org/view/neolx-solo-leveling-s01e12-end-1080p-x264-10bits.1859288",
+ "timestamp": 1711831500,
+ "status": "complete",
+ "tosho_id": 1859288,
+ "nyaa_id": null,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/4a053ad27c1ca38db68b77f1a81860948bec93cb/%5BNeoLX%5D%20Solo%20Leveling%20-%20S01E12%20%5BEND%5D%5B1080p%20x264%2010bits%20AAC%5D%5BMultiple%20Subtitles%5D.torrent",
+ "torrent_name": "[NeoLX] Solo Leveling - S01E12 [END][1080p x264 10bits AAC][Multiple Subtitles].mkv",
+ "info_hash": "4a053ad27c1ca38db68b77f1a81860948bec93cb",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:JICTVUT4DSRY3NULO7Y2QGDASSF6ZE6L&tr=http%3A%2F%2Fanidex.moe%3A6969%2Fannounce&tr=http%3A%2F%2Ftracker.anirena.com%3A80%2Fannounce&tr=http%3A%2F%2Ftracker.acgnx.se%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&dn=%5BNeoLX%5D%20Solo%20Leveling%20-%20S01E12%20%5BEND%5D%5B1080p%20x264%2010bits%20AAC%5D%5BMultiple%20Subtitles%5D.mkv",
+ "seeders": 22,
+ "leechers": 0,
+ "torrent_downloaded_count": 444,
+ "tracker_updated": 1712027991,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094897/%5BNeoLX%5D%20Solo%20Leveling%20-%20S01E12%20%5BEND%5D%5B1080p%20x264%2010bits%20AAC%5D%5BMultiple%20Subtitles%5D.nzb",
+ "total_size": 1775949490,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": null
+ },
+ {
+ "id": 608385,
+ "title": "[CameEsp] Solo Leveling - 12 [1080p][ESP-ENG][mkv].mkv",
+ "link": "https://animetosho.org/view/cameesp-solo-leveling-12-1080p-esp-eng-mkv-mkv.1859281",
+ "timestamp": 1711829220,
+ "status": "skipped",
+ "tosho_id": 1859281,
+ "nyaa_id": 1796635,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/7e683310c0a03a8d94ad4a1aaac0b7f97d98e70e/%5BCameEsp%5D%20Solo%20Leveling%20-%2012%20%5B1080p%5D%5BESP-ENG%5D%5Bmkv%5D.torrent",
+ "torrent_name": "",
+ "info_hash": "7e683310c0a03a8d94ad4a1aaac0b7f97d98e70e",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:PZUDGEGAUA5I3FFNJINKVQFX7F6ZRZYO&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=http%3A%2F%2Fanidex.moe%3A6969%2Fannounce&tr=http%3A%2F%2Ftracker.anirena.com%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&dn=%5BCameEsp%5D%20Solo%20Leveling%20-%2012%20%5B1080p%5D%5BESP-ENG%5D%5Bmkv%5D.mkv",
+ "seeders": 178,
+ "leechers": 21,
+ "torrent_downloaded_count": 541,
+ "tracker_updated": null,
+ "nzb_url": null,
+ "total_size": 1448914325,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://linkr.bio/CAME_CameEsp"
+ },
+ {
+ "id": 608386,
+ "title": "[CameEsp] Solo Leveling - 12 [720p][ESP-ENG][mkv].mkv",
+ "link": "https://animetosho.org/view/cameesp-solo-leveling-12-720p-esp-eng-mkv-mkv.1859282",
+ "timestamp": 1711829220,
+ "status": "skipped",
+ "tosho_id": 1859282,
+ "nyaa_id": 1796636,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/3b35bdf9880489b38f7a318cca8fe02ff31e430c/%5BCameEsp%5D%20Solo%20Leveling%20-%2012%20%5B720p%5D%5BESP-ENG%5D%5Bmkv%5D.torrent",
+ "torrent_name": "",
+ "info_hash": "3b35bdf9880489b38f7a318cca8fe02ff31e430c",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:HM2336MIASE3HD32GGGMVD7AF7ZR4QYM&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=http%3A%2F%2Fanidex.moe%3A6969%2Fannounce&tr=http%3A%2F%2Ftracker.anirena.com%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&dn=%5BCameEsp%5D%20Solo%20Leveling%20-%2012%20%5B720p%5D%5BESP-ENG%5D%5Bmkv%5D.mkv",
+ "seeders": 35,
+ "leechers": 10,
+ "torrent_downloaded_count": 160,
+ "tracker_updated": null,
+ "nzb_url": null,
+ "total_size": 737663624,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://linkr.bio/CAME_CameEsp"
+ },
+ {
+ "id": 608370,
+ "title": "[Valenciano] Ore dake Level Up na Ken - 12 [1080p][AV1 10bit][AAC][Multi-Sub] (Weekly).mkv",
+ "link": "https://animetosho.org/view/valenciano-ore-dake-level-up-na-ken-12.n1796530",
+ "timestamp": 1711826614,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796530,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/f89a9ffa23f5fc3321f3e2c476dbccbf0435fc98/%5BValenciano%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B1080p%5D%5BAV1%2010bit%5D%5BAAC%5D%5BMulti-Sub%5D%20%28Weekly%29.torrent",
+ "torrent_name": "[Valenciano] Ore dake Level Up na Ken - 12 [1080p][AV1 10bit][AAC][Multi-Sub] (Weekly).mkv",
+ "info_hash": "f89a9ffa23f5fc3321f3e2c476dbccbf0435fc98",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:7CNJ76RD6X6DGIPT4LCHNW6MX4CDL7EY&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&dn=%5BValenciano%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B1080p%5D%5BAV1%2010bit%5D%5BAAC%5D%5BMulti-Sub%5D%20%28Weekly%29.mkv",
+ "seeders": 22,
+ "leechers": 2,
+ "torrent_downloaded_count": 240,
+ "tracker_updated": 1711940503,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094872/%5BValenciano%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B1080p%5D%5BAV1%2010bit%5D%5BAAC%5D%5BMulti-Sub%5D%20%28Weekly%29.nzb",
+ "total_size": 427930434,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://discord.gg/83dRFDFDp7"
+ },
+ {
+ "id": 608368,
+ "title": "[Erai-raws] Ore dake Level Up na Ken - 12 [1080p][HEVC][Multiple Subtitle] [ENG][POR-BR][SPA-LA][SPA][ARA][FRE][GER][ITA][RUS]",
+ "link": "https://animetosho.org/view/erai-raws-ore-dake-level-up-na-ken.n1796524",
+ "timestamp": 1711825169,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796524,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/8009ee0e9b20732f44df9bf5eaef926df0814d68/%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B1080p%5D%5BHEVC%5D%5BMultiple%20Subtitle%5D%5BB46F650F%5D.torrent",
+ "torrent_name": "[Erai-raws] Ore dake Level Up na Ken - 12 [1080p][HEVC][Multiple Subtitle][B46F650F].mkv",
+ "info_hash": "8009ee0e9b20732f44df9bf5eaef926df0814d68",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:QAE64DU3EBZS6RG7TP26V34SNXYICTLI&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=http%3A%2F%2Fopen.acgnxtracker.com%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&dn=%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B1080p%5D%5BHEVC%5D%5BMultiple%20Subtitle%5D%20%5BENG%5D%5BPOR-BR%5D%5BSPA-LA%5D%5BSPA%5D%5BARA%5D%5BFRE%5D%5BGER%5D%5BITA%5D%5BRUS%5D",
+ "seeders": 298,
+ "leechers": 12,
+ "torrent_downloaded_count": 2398,
+ "tracker_updated": 1711933623,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094870/%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B1080p%5D%5BHEVC%5D%5BMultiple%20Subtitle%5D%5BB46F650F%5D.nzb",
+ "total_size": 1073028408,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": 3399105,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://www.erai-raws.info/anime-list/ore-dake-level-up-na-ken/"
+ },
+ {
+ "id": 608349,
+ "title": "[DKB] Solo Leveling - S01E12 [1080p][END][HEVC x265 10bit][Multi-Subs][weekly]",
+ "link": "https://animetosho.org/view/dkb-solo-leveling-s01e12-1080p-end-hevc-x265.n1796502",
+ "timestamp": 1711823055,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796502,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/d89e1a3b415c0b569481b06dbbe58d936f2e6f0a/%5BDKB%5D%20Solo%20Leveling%20-%20S01E12%20%5B1080p%5D%5BEND%5D%5BHEVC%20x265%2010bit%5D%5BMulti-Subs%5D.torrent",
+ "torrent_name": "[DKB] Solo Leveling - S01E12 [1080p][END][HEVC x265 10bit][Multi-Subs].mkv",
+ "info_hash": "d89e1a3b415c0b569481b06dbbe58d936f2e6f0a",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:3CPBUO2BLQFVNFEBWBW3XZMNSNXS43YK&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=http%3A%2F%2Fanidex.moe%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.internetwarriors.net%3A1337%2Fannounce&dn=%5BDKB%5D%20Solo%20Leveling%20-%20S01E12%20%5B1080p%5D%5BEND%5D%5BHEVC%20x265%2010bit%5D%5BMulti-Subs%5D%5Bweekly%5D",
+ "seeders": 153,
+ "leechers": 9,
+ "torrent_downloaded_count": 1010,
+ "tracker_updated": 1711922054,
+ "nzb_url": "https://animetosho.org/storage/nzbs/0009485d/%5BDKB%5D%20Solo%20Leveling%20-%20S01E12%20%5B1080p%5D%5BEND%5D%5BHEVC%20x265%2010bit%5D%5BMulti-Subs%5D.nzb",
+ "total_size": 665460303,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": 3399329,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://discord.gg/ZBQCQ7u"
+ },
+ {
+ "id": 608347,
+ "title": "[ASW] Solo Leveling - 12 [1080p HEVC x265 10Bit][AAC]",
+ "link": "https://animetosho.org/view/asw-solo-leveling-12-1080p-hevc-x265-10bit-aac.n1796496",
+ "timestamp": 1711822239,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796496,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/78d41db42271123d520f971b71a67d970cfdb64c/%5BASW%5D%20Solo%20Leveling%20-%2012%20%5B1080p%20HEVC%5D%5BE1A01A3E%5D.torrent",
+ "torrent_name": "[ASW] Solo Leveling - 12 [1080p HEVC][E1A01A3E].mkv",
+ "info_hash": "78d41db42271123d520f971b71a67d970cfdb64c",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:PDKB3NBCOEJD2UQPS4NXDJT5S4GP3NSM&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&dn=%5BASW%5D%20Solo%20Leveling%20-%2012%20%5B1080p%20HEVC%20x265%2010Bit%5D%5BAAC%5D",
+ "seeders": 689,
+ "leechers": 212,
+ "torrent_downloaded_count": 1960,
+ "tracker_updated": null,
+ "nzb_url": "https://animetosho.org/storage/nzbs/0009485b/%5BASW%5D%20Solo%20Leveling%20-%2012%20%5B1080p%20HEVC%5D%5BE1A01A3E%5D.nzb",
+ "total_size": 455351405,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": 3399037,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://discord.gg/6XnYdWP"
+ },
+ {
+ "id": 608346,
+ "title": "[Tenrai-Sensei] Solo Leveling - S01E12 - Arise [Web][1080p][HEVC 10bit x265] Ore dake Level Up na Ken",
+ "link": "https://animetosho.org/view/tenrai-sensei-solo-leveling-s01e12-arise-web-1080p.n1796495",
+ "timestamp": 1711822029,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796495,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/8b22acf6c18e9ac56f0af00a6061918712d8d992/Solo%20Leveling%20-%20S01E12%20-%20Arise.torrent",
+ "torrent_name": "Solo Leveling - S01E12 - Arise.mkv",
+ "info_hash": "8b22acf6c18e9ac56f0af00a6061918712d8d992",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:RMRKZ5WBR2NMK3YK6AFGAYMRQ4JNRWMS&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopentracker.i2p.rocks%3A6969%2Fannounce&dn=%5BTenrai-Sensei%5D%20Solo%20Leveling%20-%20S01E12%20-%20Arise%20%5BWeb%5D%5B1080p%5D%5BHEVC%2010bit%20x265%5D%20Ore%20dake%20Level%20Up%20na%20Ken",
+ "seeders": 1000000000,
+ "leechers": 1000000000,
+ "torrent_downloaded_count": 3028,
+ "tracker_updated": null,
+ "nzb_url": "https://animetosho.org/storage/nzbs/0009485a/Solo%20Leveling%20-%20S01E12%20-%20Arise.nzb",
+ "total_size": 574082022,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": 3399753,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://discord.gg/WucPeE5ume"
+ },
+ {
+ "id": 608339,
+ "title": "[Judas] Ore dake Level Up na Ken (Solo Leveling) - S01E12 [1080p][HEVC x265 10bit][Multi-Subs] (Weekly)",
+ "link": "https://animetosho.org/view/judas-ore-dake-level-up-na-ken-solo.n1796483",
+ "timestamp": 1711821551,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796483,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/aa0f1690f5bff99891883dbbde61e4c59920aa5e/%5BJudas%5D%20Solo%20Leveling%20-%20S01E12.torrent",
+ "torrent_name": "[Judas] Solo Leveling - S01E12.mkv",
+ "info_hash": "aa0f1690f5bff99891883dbbde61e4c59920aa5e",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:VIHRNEHVX74ZREMIHW554YPEYWMSBKS6&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&dn=%5BJudas%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20%28Solo%20Leveling%29%20-%20S01E12%20%5B1080p%5D%5BHEVC%20x265%2010bit%5D%5BMulti-Subs%5D%20%28Weekly%29",
+ "seeders": 422,
+ "leechers": 20,
+ "torrent_downloaded_count": 3434,
+ "tracker_updated": 1711874024,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094853/%5BJudas%5D%20Solo%20Leveling%20-%20S01E12.nzb",
+ "total_size": 485334036,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": 3399248,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://discord.gg/vbJ7RTn"
+ },
+ {
+ "id": 608338,
+ "title": "[Raze] Solo Leveling (Ore dake Level Up na Ken) - 12 x265 10bit 1080p 143.8561fps.mkv",
+ "link": "https://animetosho.org/view/raze-solo-leveling-ore-dake-level-up-na.n1796482",
+ "timestamp": 1711821474,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796482,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/bcebcb468c1a2557404afa18f4948cb4fded5c17/%5BRaze%5D%20Solo%20Leveling%20%28Ore%20dake%20Level%20Up%20na%20Ken%29%20-%2012%20x265%2010bit%201080p%20143.8561fps.torrent",
+ "torrent_name": "[Raze] Solo Leveling (Ore dake Level Up na Ken) - 12 x265 10bit 1080p 143.8561fps.mkv",
+ "info_hash": "bcebcb468c1a2557404afa18f4948cb4fded5c17",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:XTV4WRUMDISVOQCK7IMPJFEMWT662XAX&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&dn=%5BRaze%5D%20Solo%20Leveling%20%28Ore%20dake%20Level%20Up%20na%20Ken%29%20-%2012%20x265%2010bit%201080p%20143.8561fps.mkv",
+ "seeders": 15,
+ "leechers": 1,
+ "torrent_downloaded_count": 216,
+ "tracker_updated": 1711932770,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094852/%5BRaze%5D%20Solo%20Leveling%20%28Ore%20dake%20Level%20Up%20na%20Ken%29%20-%2012%20x265%2010bit%201080p%20143.8561fps.nzb",
+ "total_size": 987255128,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://discord.gg/72ZKssY"
+ },
+ {
+ "id": 608324,
+ "title": "Ore dake Level Up na Ken - S01E12 - 720p WEB x264 -NanDesuKa (CR).mkv",
+ "link": "https://animetosho.org/view/ore-dake-level-up-na-ken-s01e12-720p.n1796469",
+ "timestamp": 1711817371,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796469,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/514d25bbb699f0cd50ba82663f4d9972e42aec7e/Ore%20dake%20Level%20Up%20na%20Ken%20-%20S01E12%20-%20720p%20WEB%20x264%20-NanDesuKa%20%28CR%29.torrent",
+ "torrent_name": "Ore dake Level Up na Ken - S01E12 - 720p WEB x264 -NanDesuKa (CR).mkv",
+ "info_hash": "514d25bbb699f0cd50ba82663f4d9972e42aec7e",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:KFGSLO5WTHYM2UF2QJTD6TMZOLSCV3D6&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.internetwarriors.net%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&dn=Ore%20dake%20Level%20Up%20na%20Ken%20-%20S01E12%20-%20720p%20WEB%20x264%20-NanDesuKa%20%28CR%29.mkv",
+ "seeders": 24,
+ "leechers": 1,
+ "torrent_downloaded_count": 147,
+ "tracker_updated": 1711941873,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094844/Ore%20dake%20Level%20Up%20na%20Ken%20-%20S01E12%20-%20720p%20WEB%20x264%20-NanDesuKa%20%28CR%29.nzb",
+ "total_size": 733563952,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": null
+ },
+ {
+ "id": 608323,
+ "title": "Ore dake Level Up na Ken - S01E12 - 1080p WEB x264 -NanDesuKa (CR).mkv",
+ "link": "https://animetosho.org/view/ore-dake-level-up-na-ken-s01e12-1080p.n1796468",
+ "timestamp": 1711817278,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796468,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/2368c8599cb9dfcd15c4133c195a026c0c061452/Ore%20dake%20Level%20Up%20na%20Ken%20-%20S01E12%20-%201080p%20WEB%20x264%20-NanDesuKa%20%28CR%29.torrent",
+ "torrent_name": "Ore dake Level Up na Ken - S01E12 - 1080p WEB x264 -NanDesuKa (CR).mkv",
+ "info_hash": "2368c8599cb9dfcd15c4133c195a026c0c061452",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:ENUMQWM4XHP42FOECM6BSWQCNQGAMFCS&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.internetwarriors.net%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&dn=Ore%20dake%20Level%20Up%20na%20Ken%20-%20S01E12%20-%201080p%20WEB%20x264%20-NanDesuKa%20%28CR%29.mkv",
+ "seeders": 43,
+ "leechers": 1,
+ "torrent_downloaded_count": 325,
+ "tracker_updated": 1711950739,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094843/Ore%20dake%20Level%20Up%20na%20Ken%20-%20S01E12%20-%201080p%20WEB%20x264%20-NanDesuKa%20%28CR%29.nzb",
+ "total_size": 1444814636,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": null
+ },
+ {
+ "id": 608322,
+ "title": "Ore dake Level Up na Ken - S01E12 - 480p WEB x264 -NanDesuKa (CR).mkv",
+ "link": "https://animetosho.org/view/ore-dake-level-up-na-ken-s01e12-480p.n1796467",
+ "timestamp": 1711817275,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796467,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/65c34046223f78409badf5138035708875dae046/Ore%20dake%20Level%20Up%20na%20Ken%20-%20S01E12%20-%20480p%20WEB%20x264%20-NanDesuKa%20%28CR%29.torrent",
+ "torrent_name": "Ore dake Level Up na Ken - S01E12 - 480p WEB x264 -NanDesuKa (CR).mkv",
+ "info_hash": "65c34046223f78409badf5138035708875dae046",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:MXBUARRCH54EBG5N6UJYANLQRB25VYCG&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.internetwarriors.net%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&dn=Ore%20dake%20Level%20Up%20na%20Ken%20-%20S01E12%20-%20480p%20WEB%20x264%20-NanDesuKa%20%28CR%29.mkv",
+ "seeders": 2,
+ "leechers": 1,
+ "torrent_downloaded_count": 47,
+ "tracker_updated": 1711939543,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094842/Ore%20dake%20Level%20Up%20na%20Ken%20-%20S01E12%20-%20480p%20WEB%20x264%20-NanDesuKa%20%28CR%29.nzb",
+ "total_size": 379888841,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": null
+ },
+ {
+ "id": 608321,
+ "title": "[ToonsHub] Solo Leveling E12 Arise 2160p B-Global WEB-DL x264 (Multi-Subs)",
+ "link": "https://animetosho.org/view/toonshub-solo-leveling-e12-arise-2160p-b-global.n1796464",
+ "timestamp": 1711816495,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796464,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/953e7663ac91c946ee46efd1f00c544a81ac5210/Solo%20Leveling%20E12%20Arise%202160p%20B-Global%20WEB-DL%20x264%20%5BJapanese%5D%20%28AAC%202.0%29%20MSubs_ToonsHub_.torrent",
+ "torrent_name": "Solo Leveling E12 Arise 2160p B-Global WEB-DL x264 [Japanese] (AAC 2.0) MSubs_ToonsHub_.mkv",
+ "info_hash": "953e7663ac91c946ee46efd1f00c544a81ac5210",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:SU7HMY5MSHEUN3SG57I7ADCUJKA2YUQQ&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=http%3A%2F%2Fanidex.moe%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&dn=%5BToonsHub%5D%20Solo%20Leveling%20E12%20Arise%202160p%20B-Global%20WEB-DL%20x264%20%28Multi-Subs%29",
+ "seeders": 283,
+ "leechers": 6,
+ "torrent_downloaded_count": 2103,
+ "tracker_updated": 1711940653,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094841/Solo%20Leveling%20E12%20Arise%202160p%20B-Global%20WEB-DL%20x264%20%5BJapanese%5D%20%28AAC%202.0%29%20MSubs_ToonsHub_.nzb",
+ "total_size": 1725930387,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://discord.gg/2mPFKykW4j"
+ },
+ {
+ "id": 608320,
+ "title": "Solo Leveling S01E12 Arise 1080p CR WEB-DL AAC2.0 H 264-VARYG (Ore dake Level Up na Ken, Multi-Subs)",
+ "link": "https://animetosho.org/view/solo-leveling-s01e12-arise-1080p-cr-web-dl.n1796463",
+ "timestamp": 1711816461,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796463,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/e8c25942e297bfd38515d785ca82e0dac7a09688/Solo.Leveling.S01E12.Arise.1080p.CR.WEB-DL.AAC2.0.H.264-VARYG.torrent",
+ "torrent_name": "Solo.Leveling.S01E12.Arise.1080p.CR.WEB-DL.AAC2.0.H.264-VARYG.mkv",
+ "info_hash": "e8c25942e297bfd38515d785ca82e0dac7a09688",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:5DBFSQXCS675HBIV26C4VAXA3LD2BFUI&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&dn=Solo%20Leveling%20S01E12%20Arise%201080p%20CR%20WEB-DL%20AAC2.0%20H%20264-VARYG%20%28Ore%20dake%20Level%20Up%20na%20Ken%2C%20Multi-Subs%29",
+ "seeders": 476,
+ "leechers": 78,
+ "torrent_downloaded_count": 2233,
+ "tracker_updated": 1711948863,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094840/Solo.Leveling.S01E12.Arise.1080p.CR.WEB-DL.AAC2.0.H.264-VARYG.nzb",
+ "total_size": 1447070929,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://myanimelist.net/anime/52299/"
+ },
+ {
+ "id": 608319,
+ "title": "[ToonsHub] Solo Leveling E12 Arise 1080p B-Global WEB-DL x264 (Multi-Subs)",
+ "link": "https://animetosho.org/view/toonshub-solo-leveling-e12-arise-1080p-b-global.n1796462",
+ "timestamp": 1711816458,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796462,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/adf123922973e4c0f7979ab6d3874d2e2e0e5207/Solo%20Leveling%20E12%20Arise%201080p%20B-Global%20WEB-DL%20x264%20%5BJapanese%5D%20%28AAC%202.0%29%20MSubs_ToonsHub_.torrent",
+ "torrent_name": "Solo Leveling E12 Arise 1080p B-Global WEB-DL x264 [Japanese] (AAC 2.0) MSubs_ToonsHub_.mkv",
+ "info_hash": "adf123922973e4c0f7979ab6d3874d2e2e0e5207",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:VXYSHERJOPSMB54XTK3NHB2NFYXA4UQH&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=http%3A%2F%2Fanidex.moe%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&dn=%5BToonsHub%5D%20Solo%20Leveling%20E12%20Arise%201080p%20B-Global%20WEB-DL%20x264%20%28Multi-Subs%29",
+ "seeders": 112,
+ "leechers": 2,
+ "torrent_downloaded_count": 955,
+ "tracker_updated": 1711941514,
+ "nzb_url": "https://animetosho.org/storage/nzbs/0009483f/Solo%20Leveling%20E12%20Arise%201080p%20B-Global%20WEB-DL%20x264%20%5BJapanese%5D%20%28AAC%202.0%29%20MSubs_ToonsHub_.nzb",
+ "total_size": 424813220,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://discord.gg/2mPFKykW4j"
+ },
+ {
+ "id": 608318,
+ "title": "[Erai-raws] Ore dake Level Up na Ken - 12 [480p][Multiple Subtitle] [ENG][POR-BR][SPA-LA][SPA][ARA][FRE][GER][ITA][RUS]",
+ "link": "https://animetosho.org/view/erai-raws-ore-dake-level-up-na-ken.n1796461",
+ "timestamp": 1711816354,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796461,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/5b4a6ec6c71d1033f336bdf027fc3f56dbb6544b/%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B480p%5D%5BMultiple%20Subtitle%5D%5B348538A9%5D.torrent",
+ "torrent_name": "[Erai-raws] Ore dake Level Up na Ken - 12 [480p][Multiple Subtitle][348538A9].mkv",
+ "info_hash": "5b4a6ec6c71d1033f336bdf027fc3f56dbb6544b",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:LNFG5RWHDUIDH4ZWXXYCP7B7K3N3MVCL&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=http%3A%2F%2Fopen.acgnxtracker.com%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&dn=%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B480p%5D%5BMultiple%20Subtitle%5D%20%5BENG%5D%5BPOR-BR%5D%5BSPA-LA%5D%5BSPA%5D%5BARA%5D%5BFRE%5D%5BGER%5D%5BITA%5D%5BRUS%5D",
+ "seeders": 57,
+ "leechers": 1,
+ "torrent_downloaded_count": 593,
+ "tracker_updated": 1711935570,
+ "nzb_url": "https://animetosho.org/storage/nzbs/0009483e/%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B480p%5D%5BMultiple%20Subtitle%5D%5B348538A9%5D.nzb",
+ "total_size": 390242548,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": 3399156,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://www.erai-raws.info/anime-list/ore-dake-level-up-na-ken/"
+ },
+ {
+ "id": 608317,
+ "title": "[Erai-raws] Ore dake Level Up na Ken - 12 [720p][Multiple Subtitle] [ENG][POR-BR][SPA-LA][SPA][ARA][FRE][GER][ITA][RUS]",
+ "link": "https://animetosho.org/view/erai-raws-ore-dake-level-up-na-ken.n1796459",
+ "timestamp": 1711816335,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796459,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/371911c245694044bb84dfa1cb162c5922e46090/%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B720p%5D%5BMultiple%20Subtitle%5D%5BFF79133E%5D.torrent",
+ "torrent_name": "[Erai-raws] Ore dake Level Up na Ken - 12 [720p][Multiple Subtitle][FF79133E].mkv",
+ "info_hash": "371911c245694044bb84dfa1cb162c5922e46090",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:G4MRDQSFNFAEJO4E36Q4WFRMLEROIYEQ&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=http%3A%2F%2Fopen.acgnxtracker.com%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&dn=%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B720p%5D%5BMultiple%20Subtitle%5D%20%5BENG%5D%5BPOR-BR%5D%5BSPA-LA%5D%5BSPA%5D%5BARA%5D%5BFRE%5D%5BGER%5D%5BITA%5D%5BRUS%5D",
+ "seeders": 244,
+ "leechers": 8,
+ "torrent_downloaded_count": 1819,
+ "tracker_updated": 1711891219,
+ "nzb_url": "https://animetosho.org/storage/nzbs/0009483d/%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B720p%5D%5BMultiple%20Subtitle%5D%5BFF79133E%5D.nzb",
+ "total_size": 743917601,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": 3399115,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://www.erai-raws.info/anime-list/ore-dake-level-up-na-ken/"
+ },
+ {
+ "id": 608316,
+ "title": "[Erai-raws] Ore dake Level Up na Ken - 12 [1080p][Multiple Subtitle] [ENG][POR-BR][SPA-LA][SPA][ARA][FRE][GER][ITA][RUS]",
+ "link": "https://animetosho.org/view/erai-raws-ore-dake-level-up-na-ken.n1796456",
+ "timestamp": 1711816309,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796456,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/927f32f78956475287b80b7a3b8069d775b3bb74/%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B1080p%5D%5BMultiple%20Subtitle%5D%5BC8116259%5D.torrent",
+ "torrent_name": "[Erai-raws] Ore dake Level Up na Ken - 12 [1080p][Multiple Subtitle][C8116259].mkv",
+ "info_hash": "927f32f78956475287b80b7a3b8069d775b3bb74",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:SJ7TF54JKZDVFB5YBN5DXADJ2523HO3U&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=http%3A%2F%2Fopen.acgnxtracker.com%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&dn=%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B1080p%5D%5BMultiple%20Subtitle%5D%20%5BENG%5D%5BPOR-BR%5D%5BSPA-LA%5D%5BSPA%5D%5BARA%5D%5BFRE%5D%5BGER%5D%5BITA%5D%5BRUS%5D",
+ "seeders": 1054,
+ "leechers": 30,
+ "torrent_downloaded_count": 7259,
+ "tracker_updated": 1711904421,
+ "nzb_url": "https://animetosho.org/storage/nzbs/0009483c/%5BErai-raws%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20-%2012%20%5B1080p%5D%5BMultiple%20Subtitle%5D%5BC8116259%5D.nzb",
+ "total_size": 1455168235,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": 3399072,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://www.erai-raws.info/anime-list/ore-dake-level-up-na-ken/"
+ },
+ {
+ "id": 608315,
+ "title": "[SubsPlease] Solo Leveling - 12 (1080p) [5B47BF7E].mkv",
+ "link": "https://animetosho.org/view/subsplease-solo-leveling-12-1080p-5b47bf7e-mkv.1859208",
+ "timestamp": 1711816291,
+ "status": "complete",
+ "tosho_id": 1859208,
+ "nyaa_id": 1796455,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/ac03972f83b13773c7d6c0387969d3873c98fe6e/%5BSubsPlease%5D%20Solo%20Leveling%20-%2012%20%281080p%29%20%5B5B47BF7E%5D.torrent",
+ "torrent_name": "[SubsPlease] Solo Leveling - 12 (1080p) [5B47BF7E].mkv",
+ "info_hash": "ac03972f83b13773c7d6c0387969d3873c98fe6e",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:VQBZOL4DWE3XHR6WYA4HS2OTQ46JR7TO&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2F9.rarbg.me%3A2710%2Fannounce&dn=%5BSubsPlease%5D%20Solo%20Leveling%20-%2012%20%281080p%29%20%5B5B47BF7E%5D.mkv",
+ "seeders": 4800,
+ "leechers": 126,
+ "torrent_downloaded_count": 32750,
+ "tracker_updated": 1711902497,
+ "nzb_url": "https://animetosho.org/storage/nzbs/0009483b/%5BSubsPlease%5D%20Solo%20Leveling%20-%2012%20%281080p%29%20%5B5B47BF7E%5D.nzb",
+ "total_size": 1448782755,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": 3398902,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://subsplease.org"
+ },
+ {
+ "id": 608314,
+ "title": "[SubsPlease] Solo Leveling - 12 (720p) [83538700].mkv",
+ "link": "https://animetosho.org/view/subsplease-solo-leveling-12-720p-83538700-mkv.1859207",
+ "timestamp": 1711816270,
+ "status": "complete",
+ "tosho_id": 1859207,
+ "nyaa_id": 1796454,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/5a65737737ea4a6c24c2ef17fb87906f250f2b2b/%5BSubsPlease%5D%20Solo%20Leveling%20-%2012%20%28720p%29%20%5B83538700%5D.torrent",
+ "torrent_name": "[SubsPlease] Solo Leveling - 12 (720p) [83538700].mkv",
+ "info_hash": "5a65737737ea4a6c24c2ef17fb87906f250f2b2b",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:LJSXG5ZX5JFGYJGC54L7XB4QN4SQ6KZL&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2F9.rarbg.me%3A2710%2Fannounce&dn=%5BSubsPlease%5D%20Solo%20Leveling%20-%2012%20%28720p%29%20%5B83538700%5D.mkv",
+ "seeders": 1155,
+ "leechers": 51,
+ "torrent_downloaded_count": 8614,
+ "tracker_updated": 1711883436,
+ "nzb_url": "https://animetosho.org/storage/nzbs/0009483a/%5BSubsPlease%5D%20Solo%20Leveling%20-%2012%20%28720p%29%20%5B83538700%5D.nzb",
+ "total_size": 737532022,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": 3398956,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://subsplease.org"
+ },
+ {
+ "id": 608313,
+ "title": "[SubsPlease] Solo Leveling - 12 (480p) [9FBA731B].mkv",
+ "link": "https://animetosho.org/view/subsplease-solo-leveling-12-480p-9fba731b-mkv.1859206",
+ "timestamp": 1711816267,
+ "status": "complete",
+ "tosho_id": 1859206,
+ "nyaa_id": 1796453,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "torrent_url": "https://animetosho.org/storage/torrent/071cfac21f433b07e81e43f33f9a869098af4f64/%5BSubsPlease%5D%20Solo%20Leveling%20-%2012%20%28480p%29%20%5B9FBA731B%5D.torrent",
+ "torrent_name": "[SubsPlease] Solo Leveling - 12 (480p) [9FBA731B].mkv",
+ "info_hash": "071cfac21f433b07e81e43f33f9a869098af4f64",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:A4OPVQQ7IM5QP2A6IPZT7GUGSCMK6T3E&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2F9.rarbg.me%3A2710%2Fannounce&dn=%5BSubsPlease%5D%20Solo%20Leveling%20-%2012%20%28480p%29%20%5B9FBA731B%5D.mkv",
+ "seeders": 385,
+ "leechers": 143,
+ "torrent_downloaded_count": 2467,
+ "tracker_updated": null,
+ "nzb_url": "https://animetosho.org/storage/nzbs/00094839/%5BSubsPlease%5D%20Solo%20Leveling%20-%2012%20%28480p%29%20%5B9FBA731B%5D.nzb",
+ "total_size": 383857166,
+ "num_files": 1,
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": 3399016,
+ "article_url": null,
+ "article_title": null,
+ "website_url": "https://subsplease.org"
+ }
+] \ No newline at end of file
diff --git a/tests/subliminal_patch/data/animetosho_series_response.json b/tests/subliminal_patch/data/animetosho_series_response.json
new file mode 100644
index 000000000..290a8f7a8
--- /dev/null
+++ b/tests/subliminal_patch/data/animetosho_series_response.json
@@ -0,0 +1,232 @@
+{
+ "title": "[EMBER] Ore dake Level Up na Ken S01E12 [1080p] [HEVC WEBRip] (Solo Leveling)",
+ "timestamp": 1711853493,
+ "status": "complete",
+ "tosho_id": null,
+ "nyaa_id": 1796835,
+ "nyaa_subdom": null,
+ "anidex_id": null,
+ "comment": "",
+ "is_dupe": false,
+ "deleted": false,
+ "torrent_url": "https://animetosho.org/storage/torrent/f9670720a5142ec31aa8e3715745f1392e3ffd5b/%5BEMBER%5D%20Solo%20Leveling%20-%2012.torrent",
+ "torrent_name": "[EMBER] Solo Leveling - 12.mkv",
+ "info_hash": "f9670720a5142ec31aa8e3715745f1392e3ffd5b",
+ "info_hash_v2": null,
+ "magnet_uri": "magnet:?xt=urn:btih:7FTQOIFFCQXMGGVI4NYVORPRHEXD77K3&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&dn=%5BEMBER%5D%20Ore%20dake%20Level%20Up%20na%20Ken%20S01E12%20%5B1080p%5D%20%5BHEVC%20WEBRip%5D%20%28Solo%20Leveling%29",
+ "nzb_url": "https://animetosho.org/storage/nzbs/0009490e/%5BEMBER%5D%20Solo%20Leveling%20-%2012.nzb",
+ "anidb_aid": 17495,
+ "anidb_eid": 277518,
+ "anidb_fid": null,
+ "article_url": null,
+ "article_title": null,
+ "website_url": null,
+ "total_size": 369572311,
+ "num_files": 1,
+ "primary_file_id": 1154190,
+ "files": [
+ {
+ "id": 1154190,
+ "is_archive": false,
+ "filename": "[EMBER] Solo Leveling - 12.mkv",
+ "size": 369572311,
+ "processed": true,
+ "crc32": "cc8c36bc",
+ "md5": "07306f34a7cc9d25c2ec8a3b7d0b573a",
+ "sha1": "d79665531066b24439b0ef421074e6445d8b25a6",
+ "sha256": "0df3ec5424233bdb75ff33077b196e515455152a76ab5d4eab7a63cdcbb8c917",
+ "ed2k": "c0359507e7da148750279ff229cb9fbf",
+ "bt2": "b4526e074a41981e73cdcd13b9142a4a774bd15ff641b5cf114ace527268d213",
+ "vidframe_timestamps": [
+ 15000,
+ 354000,
+ 693000,
+ 1032000,
+ 1371000
+ ],
+ "file_info_type": "mediainfo",
+ "file_info": "General\nUnique ID : 196382376391031659169980002506916611524 (0x93BDDEB35938CEE294C45B12E5A5C5C4)\nComplete name : [EMBER] Solo Leveling - 12.mkv\nFormat : Matroska\nFormat version : Version 4\nFile size : 352 MiB\nDuration : 23 min 40 s\nOverall bit rate : 2 082 kb/s\nFrame rate : 23.976 FPS\nMovie name : S01E12-Arise\nEncoded date : 2024-03-31 02:15:23 UTC\nWriting application : mkvmerge v69.0.0 ('Day And Age') 64-bit\nWriting library : libebml v1.4.2 + libmatroska v1.6.4\nCover : Yes\nAttachments : cover.jpg / Roboto-Medium.ttf / Roboto-MediumItalic.ttf / arial.ttf / arialbd.ttf / comic.ttf / comicbd.ttf / times.ttf / timesbd.ttf / trebuc.ttf / trebucbd.ttf / verdana.ttf / verdanab.ttf / CONSOLA.TTF / CONSOLAB.TTF\n\nVideo\nID : 1\nFormat : HEVC\nFormat/Info : High Efficiency Video Coding\nFormat profile : Main 10@L4@High\nCodec ID : V_MPEGH/ISO/HEVC\nDuration : 23 min 40 s\nBit rate : 1 914 kb/s\nWidth : 1 920 pixels\nHeight : 1 080 pixels\nDisplay aspect ratio : 16:9\nFrame rate mode : Constant\nFrame rate : 23.976 (24000/1001) FPS\nColor space : YUV\nChroma subsampling : 4:2:0\nBit depth : 10 bits\nBits/(Pixel*Frame) : 0.038\nStream size : 324 MiB (92%)\nTitle : Presented By EMBER\nWriting library : x265 2.4+14-bc0e9bd7c08f5ddc:[Windows][GCC 6.3.0][64 bit] 10bit: KG7x [x265.ru]\nEncoding settings : cpuid=1173503 / frame-threads=3 / numa-pools=8 / wpp / no-pmode / no-pme / no-psnr / no-ssim / log-level=2 / input-csp=1 / input-res=1920x1080 / interlace=0 / total-frames=0 / level-idc=40 / high-tier=1 / uhd-bd=0 / ref=4 / no-allow-non-conformance / no-repeat-headers / annexb / no-aud / no-hrd / info / hash=0 / no-temporal-layers / open-gop / min-keyint=23 / keyint=250 / bframes=8 / b-adapt=2 / b-pyramid / bframe-bias=0 / rc-lookahead=70 / lookahead-slices=4 / scenecut=40 / no-intra-refresh / ctu=64 / min-cu-size=8 / rect / no-amp / max-tu-size=32 / tu-inter-depth=2 / tu-intra-depth=2 / limit-tu=4 / rdoq-level=2 / dynamic-rd=0.00 / no-ssim-rd / signhide / no-tskip / nr-intra=0 / nr-inter=0 / no-constrained-intra / no-strong-intra-smoothing / max-merge=3 / limit-refs=3 / limit-modes / me=3 / subme=3 / merange=57 / temporal-mvp / weightp / no-weightb / no-analyze-src-pics / deblock=1:1 / no-sao / no-sao-non-deblock / rd=4 / no-early-skip / rskip / no-fast-intra / no-tskip-fast / no-cu-lossless / no-b-intra / rdpenalty=0 / psy-rd=1.20 / psy-rdoq=2.00 / no-rd-refine / analysis-mode=0 / no-lossless / cbqpoffs=0 / crqpoffs=0 / rc=crf / crf=23.0 / qcomp=0.60 / qpstep=4 / stats-write=0 / stats-read=0 / vbv-maxrate=30000 / vbv-bufsize=30000 / vbv-init=0.9 / crf-max=0.0 / crf-min=0.0 / ipratio=1.40 / pbratio=1.30 / aq-mode=3 / aq-strength=0.70 / cutree / zone-count=0 / no-strict-cbr / qg-size=32 / no-rc-grain / qpmax=69 / qpmin=0 / sar=0 / overscan=0 / videoformat=5 / range=0 / colorprim=1 / transfer=1 / colormatrix=1 / chromaloc=0 / display-window=0 / max-cll=0,0 / min-luma=0 / max-luma=1023 / log2-max-poc-lsb=8 / vui-timing-info / vui-hrd-info / slices=1 / opt-qp-pps / opt-ref-list-length-pps / no-multi-pass-opt-rps / scenecut-bias=0.05 / no-opt-cu-delta-qp / no-aq-motion / no-hdr / no-hdr-opt / no-dhdr10-opt / refine-level=5 / no-limit-sao / ctu-info=0\nDefault : Yes\nForced : No\nColor range : Limited\nColor primaries : BT.709\nTransfer characteristics : BT.709\nMatrix coefficients : BT.709\n\nAudio\nID : 2\nFormat : AAC LC\nFormat/Info : Advanced Audio Codec Low Complexity\nCodec ID : A_AAC-2\nDuration : 23 min 40 s\nBit rate : 128 kb/s\nChannel(s) : 2 channels\nChannel layout : L R\nSampling rate : 44.1 kHz\nFrame rate : 43.066 FPS (1024 SPF)\nCompression mode : Lossy\nStream size : 21.7 MiB (6%)\nLanguage : Japanese\nDefault : Yes\nForced : No\n\nText\nID : 3\nFormat : ASS\nCodec ID : S_TEXT/ASS\nCodec ID/Info : Advanced Sub Station Alpha\nDuration : 23 min 20 s\nBit rate : 98 b/s\nFrame rate : 0.168 FPS\nCount of elements : 235\nCompression mode : Lossless\nStream size : 16.8 KiB (0%)\nLanguage : English\nDefault : Yes\nForced : No\n\nMenu\n00:00:00.000 : en:Intro\n00:02:00.000 : en:OP\n00:03:30.000 : en:Main EP\n00:21:42.000 : en:ED\n00:23:12.000 : en:Extra",
+ "attachments": [
+ {
+ "id": 268579,
+ "filename": "arial.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 892680
+ },
+ {
+ "id": 624527,
+ "filename": "arialbd.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 854584
+ },
+ {
+ "id": 1962029,
+ "filename": "chapters.xml",
+ "type": "xmlmeta",
+ "info": {
+ "meta": "chapters"
+ },
+ "size": 1874
+ },
+ {
+ "id": 9973,
+ "filename": "comic.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 240588
+ },
+ {
+ "id": 13424,
+ "filename": "comicbd.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 224404
+ },
+ {
+ "id": 727768,
+ "filename": "CONSOLA.TTF",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 358460
+ },
+ {
+ "id": 183919,
+ "filename": "CONSOLAB.TTF",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 368720
+ },
+ {
+ "id": 1900106,
+ "filename": "cover.jpg",
+ "type": "other",
+ "info": {
+ "mime": "image/jpeg"
+ },
+ "size": 178243
+ },
+ {
+ "id": 1066790,
+ "filename": "Roboto-Medium.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 351704
+ },
+ {
+ "id": 1066791,
+ "filename": "Roboto-MediumItalic.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 378412
+ },
+ {
+ "id": 1962028,
+ "filename": "tags.xml",
+ "type": "xmlmeta",
+ "info": {
+ "meta": "tags"
+ },
+ "size": 2698
+ },
+ {
+ "id": 653220,
+ "filename": "times.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 975228
+ },
+ {
+ "id": 653221,
+ "filename": "timesbd.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 980120
+ },
+ {
+ "id": 1961547,
+ "filename": "track3.eng.ass",
+ "type": "subtitle",
+ "info": {
+ "number": 3,
+ "codec": "ASS",
+ "lang": "eng",
+ "default": 1,
+ "enabled": 1,
+ "forced": 0,
+ "trackid": 2,
+ "tracknum": 3
+ },
+ "size": 25988
+ },
+ {
+ "id": 71778,
+ "filename": "trebuc.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 218432
+ },
+ {
+ "id": 16207,
+ "filename": "trebucbd.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 206776
+ },
+ {
+ "id": 1149,
+ "filename": "verdana.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 240456
+ },
+ {
+ "id": 8678,
+ "filename": "verdanab.ttf",
+ "type": "other",
+ "info": {
+ "mime": "application/x-truetype-font"
+ },
+ "size": 208456
+ }
+ ],
+ "links": {
+ "ClickNUpload": "https://clicknupload.red/ydok51qdzjr7",
+ "DailyUploads": "https://dailyuploads.net/nksc253gopcq",
+ "DownloadGG": "https://download.gg/file-18642810_87ce8be6abbb74f6",
+ "GoFile": "https://gofile.io/d/XgPwnN",
+ "KrakenFiles": "https://krakenfiles.com/view/9lJPP2MvAt/file.html",
+ "MdiaLoad": "https://down.mdiaload.com/t9w39f21ad9o",
+ "MultiUp": "https://multiup.io/download/b7958d691eb0b38477acdb63db00cca6/%5BEMBER%5D%20Solo%20Leveling%20-%2012.mkv",
+ "Uppit": "http://uppit.com/g58333gdg3ei"
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/tests/subliminal_patch/test_animetosho.py b/tests/subliminal_patch/test_animetosho.py
new file mode 100644
index 000000000..acb62781c
--- /dev/null
+++ b/tests/subliminal_patch/test_animetosho.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+
+import os
+import pytest
+
+from subliminal_patch.core import Episode
+from subliminal_patch.providers.animetosho import AnimeToshoProvider
+from subzero.language import Language
+
[email protected](scope="session")
+def anime_episodes():
+ return {
+ "frieren_s01e01": Episode(
+ "Frieren - Beyond Journey's End S01E28 1080p WEB x264 AAC -Tsundere-Raws (CR) (Sousou no Frieren).mkv",
+ "Frieren: Beyond Journey's End",
+ 1,
+ 28,
+ source="Web",
+ series_anidb_id=17617,
+ series_anidb_episode_id=271418,
+ series_tvdb_id=424536,
+ series_imdb_id="tt22248376",
+ release_group="Tsundere-Raws",
+ resolution="1080p",
+ video_codec="H.264",
+ ),
+ "solo_leveling_s01e10": Episode(
+ "[New-raws] Ore Dake Level Up na Ken - 12 END [1080p] [AMZN].mkv",
+ "Solo Leveling",
+ 1,
+ 12,
+ source="Web",
+ series_anidb_id=17495,
+ series_anidb_episode_id=277518,
+ series_tvdb_id=389597,
+ series_imdb_id="tt21209876",
+ release_group="New-raws",
+ resolution="1080p",
+ video_codec="H.264",
+ ),
+ }
+
+
+def test_list_subtitles(anime_episodes, requests_mock, data):
+ language = Language("eng")
+ item = anime_episodes["solo_leveling_s01e10"]
+
+ with open(os.path.join(data, 'animetosho_episode_response.json'), "rb") as f:
+ requests_mock.get(' https://feed.animetosho.org/json?eid=277518', content=f.read())
+
+ with open(os.path.join(data, 'animetosho_series_response.json'), "rb") as f:
+ response = f.read()
+ requests_mock.get('https://feed.animetosho.org/json?show=torrent&id=608516', content=response)
+ requests_mock.get('https://feed.animetosho.org/json?show=torrent&id=608526', content=response)
+
+ with AnimeToshoProvider(2) as provider:
+ subtitles = provider.list_subtitles(item, languages={language})
+
+ assert len(subtitles) == 2