---
id: rutor
name: RuTor
description: "RuTor is a RUSSIAN Public site for MOVIES / TV / GENERAL"
language: ru-RU
type: public
encoding: UTF-8
links:
  - https://rutor.info/
  - https://rutor.is/
  - http://6tor.org/ # IPv6-only
legacylinks:
  - https://rutor.uk-unblock.xyz/
  - https://rutor.ind-unblock.xyz/
  - https://rutor.unblocked.bar/
  - https://rutor.proxyportal.pw/
  - https://rutor.uk-unblock.pro/
  - https://rutor.root.yt/
  - https://rutor.unblocked.rest/
  - https://rutor.unblocked.monster/
  - https://rutor.mrunblock.bond/ # for magnet only
  - https://rutor.nocensor.cloud/
  - http://new-rutor.org/ # Oops. Something went wrong, try reloading the page
  - http://rutor.info/
  - http://rutor.is/

caps:
  # unfortunately RuTor does not display categories anywhere in its search results page :-(
  # albeit you can select a single category in its search options
  # so I've opted not to support categories
  categorymappings:
    - {id: 1, cat: Movies, desc: "Movies"}
    - {id: 2, cat: TV, desc: "TV"}
    - {id: 3, cat: Other, desc: "Other"}

  modes:
    search: [q]
    tv-search: [q, season, ep, imdbid]
    movie-search: [q, imdbid]
    music-search: [q]

settings:
  - name: stripcyrillic
    type: checkbox
    label: Strip Cyrillic Letters
    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
  - name: sort
    type: select
    label: Sort requested from site (Applies only to Search with Keywords)
    default: 0
    options:
      0: "created desc"
      1: "created asc"
      2: "seeders desc"
      3: "seeders asc"
      6: "size desc"
      7: "size asc"
      8: "title desc"
      9: "title asc"
  - name: info_category_8000
    type: info_category_8000

search:
  paths:
    # http://rutor.info/search/0/0/010/0/tt10288566 # search title and descr for imdb
    # http://rutor.info/search/0/0/100/0/gotham%2004x01 # search title for query
    # http://rutor.info/ # search keywordless
    - path: "{{ if .Query.IMDBID }}search/0/0/010/{{ .Config.sort }}/{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if .Keywords }}search/0/0/100/{{ .Config.sort }}/{{ .Keywords }}/{{ else }}{{ end }}{{ if or .Keywords .Query.IMDBID }}{{ else }}/{{ end }}"

  rows:
    selector: tr:has(td:has(a[href^="magnet:?xt="]))

  fields:
    category:
      text: 3
    title:
      selector: td:nth-of-type(2) a[href^="/torrent/"]
      filters:
        # normalize to SXXEYY format
        - name: re_replace
          args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"]
        - name: re_replace
          args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"]
        - name: re_replace
          args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?)\\s+из\\s*(\\w?)", "S$1E$2 of $3"]
        - name: re_replace
          args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"]
        - name: re_replace
          args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?)\\s+из\\s*(\\w?)", "S$1E$2 of $3"]
        - name: re_replace
          args: ["(\\d+(?:-\\d+)?)[хx](\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"]
        - name: re_replace
          args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"]
        - name: re_replace
          args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"]
        - name: re_replace
          args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"]
        - name: re_replace
          args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"]
        - name: re_replace
          args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"]
        - name: re_replace
          args: ["(?i)(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"]
        - name: re_replace
          args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"]
        - name: re_replace
          args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:[CС]ери[ияй]|Эпизод|Выпуски?)\\s+из\\s*(\\w?)", "E$1 of $2"]
        - name: re_replace
          args: ["(?i)(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)", "E$1"]
        - name: re_replace
          args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:[CС]ери[ияй]|Эпизод|Выпуски?)", "E$1"]
        - name: re_replace
          args: ["(?i)\\bFiles-х\\b", "Files-x"]
        - name: re_replace
          args: ["(?i)\\s\\|\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"]
        - name: re_replace
          args: ["\\s\\|\\s(\\w{4,})$", "-$1"]
        - name: re_replace
          args: ["(?i)\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"]
        - name: re_replace
          args: ["\\s\\|\\s(\\w{4,})$", "-$1"]
        - 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: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"]
        - name: re_replace
          args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"]
        - name: re_replace
          args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"]
        - name: re_replace
          args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"]
        - name: re_replace
          args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"]
        - name: re_replace
          args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""]
        - name: re_replace
          args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""]
        - name: append
          args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}"
    details:
      selector: td:nth-of-type(2) a[href^="/torrent/"]
      attribute: href
    download:
      selector: a.downgif
      attribute: href
    infohash:
      selector: a[href^="magnet:?xt="]
      attribute: href
      filters:
        - name: regexp
          args: ([A-F|a-f|0-9]{40})
    date:
      # 27 Окт 17
      selector: td:nth-of-type(1)
      filters:
        # replace white spaces
        - name: re_replace
          args: ["[\\s]+", " "]
        # replace month abbreviations
        - name: replace
          args: ["Янв", "Jan"]
        - name: replace
          args: ["Фев", "Feb"]
        - name: replace
          args: ["Мар", "Mar"]
        - name: replace
          args: ["Апр", "Apr"]
        - name: replace
          args: ["Май", "May"]
        - name: replace
          args: ["Июн", "Jun"]
        - name: replace
          args: ["Июл", "Jul"]
        - name: replace
          args: ["Авг", "Aug"]
        - name: replace
          args: ["Сен", "Sep"]
        - name: replace
          args: ["Окт", "Oct"]
        - name: replace
          args: ["Ноя", "Nov"]
        - name: replace
          args: ["Дек", "Dec"]
        - name: append
          args: " 00:00:00 +03:00" # MSK
        - name: dateparse
          args: "dd MMM yy HH:mm:ss zzz"
    # some results don't have comments which throws off td count. So we go fishing for the following fields
    size:
      optional: true
      selector: td:contains(\00a0TB), td:contains(\00a0GB), td:contains(\00a0MB), td:contains(\00a0kB), td:contains(\00a0B)
    seeders:
      selector: td span.green
    leechers:
      selector: td span.red
    downloadvolumefactor:
      text: 0
    uploadvolumefactor:
      text: 1
    description:
      selector: td:nth-of-type(2) a[href^="/torrent/"]
# engine n/a
