---
id: okpt
name: OKPT
description: "OKPT is a CHINESE Private site for MOVIES / TV / MUSIC / GENERAL"
language: zh-CN
type: private
encoding: UTF-8
requestDelay: 2
links:
  - https://www.okpt.net/

caps:
  categorymappings:
    - {id: 401, cat: Movies, desc: "Movies/电影", default: true}
    - {id: 402, cat: TV, desc: "TV Series/电视剧", default: true}
    - {id: 403, cat: TV, desc: "TV Shows/综艺", default: true}
    - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片", default: true}
    - {id: 407, cat: TV/Sport, desc: "Sports/体育", default: true}
    - {id: 436, cat: Books/Comics, desc: "Comics/漫画书", default: true}
    - {id: 405, cat: TV/Anime, desc: "Animations/动漫", default: true}
    - {id: 434, cat: Books/EBook, desc: "Books/书刊", default: true}
    - {id: 432, cat: Audio/Audiobook, desc: "Audiobook/有声书", default: true}
    - {id: 413, cat: Console, desc: "Games/游戏", default: true}
    - {id: 431, cat: PC, desc: "Software/软件", default: true}
    - {id: 409, cat: Other, desc: "Misc/其他", default: true}
    # special
    - {id: 412, cat: XXX/Other, desc: "3XBook/写真图影", default: false}
    - {id: 411, cat: XXX/x264, desc: "3XVideo/写真影片", default: false}
    - {id: 410, cat: XXX/ImageSet, desc: "3XImageSet/写真图片", default: false}
    - {id: 415, cat: Audio, desc: "Music/音乐", default: false}
    - {id: 437, cat: Audio/Video, desc: "Concert/演唱会", default: false}
    - {id: 438, cat: Audio/Video, desc: "Concert/音乐会", default: false}
    - {id: 416, cat: Other, desc: "Misc/其它", default: false}

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

settings:
  - name: cookie
    type: text
    label: Cookie
  - name: info_cookie
    type: info_cookie
  - 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_tpp
    type: info
    label: Results Per Page
    default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
  - name: info_activity
    type: info
    label: Account Inactivity
    default: "Account retention rules:<ul><li>Sixth degree burn (Extreme User) and above will be retained forever</li><li>Second degree burn (Elite User) and above have their accounts parked (in the control panel) for 60 consecutive days If you do not log in for 60 days, your account will be deleted</li><li>Users who have parked their accounts and do not log in for 60 consecutive days will have their accounts deleted</li><li>Users who have not parked their accounts will have their accounts deleted if they do not log in for 60 consecutive days</li><li>Users without traffic (i.e. upload / download data are all 0) If you do not log in for 14 consecutive days, your account will be deleted.</li></ul>"

login:
  method: cookie
  inputs:
    cookie: "{{ .Config.cookie }}"
  test:
    path: index.php
    selector: a[href="logout.php"]

search:
  paths:
    - path: torrents.php
      categories: [401, 402, 403, 404, 407, 436, 405, 434, 432, 413, 431, 409]
    - path: special.php
      categories: [412, 411, 410, 415, 437, 438, 416]
  inputs:
    $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
    search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}"
    # 0 incldead, 1 active, 2 dead
    incldead: 0
    # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30%
    spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}"
    # 0 title, 1 descr, 3 uploader, 4 imdburl (4 does not appear to work)
    search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}"
    # 0 AND, 2 exact
    search_mode: 0
    sort: "{{ .Config.sort }}"
    type: "{{ .Config.type }}"
    notnewword: 1

  rows:
    selector: table.torrents > tbody > tr:has(table.torrentname)

  fields:
    category:
      selector: a[href^="?cat="]
      attribute: href
      filters:
        - name: querystring
          args: cat
    title_default:
      selector: a[href^="details.php?id="]
    title:
      selector: a[title][href^="details.php?id="]
      attribute: title
      optional: true
      default: "{{ .Result.title_default }}"
    details:
      selector: a[href^="details.php?id="]
      attribute: href
    download:
      selector: a[href^="download.php?id="]
      attribute: href
    poster:
      selector: img[data-src]
      attribute: data-src
    date_elapsed:
      # time type: time elapsed (default)
      selector: td.rowfollow:nth-child(4) > span[title]
      attribute: title
      optional: true
      filters:
        - name: append
          args: " +08:00" # CST
        - name: dateparse
          args: "yyyy-MM-dd HH:mm:ss zzz"
    date_added:
      # time added
      selector: td.rowfollow:nth-child(4):not(:has(span))
      optional: true
      filters:
        - name: append
          args: " +08:00" # CST
        - name: dateparse
          args: "yyyy-MM-ddHH:mm:ss zzz"
    date:
      text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}"
    size:
      selector: td.rowfollow:nth-child(5)
    seeders:
      selector: td.rowfollow:nth-child(6)
    leechers:
      selector: td.rowfollow:nth-child(7)
    grabs:
      selector: td.rowfollow:nth-child(8)
    downloadvolumefactor:
      case:
        img.pro_free: 0
        img.pro_free2up: 0
        img.pro_50pctdown: 0.5
        img.pro_50pctdown2up: 0.5
        img.pro_30pctdown: 0.3
        "*": 1
    uploadvolumefactor:
      case:
        img.pro_50pctdown2up: 2
        img.pro_free2up: 2
        img.pro_2up: 2
        "*": 1
    minimumratio:
      text: 1.0
    minimumseedtime:
      # 1.5 days (as seconds = 1.5 x 24 x 60 x 60)
      text: 129600
    description_verified:
      case:
        span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:"
        span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:"
        span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:"
    description:
      selector: td.rowfollow:nth-child(2)
      remove: a, b, font, img, span
      filters:
        - name: prepend
          args: "{{ .Result.description_verified }} "
# NexusPHP v1.8.11 2024-03-27
