# torrent-indexer [![](https://dcbadge.limes.pink/api/server/7wqNywmpQW)](https://discord.gg/7wqNywmpQW) This is a simple torrent indexer that can be used to index torrents from HTML pages. It is written in Golang and uses Redis as a cache. ## Test it Visit [https://torrent-indexer.darklyn.org/](https://torrent-indexer.darklyn.org/) to test it. ## Supported sites - [comando-torrents](https://comando.la/) - [bludv](https://bludvfilmes.tv/) - [torrent-dos-filmes](https://torrentdosfilmes.se/) - [starck-filmes](https://www.starckfilmes.online/) - [comandohds](https://comandohds.org/) - [rede-torrent](https://redetorrent.com/) ## Deploy If you have Docker + docker-compose installed, you can deploy it using the following command: ```bash curl -s https://raw.githubusercontent.com/felipemarinho97/torrent-indexer/main/docker-compose.yml > docker-compose.yml docker-compose up -d ``` The server will be available at [http://localhost:8080/](http://localhost:8080/). ## Configuration You can configure the server using the following environment variables: - `PORT`: (optional) The port that the server will listen to. Default: `7006` - `FLARESOLVERR_ADDRESS`: (optional) The address of the FlareSolverr instance. Default: `N/A` - `MEILISEARCH_ADDRESS`: (optional) The address of the MeiliSearch instance. Default: `N/A` - `MEILISEARCH_KEY`: (optional) The API key of the MeiliSearch instance. Default: `N/A` - `REDIS_HOST`: (optional) The address of the Redis instance. Default: `localhost` - `SHORT_LIVED_CACHE_EXPIRATION` (optional) The expiration time of the short-lived cache in duration format. Default: `30m` - This cache is used to cache homepage or search results. - Example: `30m`, `1h`, `1h30m`, `1h30m30s` - `LONG_LIVED_CACHE_EXPIRATION` (optional) The expiration time of the long-lived cache in duration format. Default: `7d` - This cache is used to store the torrent webpages (posts). You can set it to a higher value because the torrent pages are not updated frequently. ## Integrating with Jackett You can integrate this indexer with Jackett by adding a new Torznab custom indexer. Here is an example of how to do it for the `bludv` indexer: ```yaml --- id: bludv_indexer name: BluDV Indexer description: "BluDV - Custom indexer on from torrent-indexer" language: pt-BR type: public encoding: UTF-8 links: - http://localhost:8080/ caps: categorymappings: - { id: Movie, cat: Movies, desc: "Movies" } - { id: TV, cat: TV, desc: "TV" } modes: search: [q] tv-search: [q, season, ep] movie-search: [q] allowrawsearch: true settings: [] search: paths: - path: "indexers/bludv?filter_results=true&q={{ .Keywords }}" response: type: json keywordsfilters: - name: tolower rows: selector: $.results count: selector: $.count fields: _id: selector: title download: selector: magnet_link title: selector: title description: selector: original_title details: selector: details infohash: selector: info_hash date: selector: date size: selector: size seeders: selector: seed_count leechers: selector: leech_count imdb: selector: imdb category_is_tv_show: selector: title filters: - name: regexp args: "\\b(S\\d+(?:E\\d+)?)\\b" category: text: "{{ if .Result.category_is_tv_show }}TV{{ else }}Movie{{ end }}" # json engine n/a ``` ## Integrating with Prowlarr You can integrate this indexer with Prowlarr by adding a custom definition. See [Adding a custom YML definition](https://wiki.servarr.com/prowlarr/indexers#adding-a-custom-yml-definition). ```yaml --- id: torrent-indexer name: Torrent Indexer description: "Indexing Brazilian Torrent websites into structured data. github.com/felipemarinho97/torrent-indexer" language: pt-BR type: public encoding: UTF-8 links: - http://localhost:8080/ caps: categories: Movies: Movies TV: TV modes: search: [q] tv-search: [q, season] movie-search: [q] settings: - name: indexer type: select label: Indexer default: bludv options: bludv: BLUDV comando_torrents: Comando Torrents torrent-dos-filmes: Torrent dos Filmes comandohds: Comando HDs starck-filmes: Starck Filmes rede_torrent: Rede Torrent search: paths: - path: "/indexers/{{ .Config.indexer }}" response: type: json inputs: filter_results: "true" q: "{{ .Keywords }}" keywordsfilters: - name: tolower - name: re_replace args: ["(?i)(S0)(\\d{1,2})$", "temporada $2"] - name: re_replace args: ["(?i)(S)(\\d{1,3})$", "temporada $2"] rows: selector: $.results count: selector: $.count fields: download: selector: magnet_link title: selector: title description: selector: original_title details: selector: details infohash: selector: info_hash date: selector: date size: selector: size seeders: selector: seed_count leechers: selector: leech_count imdb: selector: imdb category_is_tv_show: selector: title filters: - name: regexp args: "\\b(S\\d+(?:E\\d+)?)\\b" category: text: "{{ if .Result.category_is_tv_show }}TV{{ else }}Movies{{ end }}" ``` # Warning The instance running at [https://torrent-indexer.darklyn.org/](https://torrent-indexer.darklyn.org/) is my personal instance and it is not guaranteed to be up all the time. Also, for better availability, I recommend deploying your own instance because the Cloudflare protection may block requests from indexed sites if too many requests are made in a short period of time from the same IP. If I notice that the instance is being used a lot, I may block requests from Jackett to avoid overloading the server without prior notice.