Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
cb783cb
feat(catalog): browse a peer's catalog on a dedicated page
roziscoding Jun 26, 2026
0f5897a
feat(catalog): add TMDB config and connection status
roziscoding Jun 26, 2026
92ba226
feat(catalog): enrich peer catalog with TMDB metadata
roziscoding Jun 26, 2026
3adeaab
feat(catalog): add *arr request options modal
roziscoding Jun 26, 2026
2404be3
feat(catalog): request a peer title into Radarr/Sonarr
roziscoding Jun 26, 2026
4867c75
feat(torznab): tag Jack releases with the Internal indexer flag
roziscoding Jun 27, 2026
ac8a50e
feat(arr): register a Jack-only custom format and quality profile
roziscoding Jun 27, 2026
6031c41
fix(torznab): embed the requester's key in download URLs
roziscoding Jun 27, 2026
8b37bcd
perf(catalog): enrich peer titles lazily from the client
roziscoding Jun 27, 2026
831c4ea
feat(catalog): direct-download peer movies and ManualImport into *arr
roziscoding Jun 27, 2026
35e0aa0
feat(catalog): direct-download whole TV series per episode
roziscoding Jun 27, 2026
4bd51f8
refactor(arr): drop the now-dead Jack custom format and quality profile
roziscoding Jun 27, 2026
79e673b
fix(catalog): surface failed direct-download starts in requestDownload
roziscoding Jun 27, 2026
f5fe87f
feat(ui): added image fallback for TMDB poster cards
roziscoding Jun 27, 2026
58fde90
feat(catalog): aggregated GET /catalog with cross-peer grouping
roziscoding Jun 27, 2026
0db27b9
feat(ui): unified Peer Catalog page with peer picker
roziscoding Jun 27, 2026
c2e9676
refactor(ui): remove per-peer catalog page and dead type
roziscoding Jun 27, 2026
b5cd7c5
feat(ui): add View in Logflix button to catalog title detail
roziscoding Jun 28, 2026
d24199b
feat(ui): add About section with TMDB attribution and app version
roziscoding Jun 28, 2026
02c4c97
feat(ui): stable per-peer colors and plug-style connection status
roziscoding Jun 28, 2026
8c65f9a
feat(ui): shared settings store with adaptive polling
roziscoding Jun 28, 2026
a9dc73a
feat(catalog): instant-load skeletons and per-peer download picker
roziscoding Jun 28, 2026
f4ef958
chore(ui): reorder package metadata
roziscoding Jun 28, 2026
9645f3f
fix(catalog): report duplicate direct downloads accurately
roziscoding Jun 28, 2026
5f3d75c
fix(catalog): avoid ambiguous grouping and retry metadata
roziscoding Jun 28, 2026
a134d65
fix(downloads): track manual import completion
roziscoding Jun 28, 2026
4a67231
fix(arr): fail rows on pruned manual-import commands
roziscoding Jun 28, 2026
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
347 changes: 347 additions & 0 deletions .agents/skills/tmdb-api/SKILL.md

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions apps/backend/drizzle/0008_typical_rocket_racer.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE `downloads` ADD `import_mode` text;--> statement-breakpoint
ALTER TABLE `downloads` ADD `import_target` text;
2 changes: 2 additions & 0 deletions apps/backend/drizzle/0009_bumpy_ozymandias.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE `downloads` ADD `source_server_id` text;--> statement-breakpoint
Comment thread
greptile-apps[bot] marked this conversation as resolved.
Comment thread
greptile-apps[bot] marked this conversation as resolved.
ALTER TABLE `downloads` ADD `manual_import_command_id` integer;
336 changes: 336 additions & 0 deletions apps/backend/drizzle/meta/0008_snapshot.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,336 @@
{
"version": "6",
"dialect": "sqlite",
"id": "364866ab-f386-439e-af39-505eada0b51e",
"prevId": "db1b9834-4df7-4b99-a413-be6d9a0f5428",
"tables": {
"api_keys": {
"name": "api_keys",
"columns": {
"id": {
"name": "id",
"type": "integer",
"primaryKey": true,
"notNull": true,
"autoincrement": true
},
"key_hash": {
"name": "key_hash",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"description": {
"name": "description",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"expires_at": {
"name": "expires_at",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"updated_at": {
"name": "updated_at",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"api_keys_key_hash_unique": {
"name": "api_keys_key_hash_unique",
"columns": [
"key_hash"
],
"isUnique": true
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"downloads": {
"name": "downloads",
"columns": {
"id": {
"name": "id",
"type": "integer",
"primaryKey": true,
"notNull": true,
"autoincrement": true
},
"torrent_filename": {
"name": "torrent_filename",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"peer_id": {
"name": "peer_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"peer_name": {
"name": "peer_name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"item_id": {
"name": "item_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"filename": {
"name": "filename",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"dest_path": {
"name": "dest_path",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"part_path": {
"name": "part_path",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"release_size": {
"name": "release_size",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"release_json": {
"name": "release_json",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"expected_bytes": {
"name": "expected_bytes",
"type": "integer",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"expected_bytes_source": {
"name": "expected_bytes_source",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"expected_bytes_mismatch": {
"name": "expected_bytes_mismatch",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"downloaded_bytes": {
"name": "downloaded_bytes",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": 0
},
"attempts": {
"name": "attempts",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": 0
},
"status": {
"name": "status",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"started_at": {
"name": "started_at",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"updated_at": {
"name": "updated_at",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"completed_at": {
"name": "completed_at",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"error": {
"name": "error",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"qb_category": {
"name": "qb_category",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"qb_source_server": {
"name": "qb_source_server",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"import_mode": {
"name": "import_mode",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"import_target": {
"name": "import_target",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {
"downloads_status_idx": {
"name": "downloads_status_idx",
"columns": [
"status"
],
"isUnique": false
},
"downloads_updated_at_idx": {
"name": "downloads_updated_at_idx",
"columns": [
"updated_at"
],
"isUnique": false
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {
"downloads_status_check": {
"name": "downloads_status_check",
"value": "\"downloads\".\"status\" in ('downloading', 'import_queued', 'imported', 'failed')"
},
"downloads_expected_bytes_source_check": {
"name": "downloads_expected_bytes_source_check",
"value": "\"downloads\".\"expected_bytes_source\" is null or \"downloads\".\"expected_bytes_source\" in ('content_length', 'content_range', 'release_size')"
}
}
},
"managed_keys": {
"name": "managed_keys",
"columns": {
"id": {
"name": "id",
"type": "integer",
"primaryKey": true,
"notNull": true,
"autoincrement": true
},
"key_hash": {
"name": "key_hash",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"server_id": {
"name": "server_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"managed_keys_key_hash_unique": {
"name": "managed_keys_key_hash_unique",
"columns": [
"key_hash"
],
"isUnique": true
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
}
},
"views": {},
"enums": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
},
"internal": {
"indexes": {}
}
}
Loading