---
id: abnormal
name: Abnormal
description: "ABNormal (ABN) is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
language: fr-FR
type: private
encoding: UTF-8
requestDelay: 2.1
links:
  - https://abn.lol/
legacylinks:
  - https://abnormal.ws

caps:
  categorymappings:
    - {id: 1, cat: TV, desc: "Series"}
    - {id: 2, cat: Movies, desc: "Movies"}
    - {id: 3, cat: TV/Documentary, desc: "Documentaries"}
    - {id: 4, cat: TV/Anime, desc: "Anime"}
    - {id: 5, cat: PC/Games, desc: "Games"}
    - {id: 6, cat: PC, desc: "Applications"}
    - {id: 7, cat: Books/EBook, desc: "Ebooks"}
    - {id: 9, cat: TV, desc: "Emissions"}

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

settings:
  - name: username
    type: text
    label: Username
  - name: password
    type: password
    label: Password
  - name: multilang
    type: checkbox
    label: Replace MULTi by another language in release name
    default: false
  - name: multilanguage
    type: select
    label: Replace MULTi by this language
    default: FRENCH
    options:
      FRENCH: FRENCH
      MULTi.FRENCH: MULTi.FRENCH
      ENGLISH: ENGLISH
      MULTi.ENGLISH: MULTi.ENGLISH
      VOSTFR: VOSTFR
      MULTi.VOSTFR: MULTi.VOSTFR
  - name: vostfr
    type: checkbox
    label: Replace VOSTFR and SUBFRENCH with ENGLISH
    default: false
  - name: freeleech
    type: checkbox
    label: Search freeleech only
    default: false
  - name: sort
    type: select
    label: Sort requested from site
    default: Created
    options:
      Created: created
      Seeders: seeders
      Size: size
      ReleaseName: title
  - name: type
    type: select
    label: Order requested from site
    default: desc
    options:
      desc: desc
      asc: asc
  - name: info_activity
    type: info
    label: Account Inactivity
    default: "Accounts are automatically deactivated after 4 months of inactivity (no connection to the site)."

login:
  method: form
  path: Home/Login
  form: "#account"
  inputs:
    Username: "{{ .Config.username }}"
    Password: "{{ .Config.password }}"
    RememberMe: true
  selectorinputs:
    __RequestVerificationToken:
      selector: input[name="__RequestVerificationToken"]
      attribute: value
  error:
    - selector: div.validation-summary-errors[data-valmsg-summary="true"]
      message:
        text: " - Bad username/password."
  test:
    path: /
    selector: form#logoutForm

search:
  paths:
    - path: Torrent
  inputs:
    $raw: "{{ range .Categories }}SelectedCats={{.}}&{{end}}"
    Search: "{{ .Keywords }}"
    UserId: ""
    YearOperator: ≥
    Year: ""
    RatingOperator: ≥
    Rating: ""
    Pending: ""
    Pack: ""
    Scene: ""
    Freeleech: "{{ if .Config.freeleech }}true{{ else }}{{ end }}"
    SortOn: "{{ .Config.sort }}"
    SortOrder: "{{ .Config.type }}"

  rows:
    selector: table.table-rows > tbody > tr:has(a[href^="/Torrent/Download?ReleaseId="])

  fields:
    category:
      selector: a[href^="/Torrent?SelectedCats="]
      attribute: href
      filters:
        - name: querystring
          args: SelectedCats
    title_phase1:
      selector: td.grid-release-column > a
    title_vostfr:
      text: "{{ .Result.title_phase1 }}"
      filters:
        - name: re_replace
          args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"]
    title_phase2:
      text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}"
    title_multilang:
      text: "{{ .Result.title_phase2 }}"
      filters:
        - name: re_replace
          args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"]
    title:
      text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}"
    details:
      selector: a[href^="/Torrent/Details?ReleaseId="]
      attribute: href
    download:
      selector: a[href^="/Torrent/Download?ReleaseId="]
      attribute: href
    date:
      text: now
    size:
      selector: td:nth-child(6)
      filters:
        - name: re_replace
          args: [",", "."]
        - name: replace
          args: ["o", "B"]
    seeders:
      selector: td:nth-child(7)
    leechers:
      selector: td:nth-child(8)
    downloadvolumefactor:
      case:
        img[title="Freeleech"]: 0
        "*": 1
    uploadvolumefactor:
      case:
        "*": 1
    minimumratio:
      text: 1.0
    minimumseedtime:
      # 4 days (as seconds = 4 x 24 x 60 x 60)
      text: 345600
# Gazelle
