---
id: turkseed-api
name: TurkSeed
description: "TurkSeed is a TURKISH Private Torrent Tracker for MOVIES / TV / GENERAL"
language: tr-TR
type: private
encoding: UTF-8
links:
  - https://turkseed.com/

caps:
  categorymappings:
    - {id: 1, cat: Movies, desc: "Film"}
    - {id: 6, cat: TV, desc: "Dizi Show"}
    - {id: 2, cat: Movies, desc: "Yerli Film"}
    - {id: 5, cat: TV/Foreign, desc: "Yabanci Dizi"}
    - {id: 3, cat: Console, desc: "Oyunlar"}
    - {id: 13, cat: TV, desc: "AMAZON"}
    - {id: 14, cat: TV, desc: "NETFLİX DIZI"}
    - {id: 15, cat: TV, desc: "DİSNEY+ MOVIE"}
    - {id: 16, cat: TV, desc: "TODD"}
    - {id: 17, cat: TV, desc: "TV+"}
    - {id: 18, cat: TV, desc: "BLUTV"}
    - {id: 19, cat: TV, desc: "EXXEN"}
    - {id: 20, cat: TV, desc: "NETFLIX BELGESEL"}

  modes:
    search: [q]
    tv-search: [q, season, ep, imdbid, tvdbid, tmdbid]
    movie-search: [q, imdbid, tmdbid]

settings:
  - name: apikey
    type: text
    label: APIKey
  - name: info_key
    type: info
    label: About your API key
    default: "Find or Generate a new API Token by accessing your <a href=\"https://turkseed.com/\" target=\"_blank\">TurkSeed</a> account <i>My Settings</i> page and clicking on the <b>API Key</b> tab."
  - name: freeleech
    type: checkbox
    label: Search freeleech only
    default: false
  - name: single_file_release_use_filename
    type: checkbox
    label: Use filename as title for single file releases
    default: true
  - name: sort
    type: select
    label: Sort requested from site
    default: created_at
    options:
      created_at: created
      seeders: seeders
      size: size
      name: 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: "Accounts that do not download a 15GB torrent from our site within a month will receive a warning (will be closed)! Accounts that do not upload (seed, share) 20gb on our site within a month will receive a warning (will be closed)! The account that receives three warnings will be automatically closed! No objections are accepted to the deletion of accounts that have not been on our site for six months and have not been active in any way!"

login:
  path: /api/torrents
  method: get
  inputs: {} # TODO: remove in v10
  error:
    - selector: a[href*="/login"]
      message:
        text: "The API key was not accepted by {{ .Config.sitelink }}."

search:
  paths:
    # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v8.x.x)
    # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L476
    - path: "/api/torrents/filter"
      response:
        type: json

  headers:
    Authorization: ["Bearer {{ .Config.apikey }}"]

  inputs:
  # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6.  Else pass S/E Params for UNIT3D >= v6
    $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}"
    name: "{{ .Keywords }}"
    seasonNumber: "{{ .Query.Season }}"
    episodeNumber: "{{ .Query.Ep }}"
    imdbId: "{{ .Query.IMDBIDShort }}"
    tmdbId: "{{ .Query.TMDBID }}"
    tvdbId: "{{ .Query.TVDBID }}"
    "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}"
    sortField: "{{ .Config.sort }}"
    sortDirection: "{{ .Config.type }}"
    perPage: 100

  keywordsfilters:
    - name: re_replace
      args: ["\\.", " "]

  rows:
    selector: data
    attribute: attributes

  fields:
    category:
      selector: category_id
    title_optional:
      selector: name
    title_filename:
      selector: "files[0].name"
      optional: true
    files:
      selector: num_file
    title:
      text: "{{ if and (.Config.single_file_release_use_filename) (eq .Result.files \"1\") (.Result.title_filename) }}{{ .Result.title_filename }}{{ else }}{{ .Result.title_optional }}{{ end }}"
    details:
      selector: details_link
    download:
      selector: download_link
    infohash:
      selector: info_hash
    poster:
      selector: meta.poster
      filters:
        - name: replace
          args: ["https://via.placeholder.com/90x135", ""]
    imdbid:
      selector: imdb_id
    tmdbid:
      selector: tmdb_id
    tvdbid:
      selector: tvdb_id
    genre:
      selector: meta.genres
      filters:
        - name: re_replace
          args: ["(?i)(Bilim Kurgu)", "Bilim_Kurgu"]
        - name: re_replace
          args: ["(?i)(Pembe Dizi)", "Pembe_Dizi"]
        - name: re_replace
          args: ["(?i)(TV film)", "TV_film"]
        - name: re_replace
          args: ["(?i)(Vahşi Batı)", "Vahşi_Batı"]
        - name: replace
          args: [" & ", "_&_"]
    description:
      text: "{{ .Result.genre }}"
    seeders:
      selector: seeders
    leechers:
      selector: leechers
    grabs:
      selector: times_completed
    date:
      # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50
      selector: created_at
      filters:
        - name: append
          args: " +00:00" # GMT
        - name: dateparse
          args: "MM/dd/yyyy HH:mm:ss zzz"
    size:
      selector: size
    downloadvolumefactor:
      # api returns 0%, 25%, 50%, 75%, 100%
      selector: freeleech
      case:
        0%: 1 # not free
        25%: 0.75
        50%: 0.5
        75%: 0.25
        100%: 0 # freeleech
        "*": 0 # catch errors
    uploadvolumefactor:
      # api returns False, True
      selector: double_upload
      case:
        False: 1 # normal
        True: 2 # double
    minimumratio:
      text: 0.6
    minimumseedtime:
      # 7 days (as seconds = 7 x 24 x 60 x 60)
      text: 604800
# json UNIT3D 8.1.3
