---
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://animetosho.xyz/api/torznab?apikey=YOUR-API-KEY&t=caps
#    - {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: 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: api/torznab
  method: get
  inputs:
    apikey: "{{ .Config.apikey }}"
    t: search
    limit: 1

search:
  paths:
    - path: 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
