---
id: bitsearch
name: BitSearch
description: "BitSearch is a Public torrent meta-search engine"
language: en-US
type: public
encoding: UTF-8
requestDelay: 2
links:
  - https://bitsearch.to/
legacylinks:
  - https://bitsearch.nocensor.cloud/
  - https://bitsearch.mrunblock.bond/

caps:
  categories:
    AudioBook: Audio/Audiobook
    eBook: Books/EBook
    "Ebook/Course": Books/EBook
    Games: PC/Games
    "Games/PC": PC/Games
    Movies: Movies
    Music: Audio
    "Music/Album": Audio
    "Music/mp3": Audio/MP3
    "Music/Lossless": Audio/Lossless
    "Music/Video": Audio/Video
    Other: Other
    "Other/Android": PC/Mobile-Android
    "Other/Archive": Other
    "Other/Audio": Audio
    "Other/Database": PC
    "Other/DiskImage": PC/ISO
    "Other/Document": Books/Comics
    "Other/Image": Other/Misc
    "Other/Program": PC/0day
    "Other/Sourcecode": PC
    "Other/Source Code": PC
    "Other/Video": Other
    Softwares: PC/0day
    "Softwares/Windows": PC/0day
    TV: TV
    Unknown: Other
    XXX: XXX

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

settings:
  - name: prefer_magnet_links
    type: checkbox
    label: Prefer Magnet Links
    default: false
  - name: sort
    type: select
    label: Sort requested from site
    default: date
    options:
      date: created
      seeders: seeders
      size: size
  - name: type
    type: select
    label: Order requested from site
    default: desc
    options:
      desc: desc
      asc: asc
  - name: info_category_8000
    type: info
    label: About BitSearch Categories
    default: BitSearch does not properly return categories in its search results for some releases.</br>To add to your Apps' Torznab indexer, you will need to include the 8000(Other) category.

search:
  paths:
     # https://bitsearch.to/search?q=&sort=date&order=desc
    - path: search
  inputs:
    q: "{{ .Keywords }}"
    sort: "{{ .Config.sort }}"
    order: "{{ .Config.type }}"
    limit: 100
    page: 1

  keywordsfilters:
    - name: re_replace
      args: ["\\.", " "]

  rows:
    selector: div.search-result:has(a.dl-torrent), li.search-result:has(a.dl-torrent)

  fields:
    category:
      selector: a.category
    title:
      selector: h5 a
    details:
      selector: h5 a
      attribute: href
    download_optional:
      selector: a.dl-torrent
      attribute: href
      optional: true
    download:
      text: "{{ if .Config.prefer_magnet_links }}{{ else }}{{ .Result.download_optional }}{{ end }}"
      optional: true
    magnet:
      selector: a[href^="magnet:?xt"]
      attribute: href
    infohash:
      selector: a[href^="magnet:?xt"]
      attribute: href
      filters:
        - name: regexp
          args: ([A-F|a-f|0-9]{40})
    grabs_dot:
      selector: div.stats div:has(img[alt="Download"]):contains(".")
      optional: true
      filters:
        - name: replace
          args: [".", ""]
        - name: replace
          args: ["K", "00"]
        - name: replace
          args: ["M", "00000"]
    grabs_nodot:
      selector: div.stats div:has(img[alt="Download"]):not(:contains("."))
      optional: true
      filters:
        - name: replace
          args: ["K", "000"]
        - name: replace
          args: ["M", "000000"]
    grabs:
      text: "{{ if or .Result.grabs_dot .Result.grabs_nodot }}{{ or .Result.grabs_dot .Result.grabs_nodot }}{{ else }}0{{ end }}"
    size:
      selector: div.stats div:has(img[alt="Size"])
    seeders_dot:
      selector: div.stats div:has(img[alt="Seeder"]):contains(".")
      optional: true
      filters:
        - name: replace
          args: [".", ""]
        - name: replace
          args: ["K", "00"]
        - name: replace
          args: ["M", "00000"]
    seeders_nodot:
      selector: div.stats div:has(img[alt="Seeder"]):not(:contains("."))
      optional: true
      filters:
        - name: replace
          args: ["K", "000"]
        - name: replace
          args: ["M", "000000"]
    seeders:
      text: "{{ if or .Result.seeders_dot .Result.seeders_nodot }}{{ or .Result.seeders_dot .Result.seeders_nodot }}{{ else }}0{{ end }}"
    leechers_dot:
      selector: div.stats div:has(img[alt="Leecher"]):contains(".")
      optional: true
      filters:
        - name: replace
          args: [".", ""]
        - name: replace
          args: ["K", "00"]
        - name: replace
          args: ["M", "00000"]
    leechers_nodot:
      selector: div.stats div:has(img[alt="Leecher"]):not(:contains("."))
      optional: true
      filters:
        - name: replace
          args: ["K", "000"]
        - name: replace
          args: ["M", "000000"]
    leechers:
      text: "{{ if or .Result.leechers_dot .Result.leechers_nodot }}{{ or .Result.leechers_dot .Result.leechers_nodot }}{{ else }}0{{ end }}"
    date:
      selector: div.stats div:has(img[alt="Date"])
      filters:
        - name: dateparse
          args: "MMM d, yyyy"
    downloadvolumefactor:
      text: 0
    uploadvolumefactor:
      text: 1
# engine n/a
