---
id: torlock
name: Torlock
description: "Torlock is a torrent search site that lists verified torrents only for TV series and movies"
language: en-US
type: public
encoding: UTF-8
requestDelay: 2
links:
  - https://www.torlock.com/
  - https://www.torlock2.com/
  - https://torlock.unblockit.black/
legacylinks:
  - https://torlock.com/
  - https://www.torlock.icu/
  - https://torlock.unblockit.asia/
  - https://torlock.unblockit.mov/
  - https://torlock.unblockit.rsvp/
  - https://torlock.unblockit.vegas/
  - https://torlock.unblockit.esq/
  - https://torlock.unblockit.zip/
  - https://torlock.unblockit.foo/
  - https://torlock.unblockit.ing/
  - https://torlock.nocensor.cloud/
  - https://torlock.mrunblock.bond/
  - https://torlock.unblockit.date/
  - https://torlock.unblockit.dad/
  - https://torlock.unblockit.africa/
  - https://torlock.unblockit.casa/
  - https://torlock.unblockit.sbs/
  - https://torlock.unblockit.ong/

caps:
  # dont forget to update the search fields category case block
  categorymappings:
    - {id: TELEVISION, cat: TV, desc: "TV Shows"}
    - {id: MOVIES, cat: Movies, desc: "Movies"}
    - {id: MUSIC, cat: Audio, desc: "Music"}
    - {id: GAMES, cat: PC/Games, desc: "Games"}
    - {id: SOFTWARE, cat: PC, desc: "Software"}
    - {id: ANIME, cat: TV/Anime, desc: "Anime"}
    - {id: EBOOKS, cat: Books/EBook, desc: "Books"}
    - {id: OTHER, cat: Other, desc: "Other"}
    - {id: ADULT, cat: XXX, desc: "Adult"}
    - {id: AUDIOBOOK, cat: Audio/Audiobook, desc: "Audiobook"}
    - {id: IMAGES, cat: Other/Misc, desc: "Images"}

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

settings:
  - name: sort
    type: select
    label: Sort requested from site (only works for search with keywords)
    default: added
    options:
      added: created
      seeds: seeders
      size: size
  - name: type
    type: select
    label: Order requested from site
    default: desc
    options:
      desc: desc
      asc: asc

search:
  paths:
    - path: "/all/torrents/{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}"
      categories: ["!", TELEVISION, MOVIES, MUSIC, GAMES, SOFTWARE, ANIME, EBOOKS, OTHER, ADULT, AUDIOBOOK, IMAGES]
    - path: "{{ if .Keywords }}/television/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/television/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
      categories: [TELEVISION]
    - path: "{{ if .Keywords }}/movie/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/movies/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
      categories: [MOVIES]
    - path: "{{ if .Keywords }}/music/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/music/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
      categories: [MUSIC]
    - path: "{{ if .Keywords }}/game/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/games/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
      categories: [GAMES]
    - path: "{{ if .Keywords }}/software/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/software/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
      categories: [SOFTWARE]
    - path: "{{ if .Keywords }}/anime/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/anime/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
      categories: [ANIME]
    - path: "{{ if .Keywords }}/ebook/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/ebooks/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
      categories: [EBOOKS]
    - path: "{{ if .Keywords }}/unknown/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/unknown.html{{end}}" # sorting is broken for unknown
      categories: [OTHER]
    - path: "{{ if .Keywords }}/adult/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/adult/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
      categories: [ADULT]
    - path: "{{ if .Keywords }}/audiobook/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/audiobook/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
      categories: [AUDIOBOOK]
    - path: "{{ if .Keywords }}/image/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/images/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
      categories: [IMAGES]
  keywordsfilters:
    - name: tolower
    - name: re_replace
      args: ["[^a-zA-Z0-9]+", "-"]

  rows:
    selector: table > tbody > tr:has(td:has(div:has(a[href^="/torrent/"])))
    filters:
      - name: andmatch

  fields:
    category:
      selector: span[class^="tv"]
      attribute: class
      case:
        span.tv0: OTHER
        span.tv1: MOVIES
        span.tv2: MUSIC
        span.tv3: TELEVISION
        span.tv4: GAMES
        span.tv5: SOFTWARE
        span.tv6: ANIME
        span.tv7: ADULT
        span.tv8: EBOOKS
        span.tv9: IMAGES
        span.tv10: EBOOKS
        span.tv12: AUDIOBOOK
        "*": OTHER # some torrents have invalid categories
    title:
      selector: td:nth-child(1) > div > a
    details:
      selector: td:nth-child(1) > div > a[href^="/torrent/"]
      attribute: href
    download:
      selector: td:nth-child(1) > div > a[href^="/torrent/"]
      attribute: href
      filters:
        - name: replace
          args: ["/torrent/", "/tor/"]
        - name: regexp
          args: (^/tor/\d*)
        - name: append
          args: ".torrent"
    date_year:
      selector: td:nth-child(2):contains("/")
      optional: true
      filters:
        - name: append
          args: " -07:00" # PDT
        - name: dateparse
          args: "M/d/yyyy zzz"
    date_day:
      selector: td:nth-child(2):contains("Today"), td:nth-child(2):contains("Yesterday")
      optional: true
      filters:
        - name: fuzzytime
    date_ago:
      selector: td:nth-child(2):not(:contains("Today")):not(:contains("Yesterday")):not(:contains("/"))
      optional: true
      filters:
        - name: re_replace
          args: ["(min|mins)", "minutes"]
        - name: timeago
    date:
      text: "{{ if or .Result.date_year .Result.date_ago .Result.date_day }}{{ or .Result.date_year  .Result.date_ago .Result.date_day }}{{ else }}now{{ end }}"
    size:
      selector: td:nth-child(3)
    seeders:
      selector: td:nth-child(4)
    leechers:
      selector: td:nth-child(5)
    downloadvolumefactor:
      text: 0
    uploadvolumefactor:
      text: 1
# engine n/a
