From 2854b2a7a4733f87288ce50fe4924361fd9f6566 Mon Sep 17 00:00:00 2001 From: Garfield69 Date: Wed, 2 Jul 2025 08:04:12 +1200 Subject: [PATCH] add 13city a Chinese private site. resolves #16052 --- README.md | 1 + src/Jackett.Common/Definitions/13city.yml | 185 ++++++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 src/Jackett.Common/Definitions/13city.yml diff --git a/README.md b/README.md index e856072d1..195fa005c 100644 --- a/README.md +++ b/README.md @@ -231,6 +231,7 @@ Prior versions of Jackett are no longer supported.
Supported Private Trackers * 0day.kiev + * 13City * 1ptbar * 3ChangTrai (3CT) [![(invite needed)][inviteneeded]](#) * 3D Torrents (3DT) diff --git a/src/Jackett.Common/Definitions/13city.yml b/src/Jackett.Common/Definitions/13city.yml new file mode 100644 index 000000000..e21c93e48 --- /dev/null +++ b/src/Jackett.Common/Definitions/13city.yml @@ -0,0 +1,185 @@ +--- +id: 13city +name: 13City +description: "13City is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://13city.org/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "电影/Movies"} + - {id: 402, cat: TV, desc: "电视剧/TVSeries"} + - {id: 403, cat: TV, desc: "综艺/TV Shows"} + - {id: 405, cat: TV/Anime, desc: "动漫/Animations"} + - {id: 406, cat: Audio/Video, desc: "演唱会、MV/Music Videos"} + - {id: 408, cat: Audio, desc: "音乐/Music"} + - {id: 409, cat: Books/EBook, desc: "电子书/E-book"} + - {id: 409, cat: Audio/Audiobook, desc: "有声读物/A-book"} + - {id: 413, cat: TV/Documentary, desc: "纪录片/Documentary"} + + 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 Torrents per page: setting to 100 on your account profile. + - name: info_activity + type: info + label: Account Inactivity + default: "Account retention rules:
  1. If there is no valid traffic within 7 days of registration (participation in the calculation of sharing rate), the account will be blocked
  2. After the level is reduced to \"Peasant\", if the sharing rate is not improved within 7 days, the account will be blocked
  3. Long-term non-login:
      - UnParked account: 60 consecutive days of non-login → banned
      - Parked account: 180 consecutive days of non-login → banned
      - Nexus Master and above levels are not subject to long-term non-login ban restrictions
" + +login: + # using cookie method because site does a JS call to API/Challenge via JQuery to load response parm required for takelogin.php + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + 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 + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ 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(a[href^="download.php?id="]) + + 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 + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + 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) + optional: true + default: 512MB + seeders: + selector: td.rowfollow:nth-child(6) + optional: true + default: 0 + leechers: + selector: td.rowfollow:nth-child(7) + optional: true + default: 0 + grabs: + selector: td.rowfollow:nth-child(8) + optional: true + default: 0 + 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 day (as seconds = 24 x 60 x 60) + text: 86400 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.9.6 2025-06-25