diff --git a/README.md b/README.md
index 8df441a7c..4ffcba615 100644
--- a/README.md
+++ b/README.md
@@ -480,6 +480,7 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* Punk's Horror Tracker
* PuntoTorrent
* PuroVicio
+ * PuTao
* Puur-Hollands
* PWTorrents (PWT)
* R3V WTF! [![(invite needed)][inviteneeded]](#)
diff --git a/src/Jackett.Common/Definitions/putao.yml b/src/Jackett.Common/Definitions/putao.yml
new file mode 100644
index 000000000..1301e6b71
--- /dev/null
+++ b/src/Jackett.Common/Definitions/putao.yml
@@ -0,0 +1,198 @@
+---
+id: putao
+name: PuTao
+description: "葡萄 (PuTao) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL"
+language: zh-CN
+type: private
+encoding: UTF-8
+links:
+ - https://pt.sjtu.edu.cn/
+
+caps:
+ categorymappings:
+ - {id: 401, cat: Movies, desc: "Movies CHN 华语电影"}
+ - {id: 402, cat: Movies, desc: "Movies Eng 欧美电影"}
+ - {id: 403, cat: Movies, desc: "Movies Asian 亚洲电影"}
+ - {id: 406, cat: TV/Documentary, desc: "Documentary 纪录片"}
+ - {id: 407, cat: TV, desc: "TV Series HKTW 港台电视剧"}
+ - {id: 408, cat: TV, desc: "TV Series Asian 亚洲电视剧"}
+ - {id: 409, cat: TV, desc: "TV Series CHN 大陆电视剧"}
+ - {id: 410, cat: TV, desc: "TV Series Eng 欧美电视剧"}
+ - {id: 411, cat: TV, desc: "TV CHN 大陆综艺节目"}
+ - {id: 412, cat: TV, desc: "TV HKTW 港台综艺节目"}
+ - {id: 413, cat: TV, desc: "TV Eng 欧美综艺节目"}
+ - {id: 414, cat: TV, desc: "TV JPKR 日韩综艺节目"}
+ - {id: 420, cat: Audio, desc: "Music CHN 华语音乐"}
+ - {id: 421, cat: Audio, desc: "Music JPKR 日韩音乐"}
+ - {id: 422, cat: Audio, desc: "Music Eng 欧美音乐"}
+ - {id: 423, cat: Audio, desc: "Music OST 原声音乐"}
+ - {id: 425, cat: Audio, desc: "Music Classic 古典音乐"}
+ - {id: 426, cat: Audio/MP3, desc: "Music mp3合辑"}
+ - {id: 427, cat: Audio/Video, desc: "Music Videos"}
+ - {id: 429, cat: Console, desc: "Games 游戏"}
+ - {id: 431, cat: TV/Anime, desc: "Anime 动漫"}
+ - {id: 432, cat: TV/Sport, desc: "Sport 体育"}
+ - {id: 434, cat: PC, desc: "Software 软件"}
+ - {id: 435, cat: Other, desc: "Study 学习"}
+ - {id: 440, cat: PC/Mac, desc: "Software Mac"}
+ - {id: 451, cat: Other, desc: "Campus 校园原创"}
+ - {id: 450, cat: Other/Misc, desc: "Misc 其他"}
+
+ modes:
+ search: [q]
+ tv-search: [q, season, ep, imdbid]
+ movie-search: [q, imdbid]
+ music-search: [q]
+
+settings:
+ - name: username
+ type: text
+ label: Username
+ - name: password
+ type: password
+ label: Password
+ - name: info_captcha
+ type: info
+ label: About the Captcha
+ default: If the Captcha image is missing then set the checkcode to XxXx
+ - name: freeleech
+ type: checkbox
+ label: Search freeleech only
+ default: false
+ - name: info_tpp
+ type: info
+ label: Results Per Page
+ default: For best results, change the 每页种子数:每页显示(Torrents per page:) setting to 100 on your account profile.
+ - 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
+
+login:
+ path: login.php
+ method: form
+ form: form[action="takelogin.php"]
+ captcha:
+ type: image
+ selector: img[src^="getcheckcode.php?"]
+ input: checkcode
+ inputs:
+ username: "{{ .Config.username }}"
+ password: "{{ .Config.password }}"
+ logout: ""
+ error:
+ - selector: td.embedded:has(h2:contains("失败"))
+ test:
+ path: index.php
+ selector: a[href^="logout.php?hash="]
+
+search:
+ paths:
+ - path: torrents.php
+ inputs:
+ $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
+ search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search
+ # 0 incldead, 1 onlyactive, 2 onlydead
+ incldead: 0
+ # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 30%, 7 70%
+ spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}"
+ # 0 all, 1 popular, 2 classic, 3 recommended, 4 normal, 5 seeds
+ picktype: 0
+ # 0 title, 1 descr, 3 uploader, 4 imdbid
+ search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}"
+ # 0 AND, 1 OR, 2 exact
+ search_mode: 0
+ sort: "{{ .Config.sort }}"
+ type: "{{ .Config.type }}"
+
+ rows:
+ selector: table.torrents > tbody > tr:has(table.torrentname)
+
+ fields:
+ category:
+ selector: a[href^="?cat="]
+ attribute: href
+ filters:
+ - name: querystring
+ args: cat
+ title:
+ selector: a[href^="details.php?id="]
+ title:
+ optional: true
+ selector: a[title][href^="details.php?id="]
+ attribute: title
+ details:
+ selector: a[href^="details.php?id="]
+ attribute: href
+ download:
+ selector: a[href^="download.php?id="]
+ attribute: href
+ date:
+ # time elapsed (default)
+ # 19时
3分 (19 hours 3 minutes)
+ # 2天
21时 (2 days 21 hours)
+ selector: td:nth-child(4):not(:contains("-"))
+ optional: true
+ filters:
+ - name: replace
+ args: ["年", "years"]
+ - name: replace
+ args: ["月", "months"]
+ - name: replace
+ args: ["天", "days"]
+ - name: replace
+ args: ["时", " hours"]
+ - name: replace
+ args: ["分", "minutes"]
+ - name: append
+ args: " ago"
+ - name: timeago
+ date:
+ # time added
+ selector: td:nth-child(4):contains("-")
+ optional: true
+ filters:
+ - name: append
+ args: " +08:00" # CST
+ - name: dateparse
+ args: "2006-01-0215:04:05 -07:00"
+ size:
+ selector: td:nth-child(5)
+ seeders:
+ selector: td:nth-child(6)
+ leechers:
+ selector: td:nth-child(7)
+ grabs:
+ selector: td:nth-child(8)
+ downloadvolumefactor:
+ case:
+ tr.free_bg: 0
+# tr.2up: 0
+# tr.free2up: 0
+ tr.halfdown_bg: 0.5
+ tr.d30down_bg: 0.3
+ tr.d70down_bg: 0.7
+ "*": 1
+ uploadvolumefactor:
+ case:
+# tr.2up: 0
+# tr.free2up: 0
+ "*": 1
+ description:
+ selector: td:nth-child(2)
+ remove: a, img
+ minimumratio:
+ text: 0.7
+# NexusPHP v1.0 Beta 2