---
id: ptfiles
name: PTFiles
description: "PTFiles (PTF) is a Private Torrent Tracker for MOVIES / TV / GENERAL"
language: en-US
type: private
encoding: windows-1252
links:
  - https://ptfiles.net/

caps:
  categorymappings:
    - {id: 19, cat: Movies/SD, desc: "Movies/XviD"}
    - {id: 20, cat: Movies/DVD, desc: "Movies/DVD-R"}
    - {id: 60, cat: Movies/SD, desc: "Movies/SD X264"}
    - {id: 23, cat: TV/Anime, desc: "Anime"}
    - {id: 1, cat: PC/0day, desc: "Apps"}
    - {id: 55, cat: Books, desc: "Comics"}
    - {id: 5, cat: Movies/HD, desc: "Movies/720p HD"}
    - {id: 8, cat: Movies/HD, desc: "Movies/1080p HD"}
    - {id: 15, cat: Movies/UHD, desc: "Movies/Ultra-HD"}
    - {id: 44, cat: Movies, desc: "Movies/Packs"}
    - {id: 69, cat: Books, desc: "E Books"}
    - {id: 12, cat: Books, desc: "E Learning"}
    - {id: 11, cat: PC/Mac, desc: "Mac OS"}
    - {id: 7, cat: TV/SD, desc: "TV/XviD Episodes"}
    - {id: 42, cat: TV/SD, desc: "TV/SD X264 Episodes"}
    - {id: 33, cat: TV/HD, desc: "TV/HD Episodes"}
    - {id: 22, cat: Other, desc: "Misc"}
    - {id: 24, cat: PC/Mobile-Other, desc: "Mobile"}
    - {id: 6, cat: Audio, desc: "Music"}
    - {id: 39, cat: TV, desc: "TV/Seasons"}
    - {id: 4, cat: PC/Games, desc: "Games/PC"}
    - {id: 29, cat: Console, desc: "Games/Consoles"}
    - {id: 9, cat: XXX, desc: "XXX"}

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

settings:
  - name: username
    type: text
    label: Username
  - name: password
    type: password
    label: Password
  - name: freeleech
    type: checkbox
    label: Search freeleech only
    default: false
  - name: sort
    type: select
    label: Sort requested from site
    default: 4
    options:
      4: created
      7: seeders
      5: size
      1: 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: "You must login to the site at least every 119 days. If you get to the 120th day without logging in, your account will be Deleted/Pruned automatically by the system."

login:
  path: loginproc/
  method: form
  form: form#login
  inputs:
    username: "{{ .Config.username }}"
    password: "{{ .Config.password }}"
    force_ssl: on
    ssl: ""
  selectorinputs:
    hash:
      selector: input[name="hash"]
      attribute: value
  error:
    - selector: p.error:contains(strong)
  test:
    path: index.php
    selector: a[href*="&logout_hash="]

search:
  paths:
    # https://ptfiles.net/browse.php?search=tt3612126&incldead=1&title=1
    # https://ptfiles.net/browse.php?free=1&search=&incldead=1&title=0
    - path: browse.php
  inputs:
    $raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
    search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
    # 0 active, 1 both, 2 dead, 3 needseed
    incldead: 0
    # 0 title, 1 descr, 2 both, 3 genre
    title: "{{ if .Query.IMDBID }}1{{ else }}0{{ end }}"
    free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
    sort: "{{ .Config.sort }}"
    type: "{{ .Config.type }}"

  rows:
    # for some users (don't know why) the table is called tablethree instead of tortable
    selector: table#tortable > tbody > tr.rowhead:has(a[href^="dl.php/"]), table#tablethree > tbody > tr.rowhead:has(a[href^="dl.php/"])

  fields:
    # column 3 will be the wait time for new users
    download:
      selector: a[href^="dl.php/"]
      attribute: href
    title:
      selector: a.torrentlink
      attribute: title
    category:
      selector: td[onclick*="browse.php?cat="]
      attribute: onclick
      filters:
        - name: querystring
          args: cat
        - name: trim
          args: "'"
    details:
      selector: a.torrentlink
      attribute: href
    imdbid:
      selector: a[href*="imdb.com/title/tt"]
      attribute: href
    files:
      selector: td:nth-last-child(5)
    grabs:
      selector: td:nth-last-child(3) > span
      filters:
        - name: regexp
          args: ([\d\.]+)
    size:
      selector: td:nth-last-child(3)
      remove: span
    seeders:
      selector: td:nth-last-child(2) > span > b:nth-child(1)
    leechers:
      selector: td:nth-last-child(2) > span > b:nth-child(2)
    date:
      # timeago
      selector: td:nth-child(2) > span > span > small
      filters:
        - name: replace
          args: ["Uploaded: ", ""]
    downloadvolumefactor:
      case:
        ":root:has(div.rounded_colhead2:contains(\"w00t It's Crazyhour!\"))": 0 # Freeleech hour
        "span.tool:contains(\"[FREE]\")": 0
        "*": 1
    uploadvolumefactor:
      case:
        ":root:has(div.rounded_colhead2:contains(\"w00t It's Crazyhour!\"))": 3 # Freeleech hour
        "*": 1
    genre:
      selector: td:nth-child(2) > span:has(span > small)
      remove: span:nth-child(1), span.tool, a[title^="Search all"], br ~ b > small
    description:
      text: "{{ .Result.genre }}"
    minimumratio:
      text: 1.0
    minimumseedtime:
      # 2 days (as seconds = 2 x 24 x 60 x 60)
      text: 172800
# TBDev Custom
