Files
managarr-demo/mock-htpc/prowlarr/Definitions/animetosho-xyz.yml
T
Dark-Alex-17 f3ad44f7d7 Add a Readarr mock instance to the demo
Adds darkalex17/readarr-mock, built from ghcr.io/pennydreadful/bookshelf:softcover
(the maintained Readarr continuation; the LinuxServer image is discontinued and
its metadata endpoint no longer resolves). The captured config carries 6 authors,
327 books, 39 book files, 4 tags, 7 indexers, 193 history rows and one root
folder at /books, with minimal EPUBs under mock-htpc/books so the files show as
imported.

Prowlarr now registers Readarr as a synced application, so its config is
recaptured and the prowlarr-mock image must be rebuilt and pushed alongside.

The compose file, managarr config, justfile recipes and README gain the fourth
instance. The demo script needs no change; it fetches the compose file and
config from main at run time.

Requires a Managarr release with Readarr support, since the demo script runs
the published darkalex17/managarr image against these files.
2026-09-21 17:12:10 -06:00

165 lines
5.5 KiB
YAML

---
id: animetosho-xyz
name: Anime Tosho
description: "Anime Tosho is a Semi-Private Torrent Tracker for ANIME"
language: en-US
type: semi-private
encoding: UTF-8
links:
- https://animetosho.xyz/
caps:
categorymappings:
- {id: Anime, cat: TV/Anime, desc: "Anime"}
# all results are currently returned as both 5070 & 2020
# # from https://feed.animetosho.xyz/api/torznab?t=caps&apikey=YOUR-API-KEY
# - {id: 5070, cat: TV/Anime, desc: "Anime (TV)"}
# - {id: 2020, cat: Movies/Other, desc: "Anime (Movies)"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: apikey
type: text
label: API Key
- name: info_key
type: info
label: About your API key
default: "You can find or generate a new API Key by accessing the <a href=\"https://animetosho.xyz/profile\" target=\"_blank\">Anime Tosho profile</a> page."
- name: apiurl
label: API URL
type: text
default: feed.animetosho.xyz
- name: sonarr_compatibility
type: checkbox
label: Improve Sonarr compatibility by trying to add Season information into Release Titles
default: false
- name: strip_s01
type: checkbox
label: Remove first season keywords (S1/S01/Season 1), as some results do not include this for first/single season releases
default: false
- name: radarr_compatibility
type: checkbox
label: Improve Radarr compatibility by removing year information from keywords and adding it to Release Titles
default: false
login:
# returns "401 Unauthorized, check your credentials" if apikey is invalid
path: "https://{{ .Config.apiurl }}/api/torznab"
method: get
inputs:
apikey: "{{ .Config.apikey }}"
t: search
limit: 1
search:
paths:
- path: "https://{{ .Config.apiurl }}/api/torznab"
response:
type: xml
inputs:
apikey: "{{ .Config.apikey }}"
t: "{{ if .Keywords }}{{ .Query.Type }}{{ else }}search{{ end }}"
q: "{{ .Keywords }}"
# all results are currently returned as both 5070 & 2020
# cat: "{{ join .Categories \",\" }}"
season: "{{ .Query.Season }}"
ep: "{{ .Query.Ep }}"
limit: 100
keywordsfilters:
- name: re_replace
args: [" *\\b((?:19|20)\\d{2})\\b", "{{ if .Config.radarr_compatibility }}{{ else }} $1{{ end }}"]
- name: re_replace
args: ["(?i) *\\b(S(?:0|eason *)?1)\\b", "{{ if .Config.strip_s01 }}{{ else }} $1{{ end }}"]
rows:
selector: rss > channel > item
fields:
category:
text: Anime
title_keyword_year:
text: "{{ .Query.Keywords }}"
filters:
- name: regexp
args: "\\b((19|20)\\d{2})\\b"
title_default:
selector: title
filters:
- name: re_replace
args: ["^(\\[.+?\\] ?)?(\\[.+?\\] ?)?(.+?)(\\[)", "$1$2$3{{ if and (.Config.radarr_compatibility) (.Result.title_keyword_year) }} {{ .Result.title_keyword_year }} $4{{ else }}$4{{ end }}"]
title_has_season:
text: "{{ .Result.title_default }}"
filters:
- name: regexp
args: "(?i)(S\\d{1,3}([Ev]\\d+)?)"
- name: append
args: "NULL"
title_has_episode:
text: "{{ .Result.title_default }}"
filters:
- name: regexp
args: "\\b(.+? - ?)(\\d+([-v]\\d+)?) ([\\[\\(])\\b"
- name: append
args: "NULL"
title_has_movie_ova:
text: "{{ .Result.title_default }}"
filters:
- name: regexp
args: "(?i)(?<![A-Za-z0-9])(Movies?|OVA|OAV)(?![A-Za-z0-9])"
- name: re_replace
args: ["(?i)(Movies?|OVA|OAV)", "YES"]
title_optional:
text: "{{ .Result.title_default }}"
filters:
- name: re_replace
args: ["^(\\[.+?].+?)\\s*(?<![\\]\\)])((?:\\[|\\(| - ).+)", "{{ if and (ne .Result.title_has_movie_ova \"YES\") (and (eq .Result.title_has_season \"NULL\") (eq .Result.title_has_episode \"NULL\")) }}$1 S01 $2{{ else }}$1 $2{{ end }}"]
title_live_action:
text: "{{ .Result.title_optional }}"
filters:
# Insert S01 after year for Live Action titles without season/episode info
# e.g. Hotel.del.Luna.2019.1080p... -> Hotel.del.Luna.2019.S01.1080p...
- name: re_replace
args: ["^(.+?)([\\. ])((?:19|20)\\d{2})([\\. ])(.+)$", "{{ if and (eq .Result.title_has_season \"NULL\") (eq .Result.title_has_episode \"NULL\") }}$1$2$3$4S01$4$5{{ else }}$1$2$3$4$5{{ end }}"]
# Insert S01 before resolution for Live Action titles without year or season info
# e.g. Hotel Del Luna 720p HDTV... -> Hotel Del Luna S01 720p HDTV...
- name: re_replace
args: ["^(?!.*(?:19|20)\\d{2})(.+?)([\\. ])((?:480|720|1080|2160)[pi])(.*)$", "{{ if and (eq .Result.title_has_season \"NULL\") (eq .Result.title_has_episode \"NULL\") }}$1$2S01$2$3$4{{ else }}$1$2$3$4{{ end }}"]
title:
text: "{{ if .Config.sonarr_compatibility }}{{ .Result.title_live_action }}{{ else }}{{ .Result.title_default }}{{ end }}"
details:
selector: link
download:
selector: enclosure
attribute: url
infohash:
selector: "[name=infohash]"
attribute: value
date:
# Sun, 18 Jan 2026 04:05:41 +0000
selector: pubDate
filters:
- name: dateparse
args: "ddd, dd MMM yyyy HH:mm:ss zzz"
size:
selector: "[name=size]"
attribute: value
seeders:
selector: "[name=seeders]"
attribute: value
leechers:
selector: "[name=leechers]"
attribute: value
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
description:
selector: title
# torznab xml