Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions FORK.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Fork notes — patrickdundas/tracker-tracker

Fork of [jordanlambrecht/tracker-tracker](https://github.com/jordanlambrecht/tracker-tracker)
(GPL-3.0), maintained for Patrick's homelab. Deployed on the `yams` VM at
`http://192.168.8.199:3838`; see `docs/tracker-stats.md` in the `homelab-agent` repo.

## Why this fork exists

TorrentLeech hit-and-run tracking. TL has no public API, so stats come from scraping the logged-in
profile page — and upstream's TL adapter (via PR #175) stubs `hitAndRuns: null`. HnR visibility
across trackers is the whole reason this dashboard was deployed, so that gap is the fork's purpose.

## Branch strategy

| Branch | Role |
|---|---|
| `main` | **Integration + deploy branch.** `release.yml` triggers on push here and publishes to `ghcr.io/patrickdundas/tracker-tracker`. Upstream is merged *into* this. |
| `feat/*` | Work branches. PR into `main` so `ci.yml` runs before anything publishes. |

`main` deliberately is *not* a clean upstream mirror: the release workflow only builds from `main`,
so that is where deployable code has to live. To contribute something back upstream, branch from
`upstream/main` directly rather than from our `main`.

```bash
git remote -v
# origin git@github.com:patrickdundas/tracker-tracker.git
# upstream https://github.com/jordanlambrecht/tracker-tracker.git

# sync with upstream
git fetch upstream && git merge upstream/main
```

## Versioning

`release.yml` publishes only when `package.json`'s version has no matching GitHub Release, so
**every deployable change needs a version bump** or no image is built.

This fork uses a `-homelab.N` suffix (`2.8.9-homelab.1`) so builds are unambiguously ours and never
collide with an upstream release tag. On an upstream sync, `package.json` will conflict on this one
line — resolve to the new upstream base plus a reset suffix, e.g. `2.9.0-homelab.1`.

## Deltas from upstream

| Change | Status |
|---|---|
| Upstream PR #175 merged whole (Zenith, BTN fix, IPTorrents, TorrentLeech adapters) | done — see below |
| TorrentLeech `hitAndRuns` | **the point of the fork**, not yet implemented |
| TorrentLeech `requiredRatio` / `warned` | stubbed `null` upstream; `warned` feeds the `warned` notification event |

**On taking #175 whole rather than extracting only TorrentLeech:** all four adapters touch the same
shared files (`src/lib/adapters/index.ts`, `adapters/constants.ts`, `lib/parser.ts`). Cherry-picking
TL alone would leave this fork carrying divergent copies of those, guaranteeing conflicts when
upstream merges #175. Taken whole, that merge becomes a no-op. The unused adapters never execute
unless those trackers are configured.

## One-time setup gotcha

GitHub **disables workflows on forks by default**. `total_count` from
`/repos/:owner/:repo/actions/workflows` reads 0 and nothing runs until they are enabled once from
the repo's Actions tab. There is no REST endpoint for this.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "private-tracker-tracker",
"version": "2.8.9",
"version": "2.8.9-homelab.1",
"description": "Self-hosted dashboard for monitoring private tracker stats over time",
"license": "GPL-3.0",
"repository": {
Expand Down
9 changes: 4 additions & 5 deletions src/data/trackers/broadcasthenet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,8 @@ export const broadcasthenet: TrackerRegistryEntry = {
"The top TV tracker, featuring a huge library, well-known internal releasers, great retention, and no ratio requirements.",

// ── Platform & API ──────────────────────────────────────────────────
platform: "gazelle",
gazelleEnrich: true,
apiPath: "/ajax.php",
platform: "btn",
apiPath: "https://api.broadcasthe.net/",

// ── Content ─────────────────────────────────────────────────────────
specialty: "TV",
Expand Down Expand Up @@ -43,8 +42,8 @@ export const broadcasthenet: TrackerRegistryEntry = {
},

// ── Status ──────────────────────────────────────────────────────────
warning: true,
warningNote: "Unvalidated",
warning: false,
warningNote: "",

// ── Flags ───────────────────────────────────────────────────────────
draft: false,
Expand Down
3 changes: 3 additions & 0 deletions src/data/trackers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export * from "./torrentleech"
export * from "./tvvault"
export * from "./uhdbits"
export * from "./uploadcx"
export * from "./zenith"

import { pier720 } from "./720pier"
import { abtorrents } from "./abtorrents"
Expand Down Expand Up @@ -105,6 +106,7 @@ import { torrentleech } from "./torrentleech"
import { tvvault } from "./tvvault"
import { uhdbits } from "./uhdbits"
import { uploadcx } from "./uploadcx"
import { zenith } from "./zenith"

export const ALL_TRACKERS: TrackerRegistryEntry[] = [
pier720,
Expand Down Expand Up @@ -158,4 +160,5 @@ export const ALL_TRACKERS: TrackerRegistryEntry[] = [
tvvault,
uhdbits,
uploadcx,
zenith,
]
12 changes: 6 additions & 6 deletions src/data/trackers/iptorrents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ export const iptorrents: TrackerRegistryEntry = {
"General tracker with a controversial reputation. Extremely large userbase. Content quality can be inconsistent.",

// ── Platform & API ──────────────────────────────────────────────────
platform: "custom",
apiPath: "/api/user",
platform: "iptorrents",
apiPath: "/profile",

// ── Content ─────────────────────────────────────────────────────────
specialty: "General",
Expand All @@ -36,8 +36,8 @@ export const iptorrents: TrackerRegistryEntry = {

// ── Rules ───────────────────────────────────────────────────────────
rules: {
minimumRatio: 0,
seedTimeHours: 0,
minimumRatio: 1.0,
seedTimeHours: 336,
loginIntervalDays: 0,
},

Expand All @@ -46,7 +46,7 @@ export const iptorrents: TrackerRegistryEntry = {
warningNote: "",

// ── Flags ───────────────────────────────────────────────────────────
draft: true,
draft: false,
supportsTransitPapers: false,
profileUrlPattern: "",
profileUrlPattern: "/u/{id}",
}
10 changes: 5 additions & 5 deletions src/data/trackers/torrentleech.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ export const torrentleech: TrackerRegistryEntry = {
"Large general tracker known for having open signups very often. Broad content library across most categories.",

// ── Platform & API ──────────────────────────────────────────────────
platform: "custom",
apiPath: "/api/user",
platform: "torrentleech",
apiPath: "/profile",

// ── Content ─────────────────────────────────────────────────────────
specialty: "General",
Expand All @@ -36,7 +36,7 @@ export const torrentleech: TrackerRegistryEntry = {

// ── Rules ───────────────────────────────────────────────────────────
rules: {
minimumRatio: 0,
minimumRatio: 1.0,
seedTimeHours: 0,
loginIntervalDays: 0,
},
Expand All @@ -46,7 +46,7 @@ export const torrentleech: TrackerRegistryEntry = {
warningNote: "",

// ── Flags ───────────────────────────────────────────────────────────
draft: true,
draft: false,
supportsTransitPapers: false,
profileUrlPattern: "",
profileUrlPattern: "/profile/{username}",
}
51 changes: 51 additions & 0 deletions src/data/trackers/zenith.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// src/data/trackers/zenith.ts

import type { TrackerRegistryEntry } from "@/data/tracker-registry"

export const zenith: TrackerRegistryEntry = {
// ── Identity ────────────────────────────────────────────────────────
slug: "zenith",
name: "Zenith",
abbreviation: "ZN",
url: "https://znth.cx",
description: "Private general tracker with a clean UNIT3D interface.",

// ── Platform & API ──────────────────────────────────────────────────
platform: "unit3d",
apiPath: "/api/user",

// ── Content ─────────────────────────────────────────────────────────
specialty: "General",
contentCategories: ["Movies", "TV", "Music", "Games", "Books", "Audiobooks"],
language: "English",

// ── Visual ──────────────────────────────────────────────────────────
color: "#7c3aed",
logo: "",

// ── External Links ──────────────────────────────────────────────────
trackerHubSlug: "",
statusPageUrl: "",

// ── Community ───────────────────────────────────────────────────────
userClasses: [],
releaseGroups: [],
bannedGroups: [],
notableMembers: [],

// ── Rules ───────────────────────────────────────────────────────────
rules: {
minimumRatio: 0.4,
seedTimeHours: 72,
loginIntervalDays: 90,
},

// ── Status ──────────────────────────────────────────────────────────
warning: false,
warningNote: "",

// ── Flags ───────────────────────────────────────────────────────────
draft: false,
supportsTransitPapers: false,
profileUrlPattern: "/users/{username}",
}
Loading