diff --git a/README.md b/README.md
index 9693d7145..ae9ae0fce 100644
--- a/README.md
+++ b/README.md
@@ -162,6 +162,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Torrent411
* TorrentBD
* TorrentBytes
+ * TorrentCCF
* TorrentDay
* TorrentHeaven
* TorrentHR
diff --git a/src/Jackett/Definitions/torrentccf.yml b/src/Jackett/Definitions/torrentccf.yml
new file mode 100644
index 000000000..f7bb3c255
--- /dev/null
+++ b/src/Jackett/Definitions/torrentccf.yml
@@ -0,0 +1,118 @@
+---
+ site: torrentccf
+ name: TorrentCCF
+ language: zh-cn
+ type: private
+ encoding: UTF-8
+ links:
+ - https://et8.org/
+
+ caps:
+ categorymappings:
+ - {id: 601, cat: Movies, desc: "Movies"}
+ - {id: 602, cat: TV/Anime, desc: "Animations"}
+ - {id: 603, cat: TV/Sport, desc: "Sports"}
+ - {id: 604, cat: TV/Documentary, desc: "Documentaries"}
+ - {id: 605, cat: Books, desc: "EDU"}
+ - {id: 606, cat: TV, desc: "TV/Cn"}
+ - {id: 607, cat: TV, desc: "TV/Western"}
+ - {id: 608, cat: TV, desc: "TV/hk_tw"}
+ - {id: 609, cat: TV, desc: "TV/Japan_korea"}
+ - {id: 610, cat: TV, desc: "TV Shows"}
+ - {id: 611, cat: Audio, desc: "Music/Cn"}
+ - {id: 612, cat: Audio, desc: "Music/Western"}
+ - {id: 613, cat: Audio, desc: "Music/Asia"}
+ - {id: 614, cat: Audio, desc: "Music/Classic"}
+ - {id: 615, cat: Audio/Video, desc: "MusicVideo"}
+ - {id: 616, cat: PC, desc: "Appz"}
+ - {id: 617, cat: PC/Games, desc: "PC Games"}
+ - {id: 618, cat: Console/PS4, desc: "Playstation"}
+ - {id: 619, cat: Console/Xbox, desc: "Xbox"}
+ - {id: 620, cat: Console/Wii, desc: "Wii"}
+ - {id: 621, cat: Other, desc: "Others"}
+
+ modes:
+ search: [q]
+ tv-search: [q, season, ep, imdbid]
+ movie-search: [imdbid]
+
+ login:
+ path: /login.php
+ method: form
+ form: form[action="takelogin.php"]
+ captcha:
+ type: image
+ image: img[alt="CAPTCHA"]
+ input: imagestring
+ inputs:
+ username: "{{ .Config.username }}"
+ password: "{{ .Config.password }}"
+ error:
+ - selector: td.embedded:has(h2:contains("登录失败"))
+ test:
+ path: /torrents.php
+
+ search:
+ path: /torrents.php
+ method: get
+ inputs:
+ $raw: "{{range .Categories}}cat{{.}}=1&{{end}}"
+ search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
+ incldead: "1"
+ search_area: "{{ if .Query.IMDBID }}4{{else}}0{{end}}"
+ rows:
+ selector: table.torrents > tbody > tr:has(table.torrentname)
+ fields:
+ title:
+ selector: a[href^="details.php?id="]
+ title|optional:
+ selector: a[title][href^="details.php?id="]
+ attribute: title
+ category:
+ selector: a[href^="?cat="]
+ attribute: href
+ filters:
+ - name: querystring
+ args: cat
+ details:
+ selector: a[href^="details.php?id="]
+ attribute: href
+ download:
+ selector: a[href^="download.php?id="]
+ attribute: href
+ imdb|optional:
+ selector: div.imdb_100 > a
+ attribute: href
+ size:
+ selector: td:nth-child(5)
+ grabs:
+ selector: td:nth-child(8)
+ seeders:
+ selector: td:nth-child(6)
+ leechers:
+ selector: td:nth-child(7)
+ date:
+ selector: td:nth-child(4) > span[title]
+ attribute: title
+ filters:
+ - name: append
+ args: " +08:00"
+ - name: dateparse
+ args: "2006-01-02 15:04:05 -07:00"
+ 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"
+ description:
+ selector: td:nth-child(2)
+ remove: a, img
diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj
index e8c097002..cad9aa3f7 100644
--- a/src/Jackett/Jackett.csproj
+++ b/src/Jackett/Jackett.csproj
@@ -680,6 +680,9 @@
PreserveNewest
+
+ PreserveNewest
+
Designer